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 | } | ||