|
@@ -812,7 +812,9 @@ static void iser_route_handler(struct rdma_cm_id *cma_id)
|
|
conn_param.rnr_retry_count = 6;
|
|
conn_param.rnr_retry_count = 6;
|
|
|
|
|
|
memset(&req_hdr, 0, sizeof(req_hdr));
|
|
memset(&req_hdr, 0, sizeof(req_hdr));
|
|
- req_hdr.flags = (ISER_ZBVA_NOT_SUP | ISER_SEND_W_INV_NOT_SUP);
|
|
|
|
|
|
+ req_hdr.flags = ISER_ZBVA_NOT_SUP;
|
|
|
|
+ if (!device->remote_inv_sup)
|
|
|
|
+ req_hdr.flags |= ISER_SEND_W_INV_NOT_SUP;
|
|
conn_param.private_data = (void *)&req_hdr;
|
|
conn_param.private_data = (void *)&req_hdr;
|
|
conn_param.private_data_len = sizeof(struct iser_cm_hdr);
|
|
conn_param.private_data_len = sizeof(struct iser_cm_hdr);
|
|
|
|
|
|
@@ -827,7 +829,8 @@ failure:
|
|
iser_connect_error(cma_id);
|
|
iser_connect_error(cma_id);
|
|
}
|
|
}
|
|
|
|
|
|
-static void iser_connected_handler(struct rdma_cm_id *cma_id)
|
|
|
|
|
|
+static void iser_connected_handler(struct rdma_cm_id *cma_id,
|
|
|
|
+ const void *private_data)
|
|
{
|
|
{
|
|
struct iser_conn *iser_conn;
|
|
struct iser_conn *iser_conn;
|
|
struct ib_qp_attr attr;
|
|
struct ib_qp_attr attr;
|
|
@@ -841,6 +844,15 @@ static void iser_connected_handler(struct rdma_cm_id *cma_id)
|
|
(void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr);
|
|
(void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr);
|
|
iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);
|
|
iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);
|
|
|
|
|
|
|
|
+ if (private_data) {
|
|
|
|
+ u8 flags = *(u8 *)private_data;
|
|
|
|
+
|
|
|
|
+ iser_conn->snd_w_inv = !(flags & ISER_SEND_W_INV_NOT_SUP);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ iser_info("conn %p: negotiated %s invalidation\n",
|
|
|
|
+ iser_conn, iser_conn->snd_w_inv ? "remote" : "local");
|
|
|
|
+
|
|
iser_conn->state = ISER_CONN_UP;
|
|
iser_conn->state = ISER_CONN_UP;
|
|
complete(&iser_conn->up_completion);
|
|
complete(&iser_conn->up_completion);
|
|
}
|
|
}
|
|
@@ -892,7 +904,7 @@ static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *eve
|
|
iser_route_handler(cma_id);
|
|
iser_route_handler(cma_id);
|
|
break;
|
|
break;
|
|
case RDMA_CM_EVENT_ESTABLISHED:
|
|
case RDMA_CM_EVENT_ESTABLISHED:
|
|
- iser_connected_handler(cma_id);
|
|
|
|
|
|
+ iser_connected_handler(cma_id, event->param.conn.private_data);
|
|
break;
|
|
break;
|
|
case RDMA_CM_EVENT_ADDR_ERROR:
|
|
case RDMA_CM_EVENT_ADDR_ERROR:
|
|
case RDMA_CM_EVENT_ROUTE_ERROR:
|
|
case RDMA_CM_EVENT_ROUTE_ERROR:
|