Commit 1373bed3 authored by Daniel Walker's avatar Daniel Walker Committed by Linus Torvalds

docs: convert kref semaphore to mutex

Just converting this documentation semaphore reference, since we don't
want to promote semaphore usage.
Signed-off-by: default avatarDaniel Walker <dwalker@mvista.com>
Acked-by: default avatarCorey Minyard <minyard@acm.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 13f14b4d
...@@ -141,10 +141,10 @@ The last rule (rule 3) is the nastiest one to handle. Say, for ...@@ -141,10 +141,10 @@ The last rule (rule 3) is the nastiest one to handle. Say, for
instance, you have a list of items that are each kref-ed, and you wish instance, you have a list of items that are each kref-ed, and you wish
to get the first one. You can't just pull the first item off the list to get the first one. You can't just pull the first item off the list
and kref_get() it. That violates rule 3 because you are not already and kref_get() it. That violates rule 3 because you are not already
holding a valid pointer. You must add locks or semaphores. For holding a valid pointer. You must add a mutex (or some other lock).
instance: For instance:
static DECLARE_MUTEX(sem); static DEFINE_MUTEX(mutex);
static LIST_HEAD(q); static LIST_HEAD(q);
struct my_data struct my_data
{ {
...@@ -155,12 +155,12 @@ struct my_data ...@@ -155,12 +155,12 @@ struct my_data
static struct my_data *get_entry() static struct my_data *get_entry()
{ {
struct my_data *entry = NULL; struct my_data *entry = NULL;
down(&sem); mutex_lock(&mutex);
if (!list_empty(&q)) { if (!list_empty(&q)) {
entry = container_of(q.next, struct my_q_entry, link); entry = container_of(q.next, struct my_q_entry, link);
kref_get(&entry->refcount); kref_get(&entry->refcount);
} }
up(&sem); mutex_unlock(&mutex);
return entry; return entry;
} }
...@@ -174,9 +174,9 @@ static void release_entry(struct kref *ref) ...@@ -174,9 +174,9 @@ static void release_entry(struct kref *ref)
static void put_entry(struct my_data *entry) static void put_entry(struct my_data *entry)
{ {
down(&sem); mutex_lock(&mutex);
kref_put(&entry->refcount, release_entry); kref_put(&entry->refcount, release_entry);
up(&sem); mutex_unlock(&mutex);
} }
The kref_put() return value is useful if you do not want to hold the The kref_put() return value is useful if you do not want to hold the
...@@ -191,13 +191,13 @@ static void release_entry(struct kref *ref) ...@@ -191,13 +191,13 @@ static void release_entry(struct kref *ref)
static void put_entry(struct my_data *entry) static void put_entry(struct my_data *entry)
{ {
down(&sem); mutex_lock(&mutex);
if (kref_put(&entry->refcount, release_entry)) { if (kref_put(&entry->refcount, release_entry)) {
list_del(&entry->link); list_del(&entry->link);
up(&sem); mutex_unlock(&mutex);
kfree(entry); kfree(entry);
} else } else
up(&sem); mutex_unlock(&mutex);
} }
This is really more useful if you have to call other routines as part This is really more useful if you have to call other routines as part
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment