diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-09-15 08:50:25 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-10-16 17:59:59 -0400 |
commit | 17a19b795e9187d65b6e45cb22797725d50f7edb (patch) | |
tree | 60db3734335f3956378063c2f8126c036b83bfed /drivers/ieee1394/csr1212.h | |
parent | 638d5bb8167c2c88552257d5af23f7f65ab4defd (diff) |
ieee1394: csr1212: proper refcounting
At least since nodemgr got rid of coarse global locking, accesses to
struct csr1212_keyval's reference counter should be atomic and coupled
with proper barriers. Also, calls to csr1212_keep_keyval(kv) should
occur before kv is being used.
(We probably should convert refcnt to struct kref, but how to keep
csr1212_destroy_keyval's implementation non-recursively then?)
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/ieee1394/csr1212.h')
-rw-r--r-- | drivers/ieee1394/csr1212.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/ieee1394/csr1212.h b/drivers/ieee1394/csr1212.h index df909ce66304..043039fc63ec 100644 --- a/drivers/ieee1394/csr1212.h +++ b/drivers/ieee1394/csr1212.h | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #include <linux/types.h> | 33 | #include <linux/types.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <asm/atomic.h> | ||
35 | 36 | ||
36 | #define CSR1212_MALLOC(size) kmalloc((size), GFP_KERNEL) | 37 | #define CSR1212_MALLOC(size) kmalloc((size), GFP_KERNEL) |
37 | #define CSR1212_FREE(ptr) kfree(ptr) | 38 | #define CSR1212_FREE(ptr) kfree(ptr) |
@@ -149,7 +150,7 @@ struct csr1212_keyval { | |||
149 | struct csr1212_directory directory; | 150 | struct csr1212_directory directory; |
150 | } value; | 151 | } value; |
151 | struct csr1212_keyval *associate; | 152 | struct csr1212_keyval *associate; |
152 | int refcnt; | 153 | atomic_t refcnt; |
153 | 154 | ||
154 | /* used in generating and/or parsing CSR image */ | 155 | /* used in generating and/or parsing CSR image */ |
155 | struct csr1212_keyval *next, *prev; /* flat list of CSR elements */ | 156 | struct csr1212_keyval *next, *prev; /* flat list of CSR elements */ |
@@ -350,7 +351,8 @@ csr1212_get_keyval(struct csr1212_csr *csr, struct csr1212_keyval *kv); | |||
350 | * need for code to retain a keyval that has been parsed. */ | 351 | * need for code to retain a keyval that has been parsed. */ |
351 | static inline void csr1212_keep_keyval(struct csr1212_keyval *kv) | 352 | static inline void csr1212_keep_keyval(struct csr1212_keyval *kv) |
352 | { | 353 | { |
353 | kv->refcnt++; | 354 | atomic_inc(&kv->refcnt); |
355 | smp_mb__after_atomic_inc(); | ||
354 | } | 356 | } |
355 | 357 | ||
356 | 358 | ||