From 958306682d7b8acee95fe2e348e745c46e9af8d7 Mon Sep 17 00:00:00 2001 From: Xiaotian Feng Date: Wed, 26 May 2010 09:51:10 +0800 Subject: [PATCH] --- yaml --- r: 199343 b: refs/heads/master c: 20413f27163fb1b8b806c0c219dc95eae67c633a h: refs/heads/master i: 199341: 3fa55fc324dbb0d0a904091e2e423afd7d4dca9b 199339: 251606f1b1a3abb4b6a5488444c84f45b985d777 199335: 59608ae13a401a3e6312b3f9c14df7d4b7614b55 199327: fbfa550ea4cb2bab7ff33f827ef67ec66a8cdfc2 v: v3 --- [refs] | 2 +- trunk/arch/x86/mm/pat.c | 10 +++++++--- trunk/arch/x86/mm/pat_internal.h | 6 +++--- trunk/arch/x86/mm/pat_rbtree.c | 7 ++++--- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 61bfeabce1a4..63e573177203 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fe501f1e89cd460793152f500bf25d81d463515b +refs/heads/master: 20413f27163fb1b8b806c0c219dc95eae67c633a diff --git a/trunk/arch/x86/mm/pat.c b/trunk/arch/x86/mm/pat.c index bbe5502ee1cb..acc15b23b743 100644 --- a/trunk/arch/x86/mm/pat.c +++ b/trunk/arch/x86/mm/pat.c @@ -336,6 +336,7 @@ int free_memtype(u64 start, u64 end) { int err = -EINVAL; int is_range_ram; + struct memtype *entry; if (!pat_enabled) return 0; @@ -355,17 +356,20 @@ int free_memtype(u64 start, u64 end) } spin_lock(&memtype_lock); - err = rbt_memtype_erase(start, end); + entry = rbt_memtype_erase(start, end); spin_unlock(&memtype_lock); - if (err) { + if (!entry) { printk(KERN_INFO "%s:%d freeing invalid memtype %Lx-%Lx\n", current->comm, current->pid, start, end); + return -EINVAL; } + kfree(entry); + dprintk("free_memtype request 0x%Lx-0x%Lx\n", start, end); - return err; + return 0; } diff --git a/trunk/arch/x86/mm/pat_internal.h b/trunk/arch/x86/mm/pat_internal.h index 4f39eefa3e61..77e5ba153fac 100644 --- a/trunk/arch/x86/mm/pat_internal.h +++ b/trunk/arch/x86/mm/pat_internal.h @@ -28,15 +28,15 @@ static inline char *cattr_name(unsigned long flags) #ifdef CONFIG_X86_PAT extern int rbt_memtype_check_insert(struct memtype *new, unsigned long *new_type); -extern int rbt_memtype_erase(u64 start, u64 end); +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 int rbt_memtype_erase(u64 start, u64 end) -{ 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) diff --git a/trunk/arch/x86/mm/pat_rbtree.c b/trunk/arch/x86/mm/pat_rbtree.c index 07de4cb8cc30..f537087bb740 100644 --- a/trunk/arch/x86/mm/pat_rbtree.c +++ b/trunk/arch/x86/mm/pat_rbtree.c @@ -231,16 +231,17 @@ int rbt_memtype_check_insert(struct memtype *new, unsigned long *ret_type) return err; } -int rbt_memtype_erase(u64 start, u64 end) +struct memtype *rbt_memtype_erase(u64 start, u64 end) { struct memtype *data; data = memtype_rb_exact_match(&memtype_rbroot, start, end); if (!data) - return -EINVAL; + goto out; rb_erase(&data->rb, &memtype_rbroot); - return 0; +out: + return data; } struct memtype *rbt_memtype_lookup(u64 addr)