From: "Elvira Khabirova" <lineprinter0@gmail.com>
To: <sashiko-reviews@lists.linux.dev>,
"Elvira Khabirova" <lineprinter0@gmail.com>
Cc: <linux-usb@vger.kernel.org>
Subject: Re: [PATCH v3 2/2] usb: musb: gadget: don't flush a waiting RX packet when queueing a request
Date: Sat, 07 Nov 2026 19:23:03 +0100 [thread overview]
Message-ID: <DMP6SD3R8V63.29JPIY8YRRCIS@gmail.com> (raw)
In-Reply-To: <sashiko-outbox-203154@kernel.org>
On Sat Nov 7, 2026 at 7:11 PM CET, sashiko-bot wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue to consider:
> - [Medium] usb: musb: gadget: premature and unlocked rx_kick queueing in
> musb_resume()
> --
>
> commit c9ae36b9b6933c41b159c85ef258637f80341755
> Author: Elvira Khabirova <lineprinter0@gmail.com>
>
> usb: musb: gadget: don't flush a waiting RX packet when queueing a request
>
> This commit replaces the RX FIFO flush in musb_ep_restart() with a
> system_bh_wq work item (rx_kick) to process waiting RX packets when a
> request is queued or after an in-progress giveback finishes.
>
>> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
>> index 73ac25f53698f..38469727acc6f 100644
>> --- a/drivers/usb/musb/musb_core.c
>> +++ b/drivers/usb/musb/musb_core.c
> [ ... ]
>> @@ -2866,6 +2868,7 @@ static int musb_resume(struct device *dev)
>> if ((devctl & mask) != (musb->context.devctl & mask))
>> musb->port1_status = 0;
>>
>> + musb_gadget_enable_rx_kicks(musb);
>> musb_enable_interrupts(musb);
>> musb_platform_enable(musb);
>>
>> diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
>> index b500e0d8b0bd3..08bb605aa0b31 100644
>> --- a/drivers/usb/musb/musb_gadget.c
>> +++ b/drivers/usb/musb/musb_gadget.c
> [ ... ]
>> +static void musb_g_enable_rx_kick(struct musb *musb, struct musb_ep *musb_ep)
>> +{
>> + if (!musb_ep->rx_kick.func)
>> + return;
>> +
>> + enable_work(&musb_ep->rx_kick);
>> + if (musb_ep->desc && !musb_ep->is_in) {
>> + pm_runtime_get_noresume(musb->controller);
>> + if (!queue_work(system_bh_wq, &musb_ep->rx_kick))
>> + pm_runtime_put_noidle(musb->controller);
>> + }
>> +}
>> +
>> +void musb_gadget_enable_rx_kicks(struct musb *musb)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < musb->nr_endpoints; i++) {
>> + musb_g_enable_rx_kick(musb, &musb->endpoints[i].ep_in);
>> + musb_g_enable_rx_kick(musb, &musb->endpoints[i].ep_out);
>> + }
>> +}
>
> [Severity: Medium]
> Can calling musb_gadget_enable_rx_kicks() unlocked before
> musb_enable_interrupts() and musb_platform_enable() in musb_resume()
> wedge an OUT endpoint or race on endpoint and interrupt state?
>
> During system suspend, musb_suspend() calls pm_runtime_get_sync() (leaving
> musb->is_runtime_suspended at 0) and musb_disable_interrupts(), which
> zeros musb->intrtxe, musb->intrrxe, MUSB_INTRTXE, and MUSB_INTRRXE. On
> resume, musb_restore_context() writes those zeroed masks back to hardware
> before musb_gadget_enable_rx_kicks() queues rx_kick on system_bh_wq:
>
> CPU0 CPU1 (system_bh_wq)
> musb_resume()
> musb_restore_context()
> /* MUSB_INTRRXE is 0 */
> musb_gadget_enable_rx_kicks()
> queue_work(..., &musb_ep->rx_kick)
> musb_g_rx_kick()
> musb_g_rx()
> rxstate()
> /* clears RXPKTRDY */
> /* next host packet arrives while
> * MUSB_INTRRXE == 0 or platform
> * interrupts are still disabled
> * <-- IRQ lost, endpoint wedged */
> musb_enable_interrupts()
> musb_platform_enable()
>
> In addition, musb_g_enable_rx_kick() inspects musb_ep->desc and
> musb_ep->is_in without holding musb->lock, and if musb_g_rx_kick()
> completes a request via musb_g_giveback() before musb_enable_interrupts()
> runs, the gadget completion callback (or a thread it wakes) can call
> usb_ep_enable() or usb_ep_disable() and modify musb->intrrxe,
> musb->intrtxe, and musb_ep->desc concurrently with the unlocked loop in
> musb_gadget_enable_rx_kicks() and musb_enable_interrupts().
>
> Calling musb_gadget_enable_rx_kicks() under musb->lock (or splitting
> enable_work() from queuing rx_kick under musb->lock) after
> musb_enable_interrupts() and musb_platform_enable() would avoid this.
Makes sense. Will be back with a v4 shortly.
prev parent reply other threads:[~2026-11-07 18:23 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-07 17:35 [PATCH v3 0/2] usb: musb: gadget: don't flush a waiting RX packet Elvira Khabirova
2026-11-07 17:36 ` [PATCH v3 1/2] usb: musb: gadget: count givebacks in busy Elvira Khabirova
2026-11-07 17:54 ` sashiko-bot
2026-11-07 17:36 ` [PATCH v3 2/2] usb: musb: gadget: don't flush a waiting RX packet when queueing a request Elvira Khabirova
2026-11-07 18:11 ` sashiko-bot
2026-11-07 18:23 ` Elvira Khabirova [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=DMP6SD3R8V63.29JPIY8YRRCIS@gmail.com \
--to=lineprinter0@gmail.com \
--cc=linux-usb@vger.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