[PATCH linux-next] workqueue: use sysfs_emit() instead of scnprintf().

xie.ludan@zte.com.cn posted 1 patch 9 months, 1 week ago
kernel/workqueue.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
[PATCH linux-next] workqueue: use sysfs_emit() instead of scnprintf().
Posted by xie.ludan@zte.com.cn 9 months, 1 week ago
From: XieLudan <xie.ludan@zte.com.cn>

Follow the advice in Documentation/filesystems/sysfs.rst:
show() should only use sysfs_emit() or sysfs_emit_at() when formatting
the value to be returned to user space.

Signed-off-by: XieLudan <xie.ludan@zte.com.cn>
---
 kernel/workqueue.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index bfe030b443e2..648e89dd3ef1 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -6463,10 +6463,10 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task)
 			 */
 			if (worker->desc[0] != '\0') {
 				if (worker->current_work)
-					scnprintf(buf + off, size - off, "+%s",
+					sysfs_emit(buf + off, "+%s",
 						  worker->desc);
 				else
-					scnprintf(buf + off, size - off, "-%s",
+					sysfs_emit(buf + off, "-%s",
 						  worker->desc);
 			}
 			raw_spin_unlock_irq(&pool->lock);
@@ -7005,7 +7005,7 @@ static int wq_affn_dfl_set(const char *val, const struct kernel_param *kp)
 
 static int wq_affn_dfl_get(char *buffer, const struct kernel_param *kp)
 {
-	return scnprintf(buffer, PAGE_SIZE, "%s\n", wq_affn_names[wq_affn_dfl]);
+	return sysfs_emit(buffer, "%s\n", wq_affn_names[wq_affn_dfl]);
 }
 
 static const struct kernel_param_ops wq_affn_dfl_ops = {
@@ -7048,7 +7048,7 @@ static ssize_t per_cpu_show(struct device *dev, struct device_attribute *attr,
 {
 	struct workqueue_struct *wq = dev_to_wq(dev);
 
-	return scnprintf(buf, PAGE_SIZE, "%d\n", (bool)!(wq->flags & WQ_UNBOUND));
+	return sysfs_emit(buf, "%d\n", (bool)!(wq->flags & WQ_UNBOUND));
 }
 static DEVICE_ATTR_RO(per_cpu);
 
@@ -7057,7 +7057,7 @@ static ssize_t max_active_show(struct device *dev,
 {
 	struct workqueue_struct *wq = dev_to_wq(dev);
 
-	return scnprintf(buf, PAGE_SIZE, "%d\n", wq->saved_max_active);
+	return sysfs_emit(buf, "%d\n", wq->saved_max_active);
 }
 
 static ssize_t max_active_store(struct device *dev,
@@ -7089,7 +7089,7 @@ static ssize_t wq_nice_show(struct device *dev, struct device_attribute *attr,
 	int written;
 
 	mutex_lock(&wq->mutex);
-	written = scnprintf(buf, PAGE_SIZE, "%d\n", wq->unbound_attrs->nice);
+	written = sysfs_emit(buf, "%d\n", wq->unbound_attrs->nice);
 	mutex_unlock(&wq->mutex);
 
 	return written;
@@ -7142,7 +7142,7 @@ static ssize_t wq_cpumask_show(struct device *dev,
 	int written;
 
 	mutex_lock(&wq->mutex);
-	written = scnprintf(buf, PAGE_SIZE, "%*pb\n",
+	written = sysfs_emit(buf, "%*pb\n",
 			    cpumask_pr_args(wq->unbound_attrs->cpumask));
 	mutex_unlock(&wq->mutex);
 	return written;
@@ -7180,11 +7180,11 @@ static ssize_t wq_affn_scope_show(struct device *dev,
 
 	mutex_lock(&wq->mutex);
 	if (wq->unbound_attrs->affn_scope == WQ_AFFN_DFL)
-		written = scnprintf(buf, PAGE_SIZE, "%s (%s)\n",
+		written = sysfs_emit(buf, "%s (%s)\n",
 				    wq_affn_names[WQ_AFFN_DFL],
 				    wq_affn_names[wq_affn_dfl]);
 	else
-		written = scnprintf(buf, PAGE_SIZE, "%s\n",
+		written = sysfs_emit(buf, "%s\n",
 				    wq_affn_names[wq->unbound_attrs->affn_scope]);
 	mutex_unlock(&wq->mutex);
 
@@ -7219,7 +7219,7 @@ static ssize_t wq_affinity_strict_show(struct device *dev,
 {
 	struct workqueue_struct *wq = dev_to_wq(dev);
 
-	return scnprintf(buf, PAGE_SIZE, "%d\n",
+	return sysfs_emit(buf, "%d\n",
 			 wq->unbound_attrs->affn_strict);
 }
 
@@ -7298,7 +7298,7 @@ static ssize_t __wq_cpumask_show(struct device *dev,
 	int written;
 
 	mutex_lock(&wq_pool_mutex);
-	written = scnprintf(buf, PAGE_SIZE, "%*pb\n", cpumask_pr_args(mask));
+	written = sysfs_emit(buf, "%*pb\n", cpumask_pr_args(mask));
 	mutex_unlock(&wq_pool_mutex);
 
 	return written;
-- 
2.25.1
Re: [PATCH linux-next] workqueue: use sysfs_emit() instead of scnprintf().
Posted by Tejun Heo 9 months, 1 week ago
On Sat, Mar 15, 2025 at 02:17:58PM +0800, xie.ludan@zte.com.cn wrote:
> From: XieLudan <xie.ludan@zte.com.cn>
> 
> Follow the advice in Documentation/filesystems/sysfs.rst:
> show() should only use sysfs_emit() or sysfs_emit_at() when formatting
> the value to be returned to user space.
> 
> Signed-off-by: XieLudan <xie.ludan@zte.com.cn>
> ---
>  kernel/workqueue.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index bfe030b443e2..648e89dd3ef1 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -6463,10 +6463,10 @@ void wq_worker_comm(char *buf, size_t size, struct task_struct *task)
>  			 */
>  			if (worker->desc[0] != '\0') {
>  				if (worker->current_work)
> -					scnprintf(buf + off, size - off, "+%s",
> +					sysfs_emit(buf + off, "+%s",
>  						  worker->desc);
>  				else
> -					scnprintf(buf + off, size - off, "-%s",
> +					sysfs_emit(buf + off, "-%s",
>  						  worker->desc);
>  			}
>  			raw_spin_unlock_irq(&pool->lock);

How did you verify your changes? wq_worker_comm() is used from procfs not
sysfs. @buf is on-stack 64byte buffer from proc_task_name() which is not
page aligned and will most likely trigger WARN() path in sysfs_emit().

Thanks.

-- 
tejun