diff options
Diffstat (limited to 'Documentation/kref.txt')
| -rw-r--r-- | Documentation/kref.txt | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/Documentation/kref.txt b/Documentation/kref.txt index f38b59d00c63..130b6e87aa7e 100644 --- a/Documentation/kref.txt +++ b/Documentation/kref.txt | |||
| @@ -141,10 +141,10 @@ The last rule (rule 3) is the nastiest one to handle. Say, for | |||
| 141 | instance, you have a list of items that are each kref-ed, and you wish | 141 | instance, you have a list of items that are each kref-ed, and you wish |
| 142 | to get the first one. You can't just pull the first item off the list | 142 | to get the first one. You can't just pull the first item off the list |
| 143 | and kref_get() it. That violates rule 3 because you are not already | 143 | and kref_get() it. That violates rule 3 because you are not already |
| 144 | holding a valid pointer. You must add locks or semaphores. For | 144 | holding a valid pointer. You must add a mutex (or some other lock). |
| 145 | instance: | 145 | For instance: |
| 146 | 146 | ||
| 147 | static DECLARE_MUTEX(sem); | 147 | static DEFINE_MUTEX(mutex); |
| 148 | static LIST_HEAD(q); | 148 | static LIST_HEAD(q); |
| 149 | struct my_data | 149 | struct my_data |
| 150 | { | 150 | { |
| @@ -155,12 +155,12 @@ struct my_data | |||
| 155 | static struct my_data *get_entry() | 155 | static struct my_data *get_entry() |
| 156 | { | 156 | { |
| 157 | struct my_data *entry = NULL; | 157 | struct my_data *entry = NULL; |
| 158 | down(&sem); | 158 | mutex_lock(&mutex); |
| 159 | if (!list_empty(&q)) { | 159 | if (!list_empty(&q)) { |
| 160 | entry = container_of(q.next, struct my_q_entry, link); | 160 | entry = container_of(q.next, struct my_q_entry, link); |
| 161 | kref_get(&entry->refcount); | 161 | kref_get(&entry->refcount); |
| 162 | } | 162 | } |
| 163 | up(&sem); | 163 | mutex_unlock(&mutex); |
| 164 | return entry; | 164 | return entry; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| @@ -174,9 +174,9 @@ static void release_entry(struct kref *ref) | |||
| 174 | 174 | ||
| 175 | static void put_entry(struct my_data *entry) | 175 | static void put_entry(struct my_data *entry) |
| 176 | { | 176 | { |
| 177 | down(&sem); | 177 | mutex_lock(&mutex); |
| 178 | kref_put(&entry->refcount, release_entry); | 178 | kref_put(&entry->refcount, release_entry); |
| 179 | up(&sem); | 179 | mutex_unlock(&mutex); |
| 180 | } | 180 | } |
| 181 | 181 | ||
| 182 | The kref_put() return value is useful if you do not want to hold the | 182 | 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 | 191 | ||
| 192 | static void put_entry(struct my_data *entry) | 192 | static void put_entry(struct my_data *entry) |
| 193 | { | 193 | { |
| 194 | down(&sem); | 194 | mutex_lock(&mutex); |
| 195 | if (kref_put(&entry->refcount, release_entry)) { | 195 | if (kref_put(&entry->refcount, release_entry)) { |
| 196 | list_del(&entry->link); | 196 | list_del(&entry->link); |
| 197 | up(&sem); | 197 | mutex_unlock(&mutex); |
| 198 | kfree(entry); | 198 | kfree(entry); |
| 199 | } else | 199 | } else |
| 200 | up(&sem); | 200 | mutex_unlock(&mutex); |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | This is really more useful if you have to call other routines as part | 203 | This is really more useful if you have to call other routines as part |
