LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH RESEND] usb: dwc2: avoid leaking DMA channels on disconnection
@ 2015-03-15 20:24 Vincent Palatin
  2015-03-16  9:48 ` Yunzhi Li
  0 siblings, 1 reply; 3+ messages in thread
From: Vincent Palatin @ 2015-03-15 20:24 UTC (permalink / raw)
  To: linux-usb, LKML
  Cc: Doug Anderson, Julius Werner, Yunzhi Li, Greg Kroah-Hartman,
	John Youn, Vincent Palatin

When the HCD is disconnected, the DMA transfers still in-flight were cleaned-up
but the count of available DMA channels (e.g. available_host_channels) was not
reset.
The pool of DMA channels can be depleted when doing unclean
disconnection of USB peripherals, and reaches the point where no
transfer was possible until the next reboot/reload of the driver.

Tested by putting a programmable USB mux on the port and randomly
plugging/unpluging a USB HUB with USB mass-storage key, USB-audio and
USB-ethernet dongle connected to its downstream ports, and also doing the
disconnection early while the devices are still enumerating to get more URBs
in-flight.
After the patch, the devices are still enumerating after thousands of cycles,
while the port was totally dead before.

Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
---
I'm re-sending it, it seems the previous email did not show up.

 drivers/usb/dwc2/hcd.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index c78c874..559b55e 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -257,6 +257,14 @@ static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
 		 */
 		channel->qh = NULL;
 	}
+	/* All channels have been freed, mark them available */
+	if (hsotg->core_params->uframe_sched > 0) {
+		hsotg->available_host_channels =
+			hsotg->core_params->host_channels;
+	} else {
+		hsotg->non_periodic_channels = 0;
+		hsotg->periodic_channels = 0;
+	}
 }
 
 /**
-- 
2.2.0.rc0.207.ga3a616c


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

* Re: [PATCH RESEND] usb: dwc2: avoid leaking DMA channels on disconnection
  2015-03-15 20:24 [PATCH RESEND] usb: dwc2: avoid leaking DMA channels on disconnection Vincent Palatin
@ 2015-03-16  9:48 ` Yunzhi Li
  2015-03-17  2:06   ` John Youn
  0 siblings, 1 reply; 3+ messages in thread
From: Yunzhi Li @ 2015-03-16  9:48 UTC (permalink / raw)
  To: Vincent Palatin, linux-usb, LKML
  Cc: Doug Anderson, Julius Werner, Greg Kroah-Hartman, John Youn

Hi
> When the HCD is disconnected, the DMA transfers still in-flight were cleaned-up
> but the count of available DMA channels (e.g. available_host_channels) was not
> reset.
> The pool of DMA channels can be depleted when doing unclean
> disconnection of USB peripherals, and reaches the point where no
> transfer was possible until the next reboot/reload of the driver.
>
> Tested by putting a programmable USB mux on the port and randomly
> plugging/unpluging a USB HUB with USB mass-storage key, USB-audio and
> USB-ethernet dongle connected to its downstream ports, and also doing the
> disconnection early while the devices are still enumerating to get more URBs
> in-flight.
> After the patch, the devices are still enumerating after thousands of cycles,
> while the port was totally dead before.
>
> Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
> ---
> I'm re-sending it, it seems the previous email did not show up.
>
>   drivers/usb/dwc2/hcd.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
>
> diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
> index c78c874..559b55e 100644
> --- a/drivers/usb/dwc2/hcd.c
> +++ b/drivers/usb/dwc2/hcd.c
> @@ -257,6 +257,14 @@ static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
>   		 */
>   		channel->qh = NULL;
>   	}
> +	/* All channels have been freed, mark them available */
> +	if (hsotg->core_params->uframe_sched > 0) {
> +		hsotg->available_host_channels =
> +			hsotg->core_params->host_channels;
> +	} else {
> +		hsotg->non_periodic_channels = 0;
> +		hsotg->periodic_channels = 0;
> +	}
>   }
>   
>   /**

I have reviewed this patch. Obviously,it makes sense.

Reviewed-by: Yunzhi Li <lyz@rock-chips.com>


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

* Re: [PATCH RESEND] usb: dwc2: avoid leaking DMA channels on disconnection
  2015-03-16  9:48 ` Yunzhi Li
@ 2015-03-17  2:06   ` John Youn
  0 siblings, 0 replies; 3+ messages in thread
From: John Youn @ 2015-03-17  2:06 UTC (permalink / raw)
  To: Yunzhi Li, Vincent Palatin, linux-usb, LKML, balbi
  Cc: Doug Anderson, Julius Werner, Greg Kroah-Hartman, John Youn

On 3/16/2015 2:50 AM, Yunzhi Li wrote:
> Hi
>> When the HCD is disconnected, the DMA transfers still in-flight were cleaned-up
>> but the count of available DMA channels (e.g. available_host_channels) was not
>> reset.
>> The pool of DMA channels can be depleted when doing unclean
>> disconnection of USB peripherals, and reaches the point where no
>> transfer was possible until the next reboot/reload of the driver.
>>
>> Tested by putting a programmable USB mux on the port and randomly
>> plugging/unpluging a USB HUB with USB mass-storage key, USB-audio and
>> USB-ethernet dongle connected to its downstream ports, and also doing the
>> disconnection early while the devices are still enumerating to get more URBs
>> in-flight.
>> After the patch, the devices are still enumerating after thousands of cycles,
>> while the port was totally dead before.
>>
>> Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
>> ---
>> I'm re-sending it, it seems the previous email did not show up.
>>
>>   drivers/usb/dwc2/hcd.c | 8 ++++++++
>>   1 file changed, 8 insertions(+)
>>
>> diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
>> index c78c874..559b55e 100644
>> --- a/drivers/usb/dwc2/hcd.c
>> +++ b/drivers/usb/dwc2/hcd.c
>> @@ -257,6 +257,14 @@ static void dwc2_hcd_cleanup_channels(struct dwc2_hsotg *hsotg)
>>   		 */
>>   		channel->qh = NULL;
>>   	}
>> +	/* All channels have been freed, mark them available */
>> +	if (hsotg->core_params->uframe_sched > 0) {
>> +		hsotg->available_host_channels =
>> +			hsotg->core_params->host_channels;
>> +	} else {
>> +		hsotg->non_periodic_channels = 0;
>> +		hsotg->periodic_channels = 0;
>> +	}
>>   }
>>   
>>   /**
> 
> I have reviewed this patch. Obviously,it makes sense.
> 
> Reviewed-by: Yunzhi Li <lyz@rock-chips.com>


Acked-by: John Youn <johnyoun@synopsys.com>




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

end of thread, other threads:[~2015-03-17  2:06 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-15 20:24 [PATCH RESEND] usb: dwc2: avoid leaking DMA channels on disconnection Vincent Palatin
2015-03-16  9:48 ` Yunzhi Li
2015-03-17  2:06   ` John Youn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).