mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	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
							
								
									44c8ff9b0c
								
							
						
					
					
						commit
						76663fe372
					
				| @ -131,7 +131,10 @@ typedef const struct vdev_ops { | ||||
|  * Virtual device properties | ||||
|  */ | ||||
| typedef union vdev_queue_class { | ||||
| 	list_t		vqc_list; | ||||
| 	struct { | ||||
| 		ulong_t 	vqc_list_numnodes; | ||||
| 		list_t		vqc_list; | ||||
| 	}; | ||||
| 	avl_tree_t	vqc_tree; | ||||
| } 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; | ||||
| 	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); | ||||
| 		vq->vq_class[p].vqc_list_numnodes++; | ||||
| 	} | ||||
| 	else | ||||
| 		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_remove(list, zio); | ||||
| 		empty = list_is_empty(list); | ||||
| 		vq->vq_class[p].vqc_list_numnodes--; | ||||
| 	} else { | ||||
| 		avl_tree_t *tree = &vq->vq_class[p].vqc_tree; | ||||
| 		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; | ||||
| 	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 | ||||
| 		return (avl_numnodes(&vq->vq_class[p].vqc_tree)); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 MigeljanImeri
						MigeljanImeri