diff options
author | Ying Xue <ying.xue@windriver.com> | 2014-02-13 17:29:17 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-13 17:57:07 -0500 |
commit | a83045292daf9f07d0b103e5715ef527123d2fcc (patch) | |
tree | ea983884e77ae82b1f099713a7d11834b95e84a9 /net/tipc | |
parent | 7d33939f475d403e79124e3143d7951dcfe8629f (diff) |
tipc: remove bearer_lock from tipc_bearer struct
After the earlier commits ("tipc: remove 'links' list from
tipc_bearer struct") and ("tipc: introduce new spinlock to protect
struct link_req"), there is no longer any need to protect struct
link_req or or any link list by use of bearer_lock. Furthermore,
we have eliminated the need for using bearer_lock during downcalls
(send) from the link to the bearer, since we have ensured that
bearers always have a longer life cycle that their associated links,
and always contain valid data.
So, the only need now for a lock protecting bearers is for guaranteeing
consistency of the bearer list itself. For this, it is sufficient, at
least for the time being, to continue applying 'net_lockĀ“ in write mode.
By removing bearer_lock we also pre-empt introduction of issue b) descibed
in the previous commit "tipc: remove 'links' list from tipc_bearer struct":
"b) When the outer protection from net_lock is gone, taking
bearer_lock and node_lock in opposite order of method 1) and 2)
will become an obvious deadlock hazard".
Therefore, we now eliminate the bearer_lock spinlock.
Signed-off-by: Ying Xue <ying.xue@windriver.com>
Reviewed-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/bcast.c | 1 | ||||
-rw-r--r-- | net/tipc/bearer.c | 16 | ||||
-rw-r--r-- | net/tipc/bearer.h | 5 |
3 files changed, 4 insertions, 18 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c index af35f76c6b29..06a639c375f0 100644 --- a/net/tipc/bcast.c +++ b/net/tipc/bcast.c | |||
@@ -785,7 +785,6 @@ void tipc_bclink_init(void) | |||
785 | bcl->owner = &bclink->node; | 785 | bcl->owner = &bclink->node; |
786 | bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; | 786 | bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; |
787 | tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); | 787 | tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); |
788 | spin_lock_init(&bcbearer->bearer.lock); | ||
789 | bcl->b_ptr = &bcbearer->bearer; | 788 | bcl->b_ptr = &bcbearer->bearer; |
790 | bcl->state = WORKING_WORKING; | 789 | bcl->state = WORKING_WORKING; |
791 | strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); | 790 | strlcpy(bcl->name, tipc_bclink_name, TIPC_MAX_LINK_NAME); |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 60caa45e5a41..242cddd35a47 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -327,7 +327,6 @@ restart: | |||
327 | b_ptr->net_plane = bearer_id + 'A'; | 327 | b_ptr->net_plane = bearer_id + 'A'; |
328 | b_ptr->active = 1; | 328 | b_ptr->active = 1; |
329 | b_ptr->priority = priority; | 329 | b_ptr->priority = priority; |
330 | spin_lock_init(&b_ptr->lock); | ||
331 | 330 | ||
332 | res = tipc_disc_create(b_ptr, &b_ptr->bcast_addr, disc_domain); | 331 | res = tipc_disc_create(b_ptr, &b_ptr->bcast_addr, disc_domain); |
333 | if (res) { | 332 | if (res) { |
@@ -351,9 +350,7 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr) | |||
351 | { | 350 | { |
352 | read_lock_bh(&tipc_net_lock); | 351 | read_lock_bh(&tipc_net_lock); |
353 | pr_info("Resetting bearer <%s>\n", b_ptr->name); | 352 | pr_info("Resetting bearer <%s>\n", b_ptr->name); |
354 | spin_lock_bh(&b_ptr->lock); | ||
355 | tipc_link_reset_list(b_ptr->identity); | 353 | tipc_link_reset_list(b_ptr->identity); |
356 | spin_unlock_bh(&b_ptr->lock); | ||
357 | read_unlock_bh(&tipc_net_lock); | 354 | read_unlock_bh(&tipc_net_lock); |
358 | return 0; | 355 | return 0; |
359 | } | 356 | } |
@@ -365,19 +362,12 @@ static int tipc_reset_bearer(struct tipc_bearer *b_ptr) | |||
365 | */ | 362 | */ |
366 | static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down) | 363 | static void bearer_disable(struct tipc_bearer *b_ptr, bool shutting_down) |
367 | { | 364 | { |
368 | struct tipc_link_req *temp_req; | ||
369 | |||
370 | pr_info("Disabling bearer <%s>\n", b_ptr->name); | 365 | pr_info("Disabling bearer <%s>\n", b_ptr->name); |
371 | spin_lock_bh(&b_ptr->lock); | ||
372 | b_ptr->media->disable_media(b_ptr); | 366 | b_ptr->media->disable_media(b_ptr); |
373 | tipc_link_delete_list(b_ptr->identity, shutting_down); | ||
374 | temp_req = b_ptr->link_req; | ||
375 | b_ptr->link_req = NULL; | ||
376 | spin_unlock_bh(&b_ptr->lock); | ||
377 | |||
378 | if (temp_req) | ||
379 | tipc_disc_delete(temp_req); | ||
380 | 367 | ||
368 | tipc_link_delete_list(b_ptr->identity, shutting_down); | ||
369 | if (b_ptr->link_req) | ||
370 | tipc_disc_delete(b_ptr->link_req); | ||
381 | memset(b_ptr, 0, sizeof(struct tipc_bearer)); | 371 | memset(b_ptr, 0, sizeof(struct tipc_bearer)); |
382 | } | 372 | } |
383 | 373 | ||
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h index 647cb1d2324a..425dd8107a8f 100644 --- a/net/tipc/bearer.h +++ b/net/tipc/bearer.h | |||
@@ -107,10 +107,8 @@ struct tipc_media { | |||
107 | 107 | ||
108 | /** | 108 | /** |
109 | * struct tipc_bearer - Generic TIPC bearer structure | 109 | * struct tipc_bearer - Generic TIPC bearer structure |
110 | * @dev: ptr to associated network device | 110 | * @media_ptr: pointer to additional media-specific information about bearer |
111 | * @usr_handle: pointer to additional media-specific information about bearer | ||
112 | * @mtu: max packet size bearer can support | 111 | * @mtu: max packet size bearer can support |
113 | * @lock: spinlock for controlling access to bearer | ||
114 | * @addr: media-specific address associated with bearer | 112 | * @addr: media-specific address associated with bearer |
115 | * @name: bearer name (format = media:interface) | 113 | * @name: bearer name (format = media:interface) |
116 | * @media: ptr to media structure associated with bearer | 114 | * @media: ptr to media structure associated with bearer |
@@ -133,7 +131,6 @@ struct tipc_bearer { | |||
133 | u32 mtu; /* initalized by media */ | 131 | u32 mtu; /* initalized by media */ |
134 | struct tipc_media_addr addr; /* initalized by media */ | 132 | struct tipc_media_addr addr; /* initalized by media */ |
135 | char name[TIPC_MAX_BEARER_NAME]; | 133 | char name[TIPC_MAX_BEARER_NAME]; |
136 | spinlock_t lock; | ||
137 | struct tipc_media *media; | 134 | struct tipc_media *media; |
138 | struct tipc_media_addr bcast_addr; | 135 | struct tipc_media_addr bcast_addr; |
139 | u32 priority; | 136 | u32 priority; |