From: Steven Smith Date: Tue, 30 Jun 2009 11:55:47 +0000 (+0100) Subject: Wakeup blktap thread once frontend is connected -- in case there are X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f1e2951b0bf4c51d1733047d6c56cc66708c105a;p=people%2Fssmith%2Fnc2-2.6.27.git Wakeup blktap thread once frontend is connected -- in case there are already pending requests. Do same for blkback. --- diff --git a/drivers/xen/blkback/blkback.c b/drivers/xen/blkback/blkback.c index 612f7c9b..199f643a 100644 --- a/drivers/xen/blkback/blkback.c +++ b/drivers/xen/blkback/blkback.c @@ -280,7 +280,7 @@ static void end_block_io_op(struct bio *bio, int error) * NOTIFICATION FROM GUEST OS. */ -static void blkif_notify_work(blkif_t *blkif) +void blkif_notify_work(blkif_t *blkif) { blkif->waiting_reqs = 1; wake_up(&blkif->wq); diff --git a/drivers/xen/blkback/common.h b/drivers/xen/blkback/common.h index 751399b4..e0756474 100644 --- a/drivers/xen/blkback/common.h +++ b/drivers/xen/blkback/common.h @@ -133,6 +133,8 @@ void blkif_xenbus_init(void); irqreturn_t blkif_be_int(int irq, void *dev_id); int blkif_schedule(void *arg); +void blkif_notify_work(blkif_t *blkif); + int blkback_barrier(struct xenbus_transaction xbt, struct backend_info *be, int state); diff --git a/drivers/xen/blkback/xenbus.c b/drivers/xen/blkback/xenbus.c index 52701e29..b0ac31e8 100644 --- a/drivers/xen/blkback/xenbus.c +++ b/drivers/xen/blkback/xenbus.c @@ -375,13 +375,16 @@ static void frontend_changed(struct xenbus_device *dev, /* Ensure we connect even when two watches fire in close successsion and we miss the intermediate value of frontend_state. */ + if (dev->state != XenbusStateConnected) { + err = connect_ring(be); + if (err) + break; + update_blkif_status(be->blkif); + } + if (dev->state == XenbusStateConnected) - break; + blkif_notify_work(be->blkif); - err = connect_ring(be); - if (err) - break; - update_blkif_status(be->blkif); break; case XenbusStateClosing: diff --git a/drivers/xen/blktap/blktap.c b/drivers/xen/blktap/blktap.c index f6e6cbec..a48e9791 100644 --- a/drivers/xen/blktap/blktap.c +++ b/drivers/xen/blktap/blktap.c @@ -1012,7 +1012,7 @@ static int blktap_read_ufe_ring(tap_blkif_t *info) * NOTIFICATION FROM GUEST OS. */ -static void blkif_notify_work(blkif_t *blkif) +void tap_blkif_notify_work(blkif_t *blkif) { blkif->waiting_reqs = 1; wake_up(&blkif->wq); @@ -1020,7 +1020,7 @@ static void blkif_notify_work(blkif_t *blkif) irqreturn_t tap_blkif_be_int(int irq, void *dev_id) { - blkif_notify_work(dev_id); + tap_blkif_notify_work(dev_id); return IRQ_HANDLED; } @@ -1374,7 +1374,7 @@ static void make_response(blkif_t *blkif, u64 id, spin_unlock_irqrestore(&blkif->blk_ring_lock, flags); if (more_to_do) - blkif_notify_work(blkif); + tap_blkif_notify_work(blkif); if (notify) notify_remote_via_irq(blkif->irq); } diff --git a/drivers/xen/blktap/common.h b/drivers/xen/blktap/common.h index 1ec1d909..779b07d4 100644 --- a/drivers/xen/blktap/common.h +++ b/drivers/xen/blktap/common.h @@ -120,4 +120,6 @@ struct tap_blkif *associate_blkif(domid_t domid, int xenbus_id, blkif_t *blkif); void signal_tapdisk(int idx); +void tap_blkif_notify_work(blkif_t *blkif); + #endif /* __BLKIF__BACKEND__COMMON_H__ */ diff --git a/drivers/xen/blktap/xenbus.c b/drivers/xen/blktap/xenbus.c index b044c8af..5e824f55 100644 --- a/drivers/xen/blktap/xenbus.c +++ b/drivers/xen/blktap/xenbus.c @@ -386,13 +386,16 @@ static void tap_frontend_changed(struct xenbus_device *dev, /* Ensure we connect even when two watches fire in close successsion and we miss the intermediate value of frontend_state. */ + if (dev->state != XenbusStateConnected) { + err = connect_ring(be); + if (err) + break; + tap_update_blkif_status(be->blkif); + } + if (dev->state == XenbusStateConnected) - break; + tap_blkif_notify_work(be->blkif); - err = connect_ring(be); - if (err) - break; - tap_update_blkif_status(be->blkif); break; case XenbusStateClosing: