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
parent
13f14b4d8b
commit
1373bed34e
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue