Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Dec 2022 09:25:23 GMT
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 67e628b7a643 - main - kref: replace hand-rolled atomic ops with refcount API
Message-ID:  <202212130925.2BD9PNWE090002@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=67e628b7a6432c1ab296b0c936dffc42df357d82

commit 67e628b7a6432c1ab296b0c936dffc42df357d82
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-12-05 17:38:45 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-12-13 09:24:57 +0000

    kref: replace hand-rolled atomic ops with refcount API
    
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D37608
---
 sys/compat/linuxkpi/common/include/linux/kref.h | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/kref.h b/sys/compat/linuxkpi/common/include/linux/kref.h
index 3b5645bf139b..9a6814175223 100644
--- a/sys/compat/linuxkpi/common/include/linux/kref.h
+++ b/sys/compat/linuxkpi/common/include/linux/kref.h
@@ -44,35 +44,35 @@
 
 struct kref {
 	/* XXX In Linux this is a refcount_t */
-	atomic_t refcount;
+	volatile u_int32_t refcount;
 };
 
 static inline void
 kref_init(struct kref *kref)
 {
 
-	refcount_init(&kref->refcount.counter, 1);
+	refcount_init(&kref->refcount, 1);
 }
 
 static inline unsigned int
-kref_read(const struct kref *kref)
+kref_read(struct kref *kref)
 {
 
-	return (atomic_read(&kref->refcount));
+	return (refcount_load(&kref->refcount));
 }
 
 static inline void
 kref_get(struct kref *kref)
 {
 
-	refcount_acquire(&kref->refcount.counter);
+	refcount_acquire(&kref->refcount);
 }
 
 static inline int
 kref_put(struct kref *kref, void (*rel)(struct kref *kref))
 {
 
-	if (refcount_release(&kref->refcount.counter)) {
+	if (refcount_release(&kref->refcount)) {
 		rel(kref);
 		return 1;
 	}
@@ -84,7 +84,7 @@ kref_put_lock(struct kref *kref, void (*rel)(struct kref *kref),
     spinlock_t *lock)
 {
 
-	if (refcount_release(&kref->refcount.counter)) {
+	if (refcount_release(&kref->refcount)) {
 		spin_lock(lock);
 		rel(kref);
 		return (1);
@@ -98,7 +98,7 @@ kref_sub(struct kref *kref, unsigned int count,
 {
 
 	while (count--) {
-		if (refcount_release(&kref->refcount.counter)) {
+		if (refcount_release(&kref->refcount)) {
 			rel(kref);
 			return 1;
 		}
@@ -110,16 +110,16 @@ static inline int __must_check
 kref_get_unless_zero(struct kref *kref)
 {
 
-	return atomic_add_unless(&kref->refcount, 1, 0);
+	return refcount_acquire_if_not_zero(&kref->refcount);
 }
 
 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))) {
+	if (unlikely(!refcount_release_if_not_last(&kref->refcount))) {
 		mutex_lock(lock);
-		if (unlikely(!atomic_dec_and_test(&kref->refcount))) {
+		if (unlikely(!refcount_release(&kref->refcount))) {
 			mutex_unlock(lock);
 			return 0;
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202212130925.2BD9PNWE090002>