svn commit: r349895 - head/sys/dev/isci

Warner Losh imp at FreeBSD.org
Wed Jul 10 22:24:01 UTC 2019


Author: imp
Date: Wed Jul 10 22:23:59 2019
New Revision: 349895
URL: https://svnweb.freebsd.org/changeset/base/349895

Log:
  Enforce a 4GB DMA boundary on isci(4)
  
  This device cannot cross a 4GB boundary with DMA.  Removing the
  boundary in r346386 resulted in low frequency memory corruption on
  machines with isci(4) controllers.
  
  Submitted by: gallatin@
  Sponsored by: Netflix
  Differential Revision: https://reviews.freebsd.org/D20910

Modified:
  head/sys/dev/isci/isci.c
  head/sys/dev/isci/isci.h
  head/sys/dev/isci/isci_controller.c

Modified: head/sys/dev/isci/isci.c
==============================================================================
--- head/sys/dev/isci/isci.c	Wed Jul 10 21:35:55 2019	(r349894)
+++ head/sys/dev/isci/isci.c	Wed Jul 10 22:23:59 2019	(r349895)
@@ -414,7 +414,8 @@ isci_allocate_dma_buffer(device_t device, struct ISCI_
 	uint32_t status;
 
 	status = bus_dma_tag_create(bus_get_dma_tag(device),
-	    0x40 /* cacheline alignment */, 0x0, BUS_SPACE_MAXADDR,
+	    0x40 /* cacheline alignment */,
+	    ISCI_DMA_BOUNDARY, BUS_SPACE_MAXADDR,
 	    BUS_SPACE_MAXADDR, NULL, NULL, memory->size,
 	    0x1 /* we want physically contiguous */,
 	    memory->size, 0, busdma_lock_mutex, &controller->lock,

Modified: head/sys/dev/isci/isci.h
==============================================================================
--- head/sys/dev/isci/isci.h	Wed Jul 10 21:35:55 2019	(r349894)
+++ head/sys/dev/isci/isci.h	Wed Jul 10 22:23:59 2019	(r349895)
@@ -75,6 +75,9 @@
 #define ISCI_NUM_PCI_BARS  2
 #define ISCI_MAX_LUN		 8
 
+/* This device cannot DMA across a 4GB boundary */
+#define	ISCI_DMA_BOUNDARY		((bus_addr_t)((uint64_t)1 << 32))
+
 MALLOC_DECLARE(M_ISCI);
 
 struct ISCI_TIMER {

Modified: head/sys/dev/isci/isci_controller.c
==============================================================================
--- head/sys/dev/isci/isci_controller.c	Wed Jul 10 21:35:55 2019	(r349894)
+++ head/sys/dev/isci/isci_controller.c	Wed Jul 10 22:23:59 2019	(r349895)
@@ -477,9 +477,9 @@ int isci_controller_allocate_memory(struct ISCI_CONTRO
 	 *  will enable better performance than creating the DMA maps every time we get
 	 *  an I/O.
 	 */
-	status = bus_dma_tag_create(bus_get_dma_tag(device), 0x1, 0x0,
-	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
-	    isci_io_request_get_max_io_size(),
+	status = bus_dma_tag_create(bus_get_dma_tag(device), 0x1,
+	    ISCI_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
+	    NULL, NULL, isci_io_request_get_max_io_size(),
 	    SCI_MAX_SCATTER_GATHER_ELEMENTS, max_segment_size, 0,
 	    busdma_lock_mutex, &controller->lock,
 	    &controller->buffer_dma_tag);


More information about the svn-src-all mailing list