kernel_optimize_test/kernel/dma
Hugh Dickins a85ffd59bd dma-debug: fix debug_dma_assert_idle(), use rcu_read_lock()
Since commit 2a9127fcf2 ("mm: rewrite wait_on_page_bit_common()
logic") improved unlock_page(), it has become more noticeable how
cow_user_page() in a kernel with CONFIG_DMA_API_DEBUG=y can create and
suffer from heavy contention on DMA debug's radix_lock in
debug_dma_assert_idle().

It is only doing a lookup: use rcu_read_lock() and rcu_read_unlock()
instead; though that does require the static ents[] to be moved
onstack...

...but, hold on, isn't that radix_tree_gang_lookup() and loop doing
quite the wrong thing: searching CACHELINES_PER_PAGE entries for an
exact match with the first cacheline of the page in question?
radix_tree_gang_lookup() is the right tool for the job, but we need
nothing more than to check the first entry it can find, reporting if
that falls anywhere within the page.

(Is RCU safe here? As safe as using the spinlock was. The entries are
never freed, so don't need to be freed by RCU. They may be reused, and
there is a faint chance of a race, with an offending entry reused while
printing its error info; but the spinlock did not prevent that either,
and I agree that it's not worth worrying about. ]

[ Side noe: this patch is a clear improvement to the status quo, but the
  next patch will be removing this debug function entirely.

  But just in case we decide we want to resurrect the debugging code
  some day, I'm first applying this improvement patch so that it doesn't
  get lost    - Linus ]

Fixes: 3b7a6418c7 ("dma debug: account for cachelines and read-only mappings in overlap tracking")
Signed-off-by: Hugh Dickins <hughd@google.com>
Acked-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2020-08-14 15:16:03 -07:00
..
coherent.c dma-coherent: fix integer overflow in the reserved-memory dma allocation 2020-03-16 10:43:02 +01:00
contiguous.c dma-contiguous: cleanup dma_alloc_contiguous 2020-07-28 13:42:15 +02:00
debug.c dma-debug: fix debug_dma_assert_idle(), use rcu_read_lock() 2020-08-14 15:16:03 -07:00
direct.c dma-mapping: inline the fast path dma-direct calls 2020-07-16 16:58:37 +02:00
dummy.c
Kconfig dma-mapping: add a dma_ops_bypass flag to struct device 2020-07-19 09:29:29 +02:00
Makefile dma-mapping: make support for dma ops optional 2020-07-19 09:29:23 +02:00
mapping.c dma-mapping: add a dma_ops_bypass flag to struct device 2020-07-19 09:29:29 +02:00
pool.c dma-pool: do not allocate pool memory from CMA 2020-07-14 15:46:32 +02:00
remap.c dma-remap: align the size in dma_common_*_remap() 2020-06-23 14:14:41 +02:00
swiotlb.c dma-direct: improve swiotlb error reporting 2020-02-05 18:53:05 +01:00
virt.c