@@ -56,6 +56,10 @@ static bool iscsi_use_recv_wq;
module_param_named(use_recv_wq, iscsi_use_recv_wq, bool, 0644);
MODULE_PARM_DESC(use_recv_wq, "Set to true to read iSCSI data/headers from the iscsi_q workqueue. The default is false which will perform reads from the network softirq context.");
+static bool iscsi_xmit_from_qc;
+module_param_named(xmit_from_queuecommand, iscsi_xmit_from_qc, bool, 0644);
+MODULE_PARM_DESC(xmit_from_queuecommand, "Set to true to try to xmit the task from the queuecommand callout. The default is false wihch will xmit the task from the iscsi_q workqueue.");
+
static int iscsi_sw_tcp_dbg;
module_param_named(debug_iscsi_tcp, iscsi_sw_tcp_dbg, int,
S_IRUGO | S_IWUSR);
@@ -909,6 +913,7 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
struct iscsi_cls_session *cls_session;
struct iscsi_session *session;
struct iscsi_sw_tcp_host *tcp_sw_host;
+ struct iscsi_host *ihost;
struct Scsi_Host *shost;
int rc;
@@ -928,6 +933,12 @@ iscsi_sw_tcp_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
shost->max_channel = 0;
shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
+ if (iscsi_xmit_from_qc) {
+ shost->hostt->queuecommand_blocks = true;
+ ihost = shost_priv(shost);
+ ihost->xmit_from_qc = true;
+ }
+
rc = iscsi_host_get_max_scsi_cmds(shost, cmds_max);
if (rc < 0)
goto free_host;
Transmitting from the queuecommand is nice when your app and iscsi threads have to run on the same CPU. But, for the case where you want higher throughput/IOPs it's sometimes better to hog multiple CPUs with the app on one CPU and the xmit/recv paths an another. To allow both configs this adds a modparam. Signed-off-by: Mike Christie <michael.christie@oracle.com> --- drivers/scsi/iscsi_tcp.c | 11 +++++++++++ 1 file changed, 11 insertions(+)