]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sdp: use APM support in rdma_cm
authorAmir Vadai <amirv@mellanox.co.il>
Sun, 23 Jan 2011 09:26:40 +0000 (11:26 +0200)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:05:41 +0000 (05:05 -0700)
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
drivers/infiniband/ulp/sdp/sdp.h
drivers/infiniband/ulp/sdp/sdp_cma.c
drivers/infiniband/ulp/sdp/sdp_dbg.h
drivers/infiniband/ulp/sdp/sdp_main.c

index 3210f8c9f0e0ae3da913f00c8b367f8fa8288967..1c1e7947b4fa4f35b5b18c23db3458faf59586c6 100644 (file)
@@ -966,6 +966,7 @@ void sdp_skb_entail(struct sock *sk, struct sk_buff *skb);
 void sdp_start_cma_timewait_timeout(struct sdp_sock *ssk, int timeo);
 int sdp_abort_rx_srcavail(struct sock *sk, int post_sendsm);
 extern struct rw_semaphore device_removal_lock;
+extern int sdp_apm_enable;
 
 /* sdp_proc.c */
 int __init sdp_proc_init(void);
index 0188f22921b23b771d67b779e13676a509a0c68d..52c8a8eea056d7fe1547a3cdcca06d5cbc1cc583 100644 (file)
@@ -57,6 +57,10 @@ SDP_MODPARAM_SINT(sdp_link_layer_ib_only, 0, "Support only link layer of "
 
 static void sdp_qp_event_handler(struct ib_event *event, void *data)
 {
+       if (event->event == IB_EVENT_PATH_MIG) {
+               sdp_dbg(NULL, "Path migration event\n");
+               return;
+       }
        sdp_warn(NULL, "unexpected invocation: event: %d, data=%p\n",
                        event->event, data);
 }
@@ -414,6 +418,12 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
                        break;
                }
 
+               if (sdp_apm_enable) {
+                       rc = rdma_enable_apm(id, RDMA_ALT_PATH_BEST);
+                       if (rc)
+                               sdp_warn(sk, "APM couldn't be enabled: %d\n", rc);
+               }
+
                rc = rdma_resolve_route(id, SDP_ROUTE_TIMEOUT);
                break;
        case RDMA_CM_EVENT_ADDR_ERROR:
@@ -465,6 +475,15 @@ int sdp_cma_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
                SDP_DUMP_PACKET(sk, "TX", NULL, &hh.bsdh);
                rc = rdma_connect(id, &conn_param);
                break;
+
+       case RDMA_CM_EVENT_ALT_ROUTE_RESOLVED:
+               sdp_dbg(sk, "alt route was resolved slid=%d, dlid=%d\n",
+                               id->route.path_rec[1].slid, id->route.path_rec[1].dlid);
+               break;
+       case RDMA_CM_EVENT_ALT_ROUTE_ERROR:
+               sdp_warn(sk, "alt route resolve error\n");
+               break;
+               
        case RDMA_CM_EVENT_ROUTE_ERROR:
                rc = -ETIMEDOUT;
                break;
index b3f7cc7d363eed3562f8f8835341ae672cb7003a..b0267173714281f5a7a03b39e174149b4a52385a 100644 (file)
@@ -278,7 +278,9 @@ static inline const char* rdma_cm_event_str(int event)
                ENUM2STR(RDMA_CM_EVENT_MULTICAST_JOIN),
                ENUM2STR(RDMA_CM_EVENT_MULTICAST_ERROR),
                ENUM2STR(RDMA_CM_EVENT_ADDR_CHANGE),
