mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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…
	
		Reference in a new issue