diff mbox series

usbip: Accept arbitrarily long scatter-gather list

Message ID 20241218161344.202637-1-jasonlongball@gmail.com (mailing list archive)
State New
Headers show
Series usbip: Accept arbitrarily long scatter-gather list | expand

Commit Message

Jason Long Dec. 18, 2024, 4:13 p.m. UTC
Fixes issue where memory will fail to be allocated for larger bulk
transfers, ~1 MB or more. This occurs because userland libraries, such
as libusb, send the entire USB data buffer when SG support is detected.
The assumption is that the driver knows how to properly split the data
up before sending it out.

By hardcoding a limit, bigger transfers that exceed the SG tablesize
limit of 32 will be unable to use SG. This results in an attempt to
allocate contiguous pages which, unsurprisingly, will fail too and
returns an ENOMEM. It looks like other drivers that support SG allow for
any length of SG lists. Accepting any SG size allows the driver to
properly handle large bulk transfer situations.

Tested bulk read and write operations using the following devices:

 - Logitech Webcam Pro 9000 - USB 2.0
 - SanDisk Ultra - USB 3.0
 - Logitech M500s Mouse

Signed-off-by: Jason Long <jasonlongball@gmail.com>
---
 drivers/usb/usbip/vhci_hcd.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

Comments

Shuah Khan Dec. 20, 2024, 5:24 p.m. UTC | #1
On 12/18/24 09:13, Jason Long wrote:
> Fixes issue where memory will fail to be allocated for larger bulk
> transfers, ~1 MB or more. This occurs because userland libraries, such
> as libusb, send the entire USB data buffer when SG support is detected.
> The assumption is that the driver knows how to properly split the data
> up before sending it out.
> 
> By hardcoding a limit, bigger transfers that exceed the SG tablesize
> limit of 32 will be unable to use SG. This results in an attempt to
> allocate contiguous pages which, unsurprisingly, will fail too and
> returns an ENOMEM. It looks like other drivers that support SG allow for
> any length of SG lists. Accepting any SG size allows the driver to
> properly handle large bulk transfer situations.
> 
> Tested bulk read and write operations using the following devices:
> 
>   - Logitech Webcam Pro 9000 - USB 2.0
>   - SanDisk Ultra - USB 3.0
>   - Logitech M500s Mouse
> 
> Signed-off-by: Jason Long <jasonlongball@gmail.com>
> ---
>   drivers/usb/usbip/vhci_hcd.c | 8 ++------
>   1 file changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
> index b03e5021c..2f722849d 100644
> --- a/drivers/usb/usbip/vhci_hcd.c
> +++ b/drivers/usb/usbip/vhci_hcd.c
> @@ -1161,12 +1161,8 @@ static int vhci_setup(struct usb_hcd *hcd)
>   		hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
>   	}
>   
> -	/*
> -	 * Support SG.
> -	 * sg_tablesize is an arbitrary value to alleviate memory pressure
> -	 * on the host.
> -	 */
> -	hcd->self.sg_tablesize = 32;
> +	/* accept arbitrarily long scatter-gather lists */
> +	hcd->self.sg_tablesize = ~0;
>   	hcd->self.no_sg_constraint = 1;
>   
>   	return 0;

Looks good to me. We have other drivers that do the same.

Reviewed-by: Shuah Khan <skhan@linuxfoundation.org>

Greg, please pick this up.

thanks,
-- Shuah
diff mbox series

Patch

diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c
index b03e5021c..2f722849d 100644
--- a/drivers/usb/usbip/vhci_hcd.c
+++ b/drivers/usb/usbip/vhci_hcd.c
@@ -1161,12 +1161,8 @@  static int vhci_setup(struct usb_hcd *hcd)
 		hcd->self.root_hub->speed = USB_SPEED_SUPER_PLUS;
 	}
 
-	/*
-	 * Support SG.
-	 * sg_tablesize is an arbitrary value to alleviate memory pressure
-	 * on the host.
-	 */
-	hcd->self.sg_tablesize = 32;
+	/* accept arbitrarily long scatter-gather lists */
+	hcd->self.sg_tablesize = ~0;
 	hcd->self.no_sg_constraint = 1;
 
 	return 0;