drivers/staging/media/atomisp/pci/hmm/hmm.c | 24 ++++++--------------- 1 file changed, 7 insertions(+), 17 deletions(-)
Convert buffer output to use sysfs_emit/sysfs_emit_at API for safer
PAGE_SIZE handling and standardized sysfs output.
Signed-off-by: Abdelrahman Fekry <abdelrahmanfekry375@gmail.com>
---
drivers/staging/media/atomisp/pci/hmm/hmm.c | 24 ++++++---------------
1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/drivers/staging/media/atomisp/pci/hmm/hmm.c b/drivers/staging/media/atomisp/pci/hmm/hmm.c
index 84102c3aaf97..cae1fccd06af 100644
--- a/drivers/staging/media/atomisp/pci/hmm/hmm.c
+++ b/drivers/staging/media/atomisp/pci/hmm/hmm.c
@@ -37,51 +37,41 @@ static const char hmm_bo_type_string[] = "pv";
static ssize_t bo_show(struct device *dev, struct device_attribute *attr,
char *buf, struct list_head *bo_list, bool active)
{
- ssize_t ret = 0;
+ ssize_t offset = 0;
struct hmm_buffer_object *bo;
unsigned long flags;
int i;
long total[HMM_BO_LAST] = { 0 };
long count[HMM_BO_LAST] = { 0 };
- int index1 = 0;
- int index2 = 0;
- ret = scnprintf(buf, PAGE_SIZE, "type pgnr\n");
- if (ret <= 0)
- return 0;
-
- index1 += ret;
+ offset += sysfs_emit(buf, "type pgnr\n");
spin_lock_irqsave(&bo_device.list_lock, flags);
list_for_each_entry(bo, bo_list, list) {
if ((active && (bo->status & HMM_BO_ALLOCED)) ||
(!active && !(bo->status & HMM_BO_ALLOCED))) {
- ret = scnprintf(buf + index1, PAGE_SIZE - index1,
+ offset += sysfs_emit_at(buf, offset,
"%c %d\n",
hmm_bo_type_string[bo->type], bo->pgnr);
total[bo->type] += bo->pgnr;
count[bo->type]++;
- if (ret > 0)
- index1 += ret;
}
}
spin_unlock_irqrestore(&bo_device.list_lock, flags);
for (i = 0; i < HMM_BO_LAST; i++) {
if (count[i]) {
- ret = scnprintf(buf + index1 + index2,
- PAGE_SIZE - index1 - index2,
+ offset += sysfs_emit_at(buf,
+ offset,
"%ld %c buffer objects: %ld KB\n",
count[i], hmm_bo_type_string[i],
total[i] * 4);
- if (ret > 0)
- index2 += ret;
}
}
- /* Add trailing zero, not included by scnprintf */
- return index1 + index2 + 1;
+ /* Direct return of accumlated length */
+ return offset;
}
static ssize_t active_bo_show(struct device *dev, struct device_attribute *attr,
--
2.25.1
Hi, On 21-Jun-25 8:29 AM, Abdelrahman Fekry wrote: > Convert buffer output to use sysfs_emit/sysfs_emit_at API for safer > PAGE_SIZE handling and standardized sysfs output. > > Signed-off-by: Abdelrahman Fekry <abdelrahmanfekry375@gmail.com> > --- > drivers/staging/media/atomisp/pci/hmm/hmm.c | 24 ++++++--------------- > 1 file changed, 7 insertions(+), 17 deletions(-) > > diff --git a/drivers/staging/media/atomisp/pci/hmm/hmm.c b/drivers/staging/media/atomisp/pci/hmm/hmm.c > index 84102c3aaf97..cae1fccd06af 100644 > --- a/drivers/staging/media/atomisp/pci/hmm/hmm.c > +++ b/drivers/staging/media/atomisp/pci/hmm/hmm.c > @@ -37,51 +37,41 @@ static const char hmm_bo_type_string[] = "pv"; > static ssize_t bo_show(struct device *dev, struct device_attribute *attr, > char *buf, struct list_head *bo_list, bool active) > { <snip> As Andy already mentioned you really should try to first better understand the code before changing it. In this case this code is used for 2 custom sysfs attributes called "active_bo" and "free_bo". sysfs attributes are custom userspace API and we really want to remove all custom userspace APIs from this driver before moving it out of drivers/staging Instead everything should be done through existing standard kernels API, mostly the standard v4l2 API. Note this is already mentioned in drivers/staging/media/atomisp/TODO although these specific sysfs attributes are not named: """ TODO ==== 1. Items which MUST be fixed before the driver can be moved out of staging: * Remove/disable private IOCTLs * Remove/disable custom v4l2-ctrls * Remove custom sysfs files created by atomisp_drvfs.c """ In this case the "active_bo" and "free_bo" sysfs attributes seem to be there for debugging purposes only and they can simply be removed. So instead of replacing scnprintf you should write a new patch removing everything starting at: <--- start removing code here ---> /* * p: private * v: vmalloc ... static struct attribute_group atomisp_attribute_group[] = { {.attrs = sysfs_attrs_ctrl }, }; <--- end removing code here ---> and then also remove the sysfs_create_group() and sysfs_remove_group() calls. After writing that patch maybe you can also take a look at tackling the "Remove custom sysfs files created by atomisp_drvfs.c" TODO list item? Regards, Hans
On Mon, Jun 23, 2025 at 9:31 PM Hans de Goede <hansg@kernel.org> wrote: > > Hi, > As Andy already mentioned you really should try to first better understand > the code before changing it. > > In this case this code is used for 2 custom sysfs attributes called > "active_bo" and "free_bo". > > sysfs attributes are custom userspace API and we really want to remove > all custom userspace APIs from this driver before moving it out of > drivers/staging > > Instead everything should be done through existing standard kernels > API, mostly the standard v4l2 API. > > Note this is already mentioned in drivers/staging/media/atomisp/TODO > although these specific sysfs attributes are not named: > > """ > TODO > ==== > > 1. Items which MUST be fixed before the driver can be moved out of staging: > > * Remove/disable private IOCTLs > > * Remove/disable custom v4l2-ctrls > > * Remove custom sysfs files created by atomisp_drvfs.c > """ > > In this case the "active_bo" and "free_bo" sysfs attributes seem > to be there for debugging purposes only and they can simply be removed. > > So instead of replacing scnprintf you should write a new patch > removing everything starting at: > > <--- start removing code here ---> > /* > * p: private > * v: vmalloc > > ... > > static struct attribute_group atomisp_attribute_group[] = { > {.attrs = sysfs_attrs_ctrl }, > }; > <--- end removing code here ---> > > and then also remove the sysfs_create_group() and > sysfs_remove_group() calls. > > After writing that patch maybe you can also take a look at tackling > the "Remove custom sysfs files created by atomisp_drvfs.c" TODO > list item? > > Regards, > > Hans > Thank you so much Hans for this informative feedback , i now see the whole picture , i will submit a new patch that removes the two custom attributes active_bo and free_bo and then will proceed with the TODO list item " Remove custom sysfs files created by atomisp_drvfs.c"
On Sat, Jun 21, 2025 at 9:30 AM Abdelrahman Fekry <abdelrahmanfekry375@gmail.com> wrote: > > Convert buffer output to use sysfs_emit/sysfs_emit_at API for safer > PAGE_SIZE handling and standardized sysfs output. ... > - ssize_t ret = 0; > + ssize_t offset = 0; It would be good to move this... > struct hmm_buffer_object *bo; > unsigned long flags; > int i; > long total[HMM_BO_LAST] = { 0 }; > long count[HMM_BO_LAST] = { 0 }; > - int index1 = 0; > - int index2 = 0; ...to be here. > > - ret = scnprintf(buf, PAGE_SIZE, "type pgnr\n"); > - if (ret <= 0) > - return 0; > - > - index1 += ret; > + offset += sysfs_emit(buf, "type pgnr\n"); This changes the behaviour in case the sysfs_emit() fails. Not that this is a big issue, but it should be pointed out somewhere. ... > + /* Direct return of accumlated length */ accumulated Don't forget to run a spell-checker. -- With Best Regards, Andy Shevchenko
On Sat, Jun 21, 2025 at 09:24:40PM +0300, Andy Shevchenko wrote: > On Sat, Jun 21, 2025 at 9:30 AM Abdelrahman Fekry > > > > - ret = scnprintf(buf, PAGE_SIZE, "type pgnr\n"); > > - if (ret <= 0) > > - return 0; > > - > > - index1 += ret; > > + offset += sysfs_emit(buf, "type pgnr\n"); > > This changes the behaviour in case the sysfs_emit() fails. Not that > this is a big issue, but it should be pointed out somewhere. > > ... Neither scnprintf() nor sysfs_emit() can return negatives. regards, dan carpenter
On Mon, Jun 23, 2025 at 05:16:57PM +0300, Dan Carpenter wrote: > On Sat, Jun 21, 2025 at 09:24:40PM +0300, Andy Shevchenko wrote: > > On Sat, Jun 21, 2025 at 9:30 AM Abdelrahman Fekry ... > > > - ret = scnprintf(buf, PAGE_SIZE, "type pgnr\n"); > > > - if (ret <= 0) > > > - return 0; > > > - > > > - index1 += ret; > > > + offset += sysfs_emit(buf, "type pgnr\n"); > > > > This changes the behaviour in case the sysfs_emit() fails. Not that > > this is a big issue, but it should be pointed out somewhere. > > Neither scnprintf() nor sysfs_emit() can return negatives. Good, that's what I asked the author to investigate and add the respective comment / update commit message accordingly. -- With Best Regards, Andy Shevchenko
Thanks for the review On Sat, Jun 21, 2025 at 9:25 PM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > On Sat, Jun 21, 2025 at 9:30 AM Abdelrahman Fekry > <abdelrahmanfekry375@gmail.com> wrote: > > > > Convert buffer output to use sysfs_emit/sysfs_emit_at API for safer > > PAGE_SIZE handling and standardized sysfs output. > > ... > > > - ssize_t ret = 0; > > + ssize_t offset = 0; > > It would be good to move this... > > > struct hmm_buffer_object *bo; > > unsigned long flags; > > int i; > > long total[HMM_BO_LAST] = { 0 }; > > long count[HMM_BO_LAST] = { 0 }; > > - int index1 = 0; > > - int index2 = 0; > > ...to be here. noted , thanks. > > > > - ret = scnprintf(buf, PAGE_SIZE, "type pgnr\n"); > > - if (ret <= 0) > > - return 0; > > - > > - index1 += ret; > > + offset += sysfs_emit(buf, "type pgnr\n"); > > This changes the behaviour in case the sysfs_emit() fails. Not that > this is a big issue, but it should be pointed out somewhere. noted , will make a comment about it. > ... > > > + /* Direct return of accumlated length */ > > accumulated > > Don't forget to run a spell-checker. > noted . > -- > With Best Regards, > Andy Shevchenko
© 2016 - 2025 Red Hat, Inc.