* [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) @ 2007-08-01 23:55 Jesper Juhl 2007-08-02 0:26 ` Andrew Morton 0 siblings, 1 reply; 11+ messages in thread From: Jesper Juhl @ 2007-08-01 23:55 UTC (permalink / raw) To: Eric Moore Cc: DL-MPTFusionLinux, Linux Kernel Mailing List, Andrew Morton, support, mpt_linux_developer, linux-scsi, James Bottomley Greetings & Salutations, The Coverity checker spotted two potential memory leaks in drivers/message/fusion/mptbase.c::mpt_attach(). There are two returns that may leak the storage allocated for 'ioc' (sizeof(MPT_ADAPTER) bytes). A simple fix would be to simply add two kfree() calls before the return statements, but a better fix (that this patch implements) is to reorder the code so that if we hit the first return condition we don't have to do the allocation at all and then just add a kfree() call for the second case. Please consider applying. Patch has been compile tested only. Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com> --- drivers/message/fusion/mptbase.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index e866dac..f9bb705 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c @@ -1393,18 +1393,18 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) struct proc_dir_entry *dent, *ent; #endif + if (mpt_debug_level) + printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); + + if (pci_enable_device(pdev)) + return r; + ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); if (ioc == NULL) { printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n"); return -ENOMEM; } - ioc->debug_level = mpt_debug_level; - if (mpt_debug_level) - printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); - - if (pci_enable_device(pdev)) - return r; dinitprintk(ioc, printk(KERN_WARNING MYNAM ": mpt_adapter_install\n")); @@ -1413,6 +1413,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n")); } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n"); + kfree(ioc); return r; } ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-01 23:55 [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) Jesper Juhl @ 2007-08-02 0:26 ` Andrew Morton 2007-08-02 3:03 ` Matthew Wilcox 2007-08-02 8:20 ` Jesper Juhl 0 siblings, 2 replies; 11+ messages in thread From: Andrew Morton @ 2007-08-02 0:26 UTC (permalink / raw) To: Jesper Juhl Cc: Eric Moore, DL-MPTFusionLinux, Linux Kernel Mailing List, support, mpt_linux_developer, linux-scsi, James Bottomley On Thu, 2 Aug 2007 01:55:33 +0200 Jesper Juhl <jesper.juhl@gmail.com> wrote: > Greetings & Salutations, > > The Coverity checker spotted two potential memory leaks in > drivers/message/fusion/mptbase.c::mpt_attach(). > > There are two returns that may leak the storage allocated for > 'ioc' (sizeof(MPT_ADAPTER) bytes). > A simple fix would be to simply add two kfree() calls before > the return statements, but a better fix (that this patch > implements) is to reorder the code so that if we hit the first > return condition we don't have to do the allocation at all and > then just add a kfree() call for the second case. > > Please consider applying. Patch has been compile tested only. > > umm, > --- > > drivers/message/fusion/mptbase.c | 13 +++++++------ > 1 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c > index e866dac..f9bb705 100644 > --- a/drivers/message/fusion/mptbase.c > +++ b/drivers/message/fusion/mptbase.c > @@ -1393,18 +1393,18 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) > struct proc_dir_entry *dent, *ent; > #endif > > + if (mpt_debug_level) > + printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); > + > + if (pci_enable_device(pdev)) > + return r; > + > ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); Why on earth is that using GFP_ATOMIC? This function later goes on to create procfs files and such things. y'know, we could have a debug option which will spit warnings if someone does a !__GFP_WAIT allocation while !in_atomic() (only works if CONFIG_PREEMPT). But please, make it depend on !CONFIG_AKPM. I shudder to think about all the stuff it would pick up. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 0:26 ` Andrew Morton @ 2007-08-02 3:03 ` Matthew Wilcox 2007-08-02 5:13 ` Andrew Morton 2007-08-02 8:20 ` Jesper Juhl 1 sibling, 1 reply; 11+ messages in thread From: Matthew Wilcox @ 2007-08-02 3:03 UTC (permalink / raw) To: Andrew Morton Cc: Jesper Juhl, Eric Moore, DL-MPTFusionLinux, Linux Kernel Mailing List, support, mpt_linux_developer, linux-scsi, James Bottomley On Wed, Aug 01, 2007 at 05:26:53PM -0700, Andrew Morton wrote: > Why on earth is that using GFP_ATOMIC? This function later goes on to > create procfs files and such things. Seems fairly common in driver initialisation code. I removed three instances of this in the advansys driver. > y'know, we could have a debug option which will spit warnings if someone > does a !__GFP_WAIT allocation while !in_atomic() (only works if > CONFIG_PREEMPT). > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > the stuff it would pick up. Seems like you'd get a lot of false positives. How about a call: slab_warn_about_atomic_allocs(); right before calling the initcalls, and then slab_stop_warning_about_atomic_allocs(); after calling them? That should give people a lot to chew on for a few months. Obviously, you would need to not warn about allocations from interrupt context, as you say above. -- "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step." ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 3:03 ` Matthew Wilcox @ 2007-08-02 5:13 ` Andrew Morton 0 siblings, 0 replies; 11+ messages in thread From: Andrew Morton @ 2007-08-02 5:13 UTC (permalink / raw) To: Matthew Wilcox Cc: Jesper Juhl, Eric Moore, DL-MPTFusionLinux, Linux Kernel Mailing List, support, mpt_linux_developer, linux-scsi, James Bottomley On Wed, 1 Aug 2007 21:03:50 -0600 Matthew Wilcox <matthew@wil.cx> wrote: > On Wed, Aug 01, 2007 at 05:26:53PM -0700, Andrew Morton wrote: > > Why on earth is that using GFP_ATOMIC? This function later goes on to > > create procfs files and such things. > > Seems fairly common in driver initialisation code. I removed three > instances of this in the advansys driver. hrm. People reach for GFP_ATOMIC so often that it becomes a habit, I guess. It makes one wonder how much that lovely fault-injection framework is being used. > > y'know, we could have a debug option which will spit warnings if someone > > does a !__GFP_WAIT allocation while !in_atomic() (only works if > > CONFIG_PREEMPT). > > > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > > the stuff it would pick up. > > Seems like you'd get a lot of false positives. There would be a few. mempool does a non-__GFP_WAIT allocation deliberately, for example (I still think that's fishy btw). But I don't expect there would be a large number of falsies. We could add a __GFP_I_REALLY_MEANT_ATOMIC flag to shut those up. > How about a call: > > slab_warn_about_atomic_allocs(); > > right before calling the initcalls, and then > > slab_stop_warning_about_atomic_allocs(); > > after calling them? That should give people a lot to chew on for a few > months. Obviously, you would need to not warn about allocations from > interrupt context, as you say above. Could. But GFP_ATOMIC at initcall-time really isn't a problem (except that it can probably also happen at modprobe-time). What is the major concern is needlessly atomic allocations at regular runtime. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 0:26 ` Andrew Morton 2007-08-02 3:03 ` Matthew Wilcox @ 2007-08-02 8:20 ` Jesper Juhl 2007-08-02 22:53 ` Jesper Juhl 1 sibling, 1 reply; 11+ messages in thread From: Jesper Juhl @ 2007-08-02 8:20 UTC (permalink / raw) To: Andrew Morton Cc: Eric Moore, DL-MPTFusionLinux, Linux Kernel Mailing List, support, mpt_linux_developer, linux-scsi, James Bottomley On 02/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: > On Thu, 2 Aug 2007 01:55:33 +0200 > Jesper Juhl <jesper.juhl@gmail.com> wrote: > [snip] > > +++ b/drivers/message/fusion/mptbase.c > > @@ -1393,18 +1393,18 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id) > > struct proc_dir_entry *dent, *ent; > > #endif > > > > + if (mpt_debug_level) > > + printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level); > > + > > + if (pci_enable_device(pdev)) > > + return r; > > + > > ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC); > > Why on earth is that using GFP_ATOMIC? This function later goes on to > create procfs files and such things. > Dunno. But you are right, that does seem a bit odd, but I assumed there was a reason for it. > > y'know, we could have a debug option which will spit warnings if someone > does a !__GFP_WAIT allocation while !in_atomic() (only works if > CONFIG_PREEMPT). > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > the stuff it would pick up. > I can try to cook up something like that tonight... -- Jesper Juhl <jesper.juhl@gmail.com> Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html Plain text mails only, please http://www.expita.com/nomime.html ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 8:20 ` Jesper Juhl @ 2007-08-02 22:53 ` Jesper Juhl 2007-08-02 23:04 ` Andrew Morton 0 siblings, 1 reply; 11+ messages in thread From: Jesper Juhl @ 2007-08-02 22:53 UTC (permalink / raw) To: Andrew Morton Cc: Linux Kernel Mailing List, James Bottomley, Christoph Lameter, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall On Thursday 02 August 2007 10:20:47 Jesper Juhl wrote: > On 02/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: [snip] > > y'know, we could have a debug option which will spit warnings if someone > > does a !__GFP_WAIT allocation while !in_atomic() (only works if > > CONFIG_PREEMPT). > > > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > > the stuff it would pick up. > > > > I can try to cook up something like that tonight... > Ok, so I did a quick hack and I'm drowning in dmesg WARN_ON() traces with my usual config. This is what I added : diff --git a/mm/slub.c b/mm/slub.c index 6c6d74f..e60dd9e 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -20,6 +20,7 @@ #include <linux/mempolicy.h> #include <linux/ctype.h> #include <linux/kallsyms.h> +#include <linux/hardirq.h> /* * Lock order: @@ -1568,6 +1569,10 @@ static void __always_inline *slab_alloc(struct kmem_cache *s, void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags) { +#ifdef CONFIG_PREEMPT + WARN_ON( !in_atomic() && !(gfpflags & __GFP_WAIT) ); +#endif + return slab_alloc(s, gfpflags, -1, __builtin_return_address(0)); } EXPORT_SYMBOL(kmem_cache_alloc); @@ -2370,6 +2375,10 @@ void *__kmalloc(size_t size, gfp_t flags) { struct kmem_cache *s = get_slab(size, flags); +#ifdef CONFIG_PREEMPT + WARN_ON( !in_atomic() && !(flags & __GFP_WAIT) ); +#endif + if (ZERO_OR_NULL_PTR(s)) return s; And this is what I'm getting heaps of : ... [ 165.128607] ======================= [ 165.128609] WARNING: at mm/slub.c:1573 kmem_cache_alloc() [ 165.128611] [<c010400a>] show_trace_log_lvl+0x1a/0x30 [ 165.128614] [<c0104cd2>] show_trace+0x12/0x20 [ 165.128616] [<c0104cf6>] dump_stack+0x16/0x20 [ 165.128619] [<c0175ad3>] kmem_cache_alloc+0xe3/0x110 [ 165.128622] [<c015b10e>] mempool_alloc_slab+0xe/0x10 [ 165.128625] [<c015b211>] mempool_alloc+0x31/0xf0 [ 165.128628] [<c019d033>] bio_alloc_bioset+0x73/0x140 [ 165.128631] [<c019d10e>] bio_alloc+0xe/0x20 [ 165.128634] [<c019d6e1>] bio_map_kern+0x31/0x100 [ 165.128637] [<c02207b2>] blk_rq_map_kern+0x52/0x90 [ 165.128640] [<c02c418b>] scsi_execute+0x4b/0xe0 [ 165.128643] [<c02e5f28>] sr_do_ioctl+0xa8/0x230 [ 165.128646] [<c02e64f6>] sr_read_tochdr+0x76/0xb0 [ 165.128649] [<c02e654b>] sr_disk_status+0x1b/0xa0 [ 165.128652] [<c02e69db>] sr_cd_check+0x9b/0x1b0 [ 165.128655] [<c02e4fbd>] sr_media_change+0x7d/0x250 [ 165.128659] [<c02e6b8e>] media_changed+0x5e/0xa0 [ 165.128662] [<c02e6c01>] cdrom_media_changed+0x31/0x40 [ 165.128665] [<c02e51be>] sr_block_media_changed+0xe/0x10 [ 165.128668] [<c019e5a0>] check_disk_change+0x20/0x80 [ 165.128671] [<c02eaec3>] cdrom_open+0x173/0xa10 [ 165.128674] [<c02e526e>] sr_block_open+0x5e/0xa0 [ 165.128677] [<c019ed55>] do_open+0x85/0x2c0 [ 165.128680] [<c019f1b3>] blkdev_open+0x33/0x80 [ 165.128683] [<c0177c34>] __dentry_open+0xe4/0x200 [ 165.128686] [<c0177df5>] nameidata_to_filp+0x35/0x40 [ 165.128689] [<c0177e49>] do_filp_open+0x49/0x60 [ 165.128692] [<c0177ea9>] do_sys_open+0x49/0xe0 [ 165.128695] [<c0177f7c>] sys_open+0x1c/0x20 [ 165.128697] [<c0102fba>] syscall_call+0x7/0xb ... [ 165.134957] WARNING: at mm/slub.c:1573 kmem_cache_alloc() [ 165.134959] [<c010400a>] show_trace_log_lvl+0x1a/0x30 [ 165.134962] [<c0104cd2>] show_trace+0x12/0x20 [ 165.134965] [<c0104cf6>] dump_stack+0x16/0x20 [ 165.134969] [<c0175ad3>] kmem_cache_alloc+0xe3/0x110 [ 165.134971] [<c015b10e>] mempool_alloc_slab+0xe/0x10 [ 165.134974] [<c015b211>] mempool_alloc+0x31/0xf0 [ 165.134977] [<c0220b3c>] get_request+0xac/0x260 [ 165.134981] [<c022155c>] get_request_wait+0x1c/0x100 [ 165.134983] [<c0221672>] blk_get_request+0x32/0x70 [ 165.134986] [<c02c4162>] scsi_execute+0x22/0xe0 [ 165.134989] [<c02c428c>] scsi_execute_req+0x6c/0xd0 [ 165.134991] [<c02bff70>] ioctl_internal_command+0x40/0x100 [ 165.134996] [<c02c008c>] scsi_set_medium_removal+0x5c/0x90 [ 165.134999] [<c02e5e76>] sr_lock_door+0x16/0x20 [ 165.135002] [<c02e83d4>] cdrom_release+0x104/0x250 [ 165.135005] [<c02e5d74>] sr_block_release+0x24/0x40 [ 165.135008] [<c019eb96>] __blkdev_put+0x146/0x150 [ 165.135012] [<c019ebaa>] blkdev_put+0xa/0x10 [ 165.135015] [<c019f5e2>] blkdev_close+0x32/0x40 [ 165.135018] [<c017a586>] __fput+0xb6/0x180 [ 165.135021] [<c017a6b9>] fput+0x19/0x20 [ 165.135024] [<c0177a37>] filp_close+0x47/0x80 [ 165.135027] [<c0178e46>] sys_close+0x66/0xc0 [ 165.135030] [<c0102fba>] syscall_call+0x7/0xb [ 165.135032] ======================= [ 166.564998] WARNING: at mm/slub.c:1573 kmem_cache_alloc() [ 166.565006] [<c010400a>] show_trace_log_lvl+0x1a/0x30 [ 166.565013] [<c0104cd2>] show_trace+0x12/0x20 [ 166.565016] [<c0104cf6>] dump_stack+0x16/0x20 [ 166.565020] [<c0175ad3>] kmem_cache_alloc+0xe3/0x110 [ 166.565030] [<c015b10e>] mempool_alloc_slab+0xe/0x10 [ 166.565039] [<c015b211>] mempool_alloc+0x31/0xf0 [ 166.565047] [<c019cfdf>] bio_alloc_bioset+0x1f/0x140 [ 166.565057] [<c019d10e>] bio_alloc+0xe/0x20 [ 166.565066] [<c01997b3>] submit_bh+0x63/0x100 [ 166.565075] [<c01c96f8>] journal_do_submit_data+0x28/0x40 [ 166.565085] [<c01c9e18>] journal_commit_transaction+0x658/0x1290 [ 166.565095] [<c01ce5f2>] kjournald+0xb2/0x1e0 [ 166.565103] [<c013b9a2>] kthread+0x42/0x70 [ 166.565112] [<c0103bff>] kernel_thread_helper+0x7/0x18 [ 166.565121] ======================= ... etc... So, where do we go from here? Obviously my patch above is nothing but a quick hack. Should I turn that into a proper debug config option? Do we even want to clean up this stuff? Am I even looking at the right thing? I'm more than willing to try and create a proper debug option patch as well as clean up some of these allocations if wanted... What say "the powers that be" ? Kind regards, Jesper Juhl <jesper.juhl@gmail.com> PS. Please keep me on Cc when replying. ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 22:53 ` Jesper Juhl @ 2007-08-02 23:04 ` Andrew Morton 2007-08-02 23:10 ` Jesper Juhl 0 siblings, 1 reply; 11+ messages in thread From: Andrew Morton @ 2007-08-02 23:04 UTC (permalink / raw) To: Jesper Juhl Cc: Linux Kernel Mailing List, James Bottomley, Christoph Lameter, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall On Fri, 3 Aug 2007 00:53:44 +0200 Jesper Juhl <jesper.juhl@gmail.com> wrote: > On Thursday 02 August 2007 10:20:47 Jesper Juhl wrote: > > On 02/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: > [snip] > > > y'know, we could have a debug option which will spit warnings if someone > > > does a !__GFP_WAIT allocation while !in_atomic() (only works if > > > CONFIG_PREEMPT). > > > > > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > > > the stuff it would pick up. > > > > > > > I can try to cook up something like that tonight... > > > > Ok, so I did a quick hack and I'm drowning in dmesg WARN_ON() traces > with my usual config. > > This is what I added : > > diff --git a/mm/slub.c b/mm/slub.c > index 6c6d74f..e60dd9e 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -20,6 +20,7 @@ > #include <linux/mempolicy.h> > #include <linux/ctype.h> > #include <linux/kallsyms.h> > +#include <linux/hardirq.h> > > /* > * Lock order: > @@ -1568,6 +1569,10 @@ static void __always_inline *slab_alloc(struct kmem_cache *s, > > void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags) > { > +#ifdef CONFIG_PREEMPT > + WARN_ON( !in_atomic() && !(gfpflags & __GFP_WAIT) ); > +#endif > + > return slab_alloc(s, gfpflags, -1, __builtin_return_address(0)); > } > EXPORT_SYMBOL(kmem_cache_alloc); > @@ -2370,6 +2375,10 @@ void *__kmalloc(size_t size, gfp_t flags) > { > struct kmem_cache *s = get_slab(size, flags); > > +#ifdef CONFIG_PREEMPT > + WARN_ON( !in_atomic() && !(flags & __GFP_WAIT) ); > +#endif > + > if (ZERO_OR_NULL_PTR(s)) > return s; > > > > And this is what I'm getting heaps of : > > ... > [ 165.128607] ======================= > [ 165.128609] WARNING: at mm/slub.c:1573 kmem_cache_alloc() > [ 165.128611] [<c010400a>] show_trace_log_lvl+0x1a/0x30 > [ 165.128614] [<c0104cd2>] show_trace+0x12/0x20 > [ 165.128616] [<c0104cf6>] dump_stack+0x16/0x20 > [ 165.128619] [<c0175ad3>] kmem_cache_alloc+0xe3/0x110 > [ 165.128622] [<c015b10e>] mempool_alloc_slab+0xe/0x10 > [ 165.128625] [<c015b211>] mempool_alloc+0x31/0xf0 I said you would. > So, where do we go from here? Where I said ;) Add a new __GFP_ flag which suppresses the warning, add that flag to known-to-be-OK callsites, such as mempool_alloc(). ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 23:04 ` Andrew Morton @ 2007-08-02 23:10 ` Jesper Juhl 2007-08-02 23:17 ` Andrew Morton 0 siblings, 1 reply; 11+ messages in thread From: Jesper Juhl @ 2007-08-02 23:10 UTC (permalink / raw) To: Andrew Morton Cc: Linux Kernel Mailing List, James Bottomley, Christoph Lameter, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall On 03/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: > On Fri, 3 Aug 2007 00:53:44 +0200 > Jesper Juhl <jesper.juhl@gmail.com> wrote: > > > On Thursday 02 August 2007 10:20:47 Jesper Juhl wrote: > > > On 02/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: > > [snip] > > > > y'know, we could have a debug option which will spit warnings if someone > > > > does a !__GFP_WAIT allocation while !in_atomic() (only works if > > > > CONFIG_PREEMPT). > > > > > > > > But please, make it depend on !CONFIG_AKPM. I shudder to think about all > > > > the stuff it would pick up. > > > > > > > > > > I can try to cook up something like that tonight... > > > > > > > Ok, so I did a quick hack and I'm drowning in dmesg WARN_ON() traces > > with my usual config. > > > > This is what I added : > > > > diff --git a/mm/slub.c b/mm/slub.c > > index 6c6d74f..e60dd9e 100644 > > --- a/mm/slub.c > > +++ b/mm/slub.c > > @@ -20,6 +20,7 @@ > > #include <linux/mempolicy.h> > > #include <linux/ctype.h> > > #include <linux/kallsyms.h> > > +#include <linux/hardirq.h> > > > > /* > > * Lock order: > > @@ -1568,6 +1569,10 @@ static void __always_inline *slab_alloc(struct kmem_cache *s, > > > > void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags) > > { > > +#ifdef CONFIG_PREEMPT > > + WARN_ON( !in_atomic() && !(gfpflags & __GFP_WAIT) ); > > +#endif > > + > > return slab_alloc(s, gfpflags, -1, __builtin_return_address(0)); > > } > > EXPORT_SYMBOL(kmem_cache_alloc); > > @@ -2370,6 +2375,10 @@ void *__kmalloc(size_t size, gfp_t flags) > > { > > struct kmem_cache *s = get_slab(size, flags); > > > > +#ifdef CONFIG_PREEMPT > > + WARN_ON( !in_atomic() && !(flags & __GFP_WAIT) ); > > +#endif > > + > > if (ZERO_OR_NULL_PTR(s)) > > return s; > > > > > > > > And this is what I'm getting heaps of : > > > > ... > > [ 165.128607] ======================= > > [ 165.128609] WARNING: at mm/slub.c:1573 kmem_cache_alloc() > > [ 165.128611] [<c010400a>] show_trace_log_lvl+0x1a/0x30 > > [ 165.128614] [<c0104cd2>] show_trace+0x12/0x20 > > [ 165.128616] [<c0104cf6>] dump_stack+0x16/0x20 > > [ 165.128619] [<c0175ad3>] kmem_cache_alloc+0xe3/0x110 > > [ 165.128622] [<c015b10e>] mempool_alloc_slab+0xe/0x10 > > [ 165.128625] [<c015b211>] mempool_alloc+0x31/0xf0 > > I said you would. > Hehe, I know you did. I'm not complaining, simply stating facts (confirming what you said actually). > > So, where do we go from here? > > Where I said ;) Add a new __GFP_ flag which suppresses the warning, add > that flag to known-to-be-OK callsites, such as mempool_alloc(). > Ok, I'll try to play around with this some more, try to filter out false positives and see what I'm left with (if anything - I'm pretty limited hardware-wise, so I can only test a small subset of drivers, archs etc) - I'll keep you informed, but expect a few days to pass before I have any news... -- Jesper Juhl <jesper.juhl@gmail.com> Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html Plain text mails only, please http://www.expita.com/nomime.html ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 23:10 ` Jesper Juhl @ 2007-08-02 23:17 ` Andrew Morton 2007-08-02 23:26 ` Jesper Juhl 0 siblings, 1 reply; 11+ messages in thread From: Andrew Morton @ 2007-08-02 23:17 UTC (permalink / raw) To: Jesper Juhl Cc: Linux Kernel Mailing List, James Bottomley, Christoph Lameter, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall On Fri, 3 Aug 2007 01:10:02 +0200 "Jesper Juhl" <jesper.juhl@gmail.com> wrote: > > > So, where do we go from here? > > > > Where I said ;) Add a new __GFP_ flag which suppresses the warning, add > > that flag to known-to-be-OK callsites, such as mempool_alloc(). > > > Ok, I'll try to play around with this some more, try to filter out > false positives and see what I'm left with (if anything - I'm pretty > limited hardware-wise, so I can only test a small subset of drivers, > archs etc) - I'll keep you informed, but expect a few days to pass > before I have any news... Make it a once-off thing for now, so the warning will disable itself after it has triggered once. That will prevent the debug feature from making anyone's kernel unusable. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 23:17 ` Andrew Morton @ 2007-08-02 23:26 ` Jesper Juhl 2007-08-03 0:47 ` Christoph Lameter 0 siblings, 1 reply; 11+ messages in thread From: Jesper Juhl @ 2007-08-02 23:26 UTC (permalink / raw) To: Andrew Morton Cc: Linux Kernel Mailing List, James Bottomley, Christoph Lameter, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall On 03/08/07, Andrew Morton <akpm@linux-foundation.org> wrote: > On Fri, 3 Aug 2007 01:10:02 +0200 > "Jesper Juhl" <jesper.juhl@gmail.com> wrote: > > > > > So, where do we go from here? > > > > > > Where I said ;) Add a new __GFP_ flag which suppresses the warning, add > > > that flag to known-to-be-OK callsites, such as mempool_alloc(). > > > > > Ok, I'll try to play around with this some more, try to filter out > > false positives and see what I'm left with (if anything - I'm pretty > > limited hardware-wise, so I can only test a small subset of drivers, > > archs etc) - I'll keep you informed, but expect a few days to pass > > before I have any news... > > Make it a once-off thing for now, so the warning will disable itself after > it has triggered once. That will prevent the debug feature from making > anyone's kernel unusable. > Ok, I'll do that :-) Just be a little patient. I'm doing this in my spare time and I do have a real job/life to attend to, so I'll be playing with this in the little free time I have over the next couple of days. I'll get something done, but don't expect it until a few days have passed :-) -- Jesper Juhl <jesper.juhl@gmail.com> Don't top-post http://www.catb.org/~esr/jargon/html/T/top-post.html Plain text mails only, please http://www.expita.com/nomime.html ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) 2007-08-02 23:26 ` Jesper Juhl @ 2007-08-03 0:47 ` Christoph Lameter 0 siblings, 0 replies; 11+ messages in thread From: Christoph Lameter @ 2007-08-03 0:47 UTC (permalink / raw) To: Jesper Juhl Cc: Andrew Morton, Linux Kernel Mailing List, James Bottomley, Pekka Enberg, linux-mm, Ingo Molnar, Matt Mackall Mempools do not want to wait if there is an allocation failure. Its like GFP_THISNODE in that we want a failure. I had to add a if (NUMA_BUILD && (gfp_mask & GFP_THISNODE) == GFP_THISNODE) goto nopage; in page_alloc.c to make GFP_THISNODE fail. Maybe add a GFP_FAIL and check for that? diff --git a/include/linux/gfp.h b/include/linux/gfp.h index bc68dd9..41b6aa3 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -43,6 +43,7 @@ struct vm_area_struct; #define __GFP_REPEAT ((__force gfp_t)0x400u) /* Retry the allocation. Might fail */ #define __GFP_NOFAIL ((__force gfp_t)0x800u) /* Retry for ever. Cannot fail */ #define __GFP_NORETRY ((__force gfp_t)0x1000u)/* Do not retry. Might fail */ +#define __GFP_FAIL ((__force gfp_t)0x2000u)/* Fail immediately if there is a problem */ #define __GFP_COMP ((__force gfp_t)0x4000u)/* Add compound page metadata */ #define __GFP_ZERO ((__force gfp_t)0x8000u)/* Return zeroed page on success */ #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */ @@ -81,7 +82,8 @@ struct vm_area_struct; __GFP_MOVABLE) #ifdef CONFIG_NUMA -#define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) +#define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY |\ + __GFP_FAIL) #else #define GFP_THISNODE ((__force gfp_t)0) #endif diff --git a/mm/mempool.c b/mm/mempool.c index 02d5ec3..c1ac622 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -211,8 +211,9 @@ void * mempool_alloc(mempool_t *pool, gfp_t gfp_mask) gfp_mask |= __GFP_NOMEMALLOC; /* don't allocate emergency reserves */ gfp_mask |= __GFP_NORETRY; /* don't loop in __alloc_pages */ gfp_mask |= __GFP_NOWARN; /* failures are OK */ + gfp_mask |= __GFP_FAIL; - gfp_temp = gfp_mask & ~(__GFP_WAIT|__GFP_IO); + gfp_temp = gfp_mask & ~__GFP_IO; repeat_alloc: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3da85b8..58c1a4d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1250,15 +1250,7 @@ restart: if (page) goto got_pg; - /* - * GFP_THISNODE (meaning __GFP_THISNODE, __GFP_NORETRY and - * __GFP_NOWARN set) should not cause reclaim since the subsystem - * (f.e. slab) using GFP_THISNODE may choose to trigger reclaim - * using a larger set of nodes after it has established that the - * allowed per node queues are empty and that nodes are - * over allocated. - */ - if (NUMA_BUILD && (gfp_mask & GFP_THISNODE) == GFP_THISNODE) + if (gfp_mask & __GFP_FAIL) goto nopage; for (z = zonelist->zones; *z; z++) ^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2007-08-03 0:47 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2007-08-01 23:55 [PATCH] Fix two potential mem leaks in MPT Fusion (mpt_attach()) Jesper Juhl 2007-08-02 0:26 ` Andrew Morton 2007-08-02 3:03 ` Matthew Wilcox 2007-08-02 5:13 ` Andrew Morton 2007-08-02 8:20 ` Jesper Juhl 2007-08-02 22:53 ` Jesper Juhl 2007-08-02 23:04 ` Andrew Morton 2007-08-02 23:10 ` Jesper Juhl 2007-08-02 23:17 ` Andrew Morton 2007-08-02 23:26 ` Jesper Juhl 2007-08-03 0:47 ` Christoph Lameter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox