tipc: Simplify bearer shutdown logic
Optimize processing in TIPC's bearer shutdown code, including: 1. Remove an unnecessary check to see if TIPC bearer's can exist. 2. Don't release spinlocks before calling a media-specific disabling routine, since the routine can't sleep. 3. Make bearer_disable() operate directly on a struct bearer, instead of needlessly taking a name and then mapping that to the struct. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Reviewed-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
724829b3ad
commit
ccc901ee58
|
@ -288,9 +288,6 @@ static struct bearer *bearer_find(const char *name)
|
||||||
struct bearer *b_ptr;
|
struct bearer *b_ptr;
|
||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
if (tipc_mode != TIPC_NET_MODE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) {
|
for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) {
|
||||||
if (b_ptr->active && (!strcmp(b_ptr->publ.name, name)))
|
if (b_ptr->active && (!strcmp(b_ptr->publ.name, name)))
|
||||||
return b_ptr;
|
return b_ptr;
|
||||||
|
@ -630,30 +627,17 @@ int tipc_block_bearer(const char *name)
|
||||||
* Note: This routine assumes caller holds tipc_net_lock.
|
* Note: This routine assumes caller holds tipc_net_lock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int bearer_disable(const char *name)
|
static int bearer_disable(struct bearer *b_ptr)
|
||||||
{
|
{
|
||||||
struct bearer *b_ptr;
|
|
||||||
struct link *l_ptr;
|
struct link *l_ptr;
|
||||||
struct link *temp_l_ptr;
|
struct link *temp_l_ptr;
|
||||||
|
|
||||||
b_ptr = bearer_find(name);
|
info("Disabling bearer <%s>\n", b_ptr->publ.name);
|
||||||
if (!b_ptr) {
|
|
||||||
warn("Attempt to disable unknown bearer <%s>\n", name);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
info("Disabling bearer <%s>\n", name);
|
|
||||||
tipc_disc_stop_link_req(b_ptr->link_req);
|
tipc_disc_stop_link_req(b_ptr->link_req);
|
||||||
spin_lock_bh(&b_ptr->publ.lock);
|
spin_lock_bh(&b_ptr->publ.lock);
|
||||||
b_ptr->link_req = NULL;
|
b_ptr->link_req = NULL;
|
||||||
b_ptr->publ.blocked = 1;
|
b_ptr->publ.blocked = 1;
|
||||||
if (b_ptr->media->disable_bearer) {
|
|
||||||
spin_unlock_bh(&b_ptr->publ.lock);
|
|
||||||
write_unlock_bh(&tipc_net_lock);
|
|
||||||
b_ptr->media->disable_bearer(&b_ptr->publ);
|
b_ptr->media->disable_bearer(&b_ptr->publ);
|
||||||
write_lock_bh(&tipc_net_lock);
|
|
||||||
spin_lock_bh(&b_ptr->publ.lock);
|
|
||||||
}
|
|
||||||
list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) {
|
list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) {
|
||||||
tipc_link_delete(l_ptr);
|
tipc_link_delete(l_ptr);
|
||||||
}
|
}
|
||||||
|
@ -664,10 +648,16 @@ static int bearer_disable(const char *name)
|
||||||
|
|
||||||
int tipc_disable_bearer(const char *name)
|
int tipc_disable_bearer(const char *name)
|
||||||
{
|
{
|
||||||
|
struct bearer *b_ptr;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
write_lock_bh(&tipc_net_lock);
|
write_lock_bh(&tipc_net_lock);
|
||||||
res = bearer_disable(name);
|
b_ptr = bearer_find(name);
|
||||||
|
if (b_ptr == NULL) {
|
||||||
|
warn("Attempt to disable unknown bearer <%s>\n", name);
|
||||||
|
res = -EINVAL;
|
||||||
|
} else
|
||||||
|
res = bearer_disable(b_ptr);
|
||||||
write_unlock_bh(&tipc_net_lock);
|
write_unlock_bh(&tipc_net_lock);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -680,13 +670,7 @@ void tipc_bearer_stop(void)
|
||||||
|
|
||||||
for (i = 0; i < MAX_BEARERS; i++) {
|
for (i = 0; i < MAX_BEARERS; i++) {
|
||||||
if (tipc_bearers[i].active)
|
if (tipc_bearers[i].active)
|
||||||
tipc_bearers[i].publ.blocked = 1;
|
bearer_disable(&tipc_bearers[i]);
|
||||||
}
|
|
||||||
for (i = 0; i < MAX_BEARERS; i++) {
|
|
||||||
if (tipc_bearers[i].active)
|
|
||||||
bearer_disable(tipc_bearers[i].publ.name);
|
|
||||||
}
|
}
|
||||||
media_count = 0;
|
media_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue