[source] kernel: MIPS compile out no-op DMA mapping ops where possible

LEDE Commits lede-commits at lists.infradead.org
Fri Dec 8 10:55:36 PST 2017


nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/668eb70157be59b17bb6da4a6de5d5e71a7c832b

commit 668eb70157be59b17bb6da4a6de5d5e71a7c832b
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Tue Dec 5 13:01:40 2017 +0100

    kernel: MIPS compile out no-op DMA mapping ops where possible
    
    Slightly improves networking throughput on some devices
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../ar71xx/patches-4.9/500-MIPS-fw-myloader.patch  |   2 +-
 ...340-MIPS-mm-remove-mips_dma_mapping_error.patch |  32 +++++
 ...m-remove-no-op-dma_map_ops-where-possible.patch | 140 +++++++++++++++++++++
 3 files changed, 173 insertions(+), 1 deletion(-)

diff --git a/target/linux/ar71xx/patches-4.9/500-MIPS-fw-myloader.patch b/target/linux/ar71xx/patches-4.9/500-MIPS-fw-myloader.patch
index bcb1937..d6a9276 100644
--- a/target/linux/ar71xx/patches-4.9/500-MIPS-fw-myloader.patch
+++ b/target/linux/ar71xx/patches-4.9/500-MIPS-fw-myloader.patch
@@ -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
index 0000000..4091542
--- /dev/null
+++ b/target/linux/generic/pending-4.9/340-MIPS-mm-remove-mips_dma_mapping_error.patch
@@ -0,0 +1,32 @@
+From: Felix Fietkau <nbd at 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 at 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
index 0000000..5b237a6
--- /dev/null
+++ b/target/linux/generic/pending-4.9/341-MIPS-mm-remove-no-op-dma_map_ops-where-possible.patch
@@ -0,0 +1,140 @@
+From: Felix Fietkau <nbd at 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 at 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
+ };



More information about the lede-commits mailing list