提交 1373bed3 编写于 作者: D Daniel Walker 提交者: 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: NDaniel Walker <dwalker@mvista.com>
Acked-by: NCorey Minyard <minyard@acm.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册