2018-04-24 14:39:47

by Christoph Hellwig

[permalink] [raw]
Subject: dma-debug cleanups, including removing the arch hook

Hi all,

this series has a few dma-debug cleanups, most notably removing the need
for architectures to explicitly initialize dma-debug.


2018-04-24 14:05:11

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 2/3] dma-debug: simplify counting of preallocated requests

Just keep a single variable with a descriptive name instead of two
with confusing names.

Signed-off-by: Christoph Hellwig <[email protected]>
---
lib/dma-debug.c | 20 ++++----------------
1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/lib/dma-debug.c b/lib/dma-debug.c
index 712a897174e4..075253cb613b 100644
--- a/lib/dma-debug.c
+++ b/lib/dma-debug.c
@@ -132,7 +132,7 @@ static u32 min_free_entries;
static u32 nr_total_entries;

/* number of preallocated entries requested by kernel cmdline */
-static u32 req_entries;
+static u32 nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;

/* debugfs dentry's for the stuff above */
static struct dentry *dma_debug_dent __read_mostly;
@@ -1011,7 +1011,6 @@ void dma_debug_add_bus(struct bus_type *bus)

static int dma_debug_init(void)
{
- u32 num_entries;
int i;

/* Do not use dma_debug_initialized here, since we really want to be
@@ -1032,12 +1031,7 @@ static int dma_debug_init(void)
return 0;
}

- if (req_entries)
- num_entries = req_entries;
- else
- num_entries = PREALLOC_DMA_DEBUG_ENTRIES;
-
- if (prealloc_memory(num_entries) != 0) {
+ if (prealloc_memory(nr_prealloc_entries) != 0) {
pr_err("DMA-API: debugging out of memory error - disabled\n");
global_disable = true;

@@ -1068,16 +1062,10 @@ static __init int dma_debug_cmdline(char *str)

static __init int dma_debug_entries_cmdline(char *str)
{
- int res;
-
if (!str)
return -EINVAL;
-
- res = get_option(&str, &req_entries);
-
- if (!res)
- req_entries = 0;
-
+ if (!get_option(&str, &nr_prealloc_entries))
+ nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;
return 0;
}

--
2.17.0


2018-04-24 14:05:33

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 3/3] dma-debug: unexport dma_debug_resize_entries and debug_dma_dump_mappings

Only used by the AMD GART driver, which must be built in.

Signed-off-by: Christoph Hellwig <[email protected]>
---
lib/dma-debug.c | 2 --
1 file changed, 2 deletions(-)

diff --git a/lib/dma-debug.c b/lib/dma-debug.c
index 075253cb613b..6a1ebaa83623 100644
--- a/lib/dma-debug.c
+++ b/lib/dma-debug.c
@@ -444,7 +444,6 @@ void debug_dma_dump_mappings(struct device *dev)
spin_unlock_irqrestore(&bucket->lock, flags);
}
}
-EXPORT_SYMBOL(debug_dma_dump_mappings);

/*
* For each mapping (initial cacheline in the case of
@@ -753,7 +752,6 @@ int dma_debug_resize_entries(u32 num_entries)

return ret;
}
-EXPORT_SYMBOL(dma_debug_resize_entries);

/*
* DMA-API debugging init code
--
2.17.0


2018-04-24 14:06:30

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 1/3] dma-debug: move initialization to common code

Most mainstream architectures are using 65536 entries, so lets stick to
that. If someone is really desperate to override it that can still be
done through <asm/dma-mapping.h>, but I'd rather see a really good
rationale for that.

dma_debug_init is now called as a core_initcall, which for many
architectures means much earlier, and provides dma-debug functionality
earlier in the boot process. This should be safe as it only relies
on the memory allocator already being available.

Signed-off-by: Christoph Hellwig <[email protected]>
---
arch/arm/mm/dma-mapping-nommu.c | 9 ---------
arch/arm/mm/dma-mapping.c | 9 ---------
arch/arm64/mm/dma-mapping.c | 10 ----------
arch/c6x/kernel/dma.c | 11 -----------
arch/ia64/kernel/dma-mapping.c | 10 ----------
arch/microblaze/kernel/dma.c | 11 -----------
arch/mips/mm/dma-default.c | 10 ----------
arch/openrisc/kernel/dma.c | 11 -----------
arch/powerpc/kernel/dma.c | 3 ---
arch/s390/pci/pci_dma.c | 9 ---------
arch/sh/mm/consistent.c | 9 ---------
arch/sparc/kernel/Makefile | 2 --
arch/sparc/kernel/dma.c | 13 -------------
arch/x86/kernel/pci-dma.c | 4 ----
arch/xtensa/kernel/pci-dma.c | 9 ---------
include/linux/dma-debug.h | 6 ------
lib/dma-debug.c | 21 ++++++++++++++-------
17 files changed, 14 insertions(+), 143 deletions(-)
delete mode 100644 arch/sparc/kernel/dma.c

diff --git a/arch/arm/mm/dma-mapping-nommu.c b/arch/arm/mm/dma-mapping-nommu.c
index 619f24a42d09..f448a0663b10 100644
--- a/arch/arm/mm/dma-mapping-nommu.c
+++ b/arch/arm/mm/dma-mapping-nommu.c
@@ -241,12 +241,3 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
void arch_teardown_dma_ops(struct device *dev)
{
}
-
-#define PREALLOC_DMA_DEBUG_ENTRIES 4096
-
-static int __init dma_debug_do_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-core_initcall(dma_debug_do_init);
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 8c398fedbbb6..c26bf83f44ca 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -1165,15 +1165,6 @@ int arm_dma_supported(struct device *dev, u64 mask)
return __dma_supported(dev, mask, false);
}

-#define PREALLOC_DMA_DEBUG_ENTRIES 4096
-
-static int __init dma_debug_do_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-core_initcall(dma_debug_do_init);
-
#ifdef CONFIG_ARM_DMA_USE_IOMMU

static int __dma_info_to_prot(enum dma_data_direction dir, unsigned long attrs)
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
index a96ec0181818..db01f2709842 100644
--- a/arch/arm64/mm/dma-mapping.c
+++ b/arch/arm64/mm/dma-mapping.c
@@ -508,16 +508,6 @@ static int __init arm64_dma_init(void)
}
arch_initcall(arm64_dma_init);

-#define PREALLOC_DMA_DEBUG_ENTRIES 4096
-
-static int __init dma_debug_do_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-fs_initcall(dma_debug_do_init);
-
-
#ifdef CONFIG_IOMMU_DMA
#include <linux/dma-iommu.h>
#include <linux/platform_device.h>
diff --git a/arch/c6x/kernel/dma.c b/arch/c6x/kernel/dma.c
index 9fff8be75f58..31e1a9ec3a9c 100644
--- a/arch/c6x/kernel/dma.c
+++ b/arch/c6x/kernel/dma.c
@@ -136,14 +136,3 @@ const struct dma_map_ops c6x_dma_ops = {
.sync_sg_for_cpu = c6x_dma_sync_sg_for_cpu,
};
EXPORT_SYMBOL(c6x_dma_ops);
-
-/* Number of entries preallocated for DMA-API debugging */
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
-
- return 0;
-}
-fs_initcall(dma_init);
diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c
index f2d57e66fd86..7a471d8d67d4 100644
--- a/arch/ia64/kernel/dma-mapping.c
+++ b/arch/ia64/kernel/dma-mapping.c
@@ -9,16 +9,6 @@ int iommu_detected __read_mostly;
const struct dma_map_ops *dma_ops;
EXPORT_SYMBOL(dma_ops);

