Whamcloud - gitweb
LU-14008 o2iblnd: cleanup
[fs/lustre-release.git] / lnet / lnet / lib-move.c
index 67ab256..9551627 100644 (file)
@@ -190,13 +190,15 @@ void lnet_usr_translate_stats(struct lnet_ioctl_element_msg_stats *msg_stats,
 }
 
 int
-lnet_fail_nid(lnet_nid_t nid, unsigned int threshold)
+lnet_fail_nid(lnet_nid_t nid4, unsigned int threshold)
 {
        struct lnet_test_peer *tp;
        struct list_head *el;
        struct list_head *next;
+       struct lnet_nid nid;
        LIST_HEAD(cull);
 
+       lnet_nid4_to_nid(nid4, &nid);
        /* NB: use lnet_net_lock(0) to serialize operations on test peers */
        if (threshold != 0) {
                /* Adding a new entry */
@@ -219,8 +221,8 @@ lnet_fail_nid(lnet_nid_t nid, unsigned int threshold)
                tp = list_entry(el, struct lnet_test_peer, tp_list);
 
                if (tp->tp_threshold == 0 ||    /* needs culling anyway */
-                   nid == LNET_NID_ANY ||      /* removing all entries */
-                   tp->tp_nid == nid) {        /* matched this one */
+                   LNET_NID_IS_ANY(&nid) ||    /* removing all entries */
+                   nid_same(&tp->tp_nid, &nid)) {      /* matched this one */
                        list_move(&tp->tp_list, &cull);
                }
        }
@@ -237,14 +239,16 @@ lnet_fail_nid(lnet_nid_t nid, unsigned int threshold)
 }
 
 static int
-fail_peer (lnet_nid_t nid, int outgoing)
+fail_peer(lnet_nid_t nid4, int outgoing)
 {
        struct lnet_test_peer *tp;
        struct list_head *el;
        struct list_head *next;
+       struct lnet_nid nid;
        LIST_HEAD(cull);
        int fail = 0;
 
+       lnet_nid4_to_nid(nid4, &nid);
        /* NB: use lnet_net_lock(0) to serialize operations on test peers */
        lnet_net_lock(0);
 
@@ -262,8 +266,8 @@ fail_peer (lnet_nid_t nid, int outgoing)
                        continue;
                }
 
