block: Improve bdrv_aio_co_cancel_em
Instead of waiting for all requests to complete, wait just for the specific request that should be cancelled. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									8a805c222c
								
							
						
					
					
						commit
						d318aea932
					
				
							
								
								
									
										19
									
								
								block.c
								
								
								
								
							
							
						
						
									
										19
									
								
								block.c
								
								
								
								
							| 
						 | 
					@ -3778,12 +3778,20 @@ typedef struct BlockDriverAIOCBCoroutine {
 | 
				
			||||||
    BlockDriverAIOCB common;
 | 
					    BlockDriverAIOCB common;
 | 
				
			||||||
    BlockRequest req;
 | 
					    BlockRequest req;
 | 
				
			||||||
    bool is_write;
 | 
					    bool is_write;
 | 
				
			||||||
 | 
					    bool *done;
 | 
				
			||||||
    QEMUBH* bh;
 | 
					    QEMUBH* bh;
 | 
				
			||||||
} BlockDriverAIOCBCoroutine;
 | 
					} BlockDriverAIOCBCoroutine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
 | 
					static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qemu_aio_flush();
 | 
					    BlockDriverAIOCBCoroutine *acb =
 | 
				
			||||||
 | 
					        container_of(blockacb, BlockDriverAIOCBCoroutine, common);
 | 
				
			||||||
 | 
					    bool done = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    acb->done = &done;
 | 
				
			||||||
 | 
					    while (!done) {
 | 
				
			||||||
 | 
					        qemu_aio_wait();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const AIOCBInfo bdrv_em_co_aiocb_info = {
 | 
					static const AIOCBInfo bdrv_em_co_aiocb_info = {
 | 
				
			||||||
| 
						 | 
					@ -3796,6 +3804,11 @@ static void bdrv_co_em_bh(void *opaque)
 | 
				
			||||||
    BlockDriverAIOCBCoroutine *acb = opaque;
 | 
					    BlockDriverAIOCBCoroutine *acb = opaque;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    acb->common.cb(acb->common.opaque, acb->req.error);
 | 
					    acb->common.cb(acb->common.opaque, acb->req.error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (acb->done) {
 | 
				
			||||||
 | 
					        *acb->done = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qemu_bh_delete(acb->bh);
 | 
					    qemu_bh_delete(acb->bh);
 | 
				
			||||||
    qemu_aio_release(acb);
 | 
					    qemu_aio_release(acb);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -3834,6 +3847,7 @@ static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
 | 
				
			||||||
    acb->req.nb_sectors = nb_sectors;
 | 
					    acb->req.nb_sectors = nb_sectors;
 | 
				
			||||||
    acb->req.qiov = qiov;
 | 
					    acb->req.qiov = qiov;
 | 
				
			||||||
    acb->is_write = is_write;
 | 
					    acb->is_write = is_write;
 | 
				
			||||||
 | 
					    acb->done = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    co = qemu_coroutine_create(bdrv_co_do_rw);
 | 
					    co = qemu_coroutine_create(bdrv_co_do_rw);
 | 
				
			||||||
    qemu_coroutine_enter(co, acb);
 | 
					    qemu_coroutine_enter(co, acb);
 | 
				
			||||||
| 
						 | 
					@ -3860,6 +3874,8 @@ BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
 | 
				
			||||||
    BlockDriverAIOCBCoroutine *acb;
 | 
					    BlockDriverAIOCBCoroutine *acb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
 | 
					    acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
 | 
				
			||||||
 | 
					    acb->done = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    co = qemu_coroutine_create(bdrv_aio_flush_co_entry);
 | 
					    co = qemu_coroutine_create(bdrv_aio_flush_co_entry);
 | 
				
			||||||
    qemu_coroutine_enter(co, acb);
 | 
					    qemu_coroutine_enter(co, acb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3888,6 +3904,7 @@ BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
 | 
				
			||||||
    acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
 | 
					    acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
 | 
				
			||||||
    acb->req.sector = sector_num;
 | 
					    acb->req.sector = sector_num;
 | 
				
			||||||
    acb->req.nb_sectors = nb_sectors;
 | 
					    acb->req.nb_sectors = nb_sectors;
 | 
				
			||||||
 | 
					    acb->done = NULL;
 | 
				
			||||||
    co = qemu_coroutine_create(bdrv_aio_discard_co_entry);
 | 
					    co = qemu_coroutine_create(bdrv_aio_discard_co_entry);
 | 
				
			||||||
    qemu_coroutine_enter(co, acb);
 | 
					    qemu_coroutine_enter(co, acb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue