diff options
Diffstat (limited to 'net/tipc/ref.c')
| -rw-r--r-- | net/tipc/ref.c | 30 |
1 files changed, 5 insertions, 25 deletions
diff --git a/net/tipc/ref.c b/net/tipc/ref.c index 2a2a938dc22c..3d4ecd754eee 100644 --- a/net/tipc/ref.c +++ b/net/tipc/ref.c | |||
| @@ -89,7 +89,7 @@ struct ref_table { | |||
| 89 | 89 | ||
| 90 | static struct ref_table tipc_ref_table; | 90 | static struct ref_table tipc_ref_table; |
| 91 | 91 | ||
| 92 | static DEFINE_RWLOCK(ref_table_lock); | 92 | static DEFINE_SPINLOCK(ref_table_lock); |
| 93 | 93 | ||
| 94 | /** | 94 | /** |
| 95 | * tipc_ref_table_init - create reference table for objects | 95 | * tipc_ref_table_init - create reference table for objects |
| @@ -126,9 +126,6 @@ int tipc_ref_table_init(u32 requested_size, u32 start) | |||
| 126 | */ | 126 | */ |
| 127 | void tipc_ref_table_stop(void) | 127 | void tipc_ref_table_stop(void) |
| 128 | { | 128 | { |
| 129 | if (!tipc_ref_table.entries) | ||
| 130 | return; | ||
| 131 | |||
| 132 | vfree(tipc_ref_table.entries); | 129 | vfree(tipc_ref_table.entries); |
| 133 | tipc_ref_table.entries = NULL; | 130 | tipc_ref_table.entries = NULL; |
| 134 | } | 131 | } |
| @@ -162,7 +159,7 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) | |||
| 162 | } | 159 | } |
| 163 | 160 | ||
| 164 | /* take a free entry, if available; otherwise initialize a new entry */ | 161 | /* take a free entry, if available; otherwise initialize a new entry */ |
| 165 | write_lock_bh(&ref_table_lock); | 162 | spin_lock_bh(&ref_table_lock); |
| 166 | if (tipc_ref_table.first_free) { | 163 | if (tipc_ref_table.first_free) { |
| 167 | index = tipc_ref_table.first_free; | 164 | index = tipc_ref_table.first_free; |
| 168 | entry = &(tipc_ref_table.entries[index]); | 165 | entry = &(tipc_ref_table.entries[index]); |
| @@ -178,7 +175,7 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) | |||
| 178 | } else { | 175 | } else { |
| 179 | ref = 0; | 176 | ref = 0; |
| 180 | } | 177 | } |
| 181 | write_unlock_bh(&ref_table_lock); | 178 | spin_unlock_bh(&ref_table_lock); |
| 182 | 179 | ||
| 183 | /* | 180 | /* |
| 184 | * Grab the lock so no one else can modify this entry | 181 | * Grab the lock so no one else can modify this entry |
| @@ -219,7 +216,7 @@ void tipc_ref_discard(u32 ref) | |||
| 219 | index = ref & index_mask; | 216 | index = ref & index_mask; |
| 220 | entry = &(tipc_ref_table.entries[index]); | 217 | entry = &(tipc_ref_table.entries[index]); |
| 221 | 218 | ||
| 222 | write_lock_bh(&ref_table_lock); | 219 | spin_lock_bh(&ref_table_lock); |
| 223 | 220 | ||
| 224 | if (!entry->object) { | 221 | if (!entry->object) { |
| 225 | pr_err("Attempt to discard ref. to non-existent obj\n"); | 222 | pr_err("Attempt to discard ref. to non-existent obj\n"); |
| @@ -245,7 +242,7 @@ void tipc_ref_discard(u32 ref) | |||
| 245 | tipc_ref_table.last_free = index; | 242 | tipc_ref_table.last_free = index; |
| 246 | 243 | ||
| 247 | exit: | 244 | exit: |
| 248 | write_unlock_bh(&ref_table_lock); | 245 | spin_unlock_bh(&ref_table_lock); |
| 249 | } | 246 | } |
| 250 | 247 | ||
| 251 | /** | 248 | /** |
| @@ -267,20 +264,3 @@ void *tipc_ref_lock(u32 ref) | |||
| 267 | } | 264 | } |
| 268 | return NULL; | 265 | return NULL; |
| 269 | } | 266 | } |
| 270 | |||
| 271 | |||
| 272 | /** | ||
| 273 | * tipc_ref_deref - return pointer referenced object (without locking it) | ||
| 274 | */ | ||
| 275 | void *tipc_ref_deref(u32 ref) | ||
| 276 | { | ||
| 277 | if (likely(tipc_ref_table.entries)) { | ||
| 278 | struct reference *entry; | ||
| 279 | |||
| 280 | entry = &tipc_ref_table.entries[ref & | ||
| 281 | tipc_ref_table.index_mask]; | ||
| 282 | if (likely(entry->ref == ref)) | ||
| 283 | return entry->object; | ||
| 284 | } | ||
| 285 | return NULL; | ||
| 286 | } | ||
