From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: virtio-dev@lists.oasis-open.org, Joern Engel <joern@logfs.org>,
Anatol Pomozov <anatol.pomozov@gmail.com>,
netdev@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
qinchuanyu@huawei.com, davem@davemloft.net
Subject: [PATCH net 1/3] kref: add kref_sub_return
Date: Wed, 12 Feb 2014 18:38:21 +0200 [thread overview]
Message-ID: <1392222846-26699-2-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1392222846-26699-1-git-send-email-mst@redhat.com>
It is sometimes useful to get the value of the reference count after
decrement.
For example, vhost wants to execute some periodic cleanup operations
once number of references drops below a specific value, before it
reaches zero (for efficiency).
Add an API to do this atomically and efficiently using
atomic_sub_return.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
Greg, could you ack this API extension please?
I think it is cleanest to merge this through -net together
with the first user.
include/linux/kref.h | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/include/linux/kref.h b/include/linux/kref.h
index 484604d..cb20550 100644
--- a/include/linux/kref.h
+++ b/include/linux/kref.h
@@ -61,7 +61,7 @@ static inline void kref_get(struct kref *kref)
*
* 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
+ * function returns 0, you still can not count on the kref remaining in
* memory. Only use the return value if you want to see if the kref is now
* gone, not present.
*/
@@ -78,6 +78,38 @@ static inline int kref_sub(struct kref *kref, unsigned int count,
}
/**
+ * kref_sub_return - 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 the new refcount. Beware, if this function returns > N, you still
+ * can not count on there being at least N other references, and in
+ * particular, on the kref remaining in memory.
+ * Only use the return value if you want to see if there are at most,
+ * not at least, N other references to kref,
+ */
+static inline int kref_sub_return(struct kref *kref, unsigned int count,
+ void (*release)(struct kref *kref))
+{
+ int r;
+
+ WARN_ON(release == NULL);
+
+ r = atomic_sub_return((int) count, &kref->refcount);
+ if (!r)
+ release(kref);
+ return r;
+}
+
+/**
* kref_put - decrement refcount for object.
* @kref: object.
* @release: pointer to the function that will clean up the object when the
--
MST
next prev parent reply other threads:[~2014-02-12 16:38 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-12 16:37 [PATCH net 0/3] vhost fixes for 3.14, -stable Michael S. Tsirkin
2014-02-12 16:36 ` [PATCH net 3/3] vhost: fix a theoretical race in device cleanup Michael S. Tsirkin
2014-02-12 16:38 ` [PATCH net 2/3] vhost: fix ref cnt checking deadlock Michael S. Tsirkin
2014-02-12 16:38 ` Michael S. Tsirkin [this message]
2014-02-12 16:56 ` [PATCH net 1/3] kref: add kref_sub_return Greg Kroah-Hartman
2014-02-12 17:35 ` Michael S. Tsirkin
[not found] ` <20140212173524.GA26860@redhat.com>
2014-02-12 18:37 ` Greg Kroah-Hartman
2014-02-12 18:39 ` Anatol Pomozov
2014-02-13 0:06 ` David Miller
2014-02-13 1:25 ` Jörn Engel
2014-02-13 1:39 ` Greg KH
2014-02-13 4:05 ` David Miller
2014-02-13 4:09 ` David Miller
2014-02-14 0:03 ` Greg KH
2014-02-14 5:10 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1392222846-26699-2-git-send-email-mst@redhat.com \
--to=mst@redhat.com \
--cc=anatol.pomozov@gmail.com \
--cc=davem@davemloft.net \
--cc=gregkh@linuxfoundation.org \
--cc=joern@logfs.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=qinchuanyu@huawei.com \
--cc=virtio-dev@lists.oasis-open.org \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).