[PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI
sashiko-bot at kernel.org
sashiko-bot at kernel.org
Sun Aug 9 18:43:39 PDT 2026
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Race condition in `i3c_dev_free_ibi_locked()` allows a top-half IRQ handler to cause a use-after-free and NULL pointer dereference.
--
--- Patch [1]: [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI ---
commit 9b5ec34ca4a070587e40145288be3b34ce061d58
Author: Stanley Chu <yschu at nuvoton.com>
i3c: master: allocate IBI workqueue with WQ_HIGHPRI
This commit adds the WQ_HIGHPRI flag to the IBI (In-Band Interrupt) workqueue
allocation in the I3C master driver. This ensures that IBI bottom-half work
is scheduled promptly, avoiding latency issues for sensitive clients that
could occur if processed at normal worker priority.
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index afcd7a21a3e66..4fa90013290f1 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -3945,7 +3945,8 @@ int i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev,
> if (!ibi)
> return -ENOMEM;
>
> - ibi->wq = alloc_ordered_workqueue(dev_name(i3cdev_to_dev(dev->dev)), WQ_MEM_RECLAIM);
> + ibi->wq = alloc_ordered_workqueue(dev_name(i3cdev_to_dev(dev->dev)),
> + WQ_MEM_RECLAIM | WQ_HIGHPRI);
[Severity: High]
This isn't a bug introduced by this patch, but is there a race condition in
i3c_dev_free_ibi_locked() when tearing down this workqueue?
When an I3C device driver frees its IBI (e.g. during unbind),
i3c_dev_free_ibi_locked() destroys the workqueue and frees dev->ibi. However,
there is no synchronize_irq() to wait for executing master controller IRQ
handlers to finish.
A concurrently executing IRQ handler can read the device descriptor, be briefly
delayed, and then invoke i3c_master_queue_ibi():
drivers/i3c/master.c:i3c_master_queue_ibi() {
...
atomic_inc(&dev->ibi->pending_ibis);
queue_work(dev->ibi->wq, &slot->work);
...
}
If this happens after i3c_dev_free_ibi_locked() has already destroyed the
workqueue and freed dev->ibi:
drivers/i3c/master.c:i3c_dev_free_ibi_locked() {
...
if (dev->ibi->wq) {
destroy_workqueue(dev->ibi->wq);
dev->ibi->wq = NULL;
}
kfree(dev->ibi);
dev->ibi = NULL;
...
}
Could this lead to a use-after-free and NULL pointer dereference when accessing
dev->ibi->wq inside queue_work()?
> if (!ibi->wq) {
> kfree(ibi);
> return -ENOMEM;
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260810013059.3055787-1-yschu@nuvoton.com?part=1
More information about the linux-i3c
mailing list