Re: ISER blk-mq tags

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Hi Karan,

I have run in to a problem where it seems like an ISER initiator cannot
submit more than 128 commands to the target (per scsi host). I tried to
debug this and found that when iscsi_host_add() is called,
Scsi_Host>can_queue is unset. This causes iscsi_host_add() to use the
default qdepth (128) when creating the scsi host's blk-mq in
scsi_add_host(). After the call to iscsi_host_add() shost->can_queue is
set to the correct value, however by then the blk-mq is already created
with the wrong nuber of tags.

This causes the queue depth not to exceed 128.

Please advise if this is the expected behaviour. Have I missed
something? It appears that other drivers that call scsi_add_host() set
can_queue before the function call.

Thanks for reporting, you are correct, this can be easily fixed, does
the below patch fix your issue:
--
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c
index 0336643c2ed6..434ae88ff623 100644
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -633,8 +633,8 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
         */
        if (ep) {
                iser_conn = ep->dd_data;
-               max_cmds = iser_conn->max_cmds;
                shost->sg_tablesize = iser_conn->scsi_sg_tablesize;
+ shost->can_queue = min_t(u16, cmds_max, iser_conn->max_cmds);

                mutex_lock(&iser_conn->state_mutex);
                if (iser_conn->state != ISER_CONN_UP) {
@@ -660,6 +660,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
                }
                mutex_unlock(&iser_conn->state_mutex);
        } else {
+ shost->can_queue = min_t(u16, cmds_max, ISER_DEF_XMIT_CMDS_MAX);
                max_cmds = ISER_DEF_XMIT_CMDS_MAX;
                if (iscsi_host_add(shost, NULL))
                        goto free_host;
@@ -678,12 +679,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
                 iser_conn, shost->sg_tablesize,
                 shost->max_sectors);

-       if (cmds_max > max_cmds) {
-               iser_info("cmds_max changed from %u to %u\n",
-                         cmds_max, max_cmds);
-               cmds_max = max_cmds;
-       }
-
        cls_session = iscsi_session_setup(&iscsi_iser_transport, shost,
                                          cmds_max, 0,
                                          sizeof(struct iscsi_iser_task),
@@ -692,7 +687,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
                goto remove_host;
        session = cls_session->dd_data;

-       shost->can_queue = session->scsi_cmds_max;
        return cls_session;

 remove_host:
--
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux