Less lines of code is better. Cc: adobriyan@gmail.com Cc: eric.dumazet@gmail.com Cc: mingo@elte.hu Signed-off-by: Peter Zijlstra --- include/linux/kref.h | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) Index: linux-2.6/include/linux/kref.h =================================================================== --- linux-2.6.orig/include/linux/kref.h +++ linux-2.6/include/linux/kref.h @@ -43,57 +43,49 @@ static inline void kref_get(struct kref } /** - * kref_put - decrement refcount for object. + * kref_sub - subtract a number of refcounts for object. * @kref: object. + * @count: Number of recounts to subtract. * @release: pointer to the function that will clean up the object when the * last reference to the object is released. * This pointer is required, and it is not acceptable to pass kfree * in as this function. * - * Decrement the refcount, and if 0, call release(). + * Subtract @count from the refcount, and if 0, call release(). * Return 1 if the object was removed, otherwise return 0. Beware, if this * function returns 0, you still can not count on the kref from remaining in * memory. Only use the return value if you want to see if the kref is now * gone, not present. */ -static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) +static inline int kref_sub(struct kref *kref, unsigned int count, + void (*release)(struct kref *kref)) { WARN_ON(release == NULL); WARN_ON(release == (void (*)(struct kref *))kfree); - if (atomic_dec_and_test(&kref->refcount)) { + if (atomic_sub_and_test((int) count, &kref->refcount)) { release(kref); return 1; } return 0; } - /** - * kref_sub - subtract a number of refcounts for object. + * kref_put - decrement refcount for object. * @kref: object. - * @count: Number of recounts to subtract. * @release: pointer to the function that will clean up the object when the * last reference to the object is released. * This pointer is required, and it is not acceptable to pass kfree * in as this function. * - * Subtract @count from the refcount, and if 0, call release(). + * Decrement the refcount, and if 0, call release(). * Return 1 if the object was removed, otherwise return 0. Beware, if this * function returns 0, you still can not count on the kref from remaining in * memory. Only use the return value if you want to see if the kref is now * gone, not present. */ -static inline int kref_sub(struct kref *kref, unsigned int count, - void (*release)(struct kref *kref)) +static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref)) { - WARN_ON(release == NULL); - WARN_ON(release == (void (*)(struct kref *))kfree); - - if (atomic_sub_and_test((int) count, &kref->refcount)) { - release(kref); - return 1; - } - return 0; + return kref_sub(kref, 1, release); } #endif /* _KREF_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/