Commit 0e91a0c6 authored by Thomas Gleixner's avatar Thomas Gleixner

mm/highmem: Provide CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP

CONFIG_DEBUG_KMAP_LOCAL, which is selected by CONFIG_DEBUG_HIGHMEM is only
providing guard pages, but does not provide a mechanism to enforce the
usage of the kmap_local() infrastructure.

Provide CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP which forces the temporary
mapping even for lowmem pages. This needs to be a seperate config switch
because this only works on architectures which do not have cache aliasing
problems.
Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20201118204007.028261233@linutronix.de
parent 6e799cb6
...@@ -856,9 +856,23 @@ config DEBUG_KMAP_LOCAL ...@@ -856,9 +856,23 @@ config DEBUG_KMAP_LOCAL
This option enables additional error checking for the kmap_local This option enables additional error checking for the kmap_local
infrastructure. Disable for production use. infrastructure. Disable for production use.
config ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
bool
config DEBUG_KMAP_LOCAL_FORCE_MAP
bool "Enforce kmap_local temporary mappings"
depends on DEBUG_KERNEL && ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
select KMAP_LOCAL
select DEBUG_KMAP_LOCAL
help
This option enforces temporary mappings through the kmap_local
mechanism for non-highmem pages and on non-highmem systems.
Disable this for production systems!
config DEBUG_HIGHMEM config DEBUG_HIGHMEM
bool "Highmem debugging" bool "Highmem debugging"
depends on DEBUG_KERNEL && HIGHMEM depends on DEBUG_KERNEL && HIGHMEM
select DEBUG_KMAP_LOCAL_FORCE_MAP if ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP
select DEBUG_KMAP_LOCAL select DEBUG_KMAP_LOCAL
help help
This option enables additional error checking for high memory This option enables additional error checking for high memory
......
...@@ -474,7 +474,12 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot) ...@@ -474,7 +474,12 @@ void *__kmap_local_page_prot(struct page *page, pgprot_t prot)
{ {
void *kmap; void *kmap;
if (!PageHighMem(page)) /*
* To broaden the usage of the actual kmap_local() machinery always map
* pages when debugging is enabled and the architecture has no problems
* with alias mappings.
*/
if (!IS_ENABLED(CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP) && !PageHighMem(page))
return page_address(page); return page_address(page);
/* Try kmap_high_get() if architecture has it enabled */ /* Try kmap_high_get() if architecture has it enabled */
...@@ -494,6 +499,11 @@ void kunmap_local_indexed(void *vaddr) ...@@ -494,6 +499,11 @@ void kunmap_local_indexed(void *vaddr)
if (addr < __fix_to_virt(FIX_KMAP_END) || if (addr < __fix_to_virt(FIX_KMAP_END) ||
addr > __fix_to_virt(FIX_KMAP_BEGIN)) { addr > __fix_to_virt(FIX_KMAP_BEGIN)) {
if (IS_ENABLED(CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP)) {
/* This _should_ never happen! See above. */
WARN_ON_ONCE(1);
return;
}
/* /*
* Handle mappings which were obtained by kmap_high_get() * Handle mappings which were obtained by kmap_high_get()
* first as the virtual address of such mappings is below * first as the virtual address of such mappings is below
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment