* [PATCH v2] drm/rocket: Check allocations before use
[not found] <20260817055315.C9AA41F000E9@smtp.kernel.org>
@ 2026-08-17 7:20 ` Triet Hoang
2026-08-17 9:20 ` Markus Elfring
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
0 siblings, 2 replies; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 7:20 UTC (permalink / raw)
To: tomeu; +Cc: ogabbay, dri-devel, linux-kernel, Triet Hoang
Check the result of kvmalloc_array() in rocket_job_push() and
kmalloc_objs() in rocket_job_open() before using
the allocated buffer.
Changes in v2:
- Free scheds when drm_sched_entity_init() fails.
- Initialize ret to 0.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/accel/rocket/rocket_job.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocket_job.c
index ac51bff39833..24e1a61f71e7 100644
--- a/drivers/accel/rocket/rocket_job.c
+++ b/drivers/accel/rocket/rocket_job.c
@@ -192,6 +192,9 @@ static int rocket_job_push(struct rocket_job *job)
bos = kvmalloc_array(job->in_bo_count + job->out_bo_count, sizeof(void *),
GFP_KERNEL);
+ if (!bos)
+ return -ENOMEM;
+
memcpy(bos, job->in_bos, job->in_bo_count * sizeof(void *));
memcpy(&bos[job->in_bo_count], job->out_bos, job->out_bo_count * sizeof(void *));
@@ -499,7 +502,10 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
struct drm_gpu_scheduler **scheds = kmalloc_objs(*scheds,
rdev->num_cores);
unsigned int core;
- int ret;
+ int ret = 0;
+
+ if (!scheds)
+ return -ENOMEM;
for (core = 0; core < rdev->num_cores; core++)
scheds[core] = &rdev->cores[core].sched;
@@ -509,9 +515,9 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
scheds,
rdev->num_cores, NULL);
if (WARN_ON(ret))
- return ret;
+ kfree(scheds);
- return 0;
+ return ret;
}
void rocket_job_close(struct rocket_file_priv *rocket_priv)
--
2.53.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/rocket: Check allocations before use
2026-08-17 7:20 ` [PATCH v2] drm/rocket: Check allocations before use Triet Hoang
@ 2026-08-17 9:20 ` Markus Elfring
2026-08-17 9:31 ` [PATCH v3] " Triet Hoang
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
1 sibling, 1 reply; 12+ messages in thread
From: Markus Elfring @ 2026-08-17 9:20 UTC (permalink / raw)
To: Triet Hoang, dri-devel, Oded Gabbay, Tomeu Vizoso; +Cc: LKML, kernel-janitors
> Check the result of kvmalloc_array() in rocket_job_push() and
> kmalloc_objs() in rocket_job_open() before using
> the allocated buffer.
See also:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v7.2-rc7#n669
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v7.2-rc7#n145
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/stable-kernel-rules.rst?h=v7.2-rc7#n34
> Changes in v2:
…
> ---
> drivers/accel/rocket/rocket_job.c | 12 +++++++++---
…
Please move patch version descriptions behind the marker line.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v7.2-rc7#n795
Regards,
Markus
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/rocket: Check allocations before use
2026-08-17 7:20 ` [PATCH v2] drm/rocket: Check allocations before use Triet Hoang
2026-08-17 9:20 ` Markus Elfring
@ 2026-08-17 9:30 ` Igor Paunovic
2026-08-17 13:14 ` Triet Hoang
` (2 more replies)
1 sibling, 3 replies; 12+ messages in thread
From: Igor Paunovic @ 2026-08-17 9:30 UTC (permalink / raw)
To: Triet Hoang, Tomeu Vizoso
Cc: Igor Paunovic, Oded Gabbay, dri-devel, linux-kernel
Hi Triet,
Thanks for picking this up -- the rocket driver has few enough eyes on it
that allocation-check patches are welcome.
The rocket_job_push() half looks right to me. The early return skips the
err: label, but bos is NULL there anyway, and the caller
(rocket_ioctl_submit_job()) takes the goto out_cleanup_job path, which
does drm_sched_job_cleanup() and rocket_job_put(). Nothing is leaked and
nothing is armed yet, so returning early is safe.
On rocket_job_open(), the v2 change fixes the error path, but I think it
only covers half of what was reported. The other half is still there:
the array leaks on a single-core device even when nothing fails.
drm_sched_entity_init() stores the caller's array only when it will
actually need it:
entity->sched_list = num_sched_list > 1 ? sched_list : NULL;
(drivers/gpu/drm/scheduler/sched_entity.c, unchanged in current
mainline). And rocket_job_close() frees exactly that field:
kfree(entity->sched_list);
drm_sched_entity_destroy(entity);
So when rdev->num_cores == 1, drm_sched_entity_init() succeeds,
entity->sched_list is NULL, rocket_job_close() frees NULL, and the array
that rocket_job_open() allocated is never freed. One pointer per open(),
unbounded across open/close cycles.
That is not a hypothetical configuration. The RK3576 series currently on
the list enables exactly one core on the ROCK 4D -- its commit message
says so in as many words ("Only rknn_core_0 is enabled: the driver binds
one core per node and the second core is left to whoever can test it").
Any RK3588 DT that leaves a single core enabled lands in the same place.
I would suggest not depending on drm_sched_entity_init()'s internal
choice about sched_list at all: keep the pointer in rocket_file_priv and
free it unconditionally in rocket_job_close(). That covers one core and
many cores with the same line, and it stops rocket_job_close() from
reaching into a scheduler-internal field to decide what it owns. But
that is a bigger change than the one you set out to make, so it may be
better as a separate patch -- Tomeu's call.
Two smaller things:
- With the check added, ret is assigned unconditionally from
drm_sched_entity_init(), so the "int ret = 0" initialiser in v2 is
no longer doing anything.
- Heads-up on collision: I have a patch in flight that touches these
same lines of rocket_job_open() ("accel/rocket: keep core slots
stable across unbind and rebind", part of a two-patch lifecycle
series). Whichever of us lands first, the other rebases -- I am happy
for that to be me. Worth mentioning because in my version the count
passed to drm_sched_entity_init() is the number of *live* cores, so
once cores are unbound down to one, the leak above starts happening
on a multi-core board too, at runtime.
I have not run your patch, so no tag from me. If it would help, I can
test it on RK3588 with three cores and again with two of them unbound,
and check the single-core case with kmemleak.
Regards,
Igor
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3] drm/rocket: Check allocations before use
2026-08-17 9:20 ` Markus Elfring
@ 2026-08-17 9:31 ` Triet Hoang
2026-08-17 9:55 ` Markus Elfring
0 siblings, 1 reply; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 9:31 UTC (permalink / raw)
To: tomeu; +Cc: ogabbay, dri-devel, linux-kernel, Triet Hoang
Check the result of kvmalloc_array() in rocket_job_push() and
kmalloc_objs() in rocket_job_open() before using
the allocated buffer.
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
Changes in v2:
- Free scheds when drm_sched_entity_init() fails.
- Initialize ret to 0.
Changes in v3:
- Move patch version descriptions below the '---' marker.
drivers/accel/rocket/rocket_job.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocket_job.c
index ac51bff39833..24e1a61f71e7 100644
--- a/drivers/accel/rocket/rocket_job.c
+++ b/drivers/accel/rocket/rocket_job.c
@@ -192,6 +192,9 @@ static int rocket_job_push(struct rocket_job *job)
bos = kvmalloc_array(job->in_bo_count + job->out_bo_count, sizeof(void *),
GFP_KERNEL);
+ if (!bos)
+ return -ENOMEM;
+
memcpy(bos, job->in_bos, job->in_bo_count * sizeof(void *));
memcpy(&bos[job->in_bo_count], job->out_bos, job->out_bo_count * sizeof(void *));
@@ -499,7 +502,10 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
struct drm_gpu_scheduler **scheds = kmalloc_objs(*scheds,
rdev->num_cores);
unsigned int core;
- int ret;
+ int ret = 0;
+
+ if (!scheds)
+ return -ENOMEM;
for (core = 0; core < rdev->num_cores; core++)
scheds[core] = &rdev->cores[core].sched;
@@ -509,9 +515,9 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
scheds,
rdev->num_cores, NULL);
if (WARN_ON(ret))
- return ret;
+ kfree(scheds);
- return 0;
+ return ret;
}
void rocket_job_close(struct rocket_file_priv *rocket_priv)
--
2.53.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3] drm/rocket: Check allocations before use
2026-08-17 9:31 ` [PATCH v3] " Triet Hoang
@ 2026-08-17 9:55 ` Markus Elfring
2026-08-17 11:22 ` Triet Hoang
0 siblings, 1 reply; 12+ messages in thread
From: Markus Elfring @ 2026-08-17 9:55 UTC (permalink / raw)
To: Triet Hoang, dri-devel, Oded Gabbay, Tomeu Vizoso
Cc: LKML, kernel-janitors, Igor Paunovic
> Check the result of kvmalloc_array() in rocket_job_push() and
> kmalloc_objs() in rocket_job_open() before using
> the allocated buffer.
* Would an other word wrap variant be nicer here?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v7.2-rc7#n669
* How do you think about to add any tags (like “Fixes” and “Cc”) accordingly?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/submitting-patches.rst?h=v7.2-rc7#n145
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/stable-kernel-rules.rst?h=v7.2-rc7#n34
Regards,
Markus
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3] drm/rocket: Check allocations before use
2026-08-17 9:55 ` Markus Elfring
@ 2026-08-17 11:22 ` Triet Hoang
0 siblings, 0 replies; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 11:22 UTC (permalink / raw)
To: Markus.Elfring
Cc: dri-devel, ogabbay, tomeu, linux-kernel, kernel-janitors,
royalnet026
Hi Markus,
Thanks for the review. I'll update the patch accordingly in the next version.
Regards,
Triet
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/rocket: Check allocations before use
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
@ 2026-08-17 13:14 ` Triet Hoang
2026-08-17 14:01 ` [PATCH v4 1/2] " Triet Hoang
2026-08-17 14:28 ` [PATCH v2] " Triet Hoang
2 siblings, 0 replies; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 13:14 UTC (permalink / raw)
To: royalnet026; +Cc: dri-devel, linux-kernel, ogabbay, tomeu, triet.hoang.dev
From: Triet Hoang <triet.hoang.dev@gmail.com>
Hi Igor,
Thanks for the suggestion. I agree that keeping the allocation in rocket_file_priv
would make the ownership clearer. I will implement this idea as a seperate patch.
Best Regards,
Triet
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 1/2] drm/rocket: Check allocations before use
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
2026-08-17 13:14 ` Triet Hoang
@ 2026-08-17 14:01 ` Triet Hoang
2026-08-17 14:01 ` [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv Triet Hoang
2026-08-17 16:40 ` [PATCH v4 1/2] drm/rocket: Check allocations before use Markus Elfring
2026-08-17 14:28 ` [PATCH v2] " Triet Hoang
2 siblings, 2 replies; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 14:01 UTC (permalink / raw)
To: tomeu
Cc: ogabbay, dri-devel, linux-kernel, royalnet026, Markus.Elfring,
Triet Hoang
From: Triet Hoang <triet.hoang.dev@gmail.com>
Check the result of kvmalloc_array() in rocket_job_push() and
kmalloc_objs() in rocket_job_open() before using the allocated
buffers.
Fixes: 0810d5ad88a1 ("accel/rocket: Add job submission IOCTL")
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
Changes in v2:
- Free scheds when drm_sched_entity_init() fails.
- Initialize ret to 0.
Changes in v3:
- Move patch version descriptions below the '---' marker.
Changes in v4:
- Remove unnecessary initialization of ret to 0.
- Adjust commit message word wrapping.
- Add Fixes tag.
drivers/accel/rocket/rocket_job.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocket_job.c
index ac51bff39833..adcc792541ec 100644
--- a/drivers/accel/rocket/rocket_job.c
+++ b/drivers/accel/rocket/rocket_job.c
@@ -192,6 +192,9 @@ static int rocket_job_push(struct rocket_job *job)
bos = kvmalloc_array(job->in_bo_count + job->out_bo_count, sizeof(void *),
GFP_KERNEL);
+ if (!bos)
+ return -ENOMEM;
+
memcpy(bos, job->in_bos, job->in_bo_count * sizeof(void *));
memcpy(&bos[job->in_bo_count], job->out_bos, job->out_bo_count * sizeof(void *));
@@ -501,6 +504,9 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
unsigned int core;
int ret;
+ if (!scheds)
+ return -ENOMEM;
+
for (core = 0; core < rdev->num_cores; core++)
scheds[core] = &rdev->cores[core].sched;
@@ -509,9 +515,9 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
scheds,
rdev->num_cores, NULL);
if (WARN_ON(ret))
- return ret;
+ kfree(scheds);
- return 0;
+ return ret;
}
void rocket_job_close(struct rocket_file_priv *rocket_priv)
--
2.53.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv
2026-08-17 14:01 ` [PATCH v4 1/2] " Triet Hoang
@ 2026-08-17 14:01 ` Triet Hoang
2026-08-17 17:06 ` Markus Elfring
2026-08-17 16:40 ` [PATCH v4 1/2] drm/rocket: Check allocations before use Markus Elfring
1 sibling, 1 reply; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 14:01 UTC (permalink / raw)
To: tomeu
Cc: ogabbay, dri-devel, linux-kernel, royalnet026, Markus.Elfring,
Triet Hoang
From: Triet Hoang <triet.hoang.dev@gmail.com>
Keep the scheduler allocation in rocket_file_priv
and free it unconditionally in rocket_job_close().
Suggested-by: Igor Paunovic <royalnet026@gmail.com>
Link: https://lore.kernel.org/all/20260817093009.22359-1-royalnet026@gmail.com/#t
Signed-off-by: Triet Hoang <triet.hoang.dev@gmail.com>
---
drivers/accel/rocket/rocket_drv.h | 1 +
drivers/accel/rocket/rocket_job.c | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/drivers/accel/rocket/rocket_drv.h b/drivers/accel/rocket/rocket_drv.h
index 2c673bb99ccc..9421e48ec5d8 100644
--- a/drivers/accel/rocket/rocket_drv.h
+++ b/drivers/accel/rocket/rocket_drv.h
@@ -23,6 +23,7 @@ struct rocket_file_priv {
struct drm_mm mm;
struct mutex mm_lock;
+ struct drm_gpu_scheduler **scheds;
struct drm_sched_entity sched_entity;
};
diff --git a/drivers/accel/rocket/rocket_job.c b/drivers/accel/rocket/rocket_job.c
index adcc792541ec..ff1d9e802024 100644
--- a/drivers/accel/rocket/rocket_job.c
+++ b/drivers/accel/rocket/rocket_job.c
@@ -514,8 +514,11 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
DRM_SCHED_PRIORITY_NORMAL,
scheds,
rdev->num_cores, NULL);
+
if (WARN_ON(ret))
kfree(scheds);
+ else
+ rocket_priv->scheds = scheds;
return ret;
}
@@ -525,6 +528,7 @@ void rocket_job_close(struct rocket_file_priv *rocket_priv)
struct drm_sched_entity *entity = &rocket_priv->sched_entity;
kfree(entity->sched_list);
+ kfree(rocket_priv->scheds);
drm_sched_entity_destroy(entity);
}
--
2.53.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2] drm/rocket: Check allocations before use
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
2026-08-17 13:14 ` Triet Hoang
2026-08-17 14:01 ` [PATCH v4 1/2] " Triet Hoang
@ 2026-08-17 14:28 ` Triet Hoang
2 siblings, 0 replies; 12+ messages in thread
From: Triet Hoang @ 2026-08-17 14:28 UTC (permalink / raw)
To: royalnet026; +Cc: dri-devel, linux-kernel, ogabbay, tomeu, triet.hoang.dev
Hi Igor,
After reading the code carefully, I think that we can check
if entity->sched_list is NULL or not, then we can free the array
that rocket_job_open() allocated.
This will look like
if (WARN_ON(ret) || !(&rocket_priv->sched_entity->sched_list))
kfree(scheds);
How do you think about that
Best Regards,
Triet
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 1/2] drm/rocket: Check allocations before use
2026-08-17 14:01 ` [PATCH v4 1/2] " Triet Hoang
2026-08-17 14:01 ` [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv Triet Hoang
@ 2026-08-17 16:40 ` Markus Elfring
1 sibling, 0 replies; 12+ messages in thread
From: Markus Elfring @ 2026-08-17 16:40 UTC (permalink / raw)
To: Triet Hoang, dri-devel, Oded Gabbay, Tomeu Vizoso
Cc: LKML, kernel-janitors, Igor Paunovic
…
> +++ b/drivers/accel/rocket/rocket_job.c
> @@ -192,6 +192,9 @@ static int rocket_job_push(struct rocket_job *job)
>
> bos = kvmalloc_array(job->in_bo_count + job->out_bo_count, sizeof(void *),
> GFP_KERNEL);
…
I see opportunities for corresponding collateral evolution.
How do you think about to apply the attribute “__free(kvfree)” also in such
a function implementation by another update step?
https://elixir.bootlin.com/linux/v7.2-rc7/source/include/linux/slab.h#L1420
Regards,
Markus
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv
2026-08-17 14:01 ` [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv Triet Hoang
@ 2026-08-17 17:06 ` Markus Elfring
0 siblings, 0 replies; 12+ messages in thread
From: Markus Elfring @ 2026-08-17 17:06 UTC (permalink / raw)
To: Triet Hoang, dri-devel, Oded Gabbay, Tomeu Vizoso; +Cc: LKML, Igor Paunovic
…
> +++ b/drivers/accel/rocket/rocket_job.c
> @@ -514,8 +514,11 @@ int rocket_job_open(struct rocket_file_priv *rocket_priv)
> DRM_SCHED_PRIORITY_NORMAL,
> scheds,
> rdev->num_cores, NULL);
> +
> if (WARN_ON(ret))
> kfree(scheds);
…
Why do you think that an additional blank would be helpful at this place?
Regards,
Markus
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2026-08-17 17:06 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260817055315.C9AA41F000E9@smtp.kernel.org>
2026-08-17 7:20 ` [PATCH v2] drm/rocket: Check allocations before use Triet Hoang
2026-08-17 9:20 ` Markus Elfring
2026-08-17 9:31 ` [PATCH v3] " Triet Hoang
2026-08-17 9:55 ` Markus Elfring
2026-08-17 11:22 ` Triet Hoang
2026-08-17 9:30 ` [PATCH v2] " Igor Paunovic
2026-08-17 13:14 ` Triet Hoang
2026-08-17 14:01 ` [PATCH v4 1/2] " Triet Hoang
2026-08-17 14:01 ` [PATCH v4 2/2] drm/rocket: Keep scheduler allocation in rocket_file_priv Triet Hoang
2026-08-17 17:06 ` Markus Elfring
2026-08-17 16:40 ` [PATCH v4 1/2] drm/rocket: Check allocations before use Markus Elfring
2026-08-17 14:28 ` [PATCH v2] " Triet Hoang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox