aboutsummaryrefslogtreecommitdiff
path: root/sys/cam/ctl/ctl_frontend_iscsi.c
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2021-02-19 03:07:32 +0000
committerAlexander Motin <mav@FreeBSD.org>2021-02-19 03:29:38 +0000
commit812c9f48a2b7bccc31b2a6077b299822357832e4 (patch)
tree010235d080cc84effb1ee127a2b3dfd3f7f21e66 /sys/cam/ctl/ctl_frontend_iscsi.c
parent4621c4f2fd179eff0923140da9af122c42dbe78b (diff)
downloadsrc-812c9f48a2b7bccc31b2a6077b299822357832e4.tar.gz
src-812c9f48a2b7bccc31b2a6077b299822357832e4.zip
Save context switch per I/O for iSCSI and IOCTL frontends.
Introduce new CTL core KPI ctl_run(), preprocessing I/Os in the caller context instead of scheduling another thread just for that. This call may sleep, that is not acceptable for some frontends like the original CAM/FC one, but iSCSI already has separate sleepable per-connection RX threads, and another thread scheduling is mostly just a waste of time. IOCTL frontend actually waits for the I/O completion in the caller thread, so the use of another thread for this has even less sense. With this change I can measure ~5% IOPS improvement on 4KB iSCSI I/Os to ZFS. MFC after: 1 month
Diffstat (limited to 'sys/cam/ctl/ctl_frontend_iscsi.c')
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
index 8b0effcaf393..73483fb155cc 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -557,9 +557,9 @@ cfiscsi_pdu_handle_scsi_command(struct icl_pdu *request)
io->scsiio.cdb_len = sizeof(bhssc->bhssc_cdb); /* Which is 16. */
memcpy(io->scsiio.cdb, bhssc->bhssc_cdb, sizeof(bhssc->bhssc_cdb));
refcount_acquire(&cs->cs_outstanding_ctl_pdus);
- error = ctl_queue(io);
+ error = ctl_run(io);
if (error != CTL_RETVAL_COMPLETE) {
- CFISCSI_SESSION_WARN(cs, "ctl_queue() failed; error %d; "
+ CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d; "
"dropping connection", error);
ctl_free_io(io);
refcount_release(&cs->cs_outstanding_ctl_pdus);
@@ -679,9 +679,9 @@ cfiscsi_pdu_handle_task_request(struct icl_pdu *request)
}
refcount_acquire(&cs->cs_outstanding_ctl_pdus);
- error = ctl_queue(io);
+ error = ctl_run(io);
if (error != CTL_RETVAL_COMPLETE) {
- CFISCSI_SESSION_WARN(cs, "ctl_queue() failed; error %d; "
+ CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d; "
"dropping connection", error);
ctl_free_io(io);
refcount_release(&cs->cs_outstanding_ctl_pdus);
@@ -1128,9 +1128,9 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs)
io->taskio.task_action = CTL_TASK_I_T_NEXUS_RESET;
wait = cs->cs_outstanding_ctl_pdus;
refcount_acquire(&cs->cs_outstanding_ctl_pdus);
- error = ctl_queue(io);
+ error = ctl_run(io);
if (error != CTL_RETVAL_COMPLETE) {
- CFISCSI_SESSION_WARN(cs, "ctl_queue() failed; error %d", error);
+ CFISCSI_SESSION_WARN(cs, "ctl_run() failed; error %d", error);
refcount_release(&cs->cs_outstanding_ctl_pdus);
ctl_free_io(io);
}