Re: usb core: Let usb_sg_init to set transfer_buffer more often

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

 



Hello.

Pete Zaitcev wrote:

This fix permits the "new" usbmon to access usb-storage's data buffer
without DMA remapping tricks. It should be compatible with PIO controllers
and not add any new crashes. Note that from now on PIO controllers and
usbmon are uniform in their access pattern and if one crashes then
the other will too. Hopefuly neither does.

As a side effect, we get rid for #ifdefs, which were a little ugly.

Signed-off-by: Pete Zaitcev <zaitcev@xxxxxxxxxx>

diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index b626283..1686784 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -421,30 +421,21 @@ int usb_sg_init(struct usb_sg_request *io, struct usb_device *dev,
 		/*
 		 * Some systems need to revert to PIO when DMA is temporarily
 		 * unavailable.  For their sakes, both transfer_buffer and
-		 * transfer_dma are set when possible.  However this can only
-		 * work on systems without:
+		 * transfer_dma are set when possible.
 		 *
-		 *  - HIGHMEM, since DMA buffers located in high memory are
-		 *    not directly addressable by the CPU for PIO;
-		 *
-		 *  - IOMMU, since dma_map_sg() is allowed to use an IOMMU to
-		 *    make virtually discontiguous buffers be "dma-contiguous"
-		 *    so that PIO and DMA need diferent numbers of URBs.
-		 *
-		 * So when HIGHMEM or IOMMU are in use, transfer_buffer is NULL
-		 * to prevent stale pointers and to help spot bugs.
+		 * Note that if IOMMU coalescing occurred, we cannot
+		 * trust sg_page anymore, so check if S/G list shrunk.
 		 */
+		if (io->nents == io->entries && !PageHighMem(sg_page(sg))) {
+			io->urbs[i]->transfer_buffer = sg_virt(sg);
+		} else {
+			io->urbs[i]->transfer_buffer = NULL;
+		}

WARNING: braces {} are not necessary for any arm of this statement
#46: FILE: drivers/usb/core/message.c:429:
+               if (io->nents == io->entries && !PageHighMem(sg_page(sg))) {
[...]
+               } else {
[...]

total: 0 errors, 1 warnings, 38 lines checked

usb-core-let-usb_sg_init-to-set-transfer_buffer-more-often.patch has style problems, please review. If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux