Messages in this thread | | | Date | Mon, 24 Apr 2006 20:51:28 -0700 | From | Greg KH <> | Subject | Re: [patch 1/4] kref: warn kref_put() with unreferenced kref |
| |
On Mon, Apr 24, 2006 at 04:33:34PM +0800, Akinobu Mita wrote: > This patch adds warning to detect kref_put() with unreferenced kref. > > Signed-off-by: Akinobu Mita <mita@miraclelinux.com> > > lib/kref.c | 14 ++++++++------ > 1 files changed, 8 insertions(+), 6 deletions(-) > > Index: 2.6-git/lib/kref.c > =================================================================== > --- 2.6-git.orig/lib/kref.c > +++ 2.6-git/lib/kref.c > @@ -49,6 +49,7 @@ void kref_get(struct kref *kref) > */ > int kref_put(struct kref *kref, void (*release)(struct kref *kref)) > { > + WARN_ON(atomic_read(&kref->refcount) < 1);
How can this ever be true? If the refcount _ever_ goes below 1, the object is freed.
> @@ -56,12 +57,13 @@ int kref_put(struct kref *kref, void (*r > * 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))) { > - release(kref); > - return 1; > - } > - return 0; > + if (atomic_read(&kref->refcount) == 1) > + atomic_set(&kref->refcount, 0); > + else if (!atomic_dec_and_test(&kref->refcount)) > + return 0; > + > + release(kref); > + return 1;
What does this change do? What are you trying to help out with? CONFIG_DEBUG_SLAB will check to see if you reference krefs that have already been freed.
thanks,
greg k -h - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |