| From 9a976949613132977098fc49510b46fa8678d864 Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Mon, 21 Oct 2019 11:48:06 -0400 |
| Subject: usb-storage: Revert commit 747668dbc061 ("usb-storage: Set virt_boundary_mask to avoid SG overflows") |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit 9a976949613132977098fc49510b46fa8678d864 upstream. |
| |
| Commit 747668dbc061 ("usb-storage: Set virt_boundary_mask to avoid SG |
| overflows") attempted to solve a problem involving scatter-gather I/O |
| and USB/IP by setting the virt_boundary_mask for mass-storage devices. |
| |
| However, it now turns out that this interacts badly with commit |
| 09324d32d2a0 ("block: force an unlimited segment size on queues with a |
| virt boundary"), which was added later. A typical error message is: |
| |
| ehci-pci 0000:00:13.2: swiotlb buffer is full (sz: 327680 bytes), |
| total 32768 (slots), used 97 (slots) |
| |
| There is no longer any reason to keep the virt_boundary_mask setting |
| for usb-storage. It was needed in the first place only for handling |
| devices with a block size smaller than the maxpacket size and where |
| the host controller was not capable of fully general scatter-gather |
| operation (that is, able to merge two SG segments into a single USB |
| packet). But: |
| |
| High-speed or slower connections never use a bulk maxpacket |
| value larger than 512; |
| |
| The SCSI layer does not handle block devices with a block size |
| smaller than 512 bytes; |
| |
| All the host controllers capable of SuperSpeed operation can |
| handle fully general SG; |
| |
| Since commit ea44d190764b ("usbip: Implement SG support to |
| vhci-hcd and stub driver") was merged, the USB/IP driver can |
| also handle SG. |
| |
| Therefore all supported device/controller combinations should be okay |
| with no need for any special virt_boundary_mask. So in order to fix |
| the swiotlb problem, this patch reverts commit 747668dbc061. |
| |
| Reported-and-tested-by: Piergiorgio Sartor <piergiorgio.sartor@nexgo.de> |
| Link: https://marc.info/?l=linux-usb&m=157134199501202&w=2 |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| CC: Seth Bollinger <Seth.Bollinger@digi.com> |
| CC: <stable@vger.kernel.org> |
| Fixes: 747668dbc061 ("usb-storage: Set virt_boundary_mask to avoid SG overflows") |
| Acked-by: Christoph Hellwig <hch@lst.de> |
| Link: https://lore.kernel.org/r/Pine.LNX.4.44L0.1910211145520.1673-100000@iolanthe.rowland.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/storage/scsiglue.c | 10 ---------- |
| 1 file changed, 10 deletions(-) |
| |
| --- a/drivers/usb/storage/scsiglue.c |
| +++ b/drivers/usb/storage/scsiglue.c |
| @@ -81,7 +81,6 @@ static const char* host_info(struct Scsi |
| static int slave_alloc (struct scsi_device *sdev) |
| { |
| struct us_data *us = host_to_us(sdev->host); |
| - int maxp; |
| |
| /* |
| * Set the INQUIRY transfer length to 36. We don't use any of |
| @@ -91,15 +90,6 @@ static int slave_alloc (struct scsi_devi |
| sdev->inquiry_len = 36; |
| |
| /* |
| - * USB has unusual scatter-gather requirements: the length of each |
| - * scatterlist element except the last must be divisible by the |
| - * Bulk maxpacket value. Fortunately this value is always a |
| - * power of 2. Inform the block layer about this requirement. |
| - */ |
| - maxp = usb_maxpacket(us->pusb_dev, us->recv_bulk_pipe, 0); |
| - blk_queue_virt_boundary(sdev->request_queue, maxp - 1); |
| - |
| - /* |
| * Some host controllers may have alignment requirements. |
| * We'll play it safe by requiring 512-byte alignment always. |
| */ |