IB/srp: Add target_can_queue login parameter
authorBart Van Assche <bart.vanassche@wdc.com>
Mon, 22 Jan 2018 22:27:13 +0000 (14:27 -0800)
committerDoug Ledford <dledford@redhat.com>
Tue, 23 Jan 2018 16:35:05 +0000 (11:35 -0500)
Although I'm not sure this parameter is useful for regular SRP users,
setting this parameter to 1 has shown to be invaluable for testing the
block layer core, SCSI core and device mapper queue running mechanisms.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/srp/ib_srp.c
drivers/infiniband/ulp/srp/ib_srp.h

index 6109f2e8f0f866059d5714e8fb560b01c90b4805..b48843833d699210832fd50c927355b2f769dd7c 100644 (file)
@@ -3018,6 +3018,16 @@ static int srp_reset_host(struct scsi_cmnd *scmnd)
        return srp_reconnect_rport(target->rport) == 0 ? SUCCESS : FAILED;
 }
 
+static int srp_target_alloc(struct scsi_target *starget)
+{
+       struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+       struct srp_target_port *target = host_to_target(shost);
+
+       if (target->target_can_queue)
+               starget->can_queue = target->target_can_queue;
+       return 0;
+}
+
 static int srp_slave_alloc(struct scsi_device *sdev)
 {
        struct Scsi_Host *shost = sdev->host;
@@ -3231,6 +3241,7 @@ static struct scsi_host_template srp_template = {
        .module                         = THIS_MODULE,
        .name                           = "InfiniBand SRP initiator",
        .proc_name                      = DRV_NAME,
+       .target_alloc                   = srp_target_alloc,
        .slave_alloc                    = srp_slave_alloc,
        .slave_configure                = srp_slave_configure,
        .info                           = srp_target_info,
@@ -3398,6 +3409,7 @@ enum {
        SRP_OPT_QUEUE_SIZE      = 1 << 14,
        SRP_OPT_IP_SRC          = 1 << 15,
        SRP_OPT_IP_DEST         = 1 << 16,
+       SRP_OPT_TARGET_CAN_QUEUE= 1 << 17,
 };
 
 static unsigned int srp_opt_mandatory[] = {
@@ -3419,6 +3431,7 @@ static const match_table_t srp_opt_tokens = {
        { SRP_OPT_SERVICE_ID,           "service_id=%s"         },
        { SRP_OPT_MAX_SECT,             "max_sect=%d"           },
        { SRP_OPT_MAX_CMD_PER_LUN,      "max_cmd_per_lun=%d"    },
+       { SRP_OPT_TARGET_CAN_QUEUE,     "target_can_queue=%d"   },
        { SRP_OPT_IO_CLASS,             "io_class=%x"           },
        { SRP_OPT_INITIATOR_EXT,        "initiator_ext=%s"      },
        { SRP_OPT_CMD_SG_ENTRIES,       "cmd_sg_entries=%u"     },
@@ -3607,6 +3620,15 @@ static int srp_parse_options(struct net *net, const char *buf,
                        target->scsi_host->cmd_per_lun = token;
                        break;
 
+               case SRP_OPT_TARGET_CAN_QUEUE:
+                       if (match_int(args, &token) || token < 1) {
+                               pr_warn("bad max target_can_queue parameter '%s'\n",
+                                       p);
+                               goto out;
+                       }
+                       target->target_can_queue = token;
+                       break;
+
                case SRP_OPT_IO_CLASS:
                        if (match_hex(args, &token)) {
                                pr_warn("bad IO class parameter '%s'\n", p);
index 911fc1582f61820fa15b11b5171c73e82da1762e..a2706086b9c7d4e55acea759f8d96d6a9c2b2dd9 100644 (file)
@@ -211,6 +211,7 @@ struct srp_target_port {
        char                    target_name[32];
        unsigned int            scsi_id;
        unsigned int            sg_tablesize;
+       unsigned int            target_can_queue;
        int                     mr_pool_size;
        int                     mr_per_cmd;
        int                     queue_size;