* [PATCH] x86/pat: fix memory leak in free_memtype @ 2010-05-25 9:52 Xiaotian Feng 2010-05-26 0:12 ` Suresh Siddha 0 siblings, 1 reply; 6+ messages in thread From: Xiaotian Feng @ 2010-05-25 9:52 UTC (permalink / raw) To: x86 Cc: linux-kernel, Xiaotian Feng, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Venkatesh Pallipadi, Jack Steiner, Suresh Siddha reserve_memtype will allocate memory for new memtype, but in free_memtype, after the memtype erased from rbtree, the memory is not freed. Signed-off-by: Xiaotian Feng <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> Cc: Suresh Siddha <suresh.b.siddha@intel.com> --- arch/x86/mm/pat_rbtree.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index 07de4cb..fb8c1e5 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/arch/x86/mm/pat_rbtree.c @@ -15,6 +15,7 @@ #include <linux/rbtree.h> #include <linux/sched.h> #include <linux/gfp.h> +#include <linux/slab.h> #include <asm/pgtable.h> #include <asm/pat.h> @@ -240,6 +241,7 @@ int rbt_memtype_erase(u64 start, u64 end) return -EINVAL; rb_erase(&data->rb, &memtype_rbroot); + kfree(data); return 0; } -- 1.7.0.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] x86/pat: fix memory leak in free_memtype 2010-05-25 9:52 [PATCH] x86/pat: fix memory leak in free_memtype Xiaotian Feng @ 2010-05-26 0:12 ` Suresh Siddha 2010-05-26 0:27 ` Suresh Siddha 2010-05-26 1:51 ` [PATCH V2] " Xiaotian Feng 0 siblings, 2 replies; 6+ messages in thread From: Suresh Siddha @ 2010-05-26 0:12 UTC (permalink / raw) To: Xiaotian Feng Cc: x86, linux-kernel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Jack Steiner, Venkatesh Pallipadi On Tue, 2010-05-25 at 02:52 -0700, Xiaotian Feng wrote: > reserve_memtype will allocate memory for new memtype, but > in free_memtype, after the memtype erased from rbtree, the > memory is not freed. > > Signed-off-by: Xiaotian Feng <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> > Cc: Suresh Siddha <suresh.b.siddha@intel.com> > --- > arch/x86/mm/pat_rbtree.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c > index 07de4cb..fb8c1e5 100644 > --- a/arch/x86/mm/pat_rbtree.c > +++ b/arch/x86/mm/pat_rbtree.c > @@ -15,6 +15,7 @@ > #include <linux/rbtree.h> > #include <linux/sched.h> > #include <linux/gfp.h> > +#include <linux/slab.h> > > #include <asm/pgtable.h> > #include <asm/pat.h> > @@ -240,6 +241,7 @@ int rbt_memtype_erase(u64 start, u64 end) > return -EINVAL; > > rb_erase(&data->rb, &memtype_rbroot); > + kfree(data); > return 0; > } Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> Peter, Please apply this for x86/urgent, this is introduced in the post 2.6.34 changes. thanks, suresh ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] x86/pat: fix memory leak in free_memtype 2010-05-26 0:12 ` Suresh Siddha @ 2010-05-26 0:27 ` Suresh Siddha 2010-05-26 1:51 ` [PATCH V2] " Xiaotian Feng 1 sibling, 0 replies; 6+ messages in thread From: Suresh Siddha @ 2010-05-26 0:27 UTC (permalink / raw) To: Xiaotian Feng Cc: x86, linux-kernel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Jack Steiner, Venkatesh Pallipadi On Tue, 2010-05-25 at 17:12 -0700, Suresh Siddha wrote: > On Tue, 2010-05-25 at 02:52 -0700, Xiaotian Feng wrote: > > reserve_memtype will allocate memory for new memtype, but > > in free_memtype, after the memtype erased from rbtree, the > > memory is not freed. > > > > Signed-off-by: Xiaotian Feng <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> > > Cc: Suresh Siddha <suresh.b.siddha@intel.com> > > --- > > arch/x86/mm/pat_rbtree.c | 2 ++ > > 1 files changed, 2 insertions(+), 0 deletions(-) > > > > diff --git a/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c > > index 07de4cb..fb8c1e5 100644 > > --- a/arch/x86/mm/pat_rbtree.c > > +++ b/arch/x86/mm/pat_rbtree.c > > @@ -15,6 +15,7 @@ > > #include <linux/rbtree.h> > > #include <linux/sched.h> > > #include <linux/gfp.h> > > +#include <linux/slab.h> > > > > #include <asm/pgtable.h> > > #include <asm/pat.h> > > @@ -240,6 +241,7 @@ int rbt_memtype_erase(u64 start, u64 end) > > return -EINVAL; > > > > rb_erase(&data->rb, &memtype_rbroot); > > + kfree(data); > > return 0; > > } > > Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> > > Peter, Please apply this for x86/urgent, this is introduced in the post > 2.6.34 changes. Xiaotian, Also I think more cleaner fix is to do this in free_memtype(). Can you please resend the patch with this change? thanks, suresh ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH V2] x86/pat: fix memory leak in free_memtype 2010-05-26 0:12 ` Suresh Siddha 2010-05-26 0:27 ` Suresh Siddha @ 2010-05-26 1:51 ` Xiaotian Feng 2010-05-26 16:47 ` Suresh Siddha 2010-05-26 20:22 ` [tip:x86/urgent] x86, pat: Fix " tip-bot for Xiaotian Feng 1 sibling, 2 replies; 6+ messages in thread From: Xiaotian Feng @ 2010-05-26 1:51 UTC (permalink / raw) To: x86 Cc: linux-kernel, Xiaotian Feng, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Venkatesh Pallipadi, Jack Steiner, Suresh Siddha 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. Signed-off-by: Xiaotian Feng <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> Cc: Suresh Siddha <suresh.b.siddha@intel.com> --- arch/x86/mm/pat.c | 10 +++++++--- arch/x86/mm/pat_internal.h | 6 +++--- arch/x86/mm/pat_rbtree.c | 7 ++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index bbe5502..bf2b5fa 100644 --- a/arch/x86/mm/pat.c +++ b/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/arch/x86/mm/pat_internal.h b/arch/x86/mm/pat_internal.h index 4f39eef..77e5ba1 100644 --- a/arch/x86/mm/pat_internal.h +++ b/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/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index 07de4cb..f537087 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/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) -- 1.6.6.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH V2] x86/pat: fix memory leak in free_memtype 2010-05-26 1:51 ` [PATCH V2] " Xiaotian Feng @ 2010-05-26 16:47 ` Suresh Siddha 2010-05-26 20:22 ` [tip:x86/urgent] x86, pat: Fix " tip-bot for Xiaotian Feng 1 sibling, 0 replies; 6+ messages in thread From: Suresh Siddha @ 2010-05-26 16:47 UTC (permalink / raw) To: Xiaotian Feng Cc: x86, linux-kernel, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Jack Steiner, Venkatesh Pallipadi On Tue, 2010-05-25 at 18:51 -0700, Xiaotian Feng wrote: > 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. > > Signed-off-by: Xiaotian Feng <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> > Cc: Suresh Siddha <suresh.b.siddha@intel.com> It looks bigger than I expected. But it is a bit cleaner (as both allocation/free happens in pat.c API) Acked-by: Suresh Siddha <suresh.b.siddha@intel.com> > --- > arch/x86/mm/pat.c | 10 +++++++--- > arch/x86/mm/pat_internal.h | 6 +++--- > arch/x86/mm/pat_rbtree.c | 7 ++++--- > 3 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c > index bbe5502..bf2b5fa 100644 > --- a/arch/x86/mm/pat.c > +++ b/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/arch/x86/mm/pat_internal.h b/arch/x86/mm/pat_internal.h > index 4f39eef..77e5ba1 100644 > --- a/arch/x86/mm/pat_internal.h > +++ b/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/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c > index 07de4cb..f537087 100644 > --- a/arch/x86/mm/pat_rbtree.c > +++ b/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) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tip:x86/urgent] x86, pat: Fix memory leak in free_memtype 2010-05-26 1:51 ` [PATCH V2] " Xiaotian Feng 2010-05-26 16:47 ` Suresh Siddha @ 2010-05-26 20:22 ` tip-bot for Xiaotian Feng 1 sibling, 0 replies; 6+ messages in thread From: tip-bot for Xiaotian Feng @ 2010-05-26 20:22 UTC (permalink / raw) To: linux-tip-commits Cc: linux-kernel, hpa, mingo, venkatesh.pallipadi, steiner, suresh.b.siddha, tglx, dfeng, hpa Commit-ID: 20413f27163fb1b8b806c0c219dc95eae67c633a Gitweb: http://git.kernel.org/tip/20413f27163fb1b8b806c0c219dc95eae67c633a Author: Xiaotian Feng <dfeng@redhat.com> AuthorDate: Wed, 26 May 2010 09:51:10 +0800 Committer: H. Peter Anvin <hpa@linux.intel.com> CommitDate: Wed, 26 May 2010 11:26:04 -0700 x86, pat: Fix memory leak in free_memtype 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> --- arch/x86/mm/pat.c | 10 +++++++--- arch/x86/mm/pat_internal.h | 6 +++--- arch/x86/mm/pat_rbtree.c | 7 ++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index bbe5502..acc15b2 100644 --- a/arch/x86/mm/pat.c +++ b/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/arch/x86/mm/pat_internal.h b/arch/x86/mm/pat_internal.h index 4f39eef..77e5ba1 100644 --- a/arch/x86/mm/pat_internal.h +++ b/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/arch/x86/mm/pat_rbtree.c b/arch/x86/mm/pat_rbtree.c index 07de4cb..f537087 100644 --- a/arch/x86/mm/pat_rbtree.c +++ b/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) ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2010-05-26 20:22 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-05-25 9:52 [PATCH] x86/pat: fix memory leak in free_memtype Xiaotian Feng 2010-05-26 0:12 ` Suresh Siddha 2010-05-26 0:27 ` Suresh Siddha 2010-05-26 1:51 ` [PATCH V2] " Xiaotian Feng 2010-05-26 16:47 ` Suresh Siddha 2010-05-26 20:22 ` [tip:x86/urgent] x86, pat: Fix " tip-bot for Xiaotian Feng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®