tipc: Simplify bearer shutdown logic
authorAllan Stephens <allan.stephens@windriver.com>
Thu, 14 Oct 2010 13:58:26 +0000 (13:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 Oct 2010 08:50:49 +0000 (01:50 -0700)
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>
net/tipc/bearer.c

index 9c10c6b..fd9c06c 100644 (file)
@@ -288,9 +288,6 @@ static struct bearer *bearer_find(const char *name)
        struct bearer *b_ptr;
        u32 i;
 
-       if (tipc_mode != TIPC_NET_MODE)
-               return NULL;
-
        for (i = 0, b_ptr = tipc_bearers; i < MAX_BEARERS; i++, b_ptr++) {
                if (b_ptr->active && (!strcmp(b_ptr->publ.name, name)))
                        return b_ptr;
@@ -630,30 +627,17 @@ int tipc_block_bearer(const char *name)
  * 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 *temp_l_ptr;
 
-       b_ptr = bearer_find(name);
-       if (!b_ptr) {
-               warn("Attempt to disable unknown bearer <%s>\n", name);
-               return -EINVAL;
-       }
-
-       info("Disabling bearer <%s>\n", name);
+       info("Disabling bearer <%s>\n", b_ptr->publ.name);
        tipc_disc_stop_link_req(b_ptr->link_req);
        spin_lock_bh(&b_ptr->publ.lock);
        b_ptr->link_req = NULL;
        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);
-               write_lock_bh(&tipc_net_lock);
-               spin_lock_bh(&b_ptr->publ.lock);
-       }
+       b_ptr->media->disable_bearer(&b_ptr->publ);
        list_for_each_entry_safe(l_ptr, temp_l_ptr, &b_ptr->links, link_list) {
                tipc_link_delete(l_ptr);
        }
@@ -664,10 +648,16 @@ static int bearer_disable(const char *name)
 
 int tipc_disable_bearer(const char *name)
 {
+       struct bearer *b_ptr;
        int res;
 
        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);
        return res;
 }
@@ -680,13 +670,7 @@ void tipc_bearer_stop(void)
 
        for (i = 0; i < MAX_BEARERS; i++) {
                if (tipc_bearers[i].active)
-                       tipc_bearers[i].publ.blocked = 1;
-       }
-       for (i = 0; i < MAX_BEARERS; i++) {
-               if (tipc_bearers[i].active)
-                       bearer_disable(tipc_bearers[i].publ.name);
+                       bearer_disable(&tipc_bearers[i]);
        }
        media_count = 0;
 }
-
-