1
0
Fork 0

docs: convert kref semaphore to mutex

Just converting this documentation semaphore reference, since we don't
want to promote semaphore usage.

Signed-off-by: Daniel Walker <dwalker@mvista.com>
Acked-by: Corey Minyard <minyard@acm.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
hifive-unleashed-5.1
Daniel Walker 2008-02-06 01:37:58 -08:00 committed by Linus Torvalds
parent 13f14b4d8b
commit 1373bed34e
1 changed files with 10 additions and 10 deletions

View File

@ -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
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)
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)
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