X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Flnet%2Frouter.c;h=d581fa22be745af73707530e6f8f08ee8430a0c5;hb=3b760208109b249fd9051d97dbc98664ca4b5769;hp=52a55022548d87f6a4e93896b748dda954499f81;hpb=6a9bdf59e6306d49c4d2d44e95773a257114c639;p=fs%2Flustre-release.git diff --git a/lnet/lnet/router.c b/lnet/lnet/router.c index 52a5502..d581fa2 100644 --- a/lnet/lnet/router.c +++ b/lnet/lnet/router.c @@ -120,7 +120,8 @@ MODULE_PARM_DESC(router_sensitivity_percentage, static void lnet_add_route_to_rnet(struct lnet_remotenet *rnet, struct lnet_route *route); -static void lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list, +static void lnet_del_route_from_rnet(struct lnet_nid *gw_nid, + struct list_head *route_list, struct list_head *zombies); static int @@ -181,18 +182,18 @@ lnet_move_route(struct lnet_route *route, struct lnet_peer *lp, * lr_nid can be a constituent NID of the peer */ lnet_del_route_from_rnet( - lnet_nid_to_nid4(&route->lr_gateway->lp_primary_nid), + &route->lr_gateway->lp_primary_nid, &rnet->lrn_routes, l); if (lp) { route = list_first_entry(l, struct lnet_route, - lr_list); + lr_list); route->lr_gateway = lp; lnet_add_route_to_rnet(rnet, route); } else { while (!list_empty(l) && !rt_list) { route = list_first_entry(l, struct lnet_route, - lr_list); + lr_list); list_del(&route->lr_list); LIBCFS_FREE(route, sizeof(*route)); } @@ -581,15 +582,12 @@ struct lnet_remotenet * lnet_find_rnet_locked(__u32 net) { struct lnet_remotenet *rnet; - struct list_head *tmp; struct list_head *rn_list; LASSERT(the_lnet.ln_state == LNET_STATE_RUNNING); rn_list = lnet_net2rnethash(net); - list_for_each(tmp, rn_list) { - rnet = list_entry(tmp, struct lnet_remotenet, lrn_list); - + list_for_each_entry(rnet, rn_list, lrn_list) { if (rnet->lrn_net == net) return rnet; } @@ -725,7 +723,7 @@ lnet_add_route(__u32 net, __u32 hops, struct lnet_nid *gateway, * lnet_nid2peerni_ex() grabs a ref on the lpni. We will need to * lose that once we're done */ - lpni = lnet_nid2peerni_ex(gateway, LNET_LOCK_EX); + lpni = lnet_nid2peerni_ex(gateway); if (IS_ERR(lpni)) { lnet_net_unlock(LNET_LOCK_EX); @@ -739,7 +737,9 @@ lnet_add_route(__u32 net, __u32 hops, struct lnet_nid *gateway, return rc; } - LASSERT(lpni->lpni_peer_net && lpni->lpni_peer_net->lpn_peer); + LASSERT(lpni); + LASSERT(lpni->lpni_peer_net); + LASSERT(lpni->lpni_peer_net->lpn_peer); gw = lpni->lpni_peer_net->lpn_peer; route->lr_gateway = gw; @@ -813,7 +813,8 @@ lnet_add_route(__u32 net, __u32 hops, struct lnet_nid *gateway, } void -lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list, +lnet_del_route_from_rnet(struct lnet_nid *gw_nid, + struct list_head *route_list, struct list_head *zombies) { struct lnet_peer *gateway; @@ -822,8 +823,7 @@ lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list, list_for_each_entry_safe(route, tmp, route_list, lr_list) { gateway = route->lr_gateway; - if (gw_nid != LNET_NID_ANY && - gw_nid != lnet_nid_to_nid4(&gateway->lp_primary_nid)) + if (gw_nid && !nid_same(gw_nid, &gateway->lp_primary_nid)) continue; /* @@ -843,7 +843,7 @@ lnet_del_route_from_rnet(lnet_nid_t gw_nid, struct list_head *route_list, } int -lnet_del_route(__u32 net, lnet_nid_t gw_nid) +lnet_del_route(__u32 net, struct lnet_nid *gw) { LIST_HEAD(rnet_zombies); struct lnet_remotenet *rnet; @@ -851,23 +851,28 @@ lnet_del_route(__u32 net, lnet_nid_t gw_nid) struct list_head *rn_list; struct lnet_peer_ni *lpni; struct lnet_route *route; + struct lnet_nid gw_nid; LIST_HEAD(zombies); struct lnet_peer *lp = NULL; int i = 0; CDEBUG(D_NET, "Del route: net %s : gw %s\n", - libcfs_net2str(net), libcfs_nid2str(gw_nid)); + libcfs_net2str(net), libcfs_nidstr(gw)); /* NB Caller may specify either all routes via the given gateway * or a specific route entry actual NIDs) */ lnet_net_lock(LNET_LOCK_EX); - lpni = lnet_find_peer_ni_locked(gw_nid); + if (gw) + lpni = lnet_peer_ni_find_locked(gw); + else + lpni = NULL; if (lpni) { lp = lpni->lpni_peer_net->lpn_peer; LASSERT(lp); - gw_nid = lnet_nid_to_nid4(&lp->lp_primary_nid); + gw_nid = lp->lp_primary_nid; + gw = &gw_nid; lnet_peer_ni_decref_locked(lpni); } @@ -877,7 +882,7 @@ lnet_del_route(__u32 net, lnet_nid_t gw_nid) lnet_net_unlock(LNET_LOCK_EX); return -ENOENT; } - lnet_del_route_from_rnet(gw_nid, &rnet->lrn_routes, + lnet_del_route_from_rnet(gw, &rnet->lrn_routes, &zombies); if (list_empty(&rnet->lrn_routes)) list_move(&rnet->lrn_list, &rnet_zombies); @@ -888,7 +893,7 @@ lnet_del_route(__u32 net, lnet_nid_t gw_nid) rn_list = &the_lnet.ln_remote_nets_hash[i]; list_for_each_entry_safe(rnet, tmp, rn_list, lrn_list) { - lnet_del_route_from_rnet(gw_nid, &rnet->lrn_routes, + lnet_del_route_from_rnet(gw, &rnet->lrn_routes, &zombies); if (list_empty(&rnet->lrn_routes)) list_move(&rnet->lrn_list, &rnet_zombies); @@ -927,9 +932,9 @@ delete_zombies: } void -lnet_destroy_routes (void) +lnet_destroy_routes(void) { - lnet_del_route(LNET_NET_ANY, LNET_NID_ANY); + lnet_del_route(LNET_NET_ANY, NULL); } int lnet_get_rtr_pool_cfg(int cpt, struct lnet_ioctl_pool_cfg *pool_cfg) @@ -971,8 +976,6 @@ lnet_get_route(int idx, __u32 *net, __u32 *hops, lnet_nid_t *gateway, struct lnet_remotenet *rnet; struct list_head *rn_list; struct lnet_route *route; - struct list_head *e1; - struct list_head *e2; int cpt; int i; @@ -980,13 +983,8 @@ lnet_get_route(int idx, __u32 *net, __u32 *hops, lnet_nid_t *gateway, for (i = 0; i < LNET_REMOTE_NETS_HASH_SIZE; i++) { rn_list = &the_lnet.ln_remote_nets_hash[i]; - list_for_each(e1, rn_list) { - rnet = list_entry(e1, struct lnet_remotenet, lrn_list); - - list_for_each(e2, &rnet->lrn_routes) { - route = list_entry(e2, struct lnet_route, - lr_list); - + list_for_each_entry(rnet, rn_list, lrn_list) { + list_for_each_entry(route, &rnet->lrn_routes, lr_list) { if (idx-- == 0) { *net = rnet->lrn_net; *gateway = lnet_nid_to_nid4(&route->lr_nid); @@ -1017,7 +1015,6 @@ static void lnet_wait_known_routerstate(void) { struct lnet_peer *rtr; - struct list_head *entry; int all_known; LASSERT(the_lnet.ln_mt_state == LNET_MT_STATE_RUNNING); @@ -1026,10 +1023,7 @@ lnet_wait_known_routerstate(void) int cpt = lnet_net_lock_current(); all_known = 1; - list_for_each(entry, &the_lnet.ln_routers) { - rtr = list_entry(entry, struct lnet_peer, - lp_rtr_list); - + list_for_each_entry(rtr, &the_lnet.ln_routers, lp_rtr_list) { spin_lock(&rtr->lp_lock); if ((rtr->lp_state & LNET_PEER_RTR_DISCOVERED) == 0) { @@ -1075,7 +1069,7 @@ lnet_update_ni_status_locked(void) timeout = router_ping_timeout + alive_router_check_interval; - now = ktime_get_real_seconds(); + now = ktime_get_seconds(); list_for_each_entry(net, &the_lnet.ln_nets, net_list) { if (net->net_lnd->lnd_type == LOLND) continue; @@ -1151,7 +1145,6 @@ lnet_check_routers(void) struct lnet_peer_net *first_lpn; struct lnet_peer_net *lpn; struct lnet_peer_ni *lpni; - struct list_head *entry; struct lnet_peer *rtr; bool push = false; bool needs_ping; @@ -1166,10 +1159,7 @@ lnet_check_routers(void) rescan: version = the_lnet.ln_routers_version; - list_for_each(entry, &the_lnet.ln_routers) { - rtr = list_entry(entry, struct lnet_peer, - lp_rtr_list); - + list_for_each_entry(rtr, &the_lnet.ln_routers, lp_rtr_list) { /* If we're currently discovering the peer then don't * issue another discovery */ @@ -1229,8 +1219,7 @@ rescan: spin_unlock(&rtr->lp_lock); /* find the peer_ni associated with the primary NID */ - lpni = lnet_peer_get_ni_locked( - rtr, lnet_nid_to_nid4(&rtr->lp_primary_nid)); + lpni = lnet_peer_ni_get_locked(rtr, &rtr->lp_primary_nid); if (!lpni) { CDEBUG(D_NET, "Expected to find an lpni for %s, but non found\n", libcfs_nidstr(&rtr->lp_primary_nid)); @@ -1338,7 +1327,7 @@ lnet_rtrpool_free_bufs(struct lnet_rtrbufpool *rbp, int cpt) /* Free buffers on the free list. */ while (!list_empty(&tmp)) { - rb = list_entry(tmp.next, struct lnet_rtrbuf, rb_list); + rb = list_first_entry(&tmp, struct lnet_rtrbuf, rb_list); list_del(&rb->rb_list); lnet_destroy_rtrbuf(rb, npages); } @@ -1412,8 +1401,9 @@ lnet_rtrpool_adjust_bufs(struct lnet_rtrbufpool *rbp, int nbufs, int cpt) return 0; failed: - while (!list_empty(&rb_list)) { - rb = list_entry(rb_list.next, struct lnet_rtrbuf, rb_list); + while ((rb = list_first_entry_or_null(&rb_list, + struct lnet_rtrbuf, + rb_list)) != NULL) { list_del(&rb->rb_list); lnet_destroy_rtrbuf(rb, npages); } @@ -1717,25 +1707,27 @@ lnet_notify_peer_down(struct lnet_ni *ni, struct lnet_nid *nid) * when: notificaiton time. */ int -lnet_notify(struct lnet_ni *ni, lnet_nid_t nid, bool alive, bool reset, +lnet_notify(struct lnet_ni *ni, lnet_nid_t nid4, bool alive, bool reset, time64_t when) { struct lnet_peer_ni *lpni = NULL; struct lnet_route *route; struct lnet_peer *lp; time64_t now = ktime_get_seconds(); + struct lnet_nid nid; int cpt; + lnet_nid4_to_nid(nid4, &nid); LASSERT(!in_interrupt()); CDEBUG(D_NET, "%s notifying %s: %s\n", (ni == NULL) ? "userspace" : libcfs_nidstr(&ni->ni_nid), - libcfs_nid2str(nid), alive ? "up" : "down"); + libcfs_nidstr(&nid), alive ? "up" : "down"); if (ni != NULL && - LNET_NID_NET(&ni->ni_nid) != LNET_NIDNET(nid)) { + LNET_NID_NET(&ni->ni_nid) != LNET_NID_NET(&nid)) { CWARN("Ignoring notification of %s %s by %s (different net)\n", - libcfs_nid2str(nid), alive ? "birth" : "death", + libcfs_nidstr(&nid), alive ? "birth" : "death", libcfs_nidstr(&ni->ni_nid)); return -EINVAL; } @@ -1744,7 +1736,7 @@ lnet_notify(struct lnet_ni *ni, lnet_nid_t nid, bool alive, bool reset, if (when > now) { CWARN("Ignoring prediction from %s of %s %s %lld seconds in the future\n", ni ? libcfs_nidstr(&ni->ni_nid) : "userspace", - libcfs_nid2str(nid), alive ? "up" : "down", when - now); + libcfs_nidstr(&nid), alive ? "up" : "down", when - now); return -EINVAL; } @@ -1762,11 +1754,11 @@ lnet_notify(struct lnet_ni *ni, lnet_nid_t nid, bool alive, bool reset, return -ESHUTDOWN; } - lpni = lnet_find_peer_ni_locked(nid); + lpni = lnet_peer_ni_find_locked(&nid); if (lpni == NULL) { /* nid not found */ lnet_net_unlock(0); - CDEBUG(D_NET, "%s not found\n", libcfs_nid2str(nid)); + CDEBUG(D_NET, "%s not found\n", libcfs_nidstr(&nid)); return 0; }