aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/ref.c')
-rw-r--r--net/tipc/ref.c30
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
90static struct ref_table tipc_ref_table; 90static struct ref_table tipc_ref_table;
91 91
92static DEFINE_RWLOCK(ref_table_lock); 92static 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 */
127void tipc_ref_table_stop(void) 127void 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
247exit: 244exit:
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 */
275void *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}