Message ID | 20220113184420.2504545-1-gregkh@linuxfoundation.org |
---|---|
State | Accepted |
Commit | c9d967b2ce40d71e968eb839f36c936b8a9cf1ea |
Headers | show |
Series | pm / wakeup: simplify the output logic of pm_show_wakelocks() | expand |
On Fri, Jan 14, 2022 at 11:10 AM Lee Jones <lee.jones@linaro.org> wrote: > > On Thu, 13 Jan 2022, Greg Kroah-Hartman wrote: > > > The buffer handling in pm_show_wakelocks() is tricky, and hopefully > > correct. Ensure it really is correct by using sysfs_emit_at() which > > handles all of the tricky string handling logic in a PAGE_SIZE buffer > > for us automatically as this is a sysfs file being read from. > > > > Cc: "Rafael J. Wysocki" <rafael@kernel.org> > > Cc: Pavel Machek <pavel@ucw.cz> > > Cc: Len Brown <len.brown@intel.com> > > Cc: linux-pm@vger.kernel.org > > Cc: Lee Jones <lee.jones@linaro.org> > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > --- > > kernel/power/wakelock.c | 11 ++++------- > > 1 file changed, 4 insertions(+), 7 deletions(-) > > Reviewed-by: Lee Jones <lee.jones@linaro.org> Applied as 5.18 material, thanks! > > > diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c > > index 105df4dfc783..52571dcad768 100644 > > --- a/kernel/power/wakelock.c > > +++ b/kernel/power/wakelock.c > > @@ -39,23 +39,20 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active) > > { > > struct rb_node *node; > > struct wakelock *wl; > > - char *str = buf; > > - char *end = buf + PAGE_SIZE; > > + int len = 0; > > > > mutex_lock(&wakelocks_lock); > > > > for (node = rb_first(&wakelocks_tree); node; node = rb_next(node)) { > > wl = rb_entry(node, struct wakelock, node); > > if (wl->ws->active == show_active) > > - str += scnprintf(str, end - str, "%s ", wl->name); > > + len += sysfs_emit_at(buf, len, "%s ", wl->name); > > } > > - if (str > buf) > > - str--; > > > > - str += scnprintf(str, end - str, "\n"); > > + len += sysfs_emit_at(buf, len, "\n"); > > > > mutex_unlock(&wakelocks_lock); > > - return (str - buf); > > + return len; > > } > > > > #if CONFIG_PM_WAKELOCKS_LIMIT > 0 > > -- > Lee Jones [李琼斯] > Principal Technical Lead - Developer Services > Linaro.org │ Open source software for Arm SoCs > Follow Linaro: Facebook | Twitter | Blog
diff --git a/kernel/power/wakelock.c b/kernel/power/wakelock.c index 105df4dfc783..52571dcad768 100644 --- a/kernel/power/wakelock.c +++ b/kernel/power/wakelock.c @@ -39,23 +39,20 @@ ssize_t pm_show_wakelocks(char *buf, bool show_active) { struct rb_node *node; struct wakelock *wl; - char *str = buf; - char *end = buf + PAGE_SIZE; + int len = 0; mutex_lock(&wakelocks_lock); for (node = rb_first(&wakelocks_tree); node; node = rb_next(node)) { wl = rb_entry(node, struct wakelock, node); if (wl->ws->active == show_active) - str += scnprintf(str, end - str, "%s ", wl->name); + len += sysfs_emit_at(buf, len, "%s ", wl->name); } - if (str > buf) - str--; - str += scnprintf(str, end - str, "\n"); + len += sysfs_emit_at(buf, len, "\n"); mutex_unlock(&wakelocks_lock); - return (str - buf); + return len; } #if CONFIG_PM_WAKELOCKS_LIMIT > 0
The buffer handling in pm_show_wakelocks() is tricky, and hopefully correct. Ensure it really is correct by using sysfs_emit_at() which handles all of the tricky string handling logic in a PAGE_SIZE buffer for us automatically as this is a sysfs file being read from. Cc: "Rafael J. Wysocki" <rafael@kernel.org> Cc: Pavel Machek <pavel@ucw.cz> Cc: Len Brown <len.brown@intel.com> Cc: linux-pm@vger.kernel.org Cc: Lee Jones <lee.jones@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- kernel/power/wakelock.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)