-               ENUM2STR(RDMA_CM_EVENT_TIMEWAIT_EXIT)
+               ENUM2STR(RDMA_CM_EVENT_TIMEWAIT_EXIT),
+               ENUM2STR(RDMA_CM_EVENT_ALT_ROUTE_RESOLVED),
+               ENUM2STR(RDMA_CM_EVENT_ALT_ROUTE_ERROR)
        };
 
        if (event < 0 || event >= ARRAY_SIZE(state2str)) {
index abf394ea4e3478baf0101d8c4afee44f0369412c..8a4a12e45e8ef31708a7970a65f46c5f53b216bb 100644 (file)
@@ -88,6 +88,7 @@ SDP_MODPARAM_INT(sdp_data_debug_level, 0,
                "Enable data path debug tracing if > 0.");
 #endif
 
+SDP_MODPARAM_INT(sdp_apm_enable, 1, "Enable APM.");
 SDP_MODPARAM_SINT(sdp_fmr_pool_size, 20, "Number of FMRs to allocate for pool");
 SDP_MODPARAM_SINT(sdp_fmr_dirty_wm, 5, "Watermark to flush fmr pool");
 
@@ -787,14 +788,12 @@ out:
 }
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-static int sdp_ipv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+static int sdp_ipv6_connect(struct sock *sk, struct sockaddr_storage *saddr,
+               struct sockaddr *uaddr, int addr_len)
 {
        struct sdp_sock *ssk = sdp_sk(sk);
        struct sockaddr_in6 *usin = (struct sockaddr_in6 *)uaddr;
-       struct sockaddr_in6 src_addr = {
-               .sin6_family = AF_INET6,
-               .sin6_port = htons(inet_sport(sk)),
-       };
+       struct sockaddr_in6 *src_addr = (struct sockaddr_in6 *)saddr;
        int rc;
        int addr_type;
 
@@ -819,7 +818,10 @@ static int sdp_ipv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_le
                return -ENETUNREACH;
 
        sk->sk_bound_dev_if = usin->sin6_scope_id;
-       src_addr.sin6_addr = inet6_sk(sk)->saddr;
+
+       src_addr->sin6_family = AF_INET6;
+       src_addr->sin6_port = htons(inet_sport(sk));
+       src_addr->sin6_addr = inet6_sk(sk)->saddr;
 
        if (ssk->id && (addr_type != ipv6_addr_type(&inet6_sk(sk)->rcv_saddr))) {
                sdp_dbg(sk, "Existing address type is different for the "
@@ -852,16 +854,9 @@ static int sdp_ipv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_le
                addr4->sin_family = AF_INET;
        }
 
-       rc = rdma_resolve_addr(ssk->id, (struct sockaddr *)&src_addr,
-                              uaddr, SDP_RESOLVE_TIMEOUT);
-       if (rc) {
-               sdp_dbg(sk, "rdma_resolve_addr failed: %d\n", rc);
-               return rc;
-       }
-
        sdp_dbg(sk, "%s " NIP6_FMT ":%hu -> " NIP6_FMT ":%hu\n", __func__,
-               NIP6(src_addr.sin6_addr),
-               ntohs(src_addr.sin6_port),
+               NIP6(src_addr->sin6_addr),
+               ntohs(src_addr->sin6_port),
                NIP6(((struct sockaddr_in6 *)uaddr)->sin6_addr),
                ntohs(((struct sockaddr_in6 *)uaddr)->sin6_port));
 
@@ -869,14 +864,11 @@ static int sdp_ipv6_connect(struct sock *sk, struct sockaddr *uaddr, int addr_le
 }
 #endif
 
-static int sdp_ipv4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
+static int sdp_ipv4_connect(struct sock *sk, struct sockaddr_storage *saddr, 
+               struct sockaddr *uaddr, int addr_len)
 {
        struct sdp_sock *ssk = sdp_sk(sk);
-       struct sockaddr_in src_addr = {
-               .sin_family = AF_INET,
-               .sin_port = htons(inet_sport(sk)),
-               .sin_addr.s_addr = inet_saddr(sk),
-       };
+       struct sockaddr_in *src_addr = (struct sockaddr_in *)saddr;
        int rc;
 
         if (addr_len < sizeof(struct sockaddr_in))
@@ -895,16 +887,13 @@ static int sdp_ipv4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_le
                inet_sport(sk) = htons(inet_num(sk));
        }
 
-       rc = rdma_resolve_addr(ssk->id, (struct sockaddr *)&src_addr,
-                              uaddr, SDP_RESOLVE_TIMEOUT);
-       if (rc) {
-               sdp_dbg(sk, "rdma_resolve_addr failed: %d\n", rc);
-               return rc;
-       }
+       src_addr->sin_family = AF_INET;
+       src_addr->sin_port = htons(inet_sport(sk));
+       src_addr->sin_addr.s_addr = inet_saddr(sk);
 
        sdp_dbg(sk, "%s " NIPQUAD_FMT ":%hu -> " NIPQUAD_FMT ":%hu\n", __func__,
-               NIPQUAD(src_addr.sin_addr.s_addr),
-               ntohs(src_addr.sin_port),
+               NIPQUAD(src_addr->sin_addr.s_addr),
+               ntohs(src_addr->sin_port),
                NIPQUAD(((struct sockaddr_in *)uaddr)->sin_addr.s_addr),
                ntohs(((struct sockaddr_in *)uaddr)->sin_port));
 
@@ -914,6 +903,7 @@ static int sdp_ipv4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_le
 static int sdp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 {
        struct sdp_sock *ssk = sdp_sk(sk);
+       struct sockaddr_storage src_addr = { 0 };
        int rc;
 
        sdp_add_to_history(sk, __func__);
@@ -929,14 +919,27 @@ static int sdp_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
 
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        if (inet6_sk(sk))
-               rc = sdp_ipv6_connect(sk, uaddr, addr_len);
+               rc = sdp_ipv6_connect(sk, &src_addr, uaddr, addr_len);
        else
 #endif
-               rc = sdp_ipv4_connect(sk, uaddr, addr_len);
+               rc = sdp_ipv4_connect(sk, &src_addr, uaddr, addr_len);
 
-       if (!rc)
-               sdp_exch_state(sk, TCPF_CLOSE, TCP_SYN_SENT);
+       if (rc)
+               goto err;
 
+       rc = rdma_resolve_addr(ssk->id, (struct sockaddr *)&src_addr,
+                              uaddr, SDP_RESOLVE_TIMEOUT);
+       if (rc) {
+               sdp_dbg(sk, "rdma_resolve_addr failed: %d\n", rc);
+               goto err;
+       }
+
+       sdp_exch_state(sk, TCPF_CLOSE, TCP_SYN_SENT);
+
+       return rc;
+
+err:
+       sdp_warn(sk, "Error: rc = %d\n", rc);
        return rc;
 }