Linux-i3c Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI
@ 2026-08-10  1:30 Stanley Chu
  2026-08-10  1:43 ` sashiko-bot
  2026-08-10 18:27 ` Mukesh Savaliya
  0 siblings, 2 replies; 3+ messages in thread
From: Stanley Chu @ 2026-08-10  1:30 UTC (permalink / raw)
  To: frank.li, miquel.raynal, alexandre.belloni, linux-i3c
  Cc: linux-kernel, tomer.maimon, kwliu, yschu

From: Stanley Chu <yschu@nuvoton.com>

The IBI (In-Band Interrupt) workqueue is allocated with only
WQ_MEM_RECLAIM, which places IBI payload processing at normal
worker priority. This is inadequate given the time-sensitive
nature of IBI handling.

In the I3C protocol, when a target asserts an IBI, the SDA line
is held low until the master acknowledges and completes the
exchange. The IRQ handler (top half) ACKs the IBI, reads the
payload, emits a STOP, and immediately queues the payload
processing to the per-device ordered workqueue via
i3c_master_queue_ibi() — effectively the bottom half of the
IBI interrupt path.

If this workqueue worker is delayed by competing normal-priority
tasks, the IBI notification reaches the client driver late. For
latency-sensitive clients (e.g. sensors reporting alerts,
hotplug events), this defeats the purpose of using IBI over
polling. Furthermore, because the ordered workqueue serialises
slots, a backlog of delayed slots can exhaust the pre-allocated
IBI slot pool, causing subsequent IBIs to be dropped at the
hardware level.

Add WQ_HIGHPRI to ensure IBI bottom-half work is scheduled
promptly after the top-half IRQ handler enqueues it, keeping
the IBI processing pipeline consistent with the interrupt-like
semantics the protocol demands.

Signed-off-by: Stanley Chu <yschu@nuvoton.com>
---
 drivers/i3c/master.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
index f1be38a640ca..8fdd67a031ff 100644
--- a/drivers/i3c/master.c
+++ b/drivers/i3c/master.c
@@ -3505,7 +3505,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);
 	if (!ibi->wq) {
 		kfree(ibi);
 		return -ENOMEM;
-- 
2.34.1


-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI
  2026-08-10  1:30 [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI Stanley Chu
@ 2026-08-10  1:43 ` sashiko-bot
  2026-08-10 18:27 ` Mukesh Savaliya
  1 sibling, 0 replies; 3+ messages in thread
From: sashiko-bot @ 2026-08-10  1:43 UTC (permalink / raw)
  To: Stanley Chu; +Cc: Frank.Li, linux-i3c, Alexandre Belloni

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@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

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI
  2026-08-10  1:30 [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI Stanley Chu
  2026-08-10  1:43 ` sashiko-bot
@ 2026-08-10 18:27 ` Mukesh Savaliya
  1 sibling, 0 replies; 3+ messages in thread
From: Mukesh Savaliya @ 2026-08-10 18:27 UTC (permalink / raw)
  To: Stanley Chu, frank.li, miquel.raynal, alexandre.belloni,
	linux-i3c
  Cc: linux-kernel, tomer.maimon, kwliu, yschu



On 8/10/2026 7:00 AM, Stanley Chu wrote:
> From: Stanley Chu <yschu@nuvoton.com>
> 
> The IBI (In-Band Interrupt) workqueue is allocated with only
> WQ_MEM_RECLAIM, which places IBI payload processing at normal
> worker priority. This is inadequate given the time-sensitive
> nature of IBI handling.
> 
> In the I3C protocol, when a target asserts an IBI, the SDA line
> is held low until the master acknowledges and completes the
> exchange. The IRQ handler (top half) ACKs the IBI, reads the
> payload, emits a STOP, and immediately queues the payload
> processing to the per-device ordered workqueue via
> i3c_master_queue_ibi() — effectively the bottom half of the
> IBI interrupt path.
> 
> If this workqueue worker is delayed by competing normal-priority
> tasks, the IBI notification reaches the client driver late. For
> latency-sensitive clients (e.g. sensors reporting alerts,
> hotplug events), this defeats the purpose of using IBI over
> polling. Furthermore, because the ordered workqueue serialises
> slots, a backlog of delayed slots can exhaust the pre-allocated
> IBI slot pool, causing subsequent IBIs to be dropped at the
> hardware level.
> 
> Add WQ_HIGHPRI to ensure IBI bottom-half work is scheduled
> promptly after the top-half IRQ handler enqueues it, keeping
> the IBI processing pipeline consistent with the interrupt-like
> semantics the protocol demands.
> 
> Signed-off-by: Stanley Chu <yschu@nuvoton.com>
> ---

Acked-by: Mukesh Kumar Savaliya <mukesh.savaliya@oss.qualcomm.com>

-- 
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-08-10 18:27 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-10  1:30 [PATCH v1] i3c: master: allocate IBI workqueue with WQ_HIGHPRI Stanley Chu
2026-08-10  1:43 ` sashiko-bot
2026-08-10 18:27 ` Mukesh Savaliya

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox