 20413f2716
			
		
	
	
	20413f2716
	
	
	
		
			
			Reserve_memtype will allocate memory for new memtype, but in free_memtype, after the memtype erased from rbtree, the memory is not freed. Changes since V1: make rbt_memtype_erase return erased memtype so that it can be freed in free_memtype. [ hpa: not for -stable: 2.6.34 and earlier not affected ] Signed-off-by: Xiaotian Feng <dfeng@redhat.com> LKML-Reference: <1274838670-8731-1-git-send-email-dfeng@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Cc: Jack Steiner <steiner@sgi.com> Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
		
			
				
	
	
		
			46 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __PAT_INTERNAL_H_
 | |
| #define __PAT_INTERNAL_H_
 | |
| 
 | |
| extern int pat_debug_enable;
 | |
| 
 | |
| #define dprintk(fmt, arg...) \
 | |
| 	do { if (pat_debug_enable) printk(KERN_INFO fmt, ##arg); } while (0)
 | |
| 
 | |
| struct memtype {
 | |
| 	u64			start;
 | |
| 	u64			end;
 | |
| 	u64			subtree_max_end;
 | |
| 	unsigned long		type;
 | |
| 	struct rb_node		rb;
 | |
| };
 | |
| 
 | |
| static inline char *cattr_name(unsigned long flags)
 | |
| {
 | |
| 	switch (flags & _PAGE_CACHE_MASK) {
 | |
| 	case _PAGE_CACHE_UC:		return "uncached";
 | |
| 	case _PAGE_CACHE_UC_MINUS:	return "uncached-minus";
 | |
| 	case _PAGE_CACHE_WB:		return "write-back";
 | |
| 	case _PAGE_CACHE_WC:		return "write-combining";
 | |
| 	default:			return "broken";
 | |
| 	}
 | |
| }
 | |
| 
 | |
| #ifdef CONFIG_X86_PAT
 | |
| extern int rbt_memtype_check_insert(struct memtype *new,
 | |
| 					unsigned long *new_type);
 | |
| extern struct memtype *rbt_memtype_erase(u64 start, u64 end);
 | |
| extern struct memtype *rbt_memtype_lookup(u64 addr);
 | |
| extern int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos);
 | |
| #else
 | |
| static inline int rbt_memtype_check_insert(struct memtype *new,
 | |
| 					unsigned long *new_type)
 | |
| { return 0; }
 | |
| static inline struct memtype *rbt_memtype_erase(u64 start, u64 end)
 | |
| { return NULL; }
 | |
| static inline struct memtype *rbt_memtype_lookup(u64 addr)
 | |
| { return NULL; }
 | |
| static inline int rbt_memtype_copy_nth_element(struct memtype *out, loff_t pos)
 | |
| { return 0; }
 | |
| #endif
 | |
| 
 | |
| #endif /* __PAT_INTERNAL_H_ */
 |