Fix accounting error for pending sync IO ops in zpool iostat
Currently vdev_queue_class_length is responsible for checking how long the queue length is, however, it doesn't check the length when a list is used, rather it just returns whether it is empty or not. To fix this I added a counter variable to vdev_queue_class to keep track of the sync IO ops, and changed vdev_queue_class_length to reference this variable instead. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: MigeljanImeri <ImeriMigel@gmail.com> Closes #15478
This commit is contained in:
parent
3bd4df3841
commit
2a154b8484
|
@ -131,7 +131,10 @@ typedef const struct vdev_ops {
|
||||||
* Virtual device properties
|
* Virtual device properties
|
||||||
*/
|
*/
|
||||||
typedef union vdev_queue_class {
|
typedef union vdev_queue_class {
|
||||||
list_t vqc_list;
|
struct {
|
||||||
|
ulong_t vqc_list_numnodes;
|
||||||
|
list_t vqc_list;
|
||||||
|
};
|
||||||
avl_tree_t vqc_tree;
|
avl_tree_t vqc_tree;
|
||||||
} vdev_queue_class_t;
|
} vdev_queue_class_t;
|
||||||
|
|
||||||
|
|
|
@ -273,8 +273,10 @@ vdev_queue_class_add(vdev_queue_t *vq, zio_t *zio)
|
||||||
{
|
{
|
||||||
zio_priority_t p = zio->io_priority;
|
zio_priority_t p = zio->io_priority;
|
||||||
vq->vq_cqueued |= 1U << p;
|
vq->vq_cqueued |= 1U << p;
|
||||||
if (vdev_queue_class_fifo(p))
|
if (vdev_queue_class_fifo(p)) {
|
||||||
list_insert_tail(&vq->vq_class[p].vqc_list, zio);
|
list_insert_tail(&vq->vq_class[p].vqc_list, zio);
|
||||||
|
vq->vq_class[p].vqc_list_numnodes++;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
avl_add(&vq->vq_class[p].vqc_tree, zio);
|
avl_add(&vq->vq_class[p].vqc_tree, zio);
|
||||||
}
|
}
|
||||||
|
@ -288,6 +290,7 @@ vdev_queue_class_remove(vdev_queue_t *vq, zio_t *zio)
|
||||||
list_t *list = &vq->vq_class[p].vqc_list;
|
list_t *list = &vq->vq_class[p].vqc_list;
|
||||||
list_remove(list, zio);
|
list_remove(list, zio);
|
||||||
empty = list_is_empty(list);
|
empty = list_is_empty(list);
|
||||||
|
vq->vq_class[p].vqc_list_numnodes--;
|
||||||
} else {
|
} else {
|
||||||
avl_tree_t *tree = &vq->vq_class[p].vqc_tree;
|
avl_tree_t *tree = &vq->vq_class[p].vqc_tree;
|
||||||
avl_remove(tree, zio);
|
avl_remove(tree, zio);
|
||||||
|
@ -1069,7 +1072,7 @@ vdev_queue_class_length(vdev_t *vd, zio_priority_t p)
|
||||||
{
|
{
|
||||||
vdev_queue_t *vq = &vd->vdev_queue;
|
vdev_queue_t *vq = &vd->vdev_queue;
|
||||||
if (vdev_queue_class_fifo(p))
|
if (vdev_queue_class_fifo(p))
|
||||||
return (list_is_empty(&vq->vq_class[p].vqc_list) == 0);
|
return (vq->vq_class[p].vqc_list_numnodes);
|
||||||
else
|
else
|
||||||
return (avl_numnodes(&vq->vq_class[p].vqc_tree));
|
return (avl_numnodes(&vq->vq_class[p].vqc_tree));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue