kernel: MIPS compile out no-op DMA mapping ops where possible
authorFelix Fietkau <nbd@nbd.name>
Tue, 5 Dec 2017 12:01:40 +0000 (13:01 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 8 Dec 2017 18:55:17 +0000 (19:55 +0100)
Slightly improves networking throughput on some devices

Signed-off-by: Felix Fietkau <nbd@nbd.name>
target/linux/ar71xx/patches-4.9/500-MIPS-fw-myloader.patch
target/linux/generic/pending-4.9/340-MIPS-mm-remove-mips_dma_mapping_error.patch [new file with mode: 0644]
target/linux/generic/pending-4.9/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch [new file with mode: 0644]

index bcb19372efd003389d66ce75cfefee632a234b10..d6a9276c32511822a8f30a9d303e3c93e2404d5c 100644 (file)
@@ -10,7 +10,7 @@
  
 --- a/arch/mips/Kconfig
 +++ b/arch/mips/Kconfig
-@@ -1144,6 +1144,9 @@ config MIPS_MSC
+@@ -1149,6 +1149,9 @@ config MIPS_MSC
  config MIPS_NILE4
        bool
  
diff --git a/target/linux/generic/pending-4.9/340-MIPS-mm-remove-mips_dma_mapping_error.patch b/target/linux/generic/pending-4.9/340-MIPS-mm-remove-mips_dma_mapping_error.patch
new file mode 100644 (file)
index 0000000..4091542
--- /dev/null
@@ -0,0 +1,32 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Tue, 5 Dec 2017 12:34:31 +0100
+Subject: [PATCH] MIPS: mm: remove mips_dma_mapping_error
+
+dma_mapping_error() already checks if ops->mapping_error is a null
+pointer
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/arch/mips/mm/dma-default.c
++++ b/arch/mips/mm/dma-default.c
+@@ -394,11 +394,6 @@ static void mips_dma_sync_sg_for_device(
+       }
+ }
+-int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
+-{
+-      return 0;
+-}
+-
+ int mips_dma_supported(struct device *dev, u64 mask)
+ {
+       return plat_dma_supported(dev, mask);
+@@ -427,7 +422,6 @@ static struct dma_map_ops mips_default_d
+       .sync_single_for_device = mips_dma_sync_single_for_device,
+       .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu,
+       .sync_sg_for_device = mips_dma_sync_sg_for_device,
+-      .mapping_error = mips_dma_mapping_error,
+       .dma_supported = mips_dma_supported
+ };
diff --git a/target/linux/generic/pending-4.9/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch b/target/linux/generic/pending-4.9/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch
new file mode 100644 (file)
index 0000000..5b237a6
--- /dev/null
@@ -0,0 +1,140 @@
+From: Felix Fietkau <nbd@nbd.name>
+Date: Tue, 5 Dec 2017 12:46:01 +0100
+Subject: [PATCH] MIPS: mm: remove no-op dma_map_ops where possible
+
+If no post-DMA flush is required, and the platform does not provide
+plat_unmap_dma_mem(), there is no need to include unmap or sync_for_cpu
+ops.
+
+With this patch they are compiled out to improve icache footprint
+on devices that handle lots of DMA traffic (especially network routers).
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -213,6 +213,7 @@ config BMIPS_GENERIC
+       select BRCMSTB_L2_IRQ
+       select IRQ_MIPS_CPU
+       select DMA_NONCOHERENT
++      select DMA_UNMAP_POST_FLUSH
+       select SYS_SUPPORTS_32BIT_KERNEL
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+       select SYS_SUPPORTS_BIG_ENDIAN
+@@ -338,6 +339,7 @@ config MACH_JAZZ
+       select CSRC_R4K
+       select DEFAULT_SGI_PARTITION if CPU_BIG_ENDIAN
+       select GENERIC_ISA_DMA
++      select DMA_UNMAP_POST_FLUSH
+       select HAVE_PCSPKR_PLATFORM
+       select IRQ_MIPS_CPU
+       select I8253
+@@ -1125,6 +1127,9 @@ config DMA_NONCOHERENT
+       bool
+       select NEED_DMA_MAP_STATE
++config DMA_UNMAP_POST_FLUSH
++      bool
++
+ config NEED_DMA_MAP_STATE
+       bool
+@@ -1649,6 +1654,7 @@ config CPU_R10000
+       select CPU_SUPPORTS_64BIT_KERNEL
+       select CPU_SUPPORTS_HIGHMEM
+       select CPU_SUPPORTS_HUGEPAGES
++      select DMA_UNMAP_POST_FLUSH
+       help
+         MIPS Technologies R10000-series processors.
+@@ -1894,9 +1900,11 @@ config SYS_HAS_CPU_MIPS32_R3_5
+       bool
+ config SYS_HAS_CPU_MIPS32_R5
++      select DMA_UNMAP_POST_FLUSH
+       bool
+ config SYS_HAS_CPU_MIPS32_R6
++      select DMA_UNMAP_POST_FLUSH
+       bool
+ config SYS_HAS_CPU_MIPS64_R1
+@@ -1906,6 +1914,7 @@ config SYS_HAS_CPU_MIPS64_R2
+       bool
+ config SYS_HAS_CPU_MIPS64_R6
++      select DMA_UNMAP_POST_FLUSH
+       bool
+ config SYS_HAS_CPU_R3000
+--- a/arch/mips/mm/dma-default.c
++++ b/arch/mips/mm/dma-default.c
+@@ -290,8 +290,9 @@ static inline void __dma_sync(struct pag
+       } while (left);
+ }
+-static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
+-      size_t size, enum dma_data_direction direction, unsigned long attrs)
++static void __maybe_unused
++mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size,
++                  enum dma_data_direction direction, unsigned long attrs)
+ {
+       if (cpu_needs_post_dma_flush(dev))
+               __dma_sync(dma_addr_to_page(dev, dma_addr),
+@@ -330,9 +331,10 @@ static dma_addr_t mips_dma_map_page(stru
+       return plat_map_dma_mem_page(dev, page) + offset;
+ }
+-static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
+-      int nhwentries, enum dma_data_direction direction,
+-      unsigned long attrs)
++static void __maybe_unused
++mips_dma_unmap_sg(struct device *dev, struct scatterlist *sglist,
++                int nhwentries, enum dma_data_direction direction,
++                unsigned long attrs)
+ {
+       int i;
+       struct scatterlist *sg;
+@@ -346,8 +348,9 @@ static void mips_dma_unmap_sg(struct dev
+       }
+ }
+-static void mips_dma_sync_single_for_cpu(struct device *dev,
+-      dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
++static void __maybe_unused
++mips_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
++                           size_t size, enum dma_data_direction direction)
+ {
+       if (cpu_needs_post_dma_flush(dev))
+               __dma_sync(dma_addr_to_page(dev, dma_handle),
+@@ -363,9 +366,9 @@ static void mips_dma_sync_single_for_dev
+                          dma_handle & ~PAGE_MASK, size, direction);
+ }
+-static void mips_dma_sync_sg_for_cpu(struct device *dev,
+-      struct scatterlist *sglist, int nelems,
+-      enum dma_data_direction direction)
++static void __maybe_unused
++mips_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sglist,
++                       int nelems, enum dma_data_direction direction)
+ {
+       int i;
+       struct scatterlist *sg;
+@@ -415,12 +418,14 @@ static struct dma_map_ops mips_default_d
+       .free = mips_dma_free_coherent,
+       .mmap = mips_dma_mmap,
+       .map_page = mips_dma_map_page,
+-      .unmap_page = mips_dma_unmap_page,
+       .map_sg = mips_dma_map_sg,
++#ifdef CONFIG_DMA_UNMAP_POST_FLUSH
++      .unmap_page = mips_dma_unmap_page,
+       .unmap_sg = mips_dma_unmap_sg,
+       .sync_single_for_cpu = mips_dma_sync_single_for_cpu,
+-      .sync_single_for_device = mips_dma_sync_single_for_device,
+       .sync_sg_for_cpu = mips_dma_sync_sg_for_cpu,
++#endif
++      .sync_single_for_device = mips_dma_sync_single_for_device,
+       .sync_sg_for_device = mips_dma_sync_sg_for_device,
+       .dma_supported = mips_dma_supported
+ };