Skip to content

Commit

Permalink
Avoid dynamic allocation of 'search zio'
Browse files Browse the repository at this point in the history
As part of commit e8b96c6 the search zio used by the
vdev_queue_io_to_issue() function was moved to the heap
to minimize stack usage.  Functionally this is fine, but
to maximize performance it's best to minimize the number
of dynamic allocations.

To avoid this allocation temporary space for the search
zio has been reserved in the vdev_queue structure.  All
access must be serialized through the vq_lock.

Signed-off-by: Brian Behlendorf <[email protected]>
Signed-off-by: Ned Bass <[email protected]>
Closes #2572
  • Loading branch information
behlendorf committed Aug 11, 2014
1 parent ab6f407 commit 50b25b2
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/sys/vdev_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
10 changes: 4 additions & 6 deletions module/zfs/vdev_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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);
Expand Down

0 comments on commit 50b25b2

Please sign in to comment.