Revert part of "Log I/Os longer than zio_delay_max (30s default)"

This reverts commit 9dcb971983
which was originally introduced to debug occasional slow I/Os.
These I/Os would complete eventually but were observed to take
several 100 seconds.

The root cause of this issue was the CFQ scheduler which can,
under certain conditions, excessively delay an I/O from being
issued to the device.  This issue was mitigated somewhat by
commit 84daaddedb which ensures
the I/O elevator gets changed even for DM style devices.

This change isn't in any way harmful but it does conflict with
a required change to properly account from I/O wait time.
Because Linux does not export the io_schedule_timeout() function
we must instead rely  on io_schedule() via cv_wait_io().

The additional debugging information which was added to the
delay event has been intentionally left in place.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
Matt Johnston 2012-12-21 10:15:34 +08:00 committed by Brian Behlendorf
parent 15f9d4e1c2
commit 72f53c5694

View File

@ -1305,34 +1305,18 @@ __zio_execute(zio_t *zio)
int int
zio_wait(zio_t *zio) zio_wait(zio_t *zio)
{ {
uint64_t timeout;
int error; int error;
ASSERT(zio->io_stage == ZIO_STAGE_OPEN); ASSERT(zio->io_stage == ZIO_STAGE_OPEN);
ASSERT(zio->io_executor == NULL); ASSERT(zio->io_executor == NULL);
zio->io_waiter = curthread; zio->io_waiter = curthread;
timeout = ddi_get_lbolt() + (zio_delay_max / MILLISEC * hz);
__zio_execute(zio); __zio_execute(zio);
mutex_enter(&zio->io_lock); mutex_enter(&zio->io_lock);
while (zio->io_executor != NULL) { while (zio->io_executor != NULL)
/* cv_wait(&zio->io_cv, &zio->io_lock);
* Wake up periodically to prevent the kernel from complaining
* about a blocked task. However, check zio_delay_max to see
* if the I/O has exceeded the timeout and post an ereport.
*/
cv_timedwait_interruptible(&zio->io_cv, &zio->io_lock,
ddi_get_lbolt() + hz);
if (timeout && (ddi_get_lbolt() > timeout)) {
zio->io_delay = zio_delay_max;
zfs_ereport_post(FM_EREPORT_ZFS_DELAY,
zio->io_spa, zio->io_vd, zio, 0, 0);
timeout = 0;
}
}
mutex_exit(&zio->io_lock); mutex_exit(&zio->io_lock);
error = zio->io_error; error = zio->io_error;
@ -2905,11 +2889,15 @@ zio_done(zio_t *zio)
vdev_stat_update(zio, zio->io_size); vdev_stat_update(zio, zio->io_size);
/* /*
* When an I/O completes but was slow post an ereport. * If this I/O is attached to a particular vdev is slow, exeeding
* 30 seconds to complete, post an error described the I/O delay.
* We ignore these errors if the device is currently unavailable.
*/ */
if (zio->io_delay >= zio_delay_max) if (zio->io_delay >= zio_delay_max) {
if (zio->io_vd != NULL && !vdev_is_dead(zio->io_vd))
zfs_ereport_post(FM_EREPORT_ZFS_DELAY, zio->io_spa, zfs_ereport_post(FM_EREPORT_ZFS_DELAY, zio->io_spa,
zio->io_vd, zio, 0, 0); zio->io_vd, zio, 0, 0);
}
if (zio->io_error) { if (zio->io_error) {
/* /*