diff --git a/include/sys/vdev_impl.h b/include/sys/vdev_impl.h index 16cf4d77071a..16fcaa042278 100644 --- a/include/sys/vdev_impl.h +++ b/include/sys/vdev_impl.h @@ -118,6 +118,7 @@ struct vdev_queue { hrtime_t vq_io_complete_ts; /* time last i/o completed */ hrtime_t vq_io_delta_ts; list_t vq_io_list; + zio_t vq_io_search; /* used as local for stack reduction */ kmutex_t vq_lock; }; diff --git a/module/zfs/vdev_queue.c b/module/zfs/vdev_queue.c index 0dc733efc3e4..e2758d1c41f5 100644 --- a/module/zfs/vdev_queue.c +++ b/module/zfs/vdev_queue.c @@ -659,7 +659,6 @@ vdev_queue_io_to_issue(vdev_queue_t *vq) zio_priority_t p; avl_index_t idx; vdev_queue_class_t *vqc; - zio_t *search; again: ASSERT(MUTEX_HELD(&vq->vq_lock)); @@ -678,11 +677,10 @@ vdev_queue_io_to_issue(vdev_queue_t *vq) * For FIFO queues (sync), issue the i/o with the lowest timestamp. */ vqc = &vq->vq_class[p]; - search = zio_buf_alloc(sizeof (*search)); - search->io_timestamp = 0; - search->io_offset = vq->vq_last_offset + 1; - VERIFY3P(avl_find(&vqc->vqc_queued_tree, search, &idx), ==, NULL); - zio_buf_free(search, sizeof (*search)); + vq->vq_io_search.io_timestamp = 0; + vq->vq_io_search.io_offset = vq->vq_last_offset + 1; + VERIFY3P(avl_find(&vqc->vqc_queued_tree, &vq->vq_io_search, + &idx), ==, NULL); zio = avl_nearest(&vqc->vqc_queued_tree, idx, AVL_AFTER); if (zio == NULL) zio = avl_first(&vqc->vqc_queued_tree);