[openwrt/openwrt] oxnas: reduce size of ATA DMA descriptor space

LEDE Commits lede-commits at lists.infradead.org
Mon Aug 10 19:16:35 EDT 2020


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/5793112f751ee3d9f841af4846d68e6b1ff1bff4

commit 5793112f751ee3d9f841af4846d68e6b1ff1bff4
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Mon Aug 10 23:33:00 2020 +0100

    oxnas: reduce size of ATA DMA descriptor space
    
    After years of trying to find the reason for random kernel crashes
    while both CPU and SATA are under load it has been found.
    Some odd commented-out #defines in kref's single-port driver [1] which
    were copied from the vendor driver made me develop a theory:
    The IO-mapped memory area for DMA descriptors apparetly got some holes
    just before the alignment boundaries.
    This feels like an off-by-one bug in the hardware or maybe those fields
    are used internally by the SATA controller's firmware.
    Whatever the cause is: they cannot be used and trying to use them
    results in reading back unexpected stuff and ends up with oopsing
    Unable to handle kernel paging request at virtual address d085c004
    
    Work around the issue by reducing the area used for bmdma descriptors.
    This reduces SATA performance (iops) quite a bit, but finally makes
    things work reliably. Possibly one could optimize this much more by
    really just skipping the holes in that memory area -- however, that
    seems to be non-trivial with the driver and libata in it's current form
    (suggestions are welcome).
    The 'proper' way to have good SATA performance would be to make use of
    the hardware RAID features (one can use the JBOD mode to access even
    just a single disc transparently through the RAID controller integrated
    in the SATA host instead of accessing the SATA ports 'raw' as we do
    now).
    
    [1]: https://github.com/kref/linux-oxnas/blob/master/drivers/ata/sata_oxnas.c#L25
    
    Signed-off-by: Daniel Golle <daniel at makrotopia.org>
---
 target/linux/oxnas/files/drivers/ata/sata_oxnas.c | 2 +-
 target/linux/oxnas/image/ox820.mk                 | 4 ----
 2 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/target/linux/oxnas/files/drivers/ata/sata_oxnas.c b/target/linux/oxnas/files/drivers/ata/sata_oxnas.c
index 6e0f7a72a6..64231a8c70 100644
--- a/target/linux/oxnas/files/drivers/ata/sata_oxnas.c
+++ b/target/linux/oxnas/files/drivers/ata/sata_oxnas.c
@@ -70,7 +70,7 @@ struct sgdma_request {
 
 /* Controller information */
 enum {
-	SATA_OXNAS_MAX_PRD = 254,
+	SATA_OXNAS_MAX_PRD = 63,
 	SATA_OXNAS_DMA_SIZE = SATA_OXNAS_MAX_PRD *
 				sizeof(struct ata_bmdma_prd) +
 				sizeof(struct sgdma_request),
diff --git a/target/linux/oxnas/image/ox820.mk b/target/linux/oxnas/image/ox820.mk
index 2a9295bd97..99c438f149 100644
--- a/target/linux/oxnas/image/ox820.mk
+++ b/target/linux/oxnas/image/ox820.mk
@@ -68,10 +68,6 @@ define Device/shuttle_kd20
   DEVICE_VENDOR := Shuttle
   DEVICE_MODEL := KD20
   SUPPORTED_DEVICES += kd20
-  KERNEL_INITRAMFS_PREFIX = $$(IMAGE_PREFIX)-factory
-  KERNEL_INITRAMFS_SUFFIX := .tar.gz
-  KERNEL_INITRAMFS = kernel-bin | append-dtb | uImage none | omninas-factory | \
-	encrypt-3des sohmuntitnlaes
   DEVICE_PACKAGES := kmod-usb2-oxnas kmod-usb3 kmod-usb-ledtrig-usbport \
 	kmod-i2c-gpio kmod-rtc-pcf8563 kmod-gpio-beeper kmod-hwmon-drivetemp \
 	kmod-hwmon-gpiofan kmod-ata-oxnas-sata kmod-md-mod kmod-md-raid0 \



More information about the lede-commits mailing list