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

Slightly improves networking throughput on some devices

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2017-12-05 13:01:40 +01:00
parent 1c2fdfbaf2
commit 668eb70157
3 changed files with 173 additions and 1 deletions

View 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

View file

@ -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
};

View file

@ -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
};