diff options
author | Ying Xue <ying.xue@windriver.com> | 2014-04-20 22:55:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-04-22 21:17:52 -0400 |
commit | f8322dfce5766c8e26d9224cbcaf6fdc0b2eb04d (patch) | |
tree | 9631ad1e81d63e7199350788f997733a5eb873e9 /net/tipc/bearer.c | |
parent | f97e455abf0d83b7d69da295163db18e3ebb4d8b (diff) |
tipc: convert bearer_list to RCU list
Convert bearer_list to RCU list. It's protected by RTNL lock on
update side, and RCU read lock is applied to read side.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Tested-by: Erik Hugne <erik.hugne@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/bearer.c')
-rw-r--r-- | net/tipc/bearer.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index dfb4c7fe4865..65b17639e43d 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -49,7 +49,7 @@ static struct tipc_media * const media_info_array[] = { | |||
49 | NULL | 49 | NULL |
50 | }; | 50 | }; |
51 | 51 | ||
52 | struct tipc_bearer *bearer_list[MAX_BEARERS + 1]; | 52 | struct tipc_bearer __rcu *bearer_list[MAX_BEARERS + 1]; |
53 | 53 | ||
54 | static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down); | 54 | static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down); |
55 | 55 | ||
@@ -178,7 +178,7 @@ struct tipc_bearer *tipc_bearer_find(const char *name) | |||
178 | u32 i; | 178 | u32 i; |
179 | 179 | ||
180 | for (i = 0; i < MAX_BEARERS; i++) { | 180 | for (i = 0; i < MAX_BEARERS; i++) { |
181 | b_ptr = bearer_list[i]; | 181 | b_ptr = rtnl_dereference(bearer_list[i]); |
182 | if (b_ptr && (!strcmp(b_ptr->name, name))) | 182 | if (b_ptr && (!strcmp(b_ptr->name, name))) |
183 | return b_ptr; | 183 | return b_ptr; |
184 | } | 184 | } |
@@ -201,7 +201,7 @@ struct sk_buff *tipc_bearer_get_names(void) | |||
201 | read_lock_bh(&tipc_net_lock); | 201 | read_lock_bh(&tipc_net_lock); |
202 | for (i = 0; media_info_array[i] != NULL; i++) { | 202 | for (i = 0; media_info_array[i] != NULL; i++) { |
203 | for (j = 0; j < MAX_BEARERS; j++) { | 203 | for (j = 0; j < MAX_BEARERS; j++) { |
204 | b = bearer_list[j]; | 204 | b = rtnl_dereference(bearer_list[j]); |
205 | if (!b) | 205 | if (!b) |
206 | continue; | 206 | continue; |
207 | if (b->media == media_info_array[i]) { | 207 | if (b->media == media_info_array[i]) { |
@@ -287,7 +287,7 @@ restart: | |||
287 | bearer_id = MAX_BEARERS; | 287 | bearer_id = MAX_BEARERS; |
288 | with_this_prio = 1; | 288 | with_this_prio = 1; |
289 | for (i = MAX_BEARERS; i-- != 0; ) { | 289 | for (i = MAX_BEARERS; i-- != 0; ) { |
290 | b_ptr = bearer_list[i]; | 290 | b_ptr = rtnl_dereference(bearer_list[i]); |
291 | if (!b_ptr) { | 291 | if (!b_ptr) { |
292 | bearer_id = i; | 292 | bearer_id = i; |
293 | continue; | 293 | continue; |
@@ -344,7 +344,7 @@ restart: | |||
344 | goto exit; | 344 | goto exit; |
345 | } | 345 | } |
346 | 346 | ||
347 | bearer_list[bearer_id] = b_ptr; | 347 | rcu_assign_pointer(bearer_list[bearer_id], b_ptr); |
348 | 348 | ||
349 | pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n", | 349 | pr_info("Enabled bearer <%s>, discovery domain %s, priority %u\n", |
350 | name, | 350 | name, |
@@ -385,12 +385,12 @@ static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down) | |||
385 | tipc_disc_delete(b_ptr->link_req); | 385 | tipc_disc_delete(b_ptr->link_req); |
386 | 386 | ||
387 | for (i = 0; i < MAX_BEARERS; i++) { | 387 | for (i = 0; i < MAX_BEARERS; i++) { |
388 | if (b_ptr == bearer_list[i]) { | 388 | if (b_ptr == rtnl_dereference(bearer_list[i])) { |
389 | bearer_list[i] = NULL; | 389 | RCU_INIT_POINTER(bearer_list[i], NULL); |
390 | break; | 390 | break; |
391 | } | 391 | } |
392 | } | 392 | } |
393 | kfree(b_ptr); | 393 | kfree_rcu(b_ptr, rcu); |
394 | } | 394 | } |
395 | 395 | ||
396 | int tipc_disable_bearer(const char *name) | 396 | int tipc_disable_bearer(const char *name) |
@@ -628,7 +628,7 @@ void tipc_bearer_stop(void) | |||
628 | u32 i; | 628 | u32 i; |
629 | 629 | ||
630 | for (i = 0; i < MAX_BEARERS; i++) { | 630 | for (i = 0; i < MAX_BEARERS; i++) { |
631 | b_ptr = bearer_list[i]; | 631 | b_ptr = rtnl_dereference(bearer_list[i]); |
632 | if (b_ptr) { | 632 | if (b_ptr) { |
633 | bearer_disable(b_ptr, true); | 633 | bearer_disable(b_ptr, true); |
634 | bearer_list[i] = NULL; | 634 | bearer_list[i] = NULL; |