Change-Id: Ic90bc43f6bd61818530da7fb700962a8e1ef4aa5
Signed-off-by: Israel Rukshin <israelr@mellanox.com>
---
- drivers/infiniband/ulp/srp/ib_srp.c | 193 +++++++++++++++++++++++++++++++++++-
- drivers/infiniband/ulp/srp/ib_srp.h | 24 +++++
- 2 files changed, 213 insertions(+), 4 deletions(-)
+ drivers/infiniband/ulp/srp/ib_srp.c | 166 +++++++++++++++++++++++++++++++++++-
+ drivers/infiniband/ulp/srp/ib_srp.h | 24 ++++++
+ 2 files changed, 186 insertions(+), 4 deletions(-)
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index xxxxxxx..xxxxxxx xxxxxx
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
-@@ -77,12 +80,22 @@ module_param(srp_sg_tablesize, uint, 0444);
- MODULE_PARM_DESC(srp_sg_tablesize, "Deprecated name for cmd_sg_entries");
-
- module_param(cmd_sg_entries, uint, 0444);
-+#ifdef HAVE_BLK_QUEUE_VIRT_BOUNDARY
- MODULE_PARM_DESC(cmd_sg_entries,
+@@ -81,8 +84,13 @@ MODULE_PARM_DESC(cmd_sg_entries,
"Default number of gather/scatter entries in the SRP command (default is 12, max 255)");
-+#else
-+MODULE_PARM_DESC(cmd_sg_entries,
-+ "Default number of gather/scatter entries in the SRP command (default is 12, max 12)");
-+#endif
module_param(indirect_sg_entries, uint, 0444);
+#ifdef HAVE_SG_MAX_SEGMENTS
module_param(allow_ext_sg, bool, 0444);
MODULE_PARM_DESC(allow_ext_sg,
-@@ -105,7 +118,7 @@ MODULE_PARM_DESC(never_register, "Never register memory");
+@@ -105,7 +113,7 @@ MODULE_PARM_DESC(never_register, "Never register memory");
static const struct kernel_param_ops srp_tmo_ops;
module_param_cb(reconnect_delay, &srp_tmo_ops, &srp_reconnect_delay,
S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(reconnect_delay, "Time between successive reconnect attempts");
-@@ -758,7 +771,7 @@ static int srp_send_req(struct srp_rdma_ch *ch, bool multich)
+@@ -758,7 +766,7 @@ static int srp_send_req(struct srp_rdma_ch *ch, bool multich)
shost_printk(KERN_DEBUG, target->scsi_host,
PFX "Topspin/Cisco initiator port ID workaround "
"activated for target GUID %016llx\n",
memset(req->priv.initiator_port_id, 0, 8);
memcpy(req->priv.initiator_port_id + 8,
&target->srp_host->srp_dev->dev->node_guid, 8);
-@@ -846,6 +859,9 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
+@@ -846,6 +854,9 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
dma_addr_t dma_addr;
int i, ret = -ENOMEM;
ch->req_ring = kcalloc(target->req_ring_size, sizeof(*ch->req_ring),
GFP_KERNEL);
if (!ch->req_ring)
-@@ -877,6 +893,10 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
+@@ -877,6 +888,10 @@ static int srp_alloc_req_data(struct srp_rdma_ch *ch)
goto out;
req->indirect_dma_addr = dma_addr;
}
ret = 0;
-@@ -1130,6 +1150,9 @@ static void srp_free_req(struct srp_rdma_ch *ch, struct srp_request *req,
+@@ -1130,6 +1145,9 @@ static void srp_free_req(struct srp_rdma_ch *ch, struct srp_request *req,
spin_lock_irqsave(&ch->lock, flags);
ch->req_lim += req_lim_delta;
spin_unlock_irqrestore(&ch->lock, flags);
}
-@@ -1874,11 +1897,18 @@ static void srp_process_rsp(struct srp_rdma_ch *ch, struct srp_rsp *rsp)
+@@ -1874,11 +1892,18 @@ static void srp_process_rsp(struct srp_rdma_ch *ch, struct srp_rsp *rsp)
ch->tsk_mgmt_status = rsp->data[3];
complete(&ch->tsk_mgmt_done);
} else {
if (!scmnd) {
shost_printk(KERN_ERR, target->scsi_host,
"Null scmnd for RSP w/tag %#016llx received on ch %td / QP %#x\n",
-@@ -1974,8 +2004,13 @@ static void srp_process_aer_req(struct srp_rdma_ch *ch,
+@@ -1974,8 +1999,13 @@ static void srp_process_aer_req(struct srp_rdma_ch *ch,
};
s32 delta = be32_to_cpu(req->req_lim_delta);
+#ifdef HAVE_SCSI_DEVICE_U64_LUN
-+ shost_printk(KERN_ERR, target->scsi_host, PFX
-+ "ignoring AER for LUN %u\n", scsilun_to_int(&req->lun));
-+#else
shost_printk(KERN_ERR, target->scsi_host, PFX
- "ignoring AER for LUN %llu\n", scsilun_to_int(&req->lun));
+ "ignoring AER for LUN %u\n", scsilun_to_int(&req->lun));
++#else
++ shost_printk(KERN_ERR, target->scsi_host, PFX
++ "ignoring AER for LUN %u\n", scsilun_to_int(&req->lun));
+#endif
if (srp_response_common(ch, delta, &rsp, sizeof(rsp)))
shost_printk(KERN_ERR, target->scsi_host, PFX
-@@ -2085,7 +2120,9 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
+@@ -2085,7 +2115,9 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
struct ib_device *dev;
unsigned long flags;
u32 tag;
int len, ret;
const bool in_scsi_eh = !in_interrupt() && current == shost->ehandler;
-@@ -2102,6 +2139,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
+@@ -2102,6 +2134,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
if (unlikely(scmnd->result))
goto err;
WARN_ON_ONCE(scmnd->request->tag < 0);
tag = blk_mq_unique_tag(scmnd->request);
ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)];
-@@ -2109,15 +2147,28 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
+@@ -2109,15 +2142,28 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
WARN_ONCE(idx >= target->req_ring_size, "%s: tag %#x: idx %d >= %d\n",
dev_name(&shost->shost_gendev), tag, idx,
target->req_ring_size);
dev = target->srp_host->srp_dev->dev;
ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_iu_len,
DMA_TO_DEVICE);
-@@ -2178,6 +2229,14 @@ err_iu:
+@@ -2178,6 +2224,14 @@ err_iu:
*/
req->scmnd = NULL;
err:
if (scmnd->result) {
scmnd->scsi_done(scmnd);
-@@ -2493,6 +2552,31 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
+@@ -2493,6 +2547,31 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
return 0;
}
/**
* srp_change_queue_depth - setting device queue depth
* @sdev: scsi device struct
-@@ -2500,13 +2584,40 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
+@@ -2500,13 +2579,40 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
*
* Returns queue depth.
*/
static int srp_send_tsk_mgmt(struct srp_rdma_ch *ch, u64 req_tag, u64 lun,
u8 func)
-@@ -2578,8 +2689,13 @@ static int srp_abort(struct scsi_cmnd *scmnd)
+@@ -2578,8 +2684,13 @@ static int srp_abort(struct scsi_cmnd *scmnd)
if (!req)
return SUCCESS;
if (WARN_ON_ONCE(ch_idx >= target->ch_count))
return SUCCESS;
ch = &target->ch[ch_idx];
-@@ -2637,6 +2753,7 @@ static int srp_reset_host(struct scsi_cmnd *scmnd)
+@@ -2637,6 +2748,7 @@ static int srp_reset_host(struct scsi_cmnd *scmnd)
return srp_reconnect_rport(target->rport) == 0 ? SUCCESS : FAILED;
}
static int srp_slave_alloc(struct scsi_device *sdev)
{
struct Scsi_Host *shost = sdev->host;
-@@ -2650,6 +2767,7 @@ static int srp_slave_alloc(struct scsi_device *sdev)
+@@ -2650,6 +2762,7 @@ static int srp_slave_alloc(struct scsi_device *sdev)
return 0;
}
static int srp_slave_configure(struct scsi_device *sdev)
{
-@@ -2842,11 +2960,20 @@ static struct scsi_host_template srp_template = {
+@@ -2842,11 +2955,20 @@ static struct scsi_host_template srp_template = {
.module = THIS_MODULE,
.name = "InfiniBand SRP initiator",
.proc_name = DRV_NAME,
.eh_abort_handler = srp_abort,
.eh_device_reset_handler = srp_reset_device,
.eh_host_reset_handler = srp_reset_host,
-@@ -2857,7 +2984,15 @@ static struct scsi_host_template srp_template = {
+@@ -2857,7 +2979,15 @@ static struct scsi_host_template srp_template = {
.cmd_per_lun = SRP_DEFAULT_CMD_SQ_SIZE,
.use_clustering = ENABLE_CLUSTERING,
.shost_attrs = srp_host_attrs,
};
static int srp_sdev_count(struct Scsi_Host *host)
-@@ -2906,8 +3041,13 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
+@@ -2906,8 +3036,13 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
list_add_tail(&target->list, &host->target_list);
spin_unlock(&host->target_lock);
if (srp_connected_ch(target) < target->ch_count ||
target->qp_in_error) {
-@@ -3167,11 +3307,19 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
- break;
-
- case SRP_OPT_CMD_SG_ENTRIES:
-+#ifdef HAVE_BLK_QUEUE_VIRT_BOUNDARY
- if (match_int(args, &token) || token < 1 || token > 255) {
- pr_warn("bad max cmd_sg_entries parameter '%s'\n",
- p);
- goto out;
- }
-+#else
-+ if (match_int(args, &token) || token < 1 || token > 12) {
-+ pr_warn("bad max cmd_sg_entries parameter '%s'\n",
-+ p);
-+ goto out;
-+ }
-+#endif
- target->cmd_sg_cnt = token;
- break;
-
-@@ -3184,12 +3332,21 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
+@@ -3184,12 +3319,21 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
break;
case SRP_OPT_SG_TABLESIZE:
target->sg_tablesize = token;
break;
-@@ -3249,7 +3406,11 @@ static ssize_t srp_create_target(struct device *dev,
- struct srp_device *srp_dev = host->srp_dev;
- struct ib_device *ibdev = srp_dev->dev;
- int ret, node_idx, node, cpu, i;
-+#ifdef HAVE_BLK_QUEUE_VIRT_BOUNDARY
- unsigned int max_sectors_per_mr, mr_per_cmd = 0;
-+#else
-+ unsigned int mr_per_cmd = 0;
-+#endif
- bool multich = false;
-
- target_host = scsi_host_alloc(&srp_template,
-@@ -3257,6 +3418,11 @@ static ssize_t srp_create_target(struct device *dev,
+@@ -3257,6 +3401,11 @@ static ssize_t srp_create_target(struct device *dev,
if (!target_host)
return -ENOMEM;
target_host->transportt = ib_srp_transport_template;
target_host->max_channel = 0;
target_host->max_id = 1;
-@@ -3288,6 +3454,12 @@ static ssize_t srp_create_target(struct device *dev,
+@@ -3288,6 +3437,12 @@ static ssize_t srp_create_target(struct device *dev,
if (ret)
goto out;
target->req_ring_size = target->queue_size - SRP_TSK_MGMT_SQ_SIZE;
if (!srp_conn_unique(target->srp_host, target)) {
-@@ -3319,6 +3491,7 @@ static ssize_t srp_create_target(struct device *dev,
+@@ -3319,6 +3474,7 @@ static ssize_t srp_create_target(struct device *dev,
* register_always is true. Hence add one to mr_per_cmd if
* register_always has been set.
*/
-+#ifdef HAVE_BLK_QUEUE_VIRT_BOUNDARY
++
max_sectors_per_mr = srp_dev->max_pages_per_mr <<
(ilog2(srp_dev->mr_page_size) - 9);
mr_per_cmd = register_always +
-@@ -3328,6 +3501,9 @@ static ssize_t srp_create_target(struct device *dev,
- target->scsi_host->max_sectors,
- srp_dev->max_pages_per_mr, srp_dev->mr_page_size,
- max_sectors_per_mr, mr_per_cmd);
-+#else
-+ mr_per_cmd = 1;
-+#endif
- }
-
- target_host->sg_tablesize = target->sg_tablesize;
-@@ -3417,7 +3593,9 @@ static ssize_t srp_create_target(struct device *dev,
+@@ -3417,7 +3573,9 @@ static ssize_t srp_create_target(struct device *dev,
}
connected:
ret = srp_add_target(host, target);
if (ret)
-@@ -3669,10 +3847,17 @@ static int __init srp_init_module(void)
- if (!cmd_sg_entries)
- cmd_sg_entries = SRP_DEF_SG_TABLESIZE;
-
-+#ifdef HAVE_BLK_QUEUE_VIRT_BOUNDARY
- if (cmd_sg_entries > 255) {
- pr_warn("Clamping cmd_sg_entries to 255\n");
- cmd_sg_entries = 255;
- }
-+#else
-+ if (cmd_sg_entries > 12) {
-+ pr_warn("Clamping cmd_sg_entries to 12\n");
-+ cmd_sg_entries = 12;
-+ }
-+#endif
-
- if (!indirect_sg_entries)
- indirect_sg_entries = cmd_sg_entries;
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/ulp/srp/ib_srp.h