cregit-Linux how code gets into the kernel

Release 4.7 include/linux/kref.h

Directory: include/linux
/*
 * kref.h - library routines for handling generic reference counted objects
 *
 * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
 * Copyright (C) 2004 IBM Corp.
 *
 * based on kobject.h which was:
 * Copyright (C) 2002-2003 Patrick Mochel <mochel@osdl.org>
 * Copyright (C) 2002-2003 Open Source Development Labs
 *
 * This file is released under the GPLv2.
 *
 */

#ifndef _KREF_H_

#define _KREF_H_

#include <linux/bug.h>
#include <linux/atomic.h>
#include <linux/kernel.h>
#include <linux/mutex.h>


struct kref {
	
atomic_t refcount;
};

/**
 * kref_init - initialize object.
 * @kref: object in question.
 */

static inline void kref_init(struct kref *kref) { atomic_set(&kref->refcount, 1); }

Contributors

PersonTokensPropCommitsCommitProp
peter zijlstrapeter zijlstra1463.64%150.00%
greg kroah-hartmangreg kroah-hartman836.36%150.00%
Total22100.00%2100.00%

/** * kref_get - increment refcount for object. * @kref: object. */
static inline void kref_get(struct kref *kref) { /* If refcount was 0 before incrementing then we have a race * condition when this kref is freeing by some other thread right now. * In this case one should use kref_get_unless_zero() */ WARN_ON_ONCE(atomic_inc_return(&kref->refcount) < 2); }

Contributors

PersonTokensPropCommitsCommitProp
peter zijlstrapeter zijlstra1350.00%125.00%
greg kroah-hartmangreg kroah-hartman830.77%250.00%
anatol pomozovanatol pomozov519.23%125.00%
Total26100.00%4100.00%

/** * 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. If the caller does pass kfree to this * function, you will be publicly mocked mercilessly by the kref * maintainer, and anyone else who happens to notice it. You have * been warned. * * 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_sub(struct kref *kref, unsigned int count, void (*release)(struct kref *kref)) { WARN_ON(release == NULL); if (atomic_sub_and_test((int) count, &kref->refcount)) { release(kref); return 1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
peter zijlstrapeter zijlstra4469.84%240.00%
greg kroah-hartmangreg kroah-hartman1930.16%360.00%
Total63100.00%5100.00%

/** * kref_put - decrement refcount for object. * @kref: object. * @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. If the caller does pass kfree to this * function, you will be publicly mocked mercilessly by the kref * maintainer, and anyone else who happens to notice it. You have * been warned. * * 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_put(struct kref *kref, void (*release)(struct kref *kref)) { return kref_sub(kref, 1, release); }

Contributors

PersonTokensPropCommitsCommitProp
thomas hellstromthomas hellstrom1955.88%133.33%
peter zijlstrapeter zijlstra1544.12%266.67%
Total34100.00%3100.00%


static inline int kref_put_mutex(struct kref *kref, void (*release)(struct kref *kref), struct mutex *lock) { WARN_ON(release == NULL); if (unlikely(!atomic_add_unless(&kref->refcount, -1, 1))) { mutex_lock(lock); if (unlikely(!atomic_dec_and_test(&kref->refcount))) { mutex_unlock(lock); return 0; } release(kref); return 1; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
al viroal viro97100.00%1100.00%
Total97100.00%1100.00%

/** * kref_get_unless_zero - Increment refcount for object unless it is zero. * @kref: object. * * Return non-zero if the increment succeeded. Otherwise return 0. * * This function is intended to simplify locking around refcounting for * objects that can be looked up from a lookup structure, and which are * removed from that lookup structure in the object destructor. * Operations on such objects require at least a read lock around * lookup + kref_get, and a write lock around kref_put + remove from lookup * structure. Furthermore, RCU implementations become extremely tricky. * With a lookup followed by a kref_get_unless_zero *with return value check* * locking in the kref_put path can be deferred to the actual removal from * the lookup structure and RCU lookups become trivial. */
static inline int __must_check kref_get_unless_zero(struct kref *kref) { return atomic_add_unless(&kref->refcount, 1, 0); }

Contributors

PersonTokensPropCommitsCommitProp
thomas hellstromthomas hellstrom26100.00%1100.00%
Total26100.00%1100.00%

#endif /* _KREF_H_ */

Overall Contributors

PersonTokensPropCommitsCommitProp
al viroal viro10033.00%17.14%
peter zijlstrapeter zijlstra9029.70%214.29%
greg kroah-hartmangreg kroah-hartman5618.48%535.71%
thomas hellstromthomas hellstrom4615.18%214.29%
anatol pomozovanatol pomozov51.65%17.14%
james bottomleyjames bottomley30.99%17.14%
linus torvaldslinus torvalds20.66%17.14%
robert p. j. dayrobert p. j. day10.33%17.14%
Total303100.00%14100.00%
Directory: include/linux
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}