-               if (tp->tp_nid == LNET_NID_ANY ||       /* fail every peer */
-                   nid == tp->tp_nid) {                /* fail this peer */
+               if (LNET_NID_IS_ANY(&tp->tp_nid) ||     /* fail every peer */
+                   nid_same(&nid, &tp->tp_nid)) {      /* fail this peer */
                        fail = 1;
 
                        if (tp->tp_threshold != LNET_MD_THRESH_INF) {
@@ -1322,9 +1326,8 @@ lnet_select_peer_ni(struct lnet_ni *best_ni, lnet_nid_t dst_nid,
                 * preferred, then let's use it
                 */
                if (best_ni) {
-                       /* FIXME need to handle large-addr nid */
                        lpni_is_preferred = lnet_peer_is_pref_nid_locked(
-                               lpni, lnet_nid_to_nid4(&best_ni->ni_nid));
+                               lpni, &best_ni->ni_nid);
                        CDEBUG(D_NET, "%s lpni_is_preferred = %d\n",
                               libcfs_nidstr(&best_ni->ni_nid),
                               lpni_is_preferred);
@@ -1502,7 +1505,7 @@ lnet_find_route_locked(struct lnet_remotenet *rnet, __u32 src_net,
        struct lnet_route *route;
        int rc;
        bool best_rte_is_preferred = false;
-       lnet_nid_t gw_pnid;
+       struct lnet_nid *gw_pnid;
 
        CDEBUG(D_NET, "Looking up a route to %s, from %s\n",
               libcfs_net2str(rnet->lrn_net), libcfs_net2str(src_net));
@@ -1511,7 +1514,7 @@ lnet_find_route_locked(struct lnet_remotenet *rnet, __u32 src_net,
        list_for_each_entry(route, &rnet->lrn_routes, lr_list) {
                if (!lnet_is_route_alive(route))
                        continue;
-               gw_pnid = lnet_nid_to_nid4(&route->lr_gateway->lp_primary_nid);
+               gw_pnid = &route->lr_gateway->lp_primary_nid;
 
                /* no protection on below fields, but it's harmless */
                if (last_route && (last_route->lr_seq - route->lr_seq < 0))
@@ -1535,7 +1538,7 @@ lnet_find_route_locked(struct lnet_remotenet *rnet, __u32 src_net,
                        if (!lpni) {
                                CDEBUG(D_NET,
                                       "Gateway %s does not have a peer NI on net %s\n",
-                                      libcfs_nid2str(gw_pnid),
+                                      libcfs_nidstr(gw_pnid),
                                       libcfs_net2str(src_net));
                                continue;
                        }
@@ -1551,7 +1554,7 @@ lnet_find_route_locked(struct lnet_remotenet *rnet, __u32 src_net,
                        best_gw_ni = lpni;
                        best_rte_is_preferred = true;
                        CDEBUG(D_NET, "preferred gw = %s\n",
-                              libcfs_nid2str(gw_pnid));
+                              libcfs_nidstr(gw_pnid));
                        continue;
                } else if ((!rc) && best_rte_is_preferred)
                        /* The best route we found so far is in the preferred
@@ -1579,7 +1582,7 @@ lnet_find_route_locked(struct lnet_remotenet *rnet, __u32 src_net,
                if (!lpni) {
                        CDEBUG(D_NET,
                               "Gateway %s does not have a peer NI on net %s\n",
-                              libcfs_nid2str(gw_pnid),
+                              libcfs_nidstr(gw_pnid),
                               libcfs_net2str(src_net));
                        continue;
                }
@@ -1837,10 +1840,10 @@ lnet_handle_send(struct lnet_send_data *sd)
         * local ni and local net so that we pick the next ones
         * in Round Robin.
         */
-       best_lpni->lpni_seq++;
        best_lpni->lpni_peer_net->lpn_seq++;
-       best_ni->ni_seq++;
+       best_lpni->lpni_seq = best_lpni->lpni_peer_net->lpn_seq;
        best_ni->ni_net->net_seq++;
+       best_ni->ni_seq = best_ni->ni_net->net_seq;
 
        CDEBUG(D_NET, "%s NI seq info: [%d:%d:%d:%u] %s LPNI seq info [%d:%d:%d:%u]\n",
               libcfs_nidstr(&best_ni->ni_nid),
@@ -1981,8 +1984,7 @@ lnet_set_non_mr_pref_nid(struct lnet_peer_ni *lpni, struct lnet_ni *lni,
                CDEBUG(D_NET, "Setting preferred local NID %s on NMR peer %s\n",
                       libcfs_nidstr(&lni->ni_nid),
                       libcfs_nidstr(&lpni->lpni_nid));
-               lnet_peer_ni_set_non_mr_pref_nid(
-                       lpni, lnet_nid_to_nid4(&lni->ni_nid));
+               lnet_peer_ni_set_non_mr_pref_nid(lpni, &lni->ni_nid);
        }
 }
 
@@ -2187,13 +2189,19 @@ lnet_handle_find_routed_path(struct lnet_send_data *sd,
        }
 
        if (!route_found) {
-               if (sd->sd_msg->msg_routing) {
+               if (sd->sd_msg->msg_routing || src_nid != LNET_NID_ANY) {
                        /* If I'm routing this message then I need to find the
                         * next hop based on the destination NID
+                        *
+                        * We also find next hop based on the destination NID
+                        * if the source NI was specified
                         */
                        best_rnet = lnet_find_rnet_locked(LNET_NIDNET(sd->sd_dst_nid));
                        if (!best_rnet) {
-                               CERROR("Unable to route message to %s - Route table may be misconfigured\n",
+                               CERROR("Unable to send message from %s to %s - Route table may be misconfigured\n",
+                                      src_nid != LNET_NID_ANY ?
+                                               libcfs_nid2str(src_nid) :
+                                               "any local NI",
                                       libcfs_nid2str(sd->sd_dst_nid));
                                return -EHOSTUNREACH;
                        }
@@ -2520,7 +2528,8 @@ lnet_find_existing_preferred_best_ni(struct lnet_peer_ni *lpni, int cpt)
                if (lpni_entry->lpni_pref_nnids == 0)
                        continue;
                LASSERT(lpni_entry->lpni_pref_nnids == 1);
-               best_ni = lnet_nid2ni_locked(lpni_entry->lpni_pref.nid, cpt);
+               best_ni = lnet_nid_to_ni_locked(&lpni_entry->lpni_pref.nid,
+                                               cpt);
                break;
        }
 
@@ -2974,15 +2983,19 @@ again:
        /*
         * Identify the different send cases
         */
-       if (src_nid == LNET_NID_ANY)
+       if (src_nid == LNET_NID_ANY) {
                send_case |= SRC_ANY;
-       else
+               if (lnet_get_net_locked(LNET_NIDNET(dst_nid)))
+                       send_case |= LOCAL_DST;
+               else
+                       send_case |= REMOTE_DST;
+       } else {
                send_case |= SRC_SPEC;
-
-       if (lnet_get_net_locked(LNET_NIDNET(dst_nid)))
-               send_case |= LOCAL_DST;
-       else
-               send_case |= REMOTE_DST;
+               if (LNET_NIDNET(src_nid) == LNET_NIDNET(dst_nid))
+                       send_case |= LOCAL_DST;
+               else
+                       send_case |= REMOTE_DST;
+       }
 
        final_hop = false;
        if (msg->msg_routing && (send_case & LOCAL_DST))
@@ -4162,7 +4175,7 @@ lnet_parse_put(struct lnet_ni *ni, struct lnet_msg *msg)
        hdr->msg.put.offset     = le32_to_cpu(hdr->msg.put.offset);
 
        /* Primary peer NID. */
-       info.mi_id.nid  = msg->msg_initiator;
+       lnet_nid4_to_nid(msg->msg_initiator, &info.mi_id.nid);
        info.mi_id.pid  = hdr->src_pid;
        info.mi_opc     = LNET_MD_OP_PUT;
        info.mi_portal  = hdr->msg.put.ptl_index;
@@ -4200,7 +4213,7 @@ lnet_parse_put(struct lnet_ni *ni, struct lnet_msg *msg)
        case LNET_MATCHMD_DROP:
                CNETERR("Dropping PUT from %s portal %d match %llu"
                        " offset %d length %d: %d\n",
-                       libcfs_id2str(info.mi_id), info.mi_portal,
+                       libcfs_idstr(&info.mi_id), info.mi_portal,
                        info.mi_mbits, info.mi_roffset, info.mi_rlength, rc);
 
                return -ENOENT; /* -ve: OK but no match */
@@ -4225,7 +4238,7 @@ lnet_parse_get(struct lnet_ni *ni, struct lnet_msg *msg, int rdma_get)
        source_id.nid = hdr->src_nid;
        source_id.pid = hdr->src_pid;
        /* Primary peer NID */
-       info.mi_id.nid  = msg->msg_initiator;
+       lnet_nid4_to_nid(msg->msg_initiator, &info.mi_id.nid);
        info.mi_id.pid  = hdr->src_pid;
        info.mi_opc     = LNET_MD_OP_GET;
        info.mi_portal  = hdr->msg.get.ptl_index;
@@ -4238,7 +4251,7 @@ lnet_parse_get(struct lnet_ni *ni, struct lnet_msg *msg, int rdma_get)
        if (rc == LNET_MATCHMD_DROP) {
                CNETERR("Dropping GET from %s portal %d match %llu"
                        " offset %d length %d\n",
-                       libcfs_id2str(info.mi_id), info.mi_portal,
+                       libcfs_idstr(&info.mi_id), info.mi_portal,
                        info.mi_mbits, info.mi_roffset, info.mi_rlength);
                return -ENOENT; /* -ve: OK but no match */
        }
@@ -4270,7 +4283,7 @@ lnet_parse_get(struct lnet_ni *ni, struct lnet_msg *msg, int rdma_get)
                /* didn't get as far as lnet_ni_send() */
                CERROR("%s: Unable to send REPLY for GET from %s: %d\n",
                       libcfs_nidstr(&ni->ni_nid),
-                      libcfs_id2str(info.mi_id), rc);
+                      libcfs_idstr(&info.mi_id), rc);
 
                lnet_finalize(msg, rc);
        }
@@ -4469,9 +4482,10 @@ lnet_msgtyp2str (int type)
                return ("<UNKNOWN>");
        }
 }
+EXPORT_SYMBOL(lnet_msgtyp2str);
 
 int
-lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
+lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid4,
           void *private, int rdma_req)
 {
        struct lnet_peer_ni *lpni;
@@ -4480,6 +4494,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        lnet_pid_t dest_pid;
        lnet_nid_t dest_nid;
        lnet_nid_t src_nid;
+       struct lnet_nid from_nid;
        bool push = false;
        int for_me;
        __u32 type;
@@ -4488,6 +4503,8 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
 
        LASSERT (!in_interrupt ());
 
+       lnet_nid4_to_nid(from_nid4, &from_nid);
+
        type = le32_to_cpu(hdr->type);
        src_nid = le64_to_cpu(hdr->src_nid);
        dest_nid = le64_to_cpu(hdr->dest_nid);
@@ -4496,7 +4513,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
 
        /* FIXME handle large-addr nids */
        for_me = (lnet_nid_to_nid4(&ni->ni_nid) == dest_nid);
-       cpt = lnet_cpt_of_nid(from_nid, ni);
+       cpt = lnet_cpt_of_nid(from_nid4, ni);
 
        CDEBUG(D_NET, "TRACE: %s(%s) <- %s : %s - %s\n",
                libcfs_nid2str(dest_nid),
@@ -4510,7 +4527,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        case LNET_MSG_GET:
                if (payload_length > 0) {
                        CERROR("%s, src %s: bad %s payload %d (0 expected)\n",
-                              libcfs_nid2str(from_nid),
+                              libcfs_nid2str(from_nid4),
                               libcfs_nid2str(src_nid),
                               lnet_msgtyp2str(type), payload_length);
                        return -EPROTO;
@@ -4523,7 +4540,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                    (__u32)(for_me ? LNET_MAX_PAYLOAD : LNET_MTU)) {
                        CERROR("%s, src %s: bad %s payload %d "
                               "(%d max expected)\n",
-                              libcfs_nid2str(from_nid),
+                              libcfs_nid2str(from_nid4),
                               libcfs_nid2str(src_nid),
                               lnet_msgtyp2str(type),
                               payload_length,
@@ -4534,7 +4551,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
 
        default:
                CERROR("%s, src %s: Bad message type 0x%x\n",
-                      libcfs_nid2str(from_nid),
+                      libcfs_nid2str(from_nid4),
                       libcfs_nid2str(src_nid), type);
                return -EPROTO;
        }
@@ -4561,7 +4578,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                        /* should have gone direct */
                        CERROR("%s, src %s: Bad dest nid %s "
                               "(should have been sent direct)\n",
-                               libcfs_nid2str(from_nid),
+                               libcfs_nid2str(from_nid4),
                                libcfs_nid2str(src_nid),
                                libcfs_nid2str(dest_nid));
                        return -EPROTO;
@@ -4572,7 +4589,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                         * this node's NID on its own network */
                        CERROR("%s, src %s: Bad dest nid %s "
                               "(it's my nid but on a different network)\n",
-                               libcfs_nid2str(from_nid),
+                               libcfs_nid2str(from_nid4),
                                libcfs_nid2str(src_nid),
                                libcfs_nid2str(dest_nid));
                        return -EPROTO;
@@ -4581,7 +4598,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                if (rdma_req && type == LNET_MSG_GET) {
                        CERROR("%s, src %s: Bad optimized GET for %s "
                               "(final destination must be me)\n",
-                               libcfs_nid2str(from_nid),
+                               libcfs_nid2str(from_nid4),
                                libcfs_nid2str(src_nid),
                                libcfs_nid2str(dest_nid));
                        return -EPROTO;
@@ -4590,7 +4607,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                if (!the_lnet.ln_routing) {
                        CERROR("%s, src %s: Dropping message for %s "
                               "(routing not enabled)\n",
-                               libcfs_nid2str(from_nid),
+                               libcfs_nid2str(from_nid4),
                                libcfs_nid2str(src_nid),
                                libcfs_nid2str(dest_nid));
                        goto drop;
@@ -4603,7 +4620,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        if (!list_empty(&the_lnet.ln_test_peers) &&     /* normally we don't */
            fail_peer(src_nid, 0)) {                    /* shall we now? */
                CERROR("%s, src %s: Dropping %s to simulate failure\n",
-                      libcfs_nid2str(from_nid), libcfs_nid2str(src_nid),
+                      libcfs_nid2str(from_nid4), libcfs_nid2str(src_nid),
                       lnet_msgtyp2str(type));
                goto drop;
        }
@@ -4613,7 +4630,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
            lnet_drop_rule_match(hdr, lnet_nid_to_nid4(&ni->ni_nid), NULL)) {
                CDEBUG(D_NET,
                       "%s, src %s, dst %s: Dropping %s to simulate silent message loss\n",
-                      libcfs_nid2str(from_nid), libcfs_nid2str(src_nid),
+                      libcfs_nid2str(from_nid4), libcfs_nid2str(src_nid),
                       libcfs_nid2str(dest_nid), lnet_msgtyp2str(type));
                goto drop;
        }
@@ -4621,7 +4638,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        msg = lnet_msg_alloc();
        if (msg == NULL) {
                CERROR("%s, src %s: Dropping %s (out of memory)\n",
-                      libcfs_nid2str(from_nid), libcfs_nid2str(src_nid),
+                      libcfs_nid2str(from_nid4), libcfs_nid2str(src_nid),
                       lnet_msgtyp2str(type));
                goto drop;
        }
@@ -4637,7 +4654,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        msg->msg_offset = 0;
        msg->msg_hdr = *hdr;
        /* for building message event */
-       msg->msg_from = from_nid;
+       msg->msg_from = from_nid4;
        if (!for_me) {
                msg->msg_target.pid     = dest_pid;
                msg->msg_target.nid     = dest_nid;
@@ -4654,15 +4671,13 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
        }
 
        lnet_net_lock(cpt);
-       /* FIXME support large-addr nid */
-       lpni = lnet_nid2peerni_locked(from_nid, lnet_nid_to_nid4(&ni->ni_nid),
-                                     cpt);
+       lpni = lnet_peerni_by_nid_locked(&from_nid, &ni->ni_nid, cpt);
        if (IS_ERR(lpni)) {
                lnet_net_unlock(cpt);
-               CERROR("%s, src %s: Dropping %s "
-                      "(error %ld looking up sender)\n",
-                      libcfs_nid2str(from_nid), libcfs_nid2str(src_nid),
-                      lnet_msgtyp2str(type), PTR_ERR(lpni));
+               rc = PTR_ERR(lpni);
+               CERROR("%s, src %s: Dropping %s (error %d looking up sender)\n",
+                      libcfs_nid2str(from_nid4), libcfs_nid2str(src_nid),
+                      lnet_msgtyp2str(type), rc);
                lnet_msg_free(msg);
                if (rc == -ESHUTDOWN)
                        /* We are shutting down.  Don't do anything more */
@@ -4676,7 +4691,7 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
         */
        if (((lnet_drop_asym_route && for_me) ||
             !lpni->lpni_peer_net->lpn_peer->lp_alive) &&
-           LNET_NIDNET(src_nid) != LNET_NIDNET(from_nid)) {
+           LNET_NIDNET(src_nid) != LNET_NIDNET(from_nid4)) {
                __u32 src_net_id = LNET_NIDNET(src_nid);
                struct lnet_peer *gw = lpni->lpni_peer_net->lpn_peer;
                struct lnet_route *route;
@@ -4703,13 +4718,15 @@ lnet_parse(struct lnet_ni *ni, struct lnet_hdr *hdr, lnet_nid_t from_nid,
                        }
                }
                if (lnet_drop_asym_route && for_me && !found) {
+                       /* Drop ref taken by lnet_nid2peerni_locked() */
+                       lnet_peer_ni_decref_locked(lpni);
                        lnet_net_unlock(cpt);
                        /* we would not use from_nid to route a message to
                         * src_nid
                         * => asymmetric routing detected but forbidden
                         */
                        CERROR("%s, src %s: Dropping asymmetrical route %s\n",
-                              libcfs_nid2str(from_nid),
+                              libcfs_nid2str(from_nid4),
                               libcfs_nid2str(src_nid), lnet_msgtyp2str(type));
                        lnet_msg_free(msg);
                        goto drop;