IB/srp: Allow cmd_per_lun to be set per target port
Vu Pham [Sun, 18 Jun 2006 03:37:31 +0000 (20:37 -0700)]
Allow userspace to throttle traffic on a given connection to a target
port by adding "max_cmd_per_lun=xyz" to lower the cmd_per_lun value
set for that scsi_host.

Signed-off-by: Vu Pham <vu@mellanox.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

drivers/infiniband/ulp/srp/ib_srp.c

index 4629256..8e6b103 100644 (file)
@@ -1491,6 +1491,7 @@ enum {
        SRP_OPT_PKEY            = 1 << 3,
        SRP_OPT_SERVICE_ID      = 1 << 4,
        SRP_OPT_MAX_SECT        = 1 << 5,
+       SRP_OPT_MAX_CMD_PER_LUN = 1 << 6,
        SRP_OPT_ALL             = (SRP_OPT_ID_EXT       |
                                   SRP_OPT_IOC_GUID     |
                                   SRP_OPT_DGID         |
@@ -1499,13 +1500,14 @@ enum {
 };
 
 static match_table_t srp_opt_tokens = {
-       { SRP_OPT_ID_EXT,       "id_ext=%s"     },
-       { SRP_OPT_IOC_GUID,     "ioc_guid=%s"   },
-       { SRP_OPT_DGID,         "dgid=%s"       },
-       { SRP_OPT_PKEY,         "pkey=%x"       },
-       { SRP_OPT_SERVICE_ID,   "service_id=%s" },
-       { SRP_OPT_MAX_SECT,     "max_sect=%d"   },
-       { SRP_OPT_ERR,          NULL            }
+       { SRP_OPT_ID_EXT,               "id_ext=%s"             },
+       { SRP_OPT_IOC_GUID,             "ioc_guid=%s"           },
+       { SRP_OPT_DGID,                 "dgid=%s"               },
+       { SRP_OPT_PKEY,                 "pkey=%x"               },
+       { 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_ERR,                  NULL                    }
 };
 
 static int srp_parse_options(const char *buf, struct srp_target_port *target)
@@ -1581,6 +1583,14 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target)
                        target->scsi_host->max_sectors = token;
                        break;
 
+               case SRP_OPT_MAX_CMD_PER_LUN:
+                       if (match_int(args, &token)) {
+                               printk(KERN_WARNING PFX "bad max cmd_per_lun parameter '%s'\n", p);
+                               goto out;
+                       }
+                       target->scsi_host->cmd_per_lun = min(token, SRP_SQ_SIZE);
+                       break;
+
                default:
                        printk(KERN_WARNING PFX "unknown parameter or missing value "
                               "'%s' in target creation request\n", p);