Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Lakshay Piplani" <lakshay.piplani@nxp.com>
Cc: devicetree@vger.kernel.org, robh@kernel.org, Frank.Li@kernel.org,
	conor+dt@kernel.org, linux-i3c@lists.infradead.org,
	"Alexandre Belloni" <alexandre.belloni@bootlin.com>
Subject: Re: [PATCH v15 2/8] i3c: master: Add controller-only device operation helpers
Date: Mon, 17 Aug 2026 10:50:59 +0000	[thread overview]
Message-ID: <20260817105100.462311F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260817103844.2142802-3-lakshay.piplani@nxp.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [Low] Incomplete refactoring: `i3c_master_handle_ibi()` bypasses the newly introduced `i3c_dev_recycle_ibi_slot_controller()` helper.

Pre-existing issues:
- [High] Missing memory barrier in `i3c_dev_disable_ibi_locked` causes a lost wakeup and indefinite hang.
- [High] Use-after-free on error path in `i3c_dev_free_ibi_locked` when workqueue is drained after resources are freed.
--

--- Patch [2]: [PATCH v15 2/8] i3c: master: Add controller-only device operation helpers ---
commit 85e9cb3ce264f7889b2b4406bc379307ad054a14
Author: Lakshay Piplani <lakshay.piplani@nxp.com>

i3c: master: Add controller-only device operation helpers

The generic I3C device attach and IBI paths perform both core-level
bookkeeping and controller-specific operations. An I3C hub, however,
maintains a logical device descriptor on the virtual downstream bus and
a separate parent-facing descriptor used by the physical parent
controller.

>     Add helpers for:
>       - attaching, reattaching, and detaching a device from a controller;
>       - requesting and freeing controller IBI resources;
>       - enabling and disabling IBIs at the controller;
>       - recycling controller IBI slots.
>     
>     Refactor the existing generic core paths to use these helpers, keeping
>     the current behaviour unchanged for regular I3C devices.

[Severity: Low]
The commit message mentions refactoring the existing generic core paths to
use the new controller-only helpers, including the one for recycling IBI 
slots.

However, looking at the code for i3c_master_handle_ibi(), it appears to
still bypass the newly introduced wrapper:

drivers/i3c/master.c:i3c_master_handle_ibi() {
        ...
        if (master->ops->recycle_ibi_slot)
                master->ops->recycle_ibi_slot(dev, slot);
        ...
}

Does this function need to be updated to use 
i3c_dev_recycle_ibi_slot_controller() to ensure the virtual controllers
in the new I3C hub framework can properly intercept these operations?

> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 03fb41f0786c5..7ae6b3aaa9b4c 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c

[ ... ]

> @@ -3534,14 +3632,9 @@ EXPORT_SYMBOL_GPL(i3c_dev_do_xfers_locked);
>   */
>  int i3c_dev_disable_ibi_locked(struct i3c_dev_desc *dev)
>  {
> -	struct i3c_master_controller *master;
>  	int ret;
>  
> -	if (!dev->ibi)
> -		return -EINVAL;
> -
> -	master = i3c_dev_get_master(dev);
> -	ret = master->ops->disable_ibi(dev);
> +	ret = i3c_dev_disable_ibi_controller_locked(dev);
>  	if (ret)
>  		return ret;

[Severity: High]
This is a pre-existing issue, but does this sequence lack a memory barrier
before checking the pending IBIs?

Right after this return, the code does:

drivers/i3c/master.c:i3c_dev_disable_ibi_locked() {
        ...
        reinit_completion(&dev->ibi->all_ibis_handled);
        if (atomic_read(&dev->ibi->pending_ibis))
                wait_for_completion(&dev->ibi->all_ibis_handled);
        ...
}

Since reinit_completion() performs a plain store that can be delayed or
reordered after the atomic_read(), could a concurrent IBI worker
decrementing the pending count and calling complete() race with this?

If the worker executes between the load of pending_ibis and the delayed
store, could the store overwrite the completion state back to 0, causing
wait_for_completion() to hang indefinitely?

[ ... ]

> @@ -3667,7 +3835,7 @@ void i3c_dev_free_ibi_locked(struct i3c_dev_desc *dev)
>  			dev_err(&master->dev, "Failed to disable IBI before freeing\n");
>  	}
>  
> -	master->ops->free_ibi(dev);
> +	i3c_dev_free_ibi_controller_locked(dev);
>  
>  	if (dev->ibi->wq) {
>  		destroy_workqueue(dev->ibi->wq);

[Severity: High]
This is a pre-existing issue, but does this cleanup order create a
use-after-free risk during an error path?

If disabling the IBI fails (for example, due to a hardware timeout), the
error path continues and calls i3c_dev_free_ibi_controller_locked(),
which frees the underlying controller resources like the generic IBI pool.

Then destroy_workqueue() is called to drain the workqueue. If there are
pending or executing IBI works still in the workqueue, won't they try to
access the freed slot pool when they run, resulting in a use-after-free?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260817103844.2142802-1-lakshay.piplani@nxp.com?part=2

  reply	other threads:[~2026-08-17 10:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-17 10:38 [PATCH v15 0/8] Add support for NXP P3H2x4x I3C hub driver Lakshay Piplani
2026-08-17 10:38 ` [PATCH v15 1/8] i3c: master: Add APIs for I3C hub support Lakshay Piplani
2026-08-17 10:50   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 2/8] i3c: master: Add controller-only device operation helpers Lakshay Piplani
2026-08-17 10:50   ` sashiko-bot [this message]
2026-08-17 10:38 ` [PATCH v15 3/8] dt-bindings: i3c: Add NXP P3H2x4x i3c-hub support Lakshay Piplani
2026-08-17 10:49   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 4/8] mfd: p3h2x4x: Add driver for NXP P3H2x4x i3c hub and on-die regulator Lakshay Piplani
2026-08-17 10:52   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 5/8] regulator: p3h2x4x: Add driver for on-die regulators in NXP P3H2x4x i3c hub Lakshay Piplani
2026-08-17 10:51   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 6/8] i3c: hub: Add support for the I3C interface in the I3C hub Lakshay Piplani
2026-08-17 10:53   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 7/8] i3c: hub: p3h2x4x: Add support for NXP P3H2x4x I3C hub functionality Lakshay Piplani
2026-08-17 10:51   ` sashiko-bot
2026-08-17 10:38 ` [PATCH v15 8/8] i3c: hub: p3h2x4x: Add SMBus slave mode support Lakshay Piplani
2026-08-17 11:04   ` sashiko-bot

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=20260817105100.462311F00A3D@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=Frank.Li@kernel.org \
    --cc=alexandre.belloni@bootlin.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=lakshay.piplani@nxp.com \
    --cc=linux-i3c@lists.infradead.org \
    --cc=robh@kernel.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox