|
@@ -524,6 +524,20 @@ iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void
|
|
|
|
+iser_inv_rkey(struct ib_send_wr *inv_wr, struct ib_mr *mr)
|
|
|
|
+{
|
|
|
|
+ u32 rkey;
|
|
|
|
+
|
|
|
|
+ memset(inv_wr, 0, sizeof(*inv_wr));
|
|
|
|
+ inv_wr->opcode = IB_WR_LOCAL_INV;
|
|
|
|
+ inv_wr->wr_id = ISER_FASTREG_LI_WRID;
|
|
|
|
+ inv_wr->ex.invalidate_rkey = mr->rkey;
|
|
|
|
+
|
|
|
|
+ rkey = ib_inc_rkey(mr->rkey);
|
|
|
|
+ ib_update_fast_reg_key(mr, rkey);
|
|
|
|
+}
|
|
|
|
+
|
|
static int
|
|
static int
|
|
iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
|
|
iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
|
|
struct fast_reg_descriptor *desc, struct ib_sge *data_sge,
|
|
struct fast_reg_descriptor *desc, struct ib_sge *data_sge,
|
|
@@ -535,7 +549,6 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
|
|
struct ib_send_wr *bad_wr, *wr = NULL;
|
|
struct ib_send_wr *bad_wr, *wr = NULL;
|
|
struct ib_sig_attrs sig_attrs;
|
|
struct ib_sig_attrs sig_attrs;
|
|
int ret;
|
|
int ret;
|
|
- u32 key;
|
|
|
|
|
|
|
|
memset(&sig_attrs, 0, sizeof(sig_attrs));
|
|
memset(&sig_attrs, 0, sizeof(sig_attrs));
|
|
ret = iser_set_sig_attrs(iser_task->sc, &sig_attrs);
|
|
ret = iser_set_sig_attrs(iser_task->sc, &sig_attrs);
|
|
@@ -547,14 +560,8 @@ iser_reg_sig_mr(struct iscsi_iser_task *iser_task,
|
|
goto err;
|
|
goto err;
|
|
|
|
|
|
if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) {
|
|
if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) {
|
|
- memset(&inv_wr, 0, sizeof(inv_wr));
|
|
|
|
- inv_wr.opcode = IB_WR_LOCAL_INV;
|
|
|
|
- inv_wr.wr_id = ISER_FASTREG_LI_WRID;
|
|
|
|
- inv_wr.ex.invalidate_rkey = pi_ctx->sig_mr->rkey;
|
|
|
|
|
|
+ iser_inv_rkey(&inv_wr, pi_ctx->sig_mr);
|
|
wr = &inv_wr;
|
|
wr = &inv_wr;
|
|
- /* Bump the key */
|
|
|
|
- key = (u8)(pi_ctx->sig_mr->rkey & 0x000000FF);
|
|
|
|
- ib_update_fast_reg_key(pi_ctx->sig_mr, ++key);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
memset(&sig_wr, 0, sizeof(sig_wr));
|
|
memset(&sig_wr, 0, sizeof(sig_wr));
|
|
@@ -612,7 +619,6 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
|
|
struct ib_fast_reg_page_list *frpl;
|
|
struct ib_fast_reg_page_list *frpl;
|
|
struct ib_send_wr fastreg_wr, inv_wr;
|
|
struct ib_send_wr fastreg_wr, inv_wr;
|
|
struct ib_send_wr *bad_wr, *wr = NULL;
|
|
struct ib_send_wr *bad_wr, *wr = NULL;
|
|
- u8 key;
|
|
|
|
int ret, offset, size, plen;
|
|
int ret, offset, size, plen;
|
|
|
|
|
|
/* if there a single dma entry, dma mr suffices */
|
|
/* if there a single dma entry, dma mr suffices */
|
|
@@ -644,14 +650,8 @@ static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,
|
|
}
|
|
}
|
|
|
|
|
|
if (!(desc->reg_indicators & ind)) {
|
|
if (!(desc->reg_indicators & ind)) {
|
|
- memset(&inv_wr, 0, sizeof(inv_wr));
|
|
|
|
- inv_wr.wr_id = ISER_FASTREG_LI_WRID;
|
|
|
|
- inv_wr.opcode = IB_WR_LOCAL_INV;
|
|
|
|
- inv_wr.ex.invalidate_rkey = mr->rkey;
|
|
|
|
|
|
+ iser_inv_rkey(&inv_wr, mr);
|
|
wr = &inv_wr;
|
|
wr = &inv_wr;
|
|
- /* Bump the key */
|
|
|
|
- key = (u8)(mr->rkey & 0x000000FF);
|
|
|
|
- ib_update_fast_reg_key(mr, ++key);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/* Prepare FASTREG WR */
|
|
/* Prepare FASTREG WR */
|