[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260107144252.74666-3-karthikey3608@gmail.com>
Date: Wed, 7 Jan 2026 20:12:51 +0530
From: Karthikey D Kadati <karthikey3608@...il.com>
To: Hans de Goede <hansg@...nel.org>,
Mauro Carvalho Chehab <mchehab@...nel.org>
Cc: Dan Carpenter <dan.carpenter@...aro.org>,
Sakari Ailus <sakari.ailus@...ux.intel.com>,
linux-media@...r.kernel.org,
linux-staging@...ts.linux.dev,
linux-kernel@...r.kernel.org,
Karthikey D Kadati <karthikey3608@...il.com>
Subject: [PATCH v3 2/3] media: atomisp: consolidate statistics buffer allocation
Refactor atomisp_alloc_css_stat_bufs() to use a new helper function
atomisp_alloc_stat_bufs_list().
This reduces code duplication for allocating 3A, DIS, and metadata
buffers and centralizes the allocation loop logic.
The helper returns the actual error code on failure (instead of
hardcoded -ENOMEM), triggering the existing cleanup path in the caller
which correctly frees any partially allocated lists.
Signed-off-by: Karthikey D Kadati <karthikey3608@...il.com>
---
.../staging/media/atomisp/pci/atomisp_ioctl.c | 127 ++++++++++++------
1 file changed, 85 insertions(+), 42 deletions(-)
diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
index 5c0a1d92b..c81773a75 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
@@ -678,13 +678,82 @@ static int atomisp_g_fmt_cap(struct file *file, void *fh,
return atomisp_try_fmt_cap(file, fh, f);
}
+static int atomisp_alloc_stat_bufs_list(struct atomisp_sub_device *asd,
+ u16 stream_id,
+ struct list_head *buf_list,
+ int count,
+ enum ia_css_buffer_type type)
+{
+ struct atomisp_s3a_buf *s3a_buf;
+ struct atomisp_dis_buf *dis_buf;
+ struct atomisp_metadata_buf *md_buf;
+ int ret;
+
+ while (count--) {
+ switch (type) {
+ case IA_CSS_BUFFER_TYPE_3A_STATISTICS:
+ s3a_buf = kzalloc(sizeof(*s3a_buf), GFP_KERNEL);
+ if (!s3a_buf)
+ return -ENOMEM;
+
+ ret = atomisp_css_allocate_stat_buffers(asd,
+ stream_id,
+ s3a_buf,
+ NULL,
+ NULL);
+ if (ret) {
+ kfree(s3a_buf);
+ return ret;
+ }
+ list_add_tail(&s3a_buf->list, buf_list);
+ break;
+ case IA_CSS_BUFFER_TYPE_DIS_STATISTICS:
+ dis_buf = kzalloc(sizeof(*dis_buf), GFP_KERNEL);
+ if (!dis_buf)
+ return -ENOMEM;
+
+ ret = atomisp_css_allocate_stat_buffers(asd,
+ stream_id,
+ NULL,
+ dis_buf,
+ NULL);
+ if (ret) {
+ kfree(dis_buf);
+ return ret;
+ }
+ list_add_tail(&dis_buf->list, buf_list);
+ break;
+ case IA_CSS_BUFFER_TYPE_METADATA:
+ md_buf = kzalloc(sizeof(*md_buf), GFP_KERNEL);
+ if (!md_buf)
+ return -ENOMEM;
+
+ ret = atomisp_css_allocate_stat_buffers(asd,
+ stream_id,
+ NULL,
+ NULL,
+ md_buf);
+ if (ret) {
+ kfree(md_buf);
+ return ret;
+ }
+ list_add_tail(&md_buf->list, buf_list);
+ break;
+ default:
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
int atomisp_alloc_css_stat_bufs(struct atomisp_sub_device *asd,
- uint16_t stream_id)
+ u16 stream_id)
{
struct atomisp_device *isp = asd->isp;
- struct atomisp_s3a_buf *s3a_buf = NULL, *_s3a_buf;
- struct atomisp_dis_buf *dis_buf = NULL, *_dis_buf;
- struct atomisp_metadata_buf *md_buf = NULL, *_md_buf;
+ struct atomisp_dis_buf *dis_buf, *_dis_buf;
+ struct atomisp_s3a_buf *s3a_buf, *_s3a_buf;
+ struct atomisp_metadata_buf *md_buf, *_md_buf;
int count;
struct ia_css_dvs_grid_info *dvs_grid_info =
atomisp_css_get_dvs_grid_info(&asd->params.curr_grid_info);
@@ -695,37 +764,20 @@ int atomisp_alloc_css_stat_bufs(struct atomisp_sub_device *asd,
count = ATOMISP_CSS_Q_DEPTH +
ATOMISP_S3A_BUF_QUEUE_DEPTH_FOR_HAL;
dev_dbg(isp->dev, "allocating %d 3a buffers\n", count);
- while (count--) {
- s3a_buf = kzalloc(sizeof(struct atomisp_s3a_buf), GFP_KERNEL);
- if (!s3a_buf)
- goto error;
-
- if (atomisp_css_allocate_stat_buffers(
- asd, stream_id, s3a_buf, NULL, NULL)) {
- kfree(s3a_buf);
- goto error;
- }
-
- list_add_tail(&s3a_buf->list, &asd->s3a_stats);
- }
+ if (atomisp_alloc_stat_bufs_list(asd, stream_id,
+ &asd->s3a_stats, count,
+ IA_CSS_BUFFER_TYPE_3A_STATISTICS))
+ goto error;
}
if (list_empty(&asd->dis_stats) && dvs_grid_info &&
dvs_grid_info->enable) {
count = ATOMISP_CSS_Q_DEPTH + 1;
dev_dbg(isp->dev, "allocating %d dis buffers\n", count);
- while (count--) {
- dis_buf = kzalloc(sizeof(struct atomisp_dis_buf), GFP_KERNEL);
- if (!dis_buf)
- goto error;
- if (atomisp_css_allocate_stat_buffers(
- asd, stream_id, NULL, dis_buf, NULL)) {
- kfree(dis_buf);
- goto error;
- }
-
- list_add_tail(&dis_buf->list, &asd->dis_stats);
- }
+ if (atomisp_alloc_stat_bufs_list(asd, stream_id,
+ &asd->dis_stats, count,
+ IA_CSS_BUFFER_TYPE_DIS_STATISTICS))
+ goto error;
}
for (i = 0; i < ATOMISP_METADATA_TYPE_NUM; i++) {
@@ -736,19 +788,10 @@ int atomisp_alloc_css_stat_bufs(struct atomisp_sub_device *asd,
ATOMISP_METADATA_QUEUE_DEPTH_FOR_HAL;
dev_dbg(isp->dev, "allocating %d metadata buffers for type %d\n",
count, i);
- while (count--) {
- md_buf = kzalloc(sizeof(struct atomisp_metadata_buf),
- GFP_KERNEL);
- if (!md_buf)
- goto error;
-
- if (atomisp_css_allocate_stat_buffers(
- asd, stream_id, NULL, NULL, md_buf)) {
- kfree(md_buf);
- goto error;
- }
- list_add_tail(&md_buf->list, &asd->metadata[i]);
- }
+ if (atomisp_alloc_stat_bufs_list(asd, stream_id,
+ &asd->metadata[i], count,
+ IA_CSS_BUFFER_TYPE_METADATA))
+ goto error;
}
}
return 0;
--
2.43.0
Powered by blists - more mailing lists