public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* kref refcnt and false positives
@ 2006-12-13 23:34 Venkatesh Pallipadi
  2006-12-14  0:12 ` Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: Venkatesh Pallipadi @ 2006-12-13 23:34 UTC (permalink / raw)
  To: gregkh, Andrew Morton; +Cc: Arjan, linux-kernel


With WARN_ON addition to kobject_init()
[ http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.19/2.6.19-mm1/dont-use/broken-out/gregkh-driver-kobject-warn.patch ]

I started seeing following WARNING on CPU offline followed by online on my
x86_64 system.

WARNING at lib/kobject.c:172 kobject_init()

Call Trace:
 [<ffffffff8020ab45>] dump_trace+0xaa/0x3ef
 [<ffffffff8020aec4>] show_trace+0x3a/0x50
 [<ffffffff8020b0f6>] dump_stack+0x15/0x17
 [<ffffffff80350abc>] kobject_init+0x3f/0x8a
 [<ffffffff80350be1>] kobject_register+0x1a/0x3e
 [<ffffffff803bbd89>] sysdev_register+0x5b/0xf9
 [<ffffffff80211d0b>] mce_create_device+0x77/0xf4
 [<ffffffff80211dc2>] mce_cpu_callback+0x3a/0xe5
 [<ffffffff805632fd>] notifier_call_chain+0x26/0x3b
 [<ffffffff8023f6f3>] raw_notifier_call_chain+0x9/0xb
 [<ffffffff802519bf>] _cpu_up+0xb4/0xdc
 [<ffffffff80251a12>] cpu_up+0x2b/0x42
 [<ffffffff803bef00>] store_online+0x4a/0x72
 [<ffffffff803bb6ce>] sysdev_store+0x24/0x26
 [<ffffffff802baaa2>] sysfs_write_file+0xcf/0xfc
 [<ffffffff8027fc6f>] vfs_write+0xae/0x154
 [<ffffffff80280418>] sys_write+0x47/0x6f
 [<ffffffff8020963e>] system_call+0x7e/0x83
DWARF2 unwinder stuck at system_call+0x7e/0x83
Leftover inexact backtrace:

This is a false positive as mce.c is unregistering/registering sysfs
interfaces cleanly on hotplug.

kref_put() and conditional decrement of refcnt seems to be the root cause
for this and the patch below resolves the issue for me.

Original comment seemed to indicate that this conditional thing was
performance related. Is it really? If not, we should consider the below patch.

Thanks,
Venki





Now that kobject_init has a WARN_ON for refcnt, change below is needed
to avoid false positives.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>

Index: linux-2.6.19-rc-mm/lib/kref.c
===================================================================
--- linux-2.6.19-rc-mm.orig/lib/kref.c
+++ linux-2.6.19-rc-mm/lib/kref.c
@@ -52,12 +52,7 @@ int kref_put(struct kref *kref, void (*r
 	WARN_ON(release == NULL);
 	WARN_ON(release == (void (*)(struct kref *))kfree);
 
-	/*
-	 * if current count is one, we are the last user and can release object
-	 * right now, avoiding an atomic operation on 'refcount'
-	 */
-	if ((atomic_read(&kref->refcount) == 1) ||
-	    (atomic_dec_and_test(&kref->refcount))) {
+	if (atomic_dec_and_test(&kref->refcount)) {
 		release(kref);
 		return 1;
 	}

^ permalink raw reply	[flat|nested] 11+ messages in thread
* RE: kref refcnt and false positives
@ 2006-12-14 23:51 Pallipadi, Venkatesh
  2006-12-15  0:19 ` Eric W. Biederman
  0 siblings, 1 reply; 11+ messages in thread
From: Pallipadi, Venkatesh @ 2006-12-14 23:51 UTC (permalink / raw)
  To: Eric Dumazet, Andrew Morton
  Cc: Greg KH, Arjan, linux-kernel, Eric W. Biederman

 

>-----Original Message-----
>From: Eric Dumazet [mailto:dada1@cosmosbay.com] 
>Sent: Wednesday, December 13, 2006 11:57 PM
>To: Andrew Morton
>Cc: Greg KH; Pallipadi, Venkatesh; Arjan; linux-kernel; Eric 
>W. Biederman
>Subject: Re: kref refcnt and false positives
>
>
>I agree this 'optimization' is not "good" (I was the guy who 
>suggested it 
>http://lkml.org/lkml/2006/1/30/4 )
>
>After Eric Biederman message 
>(http://lkml.org/lkml/2006/1/30/292) I remember 
>adding some stat counters and telling Greg to not put the 
>patch in because 
>kref_put() was mostly called with refcount=1. But the patch 
>did its way. I 
>*did* ask Greg to revert it, but cannot find this mail 
>archived somewhere...
>
>But I believe Venkatesh problem comes from its release() 
>function : It is 
>supposed to free the object.
>If not, it should properly setup it so that further uses are OK.
>
>ie doing in release(kref)
>atomic_set(&kref->count, 0);
>

Agreed that setting kref refcnt to 0 in release will solve the probloem.
But, once the optimization code is removed, we don't need to set it to
zero as release will only be called after the count reaches zero anyway.

Thanks,
Venki

^ permalink raw reply	[flat|nested] 11+ messages in thread
[parent not found: <200612210901.kBL91MwR027509@hera.kernel.org>]

end of thread, other threads:[~2007-01-01 20:15 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-13 23:34 kref refcnt and false positives Venkatesh Pallipadi
2006-12-14  0:12 ` Greg KH
2006-12-14  0:08   ` Venkatesh Pallipadi
2006-12-14  0:41   ` Andrew Morton
2006-12-14  7:56     ` Eric Dumazet
  -- strict thread matches above, loose matches on Subject: below --
2006-12-14 23:51 Pallipadi, Venkatesh
2006-12-15  0:19 ` Eric W. Biederman
2006-12-15  0:35   ` Andrew Morton
2006-12-15  0:53     ` Eric W. Biederman
     [not found] <200612210901.kBL91MwR027509@hera.kernel.org>
2006-12-31 15:16 ` David Woodhouse
2007-01-01 20:13   ` Benjamin Herrenschmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox