Commit 4af679cd7cbb0a0d8774b5cdb34bffcaa4e86e52
Committed by
Greg Kroah-Hartman
1 parent
175cad2667
Exists in
master
and in
38 other branches
kref: Inline all functions
These are tiny functions, there's no point in having them out-of-line. Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/n/tip-8eccvi2ur2fzgi00xdjlbf5z@git.kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 3 changed files with 76 additions and 103 deletions Side-by-side Diff
include/linux/kref.h
... | ... | @@ -16,16 +16,86 @@ |
16 | 16 | #define _KREF_H_ |
17 | 17 | |
18 | 18 | #include <linux/types.h> |
19 | +#include <linux/slab.h> | |
19 | 20 | |
20 | 21 | struct kref { |
21 | 22 | atomic_t refcount; |
22 | 23 | }; |
23 | 24 | |
24 | -void kref_init(struct kref *kref); | |
25 | -void kref_get(struct kref *kref); | |
26 | -int kref_put(struct kref *kref, void (*release) (struct kref *kref)); | |
27 | -int kref_sub(struct kref *kref, unsigned int count, | |
28 | - void (*release) (struct kref *kref)); | |
25 | +/** | |
26 | + * kref_init - initialize object. | |
27 | + * @kref: object in question. | |
28 | + */ | |
29 | +static inline void kref_init(struct kref *kref) | |
30 | +{ | |
31 | + atomic_set(&kref->refcount, 1); | |
32 | + smp_mb(); | |
33 | +} | |
29 | 34 | |
35 | +/** | |
36 | + * kref_get - increment refcount for object. | |
37 | + * @kref: object. | |
38 | + */ | |
39 | +static inline void kref_get(struct kref *kref) | |
40 | +{ | |
41 | + WARN_ON(!atomic_read(&kref->refcount)); | |
42 | + atomic_inc(&kref->refcount); | |
43 | + smp_mb__after_atomic_inc(); | |
44 | +} | |
45 | + | |
46 | +/** | |
47 | + * kref_put - decrement refcount for object. | |
48 | + * @kref: object. | |
49 | + * @release: pointer to the function that will clean up the object when the | |
50 | + * last reference to the object is released. | |
51 | + * This pointer is required, and it is not acceptable to pass kfree | |
52 | + * in as this function. | |
53 | + * | |
54 | + * Decrement the refcount, and if 0, call release(). | |
55 | + * Return 1 if the object was removed, otherwise return 0. Beware, if this | |
56 | + * function returns 0, you still can not count on the kref from remaining in | |
57 | + * memory. Only use the return value if you want to see if the kref is now | |
58 | + * gone, not present. | |
59 | + */ | |
60 | +static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) | |
61 | +{ | |
62 | + WARN_ON(release == NULL); | |
63 | + WARN_ON(release == (void (*)(struct kref *))kfree); | |
64 | + | |
65 | + if (atomic_dec_and_test(&kref->refcount)) { | |
66 | + release(kref); | |
67 | + return 1; | |
68 | + } | |
69 | + return 0; | |
70 | +} | |
71 | + | |
72 | + | |
73 | +/** | |
74 | + * kref_sub - subtract a number of refcounts for object. | |
75 | + * @kref: object. | |
76 | + * @count: Number of recounts to subtract. | |
77 | + * @release: pointer to the function that will clean up the object when the | |
78 | + * last reference to the object is released. | |
79 | + * This pointer is required, and it is not acceptable to pass kfree | |
80 | + * in as this function. | |
81 | + * | |
82 | + * Subtract @count from the refcount, and if 0, call release(). | |
83 | + * Return 1 if the object was removed, otherwise return 0. Beware, if this | |
84 | + * function returns 0, you still can not count on the kref from remaining in | |
85 | + * memory. Only use the return value if you want to see if the kref is now | |
86 | + * gone, not present. | |
87 | + */ | |
88 | +static inline int kref_sub(struct kref *kref, unsigned int count, | |
89 | + void (*release)(struct kref *kref)) | |
90 | +{ | |
91 | + WARN_ON(release == NULL); | |
92 | + WARN_ON(release == (void (*)(struct kref *))kfree); | |
93 | + | |
94 | + if (atomic_sub_and_test((int) count, &kref->refcount)) { | |
95 | + release(kref); | |
96 | + return 1; | |
97 | + } | |
98 | + return 0; | |
99 | +} | |
30 | 100 | #endif /* _KREF_H_ */ |
lib/Makefile
... | ... | @@ -17,7 +17,7 @@ |
17 | 17 | lib-$(CONFIG_MMU) += ioremap.o |
18 | 18 | lib-$(CONFIG_SMP) += cpumask.o |
19 | 19 | |
20 | -lib-y += kobject.o kref.o klist.o | |
20 | +lib-y += kobject.o klist.o | |
21 | 21 | |
22 | 22 | obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \ |
23 | 23 | bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \ |
lib/kref.c
1 | -/* | |
2 | - * kref.c - library routines for handling generic reference counted objects | |
3 | - * | |
4 | - * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com> | |
5 | - * Copyright (C) 2004 IBM Corp. | |
6 | - * | |
7 | - * based on lib/kobject.c which was: | |
8 | - * Copyright (C) 2002-2003 Patrick Mochel <mochel@osdl.org> | |
9 | - * | |
10 | - * This file is released under the GPLv2. | |
11 | - * | |
12 | - */ | |
13 | - | |
14 | -#include <linux/kref.h> | |
15 | -#include <linux/module.h> | |
16 | -#include <linux/slab.h> | |
17 | - | |
18 | -/** | |
19 | - * kref_init - initialize object. | |
20 | - * @kref: object in question. | |
21 | - */ | |
22 | -void kref_init(struct kref *kref) | |
23 | -{ | |
24 | - atomic_set(&kref->refcount, 1); | |
25 | - smp_mb(); | |
26 | -} | |
27 | - | |
28 | -/** | |
29 | - * kref_get - increment refcount for object. | |
30 | - * @kref: object. | |
31 | - */ | |
32 | -void kref_get(struct kref *kref) | |
33 | -{ | |
34 | - WARN_ON(!atomic_read(&kref->refcount)); | |
35 | - atomic_inc(&kref->refcount); | |
36 | - smp_mb__after_atomic_inc(); | |
37 | -} | |
38 | - | |
39 | -/** | |
40 | - * kref_put - decrement refcount for object. | |
41 | - * @kref: object. | |
42 | - * @release: pointer to the function that will clean up the object when the | |
43 | - * last reference to the object is released. | |
44 | - * This pointer is required, and it is not acceptable to pass kfree | |
45 | - * in as this function. | |
46 | - * | |
47 | - * Decrement the refcount, and if 0, call release(). | |
48 | - * Return 1 if the object was removed, otherwise return 0. Beware, if this | |
49 | - * function returns 0, you still can not count on the kref from remaining in | |
50 | - * memory. Only use the return value if you want to see if the kref is now | |
51 | - * gone, not present. | |
52 | - */ | |
53 | -int kref_put(struct kref *kref, void (*release)(struct kref *kref)) | |
54 | -{ | |
55 | - WARN_ON(release == NULL); | |
56 | - WARN_ON(release == (void (*)(struct kref *))kfree); | |
57 | - | |
58 | - if (atomic_dec_and_test(&kref->refcount)) { | |
59 | - release(kref); | |
60 | - return 1; | |
61 | - } | |
62 | - return 0; | |
63 | -} | |
64 | - | |
65 | - | |
66 | -/** | |
67 | - * kref_sub - subtract a number of refcounts for object. | |
68 | - * @kref: object. | |
69 | - * @count: Number of recounts to subtract. | |
70 | - * @release: pointer to the function that will clean up the object when the | |
71 | - * last reference to the object is released. | |
72 | - * This pointer is required, and it is not acceptable to pass kfree | |
73 | - * in as this function. | |
74 | - * | |
75 | - * Subtract @count from the refcount, and if 0, call release(). | |
76 | - * Return 1 if the object was removed, otherwise return 0. Beware, if this | |
77 | - * function returns 0, you still can not count on the kref from remaining in | |
78 | - * memory. Only use the return value if you want to see if the kref is now | |
79 | - * gone, not present. | |
80 | - */ | |
81 | -int kref_sub(struct kref *kref, unsigned int count, | |
82 | - void (*release)(struct kref *kref)) | |
83 | -{ | |
84 | - WARN_ON(release == NULL); | |
85 | - WARN_ON(release == (void (*)(struct kref *))kfree); | |
86 | - | |
87 | - if (atomic_sub_and_test((int) count, &kref->refcount)) { | |
88 | - release(kref); | |
89 | - return 1; | |
90 | - } | |
91 | - return 0; | |
92 | -} | |
93 | - | |
94 | -EXPORT_SYMBOL(kref_init); | |
95 | -EXPORT_SYMBOL(kref_get); | |
96 | -EXPORT_SYMBOL(kref_put); | |
97 | -EXPORT_SYMBOL(kref_sub); |