-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
-
- return 0;
-}
-fs_initcall(dma_init);
-
const struct dma_map_ops *dma_get_ops(struct device *dev)
{
return dma_ops;
diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c
index c91e8cef98dd..3145e7dc8ab1 100644
--- a/arch/microblaze/kernel/dma.c
+++ b/arch/microblaze/kernel/dma.c
@@ -184,14 +184,3 @@ const struct dma_map_ops dma_nommu_ops = {
.sync_sg_for_device = dma_nommu_sync_sg_for_device,
};
EXPORT_SYMBOL(dma_nommu_ops);
-
-/* Number of entries preallocated for DMA-API debugging */
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
-
- return 0;
-}
-fs_initcall(dma_init);
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
index dcafa43613b6..f9fef0028ca2 100644
--- a/arch/mips/mm/dma-default.c
+++ b/arch/mips/mm/dma-default.c
@@ -402,13 +402,3 @@ static const struct dma_map_ops mips_default_dma_map_ops = {

const struct dma_map_ops *mips_dma_map_ops = &mips_default_dma_map_ops;
EXPORT_SYMBOL(mips_dma_map_ops);
-
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init mips_dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
-
- return 0;
-}
-fs_initcall(mips_dma_init);
diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
index a945f00011b4..ec7fd45704d2 100644
--- a/arch/openrisc/kernel/dma.c
+++ b/arch/openrisc/kernel/dma.c
@@ -247,14 +247,3 @@ const struct dma_map_ops or1k_dma_map_ops = {
.sync_single_for_device = or1k_sync_single_for_device,
};
EXPORT_SYMBOL(or1k_dma_map_ops);
-
-/* Number of entries preallocated for DMA-API debugging */
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
-
- return 0;
-}
-fs_initcall(dma_init);
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
index da20569de9d4..138157deeadf 100644
--- a/arch/powerpc/kernel/dma.c
+++ b/arch/powerpc/kernel/dma.c
@@ -309,8 +309,6 @@ int dma_set_coherent_mask(struct device *dev, u64 mask)
}
EXPORT_SYMBOL(dma_set_coherent_mask);

-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
int dma_set_mask(struct device *dev, u64 dma_mask)
{
if (ppc_md.dma_set_mask)
@@ -361,7 +359,6 @@ EXPORT_SYMBOL_GPL(dma_get_required_mask);

static int __init dma_init(void)
{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
#ifdef CONFIG_PCI
dma_debug_add_bus(&pci_bus_type);
#endif
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 2d15d84c20ed..5dee7a922589 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -668,15 +668,6 @@ void zpci_dma_exit(void)
kmem_cache_destroy(dma_region_table_cache);
}

-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init dma_debug_do_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-fs_initcall(dma_debug_do_init);
-
const struct dma_map_ops s390_pci_dma_ops = {
.alloc = s390_dma_alloc,
.free = s390_dma_free,
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
index 8ce98691d822..35ea3099a3b6 100644
--- a/arch/sh/mm/consistent.c
+++ b/arch/sh/mm/consistent.c
@@ -20,18 +20,9 @@
#include <asm/cacheflush.h>
#include <asm/addrspace.h>

-#define PREALLOC_DMA_DEBUG_ENTRIES 4096
-
const struct dma_map_ops *dma_ops;
EXPORT_SYMBOL(dma_ops);

-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-fs_initcall(dma_init);
-
void *dma_generic_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, gfp_t gfp,
unsigned long attrs)
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
index 76cb57750dda..84cfc5a428d6 100644
--- a/arch/sparc/kernel/Makefile
+++ b/arch/sparc/kernel/Makefile
@@ -74,8 +74,6 @@ obj-$(CONFIG_SPARC64) += pcr.o
obj-$(CONFIG_SPARC64) += nmi.o
obj-$(CONFIG_SPARC64_SMP) += cpumap.o

-obj-y += dma.o
-
obj-$(CONFIG_PCIC_PCI) += pcic.o
obj-$(CONFIG_LEON_PCI) += leon_pci.o
obj-$(CONFIG_SPARC_GRPCI2)+= leon_pci_grpci2.o
diff --git a/arch/sparc/kernel/dma.c b/arch/sparc/kernel/dma.c
deleted file mode 100644
index f73e7597c971..000000000000
--- a/arch/sparc/kernel/dma.c
+++ /dev/null
@@ -1,13 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/kernel.h>
-#include <linux/dma-mapping.h>
-#include <linux/dma-debug.h>
-
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 15)
-
-static int __init dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-fs_initcall(dma_init);
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index 77625b60a510..bcbaa2e8031e 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -55,9 +55,6 @@ struct device x86_dma_fallback_dev = {
};
EXPORT_SYMBOL(x86_dma_fallback_dev);

