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