Re: [PATCH v2] usb: dwc3: core: Prevent USB core invalid event buffer address access

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Aug 08, 2024, Selvarasu Ganesan wrote:
> This commit addresses an issue where the USB core could access an
> invalid event buffer address during runtime suspend, potentially causing
> SMMU faults and other memory issues. The problem arises from the
> following sequence.
>         1. In dwc3_gadget_suspend, there is a chance of a timeout when
>         moving the USB core to the halt state after clearing the
>         run/stop bit by software.
>         2. In dwc3_core_exit, the event buffer is cleared regardless of
>         the USB core's status, which may lead to an SMMU faults and

This is a workaround to your specific setup behavior. Please document in
the commit message which platforms are impacted.

>         other memory issues. if the USB core tries to access the event
>         buffer address.
> 
> To prevent this issue, this commit ensures that the event buffer address
> is not cleared by software  when the USB core is active during runtime
> suspend by checking its status before clearing the buffer address.
> 
> Cc: stable@xxxxxxxxxxxxxxx

We can keep the stable tag, but there's no issue with the commit below.

> Fixes: 89d7f9629946 ("usb: dwc3: core: Skip setting event buffers for host only controllers")
> Signed-off-by: Selvarasu Ganesan <selvarasu.g@xxxxxxxxxxx>
> ---
> 
> Changes in v2:
> - Added separate check for USB controller status before cleaning the
>   event buffer.
> - Link to v1: https://urldefense.com/v3/__https://lore.kernel.org/lkml/20240722145617.537-1-selvarasu.g@xxxxxxxxxxx/__;!!A4F2R9G_pg!cvZmnaxTWtJKR4ZDRZDa-8mvxpvkf5KPx57IwSXTSEtEFIVkPullR7sTYP0AM9de0xFbHLKdM_5jzBUiBL3f9SuioYE$ 
> ---
>  drivers/usb/dwc3/core.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 734de2a8bd21..5b67d9bca71b 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -564,10 +564,15 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc)
>  void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
>  {
>  	struct dwc3_event_buffer	*evt;
> +	u32				reg;
>  
>  	if (!dwc->ev_buf)
>  		return;
>  

Please add comment here why we need this and which platform is impacted
should we need to go back and test.

> +	reg = dwc3_readl(dwc->regs, DWC3_DSTS);
> +	if (!(reg & DWC3_DSTS_DEVCTRLHLT))
> +		return;
> +
>  	evt = dwc->ev_buf;
>  
>  	evt->lpos = 0;
> -- 
> 2.17.1
> 

Thanks,
Thinh




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux