Signed-off-by: Pradeep Vincent diff --git a/drivers/xen/blkback/blkback.c b/drivers/xen/blkback/blkback.c --- a/drivers/xen/blkback/blkback.c +++ b/drivers/xen/blkback/blkback.c @@ -315,6 +315,7 @@ static int do_block_io_op(blkif_t *blkif) pending_req_t *pending_req; RING_IDX rc, rp; int more_to_do = 0; + unsigned long flags; rc = blk_rings->common.req_cons; rp = blk_rings->common.sring->req_prod; @@ -383,6 +384,15 @@ static int do_block_io_op(blkif_t *blkif) cond_resched(); } + /* If blkback might go to sleep (i.e. more_to_do == 0) then we better + let blkfront know about it (by setting req_event appropriately) so that + blkfront will bother to wake us up (via interrupt) when it submits a + new I/O */ + if (!more_to_do){ + spin_lock_irqsave(&blkif->blk_ring_lock, flags); + RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do); + spin_unlock_irqrestore(&blkif->blk_ring_lock, flags); + } return more_to_do; }