svn commit: r287967 - head/sys/cam/ctl
Alexander Motin
mav at FreeBSD.org
Fri Sep 18 19:43:16 UTC 2015
Author: mav
Date: Fri Sep 18 19:43:14 2015
New Revision: 287967
URL: https://svnweb.freebsd.org/changeset/base/287967
Log:
Relax serseq option operation for reads.
Previously, with serseq enabled, next command was unblocked only after
previous completed. With this change, for read operations, next command
is unblocked as soon as last media read completed. This is important
for frontends that actually wait for data move completion (like camtgt),
or when data are moved through the HA link, or especially when both.
Modified:
head/sys/cam/ctl/ctl.c
head/sys/cam/ctl/ctl.h
head/sys/cam/ctl/ctl_backend_block.c
head/sys/cam/ctl/ctl_io.h
Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c Fri Sep 18 18:57:09 2015 (r287966)
+++ head/sys/cam/ctl/ctl.c Fri Sep 18 19:43:14 2015 (r287967)
@@ -10592,6 +10592,8 @@ ctl_extent_check(union ctl_io *io1, unio
if (ctl_get_lba_len(io1, &lba1, &len1) != 0)
return (CTL_ACTION_ERROR);
+ if (io1->io_hdr.flags & CTL_FLAG_SERSEQ_DONE)
+ seq = FALSE;
return (ctl_extent_check_lba(lba1, len1, lba2, len2, seq));
}
@@ -10601,6 +10603,8 @@ ctl_extent_check_seq(union ctl_io *io1,
uint64_t lba1, lba2;
uint64_t len1, len2;
+ if (io1->io_hdr.flags & CTL_FLAG_SERSEQ_DONE)
+ return (CTL_ACTION_PASS);
if (ctl_get_lba_len(io1, &lba1, &len1) != 0)
return (CTL_ACTION_ERROR);
if (ctl_get_lba_len(io2, &lba2, &len2) != 0)
@@ -13218,6 +13222,21 @@ ctl_done_timer_wakeup(void *arg)
#endif /* CTL_IO_DELAY */
void
+ctl_serseq_done(union ctl_io *io)
+{
+ struct ctl_lun *lun;
+
+ lun = (struct ctl_lun *)io->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
+ if (lun->be_lun == NULL ||
+ lun->be_lun->serseq == CTL_LUN_SERSEQ_OFF)
+ return;
+ mtx_lock(&lun->lun_lock);
+ io->io_hdr.flags |= CTL_FLAG_SERSEQ_DONE;
+ ctl_check_blocked(lun);
+ mtx_unlock(&lun->lun_lock);
+}
+
+void
ctl_done(union ctl_io *io)
{
Modified: head/sys/cam/ctl/ctl.h
==============================================================================
--- head/sys/cam/ctl/ctl.h Fri Sep 18 18:57:09 2015 (r287966)
+++ head/sys/cam/ctl/ctl.h Fri Sep 18 19:43:14 2015 (r287967)
@@ -172,6 +172,7 @@ int ctl_sap_log_sense_handler(struct ctl
int pc);
int ctl_config_move_done(union ctl_io *io);
void ctl_datamove(union ctl_io *io);
+void ctl_serseq_done(union ctl_io *io);
void ctl_done(union ctl_io *io);
void ctl_data_submit_done(union ctl_io *io);
void ctl_config_read_done(union ctl_io *io);
Modified: head/sys/cam/ctl/ctl_backend_block.c
==============================================================================
--- head/sys/cam/ctl/ctl_backend_block.c Fri Sep 18 18:57:09 2015 (r287966)
+++ head/sys/cam/ctl/ctl_backend_block.c Fri Sep 18 19:43:14 2015 (r287967)
@@ -562,8 +562,10 @@ ctl_be_block_biodone(struct bio *bio)
ctl_complete_beio(beio);
} else {
if ((ARGS(io)->flags & CTL_LLF_READ) &&
- beio->beio_cont == NULL)
+ beio->beio_cont == NULL) {
ctl_set_success(&io->scsiio);
+ ctl_serseq_done(io);
+ }
#ifdef CTL_TIME_IO
getbintime(&io->io_hdr.dma_start_bt);
#endif
@@ -782,8 +784,10 @@ ctl_be_block_dispatch_file(struct ctl_be
ctl_complete_beio(beio);
} else {
if ((ARGS(io)->flags & CTL_LLF_READ) &&
- beio->beio_cont == NULL)
+ beio->beio_cont == NULL) {
ctl_set_success(&io->scsiio);
+ ctl_serseq_done(io);
+ }
#ifdef CTL_TIME_IO
getbintime(&io->io_hdr.dma_start_bt);
#endif
@@ -951,8 +955,10 @@ ctl_be_block_dispatch_zvol(struct ctl_be
ctl_complete_beio(beio);
} else {
if ((ARGS(io)->flags & CTL_LLF_READ) &&
- beio->beio_cont == NULL)
+ beio->beio_cont == NULL) {
ctl_set_success(&io->scsiio);
+ ctl_serseq_done(io);
+ }
#ifdef CTL_TIME_IO
getbintime(&io->io_hdr.dma_start_bt);
#endif
Modified: head/sys/cam/ctl/ctl_io.h
==============================================================================
--- head/sys/cam/ctl/ctl_io.h Fri Sep 18 18:57:09 2015 (r287966)
+++ head/sys/cam/ctl/ctl_io.h Fri Sep 18 19:43:14 2015 (r287967)
@@ -115,7 +115,8 @@ typedef enum {
CTL_FLAG_FAILOVER = 0x04000000, /* Killed by a failover */
CTL_FLAG_IO_ACTIVE = 0x08000000, /* I/O active on this SC */
- CTL_FLAG_STATUS_SENT = 0x10000000 /* Status sent by datamove */
+ CTL_FLAG_STATUS_SENT = 0x10000000, /* Status sent by datamove */
+ CTL_FLAG_SERSEQ_DONE = 0x20000000 /* All storage I/O started */
} ctl_io_flags;
More information about the svn-src-head
mailing list