Locking mutex &vq->vq_lock in vdev_mirror_pending is unneeded:
* no data is modified
* only vq_pending_tree is read
* in case garbage is returned (eg. vq_pending_tree being updated
while the read is made) the worst case would be that a single
read could be queued on a mirror side which more busy than thought
The benefit of this change is streamlining of the code path since
it is taken for *every* mirror member on *every* read.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1739
static int
vdev_mirror_pending(vdev_t *vd)
{
- vdev_queue_t *vq = &vd->vdev_queue;
- int pending;
-
- mutex_enter(&vq->vq_lock);
- pending = avl_numnodes(&vq->vq_pending_tree);
- mutex_exit(&vq->vq_lock);
-
- return (pending);
+ return avl_numnodes(&vd->vdev_queue.vq_pending_tree);
}
static mirror_map_t *