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: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20201118204007.028261233@linutronix.de
This commit is contained in:
parent
6e799cb69a
commit
0e91a0c698
2 changed files with 25 additions and 1 deletions
|
@ -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
|
||||||
|
|
12
mm/highmem.c
12
mm/highmem.c
|
@ -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)
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Add table
Reference in a new issue