Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Jun 2021 18:10:38 GMT
From:      Leandro Lupori <luporl@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 9c2c6353193b - main - aacraid: reduce max I/O size to avoid DMA issues
Message-ID:  <202106211810.15LIAc1x063143@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by luporl:

URL: https://cgit.FreeBSD.org/src/commit/?id=9c2c6353193b53deb337777c2a06a2648b364f8b

commit 9c2c6353193b53deb337777c2a06a2648b364f8b
Author:     Leandro Lupori <luporl@FreeBSD.org>
AuthorDate: 2021-06-21 18:04:43 +0000
Commit:     Leandro Lupori <luporl@FreeBSD.org>
CommitDate: 2021-06-21 18:04:43 +0000

    aacraid: reduce max I/O size to avoid DMA issues
    
    Reserve one page for the DMA subsystem, that may need it when the I/O
    buffer is not page aligned.
    
    Without this change, writes with the maximum allowed size failed, if:
    - physical memory was fragmented, making it necessary to use one DMA
      segment for each page
    - the buffer to be written was not page aligned, causing the DMA
      subsystem to need one extra segment
    
    In the scenario above, the DMA subsystem would run out of segments,
    resulting in a write with no SG segments, that would fail.
    
    Reviewed by:            imp
    MFC after:              2 weeks
    Sponsored by:           Instituto de Pesquisas Eldorado (eldorado.org.br)
    Differential Revision:  https://reviews.freebsd.org/D30798
---
 sys/dev/aacraid/aacraid.c     | 4 ++--
 sys/dev/aacraid/aacraid_cam.c | 2 +-
 sys/dev/aacraid/aacraid_var.h | 8 ++++++++
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/sys/dev/aacraid/aacraid.c b/sys/dev/aacraid/aacraid.c
index 65c585269b78..51a633e70515 100644
--- a/sys/dev/aacraid/aacraid.c
+++ b/sys/dev/aacraid/aacraid.c
@@ -579,7 +579,7 @@ aac_alloc(struct aac_softc *sc)
 			       BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
 			       BUS_SPACE_MAXADDR, 	/* highaddr */
 			       NULL, NULL, 		/* filter, filterarg */
-			       sc->aac_max_sectors << 9, /* maxsize */
+			       AAC_MAXIO_SIZE(sc),	/* maxsize */
 			       sc->aac_sg_tablesize,	/* nsegments */
 			       BUS_SPACE_MAXSIZE_32BIT,	/* maxsegsize */
 			       BUS_DMA_ALLOCNOW,	/* flags */
@@ -1807,7 +1807,7 @@ aac_init(struct aac_softc *sc)
 	}
 
 	ip->MaxIoCommands = sc->aac_max_fibs;
-	ip->MaxIoSize = sc->aac_max_sectors << 9;
+	ip->MaxIoSize = AAC_MAXIO_SIZE(sc);
 	ip->MaxFibSize = sc->aac_max_fib_size;
 
 	aac_adapter_init_tole(ip);
diff --git a/sys/dev/aacraid/aacraid_cam.c b/sys/dev/aacraid/aacraid_cam.c
index 48da7e8d757f..9c73248472bd 100644
--- a/sys/dev/aacraid/aacraid_cam.c
+++ b/sys/dev/aacraid/aacraid_cam.c
@@ -1011,7 +1011,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb)
 		cpi->max_lun = 7;	/* Per the controller spec */
 		cpi->initiator_id = camsc->inf->InitiatorBusId;
 		cpi->bus_id = camsc->inf->BusNumber;
-		cpi->maxio = sc->aac_max_sectors << 9;
+		cpi->maxio = AAC_MAXIO_SIZE(sc);
 
 		/*
 		 * Resetting via the passthrough or parallel bus scan
diff --git a/sys/dev/aacraid/aacraid_var.h b/sys/dev/aacraid/aacraid_var.h
index 4fed21b1356b..bbafdafb8840 100644
--- a/sys/dev/aacraid/aacraid_var.h
+++ b/sys/dev/aacraid/aacraid_var.h
@@ -470,6 +470,14 @@ struct aac_softc
 	u_int32_t	FwDebugBufferSize;	/* FW Debug Buffer size */	
 };
 
+/*
+ * Max. I/O size in bytes.
+ * Reserve one page for the DMA subsystem, that may need it when the
+ * I/O buffer is not page aligned.
+ */
+#define AAC_MAXIO_SIZE(sc)	MIN(((sc)->aac_max_sectors << 9) - PAGE_SIZE, \
+					maxphys)
+
 /*
  * Event callback mechanism for the driver
  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202106211810.15LIAc1x063143>