From: Amir Vadai Date: Sun, 23 Jan 2011 09:26:40 +0000 (+0200) Subject: sdp: use APM support in rdma_cm X-Git-Tag: v4.1.12-92~264^2~5^2~41 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=5b849c8380233b671cfb14a3cf59531e57c32696;p=users%2Fjedix%2Flinux-maple.git sdp: use APM support in rdma_cm Signed-off-by: Amir Vadai --- diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index 3210f8c9f0e0..1c1e7947b4fa 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -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); diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index 0188f22921b2..52c8a8eea056 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -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; diff --git a/drivers/infiniband/ulp/sdp/sdp_dbg.h b/drivers/infiniband/ulp/sdp/sdp_dbg.h index b3f7cc7d363e..b02671737142 100644 --- a/drivers/infiniband/ulp/sdp/sdp_dbg.h +++ b/drivers/infiniband/ulp/sdp/sdp_dbg.h @@ -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)) { diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index abf394ea4e34..8a4a12e45e8e 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -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; }