From c82765d3af0fb4c76376294aae0250f1742ab64e Mon Sep 17 00:00:00 2001 From: t_jeang Date: Tue, 6 Jan 2009 12:06:01 +0000 Subject: [PATCH] Wakeup blktap thread once frontend is connected -- in case there are already pending requests. Do same for blkback. --- drivers/xen/blkback/blkback.c | 2 +- drivers/xen/blkback/common.h | 2 ++ drivers/xen/blkback/xenbus.c | 13 ++++++++----- drivers/xen/blktap/blktap.c | 6 +++--- drivers/xen/blktap/common.h | 2 ++ drivers/xen/blktap/xenbus.c | 13 ++++++++----- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/drivers/xen/blkback/blkback.c b/drivers/xen/blkback/blkback.c index 4b8b5ba6..1652edf9 100644 --- a/drivers/xen/blkback/blkback.c +++ b/drivers/xen/blkback/blkback.c @@ -282,7 +282,7 @@ static int end_block_io_op(struct bio *bio, unsigned int done, 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 663bfeef..425d8cd6 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, struct pt_regs *regs); 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 ece7d84f..9d95137f 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 512c4563..6d014083 100644 --- a/drivers/xen/blktap/blktap.c +++ b/drivers/xen/blktap/blktap.c @@ -1013,7 +1013,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); @@ -1021,7 +1021,7 @@ static void blkif_notify_work(blkif_t *blkif) irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs) { - blkif_notify_work(dev_id); + tap_blkif_notify_work(dev_id); return IRQ_HANDLED; } @@ -1360,7 +1360,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 87c6ea2e..e1c304ba 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 e2761383..0ab00f80 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: -- 2.39.5