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_ */
 |