forked from mirrors/linux
		
	 f58780a8e3
			
		
	
	
		f58780a8e3
		
	
	
	
	
		
			
			The macro PAGE_REPORTING_MIN_ORDER is defined as the page reporting threshold. It can't be adjusted at runtime. This introduces a variable (@page_reporting_order) to replace the marcro (PAGE_REPORTING_MIN_ORDER). MAX_ORDER is assigned to it initially, meaning the page reporting is disabled. It will be specified by driver if valid one is provided. Otherwise, it will fall back to @pageblock_order. It's also exported so that the page reporting order can be adjusted at runtime. Link: https://lkml.kernel.org/r/20210625014710.42954-3-gshan@redhat.com Signed-off-by: Gavin Shan <gshan@redhat.com> Suggested-by: David Hildenbrand <david@redhat.com> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Will Deacon <will@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef _MM_PAGE_REPORTING_H
 | |
| #define _MM_PAGE_REPORTING_H
 | |
| 
 | |
| #include <linux/mmzone.h>
 | |
| #include <linux/pageblock-flags.h>
 | |
| #include <linux/page-isolation.h>
 | |
| #include <linux/jump_label.h>
 | |
| #include <linux/slab.h>
 | |
| #include <linux/pgtable.h>
 | |
| #include <linux/scatterlist.h>
 | |
| 
 | |
| #ifdef CONFIG_PAGE_REPORTING
 | |
| DECLARE_STATIC_KEY_FALSE(page_reporting_enabled);
 | |
| extern unsigned int page_reporting_order;
 | |
| void __page_reporting_notify(void);
 | |
| 
 | |
| static inline bool page_reported(struct page *page)
 | |
| {
 | |
| 	return static_branch_unlikely(&page_reporting_enabled) &&
 | |
| 	       PageReported(page);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * page_reporting_notify_free - Free page notification to start page processing
 | |
|  *
 | |
|  * This function is meant to act as a screener for __page_reporting_notify
 | |
|  * which will determine if a give zone has crossed over the high-water mark
 | |
|  * that will justify us beginning page treatment. If we have crossed that
 | |
|  * threshold then it will start the process of pulling some pages and
 | |
|  * placing them in the batch list for treatment.
 | |
|  */
 | |
| static inline void page_reporting_notify_free(unsigned int order)
 | |
| {
 | |
| 	/* Called from hot path in __free_one_page() */
 | |
| 	if (!static_branch_unlikely(&page_reporting_enabled))
 | |
| 		return;
 | |
| 
 | |
| 	/* Determine if we have crossed reporting threshold */
 | |
| 	if (order < page_reporting_order)
 | |
| 		return;
 | |
| 
 | |
| 	/* This will add a few cycles, but should be called infrequently */
 | |
| 	__page_reporting_notify();
 | |
| }
 | |
| #else /* CONFIG_PAGE_REPORTING */
 | |
| #define page_reported(_page)	false
 | |
| 
 | |
| static inline void page_reporting_notify_free(unsigned int order)
 | |
| {
 | |
| }
 | |
| #endif /* CONFIG_PAGE_REPORTING */
 | |
| #endif /*_MM_PAGE_REPORTING_H */
 |