Skip to content

Commit

Permalink
linuxkpi: refcount: Use atomic_t directly
Browse files Browse the repository at this point in the history
Simply use a typedef for refcount_t on atomic_t, this allow us
to use a nativ type and also changing struct kref to directly use
a refcount_t like Linux.

Reviewed by:		bz
Sponsored by:		Beckhoff Automation GmbH & Co. KG
Differential Revision:	https://reviews.freebsd.org/D45207
  • Loading branch information
evadot committed May 16, 2024
1 parent 5c0a192 commit abb1a13
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 17 deletions.
3 changes: 1 addition & 2 deletions sys/compat/linuxkpi/common/include/linux/kref.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@
#include <asm/atomic.h>

struct kref {
/* XXX In Linux this is a refcount_t */
atomic_t refcount;
refcount_t refcount;
};

static inline void
Expand Down
23 changes: 8 additions & 15 deletions sys/compat/linuxkpi/common/include/linux/refcount.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,58 +31,51 @@

#include <linux/atomic.h>

struct refcount_linux {
atomic_t value;
};
typedef struct refcount_linux refcount_t;
typedef atomic_t refcount_t;

static inline void
refcount_set(refcount_t *ref, unsigned int i)
{
atomic_set(&ref->value, i);
atomic_set(ref, i);
}

static inline void
refcount_inc(refcount_t *ref)
{
atomic_inc(&ref->value);
atomic_inc(ref);
}

static inline bool
refcount_inc_not_zero(refcount_t *ref)
{
return (atomic_inc_not_zero(&ref->value));
return (atomic_inc_not_zero(ref));
}

static inline void
refcount_dec(refcount_t *ref)
{
atomic_dec(&ref->value);
atomic_dec(ref);
}

static inline unsigned int
refcount_read(refcount_t *ref)
{
return atomic_read(&ref->value);
return atomic_read(ref);
}

static inline bool
refcount_dec_and_lock_irqsave(refcount_t *ref, spinlock_t *lock,
unsigned long *flags)
{
if (atomic_dec_and_test(&ref->value) == true) {
if (atomic_dec_and_test(ref) == true) {
spin_lock_irqsave(lock, flags);
return (true);
}
return (false);
}

/*
* struct kref uses atomic_t and not refcount_t so
* we differ from Linux here.
*/
static inline bool
refcount_dec_and_test(atomic_t *r)
refcount_dec_and_test(refcount_t *r)
{

return (atomic_dec_and_test(r));
Expand Down

0 comments on commit abb1a13

Please sign in to comment.