From: sashiko-bot@kernel.org
To: "Igor Paunovic" <royalnet026@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Subject: Re: [PATCH] accel/rocket: number the cores by devicetree position, not bind order
Date: Sat, 05 Sep 2026 14:09:16 +0000 [thread overview]
Message-ID: <20260905140916.9247A1F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260905135612.7324-1-royalnet026@gmail.com>
Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
Pre-existing issues:
- [High] Global `rdev` pointer is left containing an `ERR_PTR` if `rocket_device_init()` fails, leading to a kernel panic on subsequent probes.
- [High] Unbinding a core (other than the last one) breaks `rdev->cores` array tracking, leading to resource leaks, missing remaining cores during lookup, and overwriting active cores on rebind.
- [High] Memory allocated via `devm_*` on `drm_dev->dev` in `rocket_device_init()` permanently leaks when all cores are unbound.
- [High] Global static variable `rdev` and its state (`rdev->num_cores`) are accessed and initialized without synchronization, leading to TOCTOU races during concurrent probing.
- [High] Premature `drm_dev_register()` inside `rocket_device_init()` exposes the device node to userspace before core initialization completes, leading to NULL pointer dereference on open.
- [High] The `scheds` array allocated in `rocket_job_open()` leaks if there is only 1 core or if `drm_sched_entity_init()` fails.
- [High] Unhandled errors in `rocket_ioctl_submit()` silently drop user jobs, causing implicit synchronization failures.
--
commit 536d84c08923eb208c65c6e48a6e81dd4a63e6f5
Author: Igor Paunovic <royalnet026@gmail.com>
accel/rocket: number the cores by devicetree position, not bind order
rocket_job_hw_submit() programs the S_POINTER registers of a core with an
extra bit derived from core->index, the way the vendor driver derives it
from the hardware number of the core. rocket_probe() sets core->index to
the slot the core takes in rdev->cores[], which is the order the cores
bind in.
> diff --git a/drivers/accel/rocket/rocket_drv.c b/drivers/accel/rocket/rocket_drv.c
> index 8bbbce594883e..e2cde31443ffa 100644
> --- a/drivers/accel/rocket/rocket_drv.c
> +++ b/drivers/accel/rocket/rocket_drv.c
[ ... ]
> @@ -157,10 +157,39 @@ static const struct drm_driver rocket_drm_driver = {
[ ... ]
> static int rocket_probe(struct platform_device *pdev)
> {
> + int index = rocket_core_hw_index(&pdev->dev);
> int ret;
>
> + if (index < 0)
> + return index;
> +
> if (rdev == NULL) {
> /* First core probing, initialize DRM device. */
> rdev = rocket_device_init(drm_dev, &rocket_drm_driver);
[Severity: High]
This is a pre-existing issue, but I noticed that memory allocated via devm_*
on drm_dev->dev in rocket_device_init() might leak.
When the last core is unbound, rocket_remove() calls rocket_device_fini()
and sets rdev to NULL, but drm_dev is not unregistered, so the attached
devm resources are not freed.
Will a subsequent bind cause a permanent memory leak?
Also, another pre-existing issue: is this global rdev accessed and modified
without synchronization? Concurrent probes might evaluate rdev == NULL and
race to double-initialize the DRM device.
> @@ -176,7 +205,7 @@ static int rocket_probe(struct platform_device *pdev)
>
> rdev->cores[core].rdev = rdev;
> rdev->cores[core].dev = &pdev->dev;
[Severity: High]
This is a pre-existing issue, but how does this array assignment handle
unbinds?
When rocket_remove() is called, it decrements rdev->num_cores without
compacting the array:
drivers/accel/rocket/rocket_drv.c:rocket_remove() {
...
rocket_core_fini(&rdev->cores[core]);
rdev->num_cores--;
...
}
If a core other than the last one is unbound, won't this overwrite an active
core when a new core probes and takes the slot at num_cores?
Additionally, find_core_for_dev() uses num_cores as an upper bound:
drivers/accel/rocket/rocket_drv.c:find_core_for_dev() {
for (unsigned int core = 0; core < rdev->num_cores; core++) {
if (dev == rdev->cores[core].dev)
return core;
}
...
}
Will it fail to find remaining active cores located beyond the shrunk
boundary?
> - rdev->cores[core].index = core;
> + rdev->cores[core].index = index;
>
> rdev->num_cores++;
[Severity: High]
This is a pre-existing issue, but might this unprotected increment of the
shared state lead to desynchronization and array bounds violations during
concurrent probing?
[ ... ]
Some other pre-existing issues were noticed during review:
[Severity: High]
If rocket_device_init() fails, it returns an ERR_PTR which is left in the
global rdev pointer:
drivers/accel/rocket/rocket_drv.c:rocket_probe() {
...
if (rdev == NULL) {
rdev = rocket_device_init(drm_dev, &rocket_drm_driver);
if (IS_ERR(rdev)) {
...
return PTR_ERR(rdev);
}
}
unsigned int core = rdev->num_cores;
...
}
Could this leave rdev holding a poisoned pointer instead of NULL? If rdev
holds a poisoned ERR_PTR from a previous probe failure, will the subsequent
access to rdev->num_cores dereference it and cause a kernel panic?
[Severity: High]
Does rocket_device_init() expose the device node to userspace prematurely?
drivers/accel/rocket/rocket_device.c:rocket_device_init() {
...
err = drm_dev_register(ddev, 0);
if (err)
return ERR_PTR(err);
...
}
If userspace intercepts the registration and immediately invokes open(),
could rocket_open() access an uninitialized core dev pointer?
drivers/accel/rocket/rocket_drv.c:rocket_open() {
...
rocket_priv->domain = rocket_iommu_domain_create(rdev->cores[0].dev);
...
}
Since the core properties are not assigned until later in rocket_probe(),
will this panic when trying to allocate a domain?
[Severity: High]
Does the scheds array allocated in rocket_job_open() leak if
rdev->num_cores == 1?
drivers/accel/rocket/rocket_job.c:rocket_job_open() {
...
struct drm_gpu_scheduler **scheds = kmalloc_objs(*scheds,
rdev->num_cores);
...
ret = drm_sched_entity_init(&rocket_priv->sched_entity,
DRM_SCHED_PRIORITY_NORMAL,
scheds,
rdev->num_cores, NULL);
...
}
If num_cores is 1, drm_sched_entity_init() intentionally sets
entity->sched_list to NULL instead of storing the array. Then during close:
drivers/accel/rocket/rocket_job.c:rocket_job_close() {
...
kfree(entity->sched_list);
...
}
Doesn't this incorrectly assume entity->sched_list always holds the pointer,
causing a leak when num_cores == 1 or if drm_sched_entity_init() fails?
[Severity: High]
Are job submission errors ignored in rocket_ioctl_submit()?
drivers/accel/rocket/rocket_job.c:rocket_ioctl_submit() {
...
for (i = 0; i < args->job_count; i++)
rocket_ioctl_submit_job(dev, file, &jobs[i]);
...
}
If rocket_ioctl_submit_job() fails, the loop blindly discards its error
return value. Will this silently drop user jobs and cause implicit
synchronization failures since the output fences are never injected?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260905135612.7324-1-royalnet026@gmail.com?part=1
prev parent reply other threads:[~2026-09-05 14:09 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-05 13:56 [PATCH] accel/rocket: number the cores by devicetree position, not bind order Igor Paunovic
2026-09-05 13:56 ` Igor Paunovic
2026-09-05 14:09 ` sashiko-bot [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260905140916.9247A1F00A3D@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=royalnet026@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.