aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2011-12-14 14:19:07 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-14 14:19:07 -0500
commit6261ddee70174372d6a75601f40719b7a5392f3f (patch)
treea7c8b98520a5ad531ccafebc50a9ed25b1762dff
parent3c8ed88974472b928489e3943616500ce2ad0cd8 (diff)
kref: fix up the kfree build problems
It turns out that some memory allocators use kobjects, which use krefs, and kref.h was wanting to figure out the address of kfree(), which ended up in a loop. kfree was only being needed for a warning to tell the caller that they were doing something stupid. Now we just move that warning into the comments for the functions, which results in a bit more fun as everyone enjoys digging for people to mock at times of boredom. So, remove the dependancy of slab.h on kref.h, and fix up the other include file as well (we really only need bug.h and atomic.h, not types.h). Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Oliver Neukum <oneukum@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--include/linux/kref.h15
1 files changed, 10 insertions, 5 deletions
diff --git a/include/linux/kref.h b/include/linux/kref.h
index d66c88a3b48c..abc0120b09b7 100644
--- a/include/linux/kref.h
+++ b/include/linux/kref.h
@@ -15,8 +15,8 @@
15#ifndef _KREF_H_ 15#ifndef _KREF_H_
16#define _KREF_H_ 16#define _KREF_H_
17 17
18#include <linux/types.h> 18#include <linux/bug.h>
19#include <linux/slab.h> 19#include <linux/atomic.h>
20 20
21struct kref { 21struct kref {
22 atomic_t refcount; 22 atomic_t refcount;
@@ -48,7 +48,10 @@ static inline void kref_get(struct kref *kref)
48 * @release: pointer to the function that will clean up the object when the 48 * @release: pointer to the function that will clean up the object when the
49 * last reference to the object is released. 49 * last reference to the object is released.
50 * This pointer is required, and it is not acceptable to pass kfree 50 * This pointer is required, and it is not acceptable to pass kfree
51 * in as this function. 51 * in as this function. If the caller does pass kfree to this
52 * function, you will be publicly mocked mercilessly by the kref
53 * maintainer, and anyone else who happens to notice it. You have
54 * been warned.
52 * 55 *
53 * Subtract @count from the refcount, and if 0, call release(). 56 * Subtract @count from the refcount, and if 0, call release().
54 * Return 1 if the object was removed, otherwise return 0. Beware, if this 57 * Return 1 if the object was removed, otherwise return 0. Beware, if this
@@ -60,7 +63,6 @@ static inline int kref_sub(struct kref *kref, unsigned int count,
60 void (*release)(struct kref *kref)) 63 void (*release)(struct kref *kref))
61{ 64{
62 WARN_ON(release == NULL); 65 WARN_ON(release == NULL);
63 WARN_ON(release == (void (*)(struct kref *))kfree);
64 66
65 if (atomic_sub_and_test((int) count, &kref->refcount)) { 67 if (atomic_sub_and_test((int) count, &kref->refcount)) {
66 release(kref); 68 release(kref);
@@ -75,7 +77,10 @@ static inline int kref_sub(struct kref *kref, unsigned int count,
75 * @release: pointer to the function that will clean up the object when the 77 * @release: pointer to the function that will clean up the object when the
76 * last reference to the object is released. 78 * last reference to the object is released.
77 * This pointer is required, and it is not acceptable to pass kfree 79 * This pointer is required, and it is not acceptable to pass kfree
78 * in as this function. 80 * in as this function. If the caller does pass kfree to this
81 * function, you will be publicly mocked mercilessly by the kref
82 * maintainer, and anyone else who happens to notice it. You have
83 * been warned.
79 * 84 *
80 * Decrement the refcount, and if 0, call release(). 85 * Decrement the refcount, and if 0, call release().
81 * Return 1 if the object was removed, otherwise return 0. Beware, if this 86 * Return 1 if the object was removed, otherwise return 0. Beware, if this