Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccc901ee authored by Allan Stephens's avatar Allan Stephens Committed by David S. Miller
Browse files

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: default avatarAllan Stephens <allan.stephens@windriver.com>
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
Reviewed-by: default avatarNeil Horman <nhorman@tuxdriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 724829b3
Loading
Loading
Loading
Loading
+11 −27
Original line number Original line Diff line number Diff line
@@ -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;
}
}