IB/isert: Support the remote invalidation exception
We'll use remote invalidate, according to negotiation result during connection establishment. If the initiator declared that it supports the remote invalidate exception and the local HCA supports IB_DEVICE_MEM_MGT_EXTENSIONS then the target will use IB_WR_SEND_WITH_INV with the correct rkey for the response. Signed-off-by: Jenny Derzhavetz <jennyf@mellanox.com> Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
13bce4821f
Коммит
422bd0acb0
|
@ -653,6 +653,32 @@ out_login_buf:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
isert_set_nego_params(struct isert_conn *isert_conn,
|
||||
struct rdma_conn_param *param)
|
||||
{
|
||||
struct ib_device_attr *attr = &isert_conn->device->ib_device->attrs;
|
||||
|
||||
/* Set max inflight RDMA READ requests */
|
||||
isert_conn->initiator_depth = min_t(u8, param->initiator_depth,
|
||||
attr->max_qp_init_rd_atom);
|
||||
isert_dbg("Using initiator_depth: %u\n", isert_conn->initiator_depth);
|
||||
|
||||
if (param->private_data) {
|
||||
u8 flags = *(u8 *)param->private_data;
|
||||
|
||||
/*
|
||||
* use remote invalidation if the both initiator
|
||||
* and the HCA support it
|
||||
*/
|
||||
isert_conn->snd_w_inv = !(flags & ISER_SEND_W_INV_NOT_SUP) &&
|
||||
(attr->device_cap_flags &
|
||||
IB_DEVICE_MEM_MGT_EXTENSIONS);
|
||||
if (isert_conn->snd_w_inv)
|
||||
isert_info("Using remote invalidation\n");
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||
{
|
||||
|
@ -691,11 +717,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
|||
}
|
||||
isert_conn->device = device;
|
||||
|
||||
/* Set max inflight RDMA READ requests */
|
||||
isert_conn->initiator_depth = min_t(u8,
|
||||
event->param.conn.initiator_depth,
|
||||
device->ib_device->attrs.max_qp_init_rd_atom);
|
||||
isert_dbg("Using initiator_depth: %u\n", isert_conn->initiator_depth);
|
||||
isert_set_nego_params(isert_conn, &event->param.conn);
|
||||
|
||||
ret = isert_conn_setup_qp(isert_conn, cma_id);
|
||||
if (ret)
|
||||
|
@ -1074,7 +1096,14 @@ isert_init_send_wr(struct isert_conn *isert_conn, struct isert_cmd *isert_cmd,
|
|||
|
||||
isert_cmd->rdma_wr.iser_ib_op = ISER_IB_SEND;
|
||||
send_wr->wr_id = (uintptr_t)&isert_cmd->tx_desc;
|
||||
send_wr->opcode = IB_WR_SEND;
|
||||
|
||||
if (isert_conn->snd_w_inv && isert_cmd->inv_rkey) {
|
||||
send_wr->opcode = IB_WR_SEND_WITH_INV;
|
||||
send_wr->ex.invalidate_rkey = isert_cmd->inv_rkey;
|
||||
} else {
|
||||
send_wr->opcode = IB_WR_SEND;
|
||||
}
|
||||
|
||||
send_wr->sg_list = &tx_desc->tx_sg[0];
|
||||
send_wr->num_sge = isert_cmd->tx_desc.num_sge;
|
||||
send_wr->send_flags = IB_SEND_SIGNALED;
|
||||
|
@ -1463,6 +1492,7 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
|
|||
isert_cmd->read_va = read_va;
|
||||
isert_cmd->write_stag = write_stag;
|
||||
isert_cmd->write_va = write_va;
|
||||
isert_cmd->inv_rkey = read_stag ? read_stag : write_stag;
|
||||
|
||||
ret = isert_handle_scsi_cmd(isert_conn, isert_cmd, cmd,
|
||||
rx_desc, (unsigned char *)hdr);
|
||||
|
@ -3080,7 +3110,9 @@ isert_rdma_accept(struct isert_conn *isert_conn)
|
|||
cp.rnr_retry_count = 7;
|
||||
|
||||
memset(&rsp_hdr, 0, sizeof(rsp_hdr));
|
||||
rsp_hdr.flags = (ISERT_ZBVA_NOT_USED | ISERT_SEND_W_INV_NOT_USED);
|
||||
rsp_hdr.flags = ISERT_ZBVA_NOT_USED;
|
||||
if (!isert_conn->snd_w_inv)
|
||||
rsp_hdr.flags = rsp_hdr.flags | ISERT_SEND_W_INV_NOT_USED;
|
||||
cp.private_data = (void *)&rsp_hdr;
|
||||
cp.private_data_len = sizeof(rsp_hdr);
|
||||
|
||||
|
|
|
@ -163,6 +163,7 @@ struct isert_cmd {
|
|||
uint32_t write_stag;
|
||||
uint64_t read_va;
|
||||
uint64_t write_va;
|
||||
uint32_t inv_rkey;
|
||||
u64 pdu_buf_dma;
|
||||
u32 pdu_buf_len;
|
||||
struct isert_conn *conn;
|
||||
|
@ -210,6 +211,7 @@ struct isert_conn {
|
|||
struct work_struct release_work;
|
||||
struct ib_recv_wr beacon;
|
||||
bool logout_posted;
|
||||
bool snd_w_inv;
|
||||
};
|
||||
|
||||
#define ISERT_MAX_CQ 64
|
||||
|
|
Загрузка…
Ссылка в новой задаче