-/* Number of entries preallocated for DMA-API debugging */
-#define PREALLOC_DMA_DEBUG_ENTRIES 65536
-
void __init pci_iommu_alloc(void)
{
struct iommu_table_entry *p;
@@ -189,7 +186,6 @@ EXPORT_SYMBOL(arch_dma_supported);
static int __init pci_iommu_init(void)
{
struct iommu_table_entry *p;
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);

#ifdef CONFIG_PCI
dma_debug_add_bus(&pci_bus_type);
diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
index 732631ce250f..392b4a80ebc2 100644
--- a/arch/xtensa/kernel/pci-dma.c
+++ b/arch/xtensa/kernel/pci-dma.c
@@ -261,12 +261,3 @@ const struct dma_map_ops xtensa_dma_map_ops = {
.mapping_error = xtensa_dma_mapping_error,
};
EXPORT_SYMBOL(xtensa_dma_map_ops);
-
-#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
-
-static int __init xtensa_dma_init(void)
-{
- dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
- return 0;
-}
-fs_initcall(xtensa_dma_init);
diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h
index c7d844f09c3a..a785f2507159 100644
--- a/include/linux/dma-debug.h
+++ b/include/linux/dma-debug.h
@@ -30,8 +30,6 @@ struct bus_type;

extern void dma_debug_add_bus(struct bus_type *bus);

-extern void dma_debug_init(u32 num_entries);
-
extern int dma_debug_resize_entries(u32 num_entries);

extern void debug_dma_map_page(struct device *dev, struct page *page,
@@ -100,10 +98,6 @@ static inline void dma_debug_add_bus(struct bus_type *bus)
{
}

-static inline void dma_debug_init(u32 num_entries)
-{
-}
-
static inline int dma_debug_resize_entries(u32 num_entries)
{
return 0;
diff --git a/lib/dma-debug.c b/lib/dma-debug.c
index 7f5cdc1e6b29..712a897174e4 100644
--- a/lib/dma-debug.c
+++ b/lib/dma-debug.c
@@ -41,6 +41,11 @@
#define HASH_FN_SHIFT 13
#define HASH_FN_MASK (HASH_SIZE - 1)

+/* allow architectures to override this if absolutely required */
+#ifndef PREALLOC_DMA_DEBUG_ENTRIES
+#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
+#endif
+
enum {
dma_debug_single,
dma_debug_page,
@@ -1004,18 +1009,16 @@ void dma_debug_add_bus(struct bus_type *bus)
bus_register_notifier(bus, nb);
}

-/*
- * Let the architectures decide how many entries should be preallocated.
- */
-void dma_debug_init(u32 num_entries)
+static int dma_debug_init(void)
{
+ u32 num_entries;
int i;

/* Do not use dma_debug_initialized here, since we really want to be
* called to set dma_debug_initialized
*/
if (global_disable)
- return;
+ return 0;

for (i = 0; i < HASH_SIZE; ++i) {
INIT_LIST_HEAD(&dma_entry_hash[i].list);
@@ -1026,17 +1029,19 @@ void dma_debug_init(u32 num_entries)
pr_err("DMA-API: error creating debugfs entries - disabling\n");
global_disable = true;

- return;
+ return 0;
}

if (req_entries)
num_entries = req_entries;
+ else
+ num_entries = PREALLOC_DMA_DEBUG_ENTRIES;

if (prealloc_memory(num_entries) != 0) {
pr_err("DMA-API: debugging out of memory error - disabled\n");
global_disable = true;

- return;
+ return 0;
}

nr_total_entries = num_free_entries;
@@ -1044,7 +1049,9 @@ void dma_debug_init(u32 num_entries)
dma_debug_initialized = true;

pr_info("DMA-API: debugging enabled by kernel config\n");
+ return 0;
}
+core_initcall(dma_debug_init);

static __init int dma_debug_cmdline(char *str)
{
--
2.17.0


2018-04-27 15:53:48

by Christoph Hellwig

[permalink] [raw]
Subject: [PATCH 4/3] dma-debug: remove CONFIG_HAVE_DMA_API_DEBUG

There is no arch specific code required for dma-debug, so there is no
need to opt into the support either.

Signed-off-by: Christoph Hellwig <[email protected]>
---
.../io/dma-api-debug/arch-support.txt | 31 -------------------
arch/Kconfig | 3 --
arch/arm/Kconfig | 1 -
arch/arm64/Kconfig | 1 -
arch/c6x/Kconfig | 1 -
arch/ia64/Kconfig | 1 -
arch/microblaze/Kconfig | 1 -
arch/mips/Kconfig | 1 -
arch/powerpc/Kconfig | 1 -
arch/riscv/Kconfig | 1 -
arch/s390/Kconfig | 1 -
arch/sh/Kconfig | 1 -
arch/sparc/Kconfig | 1 -
arch/x86/Kconfig | 1 -
arch/xtensa/Kconfig | 1 -
lib/Kconfig.debug | 1 -
16 files changed, 48 deletions(-)
delete mode 100644 Documentation/features/io/dma-api-debug/arch-support.txt

diff --git a/Documentation/features/io/dma-api-debug/arch-support.txt b/Documentation/features/io/dma-api-debug/arch-support.txt
deleted file mode 100644
index e438ed675623..000000000000
--- a/Documentation/features/io/dma-api-debug/arch-support.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Feature name: dma-api-debug
-# Kconfig: HAVE_DMA_API_DEBUG
-# description: arch supports DMA debug facilities
-#
- -----------------------
- | arch |status|
- -----------------------
- | alpha: | TODO |
- | arc: | TODO |
- | arm: | ok |
- | arm64: | ok |
- | c6x: | ok |
- | h8300: | TODO |
- | hexagon: | TODO |
- | ia64: | ok |
- | m68k: | TODO |
- | microblaze: | ok |
- | mips: | ok |
- | nios2: | TODO |
- | openrisc: | TODO |
- | parisc: | TODO |
- | powerpc: | ok |
- | s390: | ok |
- | sh: | ok |
- | sparc: | ok |
- | um: | TODO |
- | unicore32: | TODO |
- | x86: | ok |
- | xtensa: | ok |
- -----------------------
diff --git a/arch/Kconfig b/arch/Kconfig
index 8e0d665c8d53..f07a1a99e5db 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -278,9 +278,6 @@ config HAVE_CLK
The <linux/clk.h> calls support software clock gating and
thus are a key power management tool on many systems.

-config HAVE_DMA_API_DEBUG
- bool
-
config HAVE_HW_BREAKPOINT
bool
depends on PERF_EVENTS
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 676977bdfe33..c43f5bb55ac8 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -60,7 +60,6 @@ config ARM
select HAVE_CONTEXT_TRACKING
select HAVE_C_RECORDMCOUNT
select HAVE_DEBUG_KMEMLEAK
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS if MMU
select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL) && !CPU_ENDIAN_BE32 && MMU
select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC_FTRACE
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index db51b6445744..b25ed7834f6c 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -105,7 +105,6 @@ config ARM64
select HAVE_CONTEXT_TRACKING
select HAVE_DEBUG_BUGVERBOSE
select HAVE_DEBUG_KMEMLEAK
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE
select HAVE_EFFICIENT_UNALIGNED_ACCESS
diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
index c6b4dd1418b4..8c088b96e372 100644
--- a/arch/c6x/Kconfig
+++ b/arch/c6x/Kconfig
@@ -10,7 +10,6 @@ config C6X
select GENERIC_ATOMIC64
select GENERIC_IRQ_SHOW
select HAVE_ARCH_TRACEHOOK
- select HAVE_DMA_API_DEBUG
select HAVE_MEMBLOCK
select SPARSE_IRQ
select IRQ_DOMAIN
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 9485b5490eca..2067289fad4a 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -29,7 +29,6 @@ config IA64
select HAVE_FUNCTION_TRACER
select TTY
select HAVE_ARCH_TRACEHOOK
- select HAVE_DMA_API_DEBUG
select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP
select HAVE_VIRT_CPU_ACCOUNTING
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 3817a3e2146c..d14782100088 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -19,7 +19,6 @@ config MICROBLAZE
select HAVE_ARCH_HASH
select HAVE_ARCH_KGDB
select HAVE_DEBUG_KMEMLEAK
- select HAVE_DMA_API_DEBUG
select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_FUNCTION_GRAPH_TRACER
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 0f619b8c0e9e..2dcdc13cd65d 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -42,7 +42,6 @@ config MIPS
select HAVE_C_RECORDMCOUNT
select HAVE_DEBUG_KMEMLEAK
select HAVE_DEBUG_STACKOVERFLOW
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE
select HAVE_EXIT_THREAD
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 1887f8f86a77..268fd46fc3c7 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -181,7 +181,6 @@ config PPC
select HAVE_CONTEXT_TRACKING if PPC64
select HAVE_DEBUG_KMEMLEAK
select HAVE_DEBUG_STACKOVERFLOW
- select HAVE_DMA_API_DEBUG
select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL
select HAVE_EBPF_JIT if PPC64
diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index 17212ba54ee3..95e2da34aaad 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -23,7 +23,6 @@ config RISCV
select GENERIC_ATOMIC64 if !64BIT || !RISCV_ISA_A
select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select HAVE_GENERIC_DMA_COHERENT
select IRQ_DOMAIN
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index b794a2ab6d15..6a64287ec1da 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -130,7 +130,6 @@ config S390
select HAVE_CMPXCHG_LOCAL
select HAVE_COPY_THREAD_TLS
select HAVE_DEBUG_KMEMLEAK
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select DMA_DIRECT_OPS
select HAVE_DYNAMIC_FTRACE
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index 9417f70e008e..7d521926041e 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -13,7 +13,6 @@ config SUPERH
select HAVE_OPROFILE
select HAVE_GENERIC_DMA_COHERENT
select HAVE_ARCH_TRACEHOOK
- select HAVE_DMA_API_DEBUG
select HAVE_PERF_EVENTS
select HAVE_DEBUG_BUGVERBOSE
select ARCH_HAVE_CUSTOM_GPIO_H
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index c1cfc17eb504..435dbc033afe 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -25,7 +25,6 @@ config SPARC
select RTC_CLASS
select RTC_DRV_M48T59
select RTC_SYSTOHC
- select HAVE_DMA_API_DEBUG
select HAVE_ARCH_JUMP_LABEL if SPARC64
select GENERIC_IRQ_SHOW
select ARCH_WANT_IPC_PARSE_VERSION
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index aad35c568681..3eeca48a146b 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -135,7 +135,6 @@ config X86
select HAVE_C_RECORDMCOUNT
select HAVE_DEBUG_KMEMLEAK
select HAVE_DEBUG_STACKOVERFLOW
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE
select HAVE_DYNAMIC_FTRACE_WITH_REGS
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index c921e8bccdc8..17df332269b2 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -19,7 +19,6 @@ config XTENSA
select HAVE_ARCH_KASAN if MMU
select HAVE_CC_STACKPROTECTOR
select HAVE_DEBUG_KMEMLEAK
- select HAVE_DMA_API_DEBUG
select HAVE_DMA_CONTIGUOUS
select HAVE_EXIT_THREAD
select HAVE_FUNCTION_TRACER
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 685ed2dd4384..d5175eb7b917 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1634,7 +1634,6 @@ config PROVIDE_OHCI1394_DMA_INIT

config DMA_API_DEBUG
bool "Enable debugging of DMA-API usage"
- depends on HAVE_DMA_API_DEBUG
select NEED_DMA_MAP_STATE
help
Enable this option to debug the use of the DMA API by device drivers.
--
2.17.0


2018-05-07 10:26:49

by Christoph Hellwig

[permalink] [raw]
Subject: Re: dma-debug cleanups, including removing the arch hook

Any comments? I'd like to move forward with this rather sooner
than later, so any reviews welcome!

On Tue, Apr 24, 2018 at 04:02:32PM +0200, Christoph Hellwig wrote:
> Hi all,
>
> this series has a few dma-debug cleanups, most notably removing the need
> for architectures to explicitly initialize dma-debug.
> _______________________________________________
> iommu mailing list
> [email protected]
> https://lists.linuxfoundation.org/mailman/listinfo/iommu
---end quoted text---

2018-05-08 09:47:06

by Robin Murphy

[permalink] [raw]
Subject: Re: [PATCH 1/3] dma-debug: move initialization to common code

On 24/04/18 15:02, Christoph Hellwig wrote:
> Most mainstream architectures are using 65536 entries, so lets stick to
> that. If someone is really desperate to override it that can still be
> done through <asm/dma-mapping.h>, but I'd rather see a really good
> rationale for that.
>
> dma_debug_init is now called as a core_initcall, which for many
> architectures means much earlier, and provides dma-debug functionality
> earlier in the boot process. This should be safe as it only relies
> on the memory allocator already being available.

Reviewed-by: Robin Murphy <[email protected]>

> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> arch/arm/mm/dma-mapping-nommu.c | 9 ---------
> arch/arm/mm/dma-mapping.c | 9 ---------
> arch/arm64/mm/dma-mapping.c | 10 ----------
> arch/c6x/kernel/dma.c | 11 -----------
> arch/ia64/kernel/dma-mapping.c | 10 ----------
> arch/microblaze/kernel/dma.c | 11 -----------
> arch/mips/mm/dma-default.c | 10 ----------
> arch/openrisc/kernel/dma.c | 11 -----------
> arch/powerpc/kernel/dma.c | 3 ---
> arch/s390/pci/pci_dma.c | 9 ---------
> arch/sh/mm/consistent.c | 9 ---------
> arch/sparc/kernel/Makefile | 2 --
> arch/sparc/kernel/dma.c | 13 -------------
> arch/x86/kernel/pci-dma.c | 4 ----
> arch/xtensa/kernel/pci-dma.c | 9 ---------
> include/linux/dma-debug.h | 6 ------
> lib/dma-debug.c | 21 ++++++++++++++-------
> 17 files changed, 14 insertions(+), 143 deletions(-)
> delete mode 100644 arch/sparc/kernel/dma.c
>
> diff --git a/arch/arm/mm/dma-mapping-nommu.c b/arch/arm/mm/dma-mapping-nommu.c
> index 619f24a42d09..f448a0663b10 100644
> --- a/arch/arm/mm/dma-mapping-nommu.c
> +++ b/arch/arm/mm/dma-mapping-nommu.c
> @@ -241,12 +241,3 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> void arch_teardown_dma_ops(struct device *dev)
> {
> }
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -core_initcall(dma_debug_do_init);
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index 8c398fedbbb6..c26bf83f44ca 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -1165,15 +1165,6 @@ int arm_dma_supported(struct device *dev, u64 mask)
> return __dma_supported(dev, mask, false);
> }
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -core_initcall(dma_debug_do_init);
> -
> #ifdef CONFIG_ARM_DMA_USE_IOMMU
>
> static int __dma_info_to_prot(enum dma_data_direction dir, unsigned long attrs)
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index a96ec0181818..db01f2709842 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -508,16 +508,6 @@ static int __init arm64_dma_init(void)
> }
> arch_initcall(arm64_dma_init);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_debug_do_init);
> -
> -
> #ifdef CONFIG_IOMMU_DMA
> #include <linux/dma-iommu.h>
> #include <linux/platform_device.h>
> diff --git a/arch/c6x/kernel/dma.c b/arch/c6x/kernel/dma.c
> index 9fff8be75f58..31e1a9ec3a9c 100644
> --- a/arch/c6x/kernel/dma.c
> +++ b/arch/c6x/kernel/dma.c
> @@ -136,14 +136,3 @@ const struct dma_map_ops c6x_dma_ops = {
> .sync_sg_for_cpu = c6x_dma_sync_sg_for_cpu,
> };
> EXPORT_SYMBOL(c6x_dma_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c
> index f2d57e66fd86..7a471d8d67d4 100644
> --- a/arch/ia64/kernel/dma-mapping.c
> +++ b/arch/ia64/kernel/dma-mapping.c
> @@ -9,16 +9,6 @@ int iommu_detected __read_mostly;
> const struct dma_map_ops *dma_ops;
> EXPORT_SYMBOL(dma_ops);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> -
> const struct dma_map_ops *dma_get_ops(struct device *dev)
> {
> return dma_ops;
> diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c
> index c91e8cef98dd..3145e7dc8ab1 100644
> --- a/arch/microblaze/kernel/dma.c
> +++ b/arch/microblaze/kernel/dma.c
> @@ -184,14 +184,3 @@ const struct dma_map_ops dma_nommu_ops = {
> .sync_sg_for_device = dma_nommu_sync_sg_for_device,
> };
> EXPORT_SYMBOL(dma_nommu_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> index dcafa43613b6..f9fef0028ca2 100644
> --- a/arch/mips/mm/dma-default.c
> +++ b/arch/mips/mm/dma-default.c
> @@ -402,13 +402,3 @@ static const struct dma_map_ops mips_default_dma_map_ops = {
>
> const struct dma_map_ops *mips_dma_map_ops = &mips_default_dma_map_ops;
> EXPORT_SYMBOL(mips_dma_map_ops);
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init mips_dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(mips_dma_init);
> diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
> index a945f00011b4..ec7fd45704d2 100644
> --- a/arch/openrisc/kernel/dma.c
> +++ b/arch/openrisc/kernel/dma.c
> @@ -247,14 +247,3 @@ const struct dma_map_ops or1k_dma_map_ops = {
> .sync_single_for_device = or1k_sync_single_for_device,
> };
> EXPORT_SYMBOL(or1k_dma_map_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
> index da20569de9d4..138157deeadf 100644
> --- a/arch/powerpc/kernel/dma.c
> +++ b/arch/powerpc/kernel/dma.c
> @@ -309,8 +309,6 @@ int dma_set_coherent_mask(struct device *dev, u64 mask)
> }
> EXPORT_SYMBOL(dma_set_coherent_mask);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> int dma_set_mask(struct device *dev, u64 dma_mask)
> {
> if (ppc_md.dma_set_mask)
> @@ -361,7 +359,6 @@ EXPORT_SYMBOL_GPL(dma_get_required_mask);
>
> static int __init dma_init(void)
> {
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> #ifdef CONFIG_PCI
> dma_debug_add_bus(&pci_bus_type);
> #endif
> diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
> index 2d15d84c20ed..5dee7a922589 100644
> --- a/arch/s390/pci/pci_dma.c
> +++ b/arch/s390/pci/pci_dma.c
> @@ -668,15 +668,6 @@ void zpci_dma_exit(void)
> kmem_cache_destroy(dma_region_table_cache);
> }
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_debug_do_init);
> -
> const struct dma_map_ops s390_pci_dma_ops = {
> .alloc = s390_dma_alloc,
> .free = s390_dma_free,
> diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
> index 8ce98691d822..35ea3099a3b6 100644
> --- a/arch/sh/mm/consistent.c
> +++ b/arch/sh/mm/consistent.c
> @@ -20,18 +20,9 @@
> #include <asm/cacheflush.h>
> #include <asm/addrspace.h>
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> const struct dma_map_ops *dma_ops;
> EXPORT_SYMBOL(dma_ops);
>
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_init);
> -
> void *dma_generic_alloc_coherent(struct device *dev, size_t size,
> dma_addr_t *dma_handle, gfp_t gfp,
> unsigned long attrs)
> diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
> index 76cb57750dda..84cfc5a428d6 100644
> --- a/arch/sparc/kernel/Makefile
> +++ b/arch/sparc/kernel/Makefile
> @@ -74,8 +74,6 @@ obj-$(CONFIG_SPARC64) += pcr.o
> obj-$(CONFIG_SPARC64) += nmi.o
> obj-$(CONFIG_SPARC64_SMP) += cpumap.o
>
> -obj-y += dma.o
> -
> obj-$(CONFIG_PCIC_PCI) += pcic.o
> obj-$(CONFIG_LEON_PCI) += leon_pci.o
> obj-$(CONFIG_SPARC_GRPCI2)+= leon_pci_grpci2.o
> diff --git a/arch/sparc/kernel/dma.c b/arch/sparc/kernel/dma.c
> deleted file mode 100644
> index f73e7597c971..000000000000
> --- a/arch/sparc/kernel/dma.c
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <linux/kernel.h>
> -#include <linux/dma-mapping.h>
> -#include <linux/dma-debug.h>
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 15)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
> index 77625b60a510..bcbaa2e8031e 100644
> --- a/arch/x86/kernel/pci-dma.c
> +++ b/arch/x86/kernel/pci-dma.c
> @@ -55,9 +55,6 @@ struct device x86_dma_fallback_dev = {
> };
> EXPORT_SYMBOL(x86_dma_fallback_dev);
>
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES 65536
> -
> void __init pci_iommu_alloc(void)
> {
> struct iommu_table_entry *p;
> @@ -189,7 +186,6 @@ EXPORT_SYMBOL(arch_dma_supported);
> static int __init pci_iommu_init(void)
> {
> struct iommu_table_entry *p;
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
>
> #ifdef CONFIG_PCI
> dma_debug_add_bus(&pci_bus_type);
> diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
> index 732631ce250f..392b4a80ebc2 100644
> --- a/arch/xtensa/kernel/pci-dma.c
> +++ b/arch/xtensa/kernel/pci-dma.c
> @@ -261,12 +261,3 @@ const struct dma_map_ops xtensa_dma_map_ops = {
> .mapping_error = xtensa_dma_mapping_error,
> };
> EXPORT_SYMBOL(xtensa_dma_map_ops);
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init xtensa_dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(xtensa_dma_init);
> diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h
> index c7d844f09c3a..a785f2507159 100644
> --- a/include/linux/dma-debug.h
> +++ b/include/linux/dma-debug.h
> @@ -30,8 +30,6 @@ struct bus_type;
>
> extern void dma_debug_add_bus(struct bus_type *bus);
>
> -extern void dma_debug_init(u32 num_entries);
> -
> extern int dma_debug_resize_entries(u32 num_entries);
>
> extern void debug_dma_map_page(struct device *dev, struct page *page,
> @@ -100,10 +98,6 @@ static inline void dma_debug_add_bus(struct bus_type *bus)
> {
> }
>
> -static inline void dma_debug_init(u32 num_entries)
> -{
> -}
> -
> static inline int dma_debug_resize_entries(u32 num_entries)
> {
> return 0;
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 7f5cdc1e6b29..712a897174e4 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -41,6 +41,11 @@
> #define HASH_FN_SHIFT 13
> #define HASH_FN_MASK (HASH_SIZE - 1)
>
> +/* allow architectures to override this if absolutely required */
> +#ifndef PREALLOC_DMA_DEBUG_ENTRIES
> +#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> +#endif
> +
> enum {
> dma_debug_single,
> dma_debug_page,
> @@ -1004,18 +1009,16 @@ void dma_debug_add_bus(struct bus_type *bus)
> bus_register_notifier(bus, nb);
> }
>
> -/*
> - * Let the architectures decide how many entries should be preallocated.
> - */
> -void dma_debug_init(u32 num_entries)
> +static int dma_debug_init(void)
> {
> + u32 num_entries;
> int i;
>
> /* Do not use dma_debug_initialized here, since we really want to be
> * called to set dma_debug_initialized
> */
> if (global_disable)
> - return;
> + return 0;
>
> for (i = 0; i < HASH_SIZE; ++i) {
> INIT_LIST_HEAD(&dma_entry_hash[i].list);
> @@ -1026,17 +1029,19 @@ void dma_debug_init(u32 num_entries)
> pr_err("DMA-API: error creating debugfs entries - disabling\n");
> global_disable = true;
>
> - return;
> + return 0;
> }
>
> if (req_entries)
> num_entries = req_entries;
> + else
> + num_entries = PREALLOC_DMA_DEBUG_ENTRIES;
>
> if (prealloc_memory(num_entries) != 0) {
> pr_err("DMA-API: debugging out of memory error - disabled\n");
> global_disable = true;
>
> - return;
> + return 0;
> }
>
> nr_total_entries = num_free_entries;
> @@ -1044,7 +1049,9 @@ void dma_debug_init(u32 num_entries)
> dma_debug_initialized = true;
>
> pr_info("DMA-API: debugging enabled by kernel config\n");
> + return 0;
> }
> +core_initcall(dma_debug_init);
>
> static __init int dma_debug_cmdline(char *str)
> {
>

2018-05-08 09:50:42

by Robin Murphy

[permalink] [raw]
Subject: Re: [PATCH 2/3] dma-debug: simplify counting of preallocated requests

On 24/04/18 15:02, Christoph Hellwig wrote:
> Just keep a single variable with a descriptive name instead of two
> with confusing names.

Reviewed-by: Robin Murphy <[email protected]>

> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> lib/dma-debug.c | 20 ++++----------------
> 1 file changed, 4 insertions(+), 16 deletions(-)
>
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 712a897174e4..075253cb613b 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -132,7 +132,7 @@ static u32 min_free_entries;
> static u32 nr_total_entries;
>
> /* number of preallocated entries requested by kernel cmdline */
> -static u32 req_entries;
> +static u32 nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;
>
> /* debugfs dentry's for the stuff above */
> static struct dentry *dma_debug_dent __read_mostly;
> @@ -1011,7 +1011,6 @@ void dma_debug_add_bus(struct bus_type *bus)
>
> static int dma_debug_init(void)
> {
> - u32 num_entries;
> int i;
>
> /* Do not use dma_debug_initialized here, since we really want to be
> @@ -1032,12 +1031,7 @@ static int dma_debug_init(void)
> return 0;
> }
>
> - if (req_entries)
> - num_entries = req_entries;
> - else
> - num_entries = PREALLOC_DMA_DEBUG_ENTRIES;
> -
> - if (prealloc_memory(num_entries) != 0) {
> + if (prealloc_memory(nr_prealloc_entries) != 0) {
> pr_err("DMA-API: debugging out of memory error - disabled\n");
> global_disable = true;
>
> @@ -1068,16 +1062,10 @@ static __init int dma_debug_cmdline(char *str)
>
> static __init int dma_debug_entries_cmdline(char *str)
> {
> - int res;
> -
> if (!str)
> return -EINVAL;
> -
> - res = get_option(&str, &req_entries);
> -
> - if (!res)
> - req_entries = 0;
> -
> + if (!get_option(&str, &nr_prealloc_entries))
> + nr_prealloc_entries = PREALLOC_DMA_DEBUG_ENTRIES;
> return 0;
> }
>
>

2018-05-08 09:55:14

by Robin Murphy

[permalink] [raw]
Subject: Re: [PATCH 4/3] dma-debug: remove CONFIG_HAVE_DMA_API_DEBUG

On 27/04/18 16:53, Christoph Hellwig wrote:
> There is no arch specific code required for dma-debug, so there is no
> need to opt into the support either.

Makes sense, and a purely negative diffstat is always pleasing :)

Reviewed-by: Robin Murphy <[email protected]>

> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> .../io/dma-api-debug/arch-support.txt | 31 -------------------
> arch/Kconfig | 3 --
> arch/arm/Kconfig | 1 -
> arch/arm64/Kconfig | 1 -
> arch/c6x/Kconfig | 1 -
> arch/ia64/Kconfig | 1 -
> arch/microblaze/Kconfig | 1 -
> arch/mips/Kconfig | 1 -
> arch/powerpc/Kconfig | 1 -
> arch/riscv/Kconfig | 1 -
> arch/s390/Kconfig | 1 -
> arch/sh/Kconfig | 1 -
> arch/sparc/Kconfig | 1 -
> arch/x86/Kconfig | 1 -
> arch/xtensa/Kconfig | 1 -
> lib/Kconfig.debug | 1 -
> 16 files changed, 48 deletions(-)
> delete mode 100644 Documentation/features/io/dma-api-debug/arch-support.txt
>
> diff --git a/Documentation/features/io/dma-api-debug/arch-support.txt b/Documentation/features/io/dma-api-debug/arch-support.txt
> deleted file mode 100644
> index e438ed675623..000000000000
> --- a/Documentation/features/io/dma-api-debug/arch-support.txt
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -#
> -# Feature name: dma-api-debug
> -# Kconfig: HAVE_DMA_API_DEBUG
> -# description: arch supports DMA debug facilities
> -#
> - -----------------------
> - | arch |status|
> - -----------------------
> - | alpha: | TODO |
> - | arc: | TODO |
> - | arm: | ok |
> - | arm64: | ok |
> - | c6x: | ok |
> - | h8300: | TODO |
> - | hexagon: | TODO |
> - | ia64: | ok |
> - | m68k: | TODO |
> - | microblaze: | ok |
> - | mips: | ok |
> - | nios2: | TODO |
> - | openrisc: | TODO |
> - | parisc: | TODO |
> - | powerpc: | ok |
> - | s390: | ok |
> - | sh: | ok |
> - | sparc: | ok |
> - | um: | TODO |
> - | unicore32: | TODO |
> - | x86: | ok |
> - | xtensa: | ok |
> - -----------------------
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 8e0d665c8d53..f07a1a99e5db 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -278,9 +278,6 @@ config HAVE_CLK
> The <linux/clk.h> calls support software clock gating and
> thus are a key power management tool on many systems.
>
> -config HAVE_DMA_API_DEBUG
> - bool
> -
> config HAVE_HW_BREAKPOINT
> bool
> depends on PERF_EVENTS
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 676977bdfe33..c43f5bb55ac8 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -60,7 +60,6 @@ config ARM
> select HAVE_CONTEXT_TRACKING
> select HAVE_C_RECORDMCOUNT
> select HAVE_DEBUG_KMEMLEAK
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS if MMU
> select HAVE_DYNAMIC_FTRACE if (!XIP_KERNEL) && !CPU_ENDIAN_BE32 && MMU
> select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC_FTRACE
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index db51b6445744..b25ed7834f6c 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -105,7 +105,6 @@ config ARM64
> select HAVE_CONTEXT_TRACKING
> select HAVE_DEBUG_BUGVERBOSE
> select HAVE_DEBUG_KMEMLEAK
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select HAVE_DYNAMIC_FTRACE
> select HAVE_EFFICIENT_UNALIGNED_ACCESS
> diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
> index c6b4dd1418b4..8c088b96e372 100644
> --- a/arch/c6x/Kconfig
> +++ b/arch/c6x/Kconfig
> @@ -10,7 +10,6 @@ config C6X
> select GENERIC_ATOMIC64
> select GENERIC_IRQ_SHOW
> select HAVE_ARCH_TRACEHOOK
> - select HAVE_DMA_API_DEBUG
> select HAVE_MEMBLOCK
> select SPARSE_IRQ
> select IRQ_DOMAIN
> diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
> index 9485b5490eca..2067289fad4a 100644
> --- a/arch/ia64/Kconfig
> +++ b/arch/ia64/Kconfig
> @@ -29,7 +29,6 @@ config IA64
> select HAVE_FUNCTION_TRACER
> select TTY
> select HAVE_ARCH_TRACEHOOK
> - select HAVE_DMA_API_DEBUG
> select HAVE_MEMBLOCK
> select HAVE_MEMBLOCK_NODE_MAP
> select HAVE_VIRT_CPU_ACCOUNTING
> diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
> index 3817a3e2146c..d14782100088 100644
> --- a/arch/microblaze/Kconfig
> +++ b/arch/microblaze/Kconfig
> @@ -19,7 +19,6 @@ config MICROBLAZE
> select HAVE_ARCH_HASH
> select HAVE_ARCH_KGDB
> select HAVE_DEBUG_KMEMLEAK
> - select HAVE_DMA_API_DEBUG
> select HAVE_DYNAMIC_FTRACE
> select HAVE_FTRACE_MCOUNT_RECORD
> select HAVE_FUNCTION_GRAPH_TRACER
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 0f619b8c0e9e..2dcdc13cd65d 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -42,7 +42,6 @@ config MIPS
> select HAVE_C_RECORDMCOUNT
> select HAVE_DEBUG_KMEMLEAK
> select HAVE_DEBUG_STACKOVERFLOW
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select HAVE_DYNAMIC_FTRACE
> select HAVE_EXIT_THREAD
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 1887f8f86a77..268fd46fc3c7 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -181,7 +181,6 @@ config PPC
> select HAVE_CONTEXT_TRACKING if PPC64
> select HAVE_DEBUG_KMEMLEAK
> select HAVE_DEBUG_STACKOVERFLOW
> - select HAVE_DMA_API_DEBUG
> select HAVE_DYNAMIC_FTRACE
> select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL
> select HAVE_EBPF_JIT if PPC64
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index 17212ba54ee3..95e2da34aaad 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -23,7 +23,6 @@ config RISCV
> select GENERIC_ATOMIC64 if !64BIT || !RISCV_ISA_A
> select HAVE_MEMBLOCK
> select HAVE_MEMBLOCK_NODE_MAP
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select HAVE_GENERIC_DMA_COHERENT
> select IRQ_DOMAIN
> diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
> index b794a2ab6d15..6a64287ec1da 100644
> --- a/arch/s390/Kconfig
> +++ b/arch/s390/Kconfig
> @@ -130,7 +130,6 @@ config S390
> select HAVE_CMPXCHG_LOCAL
> select HAVE_COPY_THREAD_TLS
> select HAVE_DEBUG_KMEMLEAK
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select DMA_DIRECT_OPS
> select HAVE_DYNAMIC_FTRACE
> diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
> index 9417f70e008e..7d521926041e 100644
> --- a/arch/sh/Kconfig
> +++ b/arch/sh/Kconfig
> @@ -13,7 +13,6 @@ config SUPERH
> select HAVE_OPROFILE
> select HAVE_GENERIC_DMA_COHERENT
> select HAVE_ARCH_TRACEHOOK
> - select HAVE_DMA_API_DEBUG
> select HAVE_PERF_EVENTS
> select HAVE_DEBUG_BUGVERBOSE
> select ARCH_HAVE_CUSTOM_GPIO_H
> diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
> index c1cfc17eb504..435dbc033afe 100644
> --- a/arch/sparc/Kconfig
> +++ b/arch/sparc/Kconfig
> @@ -25,7 +25,6 @@ config SPARC
> select RTC_CLASS
> select RTC_DRV_M48T59
> select RTC_SYSTOHC
> - select HAVE_DMA_API_DEBUG
> select HAVE_ARCH_JUMP_LABEL if SPARC64
> select GENERIC_IRQ_SHOW
> select ARCH_WANT_IPC_PARSE_VERSION
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index aad35c568681..3eeca48a146b 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -135,7 +135,6 @@ config X86
> select HAVE_C_RECORDMCOUNT
> select HAVE_DEBUG_KMEMLEAK
> select HAVE_DEBUG_STACKOVERFLOW
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select HAVE_DYNAMIC_FTRACE
> select HAVE_DYNAMIC_FTRACE_WITH_REGS
> diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
> index c921e8bccdc8..17df332269b2 100644
> --- a/arch/xtensa/Kconfig
> +++ b/arch/xtensa/Kconfig
> @@ -19,7 +19,6 @@ config XTENSA
> select HAVE_ARCH_KASAN if MMU
> select HAVE_CC_STACKPROTECTOR
> select HAVE_DEBUG_KMEMLEAK
> - select HAVE_DMA_API_DEBUG
> select HAVE_DMA_CONTIGUOUS
> select HAVE_EXIT_THREAD
> select HAVE_FUNCTION_TRACER
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 685ed2dd4384..d5175eb7b917 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -1634,7 +1634,6 @@ config PROVIDE_OHCI1394_DMA_INIT
>
> config DMA_API_DEBUG
> bool "Enable debugging of DMA-API usage"
> - depends on HAVE_DMA_API_DEBUG
> select NEED_DMA_MAP_STATE
> help
> Enable this option to debug the use of the DMA API by device drivers.
>

2018-05-08 10:09:31

by Robin Murphy

[permalink] [raw]
Subject: Re: [PATCH 3/3] dma-debug: unexport dma_debug_resize_entries and debug_dma_dump_mappings

On 24/04/18 15:02, Christoph Hellwig wrote:
> Only used by the AMD GART driver, which must be built in.

FWIW debug_dma_dump_mappings() is also called by the Intel VT-d driver,
but the same reasoning still applies. This does rather beg the question
of whether it's right to have bits of low-level dma-debug internals
*only* called by a couple of IOMMU drivers, but that can wait for
another day.

Reviewed-by: Robin Murphy <[email protected]>

> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> lib/dma-debug.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 075253cb613b..6a1ebaa83623 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -444,7 +444,6 @@ void debug_dma_dump_mappings(struct device *dev)
> spin_unlock_irqrestore(&bucket->lock, flags);
> }
> }
> -EXPORT_SYMBOL(debug_dma_dump_mappings);
>
> /*
> * For each mapping (initial cacheline in the case of
> @@ -753,7 +752,6 @@ int dma_debug_resize_entries(u32 num_entries)
>
> return ret;
> }
> -EXPORT_SYMBOL(dma_debug_resize_entries);
>
> /*
> * DMA-API debugging init code
>

2018-05-08 10:27:08

by Marek Szyprowski

[permalink] [raw]
Subject: Re: [PATCH 1/3] dma-debug: move initialization to common code

Hi Christoph,

On 2018-04-24 16:02, Christoph Hellwig wrote:
> Most mainstream architectures are using 65536 entries, so lets stick to
> that. If someone is really desperate to override it that can still be
> done through <asm/dma-mapping.h>, but I'd rather see a really good
> rationale for that.
>
> dma_debug_init is now called as a core_initcall, which for many
> architectures means much earlier, and provides dma-debug functionality
> earlier in the boot process. This should be safe as it only relies
> on the memory allocator already being available.
>
> Signed-off-by: Christoph Hellwig <[email protected]>

Nice! Unification of this is definitely needed and solves the issues
reported some time ago:

https://patchwork.kernel.org/patch/9429637/ (arm)
https://patchwork.kernel.org/patch/9431161/ (arm64, rejected)

Acked-by: Marek Szyprowski <[email protected]>

> ---
> arch/arm/mm/dma-mapping-nommu.c | 9 ---------
> arch/arm/mm/dma-mapping.c | 9 ---------
> arch/arm64/mm/dma-mapping.c | 10 ----------
> arch/c6x/kernel/dma.c | 11 -----------
> arch/ia64/kernel/dma-mapping.c | 10 ----------
> arch/microblaze/kernel/dma.c | 11 -----------
> arch/mips/mm/dma-default.c | 10 ----------
> arch/openrisc/kernel/dma.c | 11 -----------
> arch/powerpc/kernel/dma.c | 3 ---
> arch/s390/pci/pci_dma.c | 9 ---------
> arch/sh/mm/consistent.c | 9 ---------
> arch/sparc/kernel/Makefile | 2 --
> arch/sparc/kernel/dma.c | 13 -------------
> arch/x86/kernel/pci-dma.c | 4 ----
> arch/xtensa/kernel/pci-dma.c | 9 ---------
> include/linux/dma-debug.h | 6 ------
> lib/dma-debug.c | 21 ++++++++++++++-------
> 17 files changed, 14 insertions(+), 143 deletions(-)
> delete mode 100644 arch/sparc/kernel/dma.c
>
> diff --git a/arch/arm/mm/dma-mapping-nommu.c b/arch/arm/mm/dma-mapping-nommu.c
> index 619f24a42d09..f448a0663b10 100644
> --- a/arch/arm/mm/dma-mapping-nommu.c
> +++ b/arch/arm/mm/dma-mapping-nommu.c
> @@ -241,12 +241,3 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
> void arch_teardown_dma_ops(struct device *dev)
> {
> }
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -core_initcall(dma_debug_do_init);
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index 8c398fedbbb6..c26bf83f44ca 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -1165,15 +1165,6 @@ int arm_dma_supported(struct device *dev, u64 mask)
> return __dma_supported(dev, mask, false);
> }
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -core_initcall(dma_debug_do_init);
> -
> #ifdef CONFIG_ARM_DMA_USE_IOMMU
>
> static int __dma_info_to_prot(enum dma_data_direction dir, unsigned long attrs)
> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
> index a96ec0181818..db01f2709842 100644
> --- a/arch/arm64/mm/dma-mapping.c
> +++ b/arch/arm64/mm/dma-mapping.c
> @@ -508,16 +508,6 @@ static int __init arm64_dma_init(void)
> }
> arch_initcall(arm64_dma_init);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_debug_do_init);
> -
> -
> #ifdef CONFIG_IOMMU_DMA
> #include <linux/dma-iommu.h>
> #include <linux/platform_device.h>
> diff --git a/arch/c6x/kernel/dma.c b/arch/c6x/kernel/dma.c
> index 9fff8be75f58..31e1a9ec3a9c 100644
> --- a/arch/c6x/kernel/dma.c
> +++ b/arch/c6x/kernel/dma.c
> @@ -136,14 +136,3 @@ const struct dma_map_ops c6x_dma_ops = {
> .sync_sg_for_cpu = c6x_dma_sync_sg_for_cpu,
> };
> EXPORT_SYMBOL(c6x_dma_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c
> index f2d57e66fd86..7a471d8d67d4 100644
> --- a/arch/ia64/kernel/dma-mapping.c
> +++ b/arch/ia64/kernel/dma-mapping.c
> @@ -9,16 +9,6 @@ int iommu_detected __read_mostly;
> const struct dma_map_ops *dma_ops;
> EXPORT_SYMBOL(dma_ops);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> -
> const struct dma_map_ops *dma_get_ops(struct device *dev)
> {
> return dma_ops;
> diff --git a/arch/microblaze/kernel/dma.c b/arch/microblaze/kernel/dma.c
> index c91e8cef98dd..3145e7dc8ab1 100644
> --- a/arch/microblaze/kernel/dma.c
> +++ b/arch/microblaze/kernel/dma.c
> @@ -184,14 +184,3 @@ const struct dma_map_ops dma_nommu_ops = {
> .sync_sg_for_device = dma_nommu_sync_sg_for_device,
> };
> EXPORT_SYMBOL(dma_nommu_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> index dcafa43613b6..f9fef0028ca2 100644
> --- a/arch/mips/mm/dma-default.c
> +++ b/arch/mips/mm/dma-default.c
> @@ -402,13 +402,3 @@ static const struct dma_map_ops mips_default_dma_map_ops = {
>
> const struct dma_map_ops *mips_dma_map_ops = &mips_default_dma_map_ops;
> EXPORT_SYMBOL(mips_dma_map_ops);
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init mips_dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(mips_dma_init);
> diff --git a/arch/openrisc/kernel/dma.c b/arch/openrisc/kernel/dma.c
> index a945f00011b4..ec7fd45704d2 100644
> --- a/arch/openrisc/kernel/dma.c
> +++ b/arch/openrisc/kernel/dma.c
> @@ -247,14 +247,3 @@ const struct dma_map_ops or1k_dma_map_ops = {
> .sync_single_for_device = or1k_sync_single_for_device,
> };
> EXPORT_SYMBOL(or1k_dma_map_ops);
> -
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> -
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
> index da20569de9d4..138157deeadf 100644
> --- a/arch/powerpc/kernel/dma.c
> +++ b/arch/powerpc/kernel/dma.c
> @@ -309,8 +309,6 @@ int dma_set_coherent_mask(struct device *dev, u64 mask)
> }
> EXPORT_SYMBOL(dma_set_coherent_mask);
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> int dma_set_mask(struct device *dev, u64 dma_mask)
> {
> if (ppc_md.dma_set_mask)
> @@ -361,7 +359,6 @@ EXPORT_SYMBOL_GPL(dma_get_required_mask);
>
> static int __init dma_init(void)
> {
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> #ifdef CONFIG_PCI
> dma_debug_add_bus(&pci_bus_type);
> #endif
> diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
> index 2d15d84c20ed..5dee7a922589 100644
> --- a/arch/s390/pci/pci_dma.c
> +++ b/arch/s390/pci/pci_dma.c
> @@ -668,15 +668,6 @@ void zpci_dma_exit(void)
> kmem_cache_destroy(dma_region_table_cache);
> }
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init dma_debug_do_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_debug_do_init);
> -
> const struct dma_map_ops s390_pci_dma_ops = {
> .alloc = s390_dma_alloc,
> .free = s390_dma_free,
> diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
> index 8ce98691d822..35ea3099a3b6 100644
> --- a/arch/sh/mm/consistent.c
> +++ b/arch/sh/mm/consistent.c
> @@ -20,18 +20,9 @@
> #include <asm/cacheflush.h>
> #include <asm/addrspace.h>
>
> -#define PREALLOC_DMA_DEBUG_ENTRIES 4096
> -
> const struct dma_map_ops *dma_ops;
> EXPORT_SYMBOL(dma_ops);
>
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_init);
> -
> void *dma_generic_alloc_coherent(struct device *dev, size_t size,
> dma_addr_t *dma_handle, gfp_t gfp,
> unsigned long attrs)
> diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
> index 76cb57750dda..84cfc5a428d6 100644
> --- a/arch/sparc/kernel/Makefile
> +++ b/arch/sparc/kernel/Makefile
> @@ -74,8 +74,6 @@ obj-$(CONFIG_SPARC64) += pcr.o
> obj-$(CONFIG_SPARC64) += nmi.o
> obj-$(CONFIG_SPARC64_SMP) += cpumap.o
>
> -obj-y += dma.o
> -
> obj-$(CONFIG_PCIC_PCI) += pcic.o
> obj-$(CONFIG_LEON_PCI) += leon_pci.o
> obj-$(CONFIG_SPARC_GRPCI2)+= leon_pci_grpci2.o
> diff --git a/arch/sparc/kernel/dma.c b/arch/sparc/kernel/dma.c
> deleted file mode 100644
> index f73e7597c971..000000000000
> --- a/arch/sparc/kernel/dma.c
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <linux/kernel.h>
> -#include <linux/dma-mapping.h>
> -#include <linux/dma-debug.h>
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 15)
> -
> -static int __init dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(dma_init);
> diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
> index 77625b60a510..bcbaa2e8031e 100644
> --- a/arch/x86/kernel/pci-dma.c
> +++ b/arch/x86/kernel/pci-dma.c
> @@ -55,9 +55,6 @@ struct device x86_dma_fallback_dev = {
> };
> EXPORT_SYMBOL(x86_dma_fallback_dev);
>
> -/* Number of entries preallocated for DMA-API debugging */
> -#define PREALLOC_DMA_DEBUG_ENTRIES 65536
> -
> void __init pci_iommu_alloc(void)
> {
> struct iommu_table_entry *p;
> @@ -189,7 +186,6 @@ EXPORT_SYMBOL(arch_dma_supported);
> static int __init pci_iommu_init(void)
> {
> struct iommu_table_entry *p;
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
>
> #ifdef CONFIG_PCI
> dma_debug_add_bus(&pci_bus_type);
> diff --git a/arch/xtensa/kernel/pci-dma.c b/arch/xtensa/kernel/pci-dma.c
> index 732631ce250f..392b4a80ebc2 100644
> --- a/arch/xtensa/kernel/pci-dma.c
> +++ b/arch/xtensa/kernel/pci-dma.c
> @@ -261,12 +261,3 @@ const struct dma_map_ops xtensa_dma_map_ops = {
> .mapping_error = xtensa_dma_mapping_error,
> };
> EXPORT_SYMBOL(xtensa_dma_map_ops);
> -
> -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> -
> -static int __init xtensa_dma_init(void)
> -{
> - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
> - return 0;
> -}
> -fs_initcall(xtensa_dma_init);
> diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h
> index c7d844f09c3a..a785f2507159 100644
> --- a/include/linux/dma-debug.h
> +++ b/include/linux/dma-debug.h
> @@ -30,8 +30,6 @@ struct bus_type;
>
> extern void dma_debug_add_bus(struct bus_type *bus);
>
> -extern void dma_debug_init(u32 num_entries);
> -
> extern int dma_debug_resize_entries(u32 num_entries);
>
> extern void debug_dma_map_page(struct device *dev, struct page *page,
> @@ -100,10 +98,6 @@ static inline void dma_debug_add_bus(struct bus_type *bus)
> {
> }
>
> -static inline void dma_debug_init(u32 num_entries)
> -{
> -}
> -
> static inline int dma_debug_resize_entries(u32 num_entries)
> {
> return 0;
> diff --git a/lib/dma-debug.c b/lib/dma-debug.c
> index 7f5cdc1e6b29..712a897174e4 100644
> --- a/lib/dma-debug.c
> +++ b/lib/dma-debug.c
> @@ -41,6 +41,11 @@
> #define HASH_FN_SHIFT 13
> #define HASH_FN_MASK (HASH_SIZE - 1)
>
> +/* allow architectures to override this if absolutely required */
> +#ifndef PREALLOC_DMA_DEBUG_ENTRIES
> +#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16)
> +#endif
> +
> enum {
> dma_debug_single,
> dma_debug_page,
> @@ -1004,18 +1009,16 @@ void dma_debug_add_bus(struct bus_type *bus)
> bus_register_notifier(bus, nb);
> }
>
> -/*
> - * Let the architectures decide how many entries should be preallocated.
> - */
> -void dma_debug_init(u32 num_entries)
> +static int dma_debug_init(void)
> {
> + u32 num_entries;
> int i;
>
> /* Do not use dma_debug_initialized here, since we really want to be
> * called to set dma_debug_initialized
> */
> if (global_disable)
> - return;
> + return 0;
>
> for (i = 0; i < HASH_SIZE; ++i) {
> INIT_LIST_HEAD(&dma_entry_hash[i].list);
> @@ -1026,17 +1029,19 @@ void dma_debug_init(u32 num_entries)
> pr_err("DMA-API: error creating debugfs entries - disabling\n");
> global_disable = true;
>
> - return;
> + return 0;
> }
>
> if (req_entries)
> num_entries = req_entries;
> + else
> + num_entries = PREALLOC_DMA_DEBUG_ENTRIES;
>
> if (prealloc_memory(num_entries) != 0) {
> pr_err("DMA-API: debugging out of memory error - disabled\n");
> global_disable = true;
>
> - return;
> + return 0;
> }
>
> nr_total_entries = num_free_entries;
> @@ -1044,7 +1049,9 @@ void dma_debug_init(u32 num_entries)
> dma_debug_initialized = true;
>
> pr_info("DMA-API: debugging enabled by kernel config\n");
> + return 0;
> }
> +core_initcall(dma_debug_init);
>
> static __init int dma_debug_cmdline(char *str)
> {

Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland


2018-05-08 10:44:16

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 3/3] dma-debug: unexport dma_debug_resize_entries and debug_dma_dump_mappings

On Tue, May 08, 2018 at 11:05:20AM +0100, Robin Murphy wrote:
> On 24/04/18 15:02, Christoph Hellwig wrote:
>> Only used by the AMD GART driver, which must be built in.
>
> FWIW debug_dma_dump_mappings() is also called by the Intel VT-d driver, but
> the same reasoning still applies.

I'll update the changelog.

> This does rather beg the question of
> whether it's right to have bits of low-level dma-debug internals *only*
> called by a couple of IOMMU drivers, but that can wait for another day.

My gut feeling is that it is wrong, but I didn't have time to look into
the details and history of how this happened.