This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
Home Products Support Community News


[Xen-devel] [PATCH] blkfront: Move blkif_interrupt into a tasklet.

To: Xen <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] blkfront: Move blkif_interrupt into a tasklet.
From: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Date: Sun, 22 Aug 2010 23:54:30 -0700
Cc: Jeremy Fitzhardinge <jeremy@xxxxxxxx>, Tom Kopec <tek@xxxxxxx>, Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Delivery-date: Sun, 22 Aug 2010 23:56:48 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1282546470-5547-1-git-send-email-daniel.stodden@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1282546470-5547-1-git-send-email-daniel.stodden@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Response processing doesn't really belong into hard irq context.

Another potential problem this avoids is that switching interrupt cpu
affinity in Xen domains can presently lead to event loss, if
RING_FINAL_CHECK is run from hard irq context.

Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Cc: Tom Kopec <tek@xxxxxxx>
 drivers/block/xen-blkfront.c |   16 ++++++++++++++--
 1 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 6c00538..75576d3 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -86,6 +86,7 @@ struct blkfront_info
        struct blkif_front_ring ring;
        struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
        unsigned int evtchn, irq;
+       struct tasklet_struct tasklet;
        struct request_queue *rq;
        struct work_struct work;
        struct gnttab_free_callback callback;
@@ -676,13 +677,14 @@ static void blkif_completion(struct blk_shadow *s)
                gnttab_end_foreign_access(s->req.seg[i].gref, 0, 0UL);
-static irqreturn_t blkif_interrupt(int irq, void *dev_id)
+static void
+blkif_do_interrupt(unsigned long data)
+       struct blkfront_info *info = (struct blkfront_info *)data;
        struct request *req;
        struct blkif_response *bret;
        RING_IDX i, rp;
        unsigned long flags;
-       struct blkfront_info *info = (struct blkfront_info *)dev_id;
        int error;
        spin_lock_irqsave(&info->io_lock, flags);
@@ -743,6 +745,15 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
        spin_unlock_irqrestore(&info->io_lock, flags);
+static irqreturn_t
+blkif_interrupt(int irq, void *dev_id)
+       struct blkfront_info *info = (struct blkfront_info *)dev_id;
+       tasklet_schedule(&info->tasklet);
        return IRQ_HANDLED;
@@ -893,6 +904,7 @@ static int blkfront_probe(struct xenbus_device *dev,
        info->connected = BLKIF_STATE_DISCONNECTED;
        INIT_WORK(&info->work, blkif_restart_queue);
+       tasklet_init(&info->tasklet, blkif_do_interrupt, (unsigned long)info);
        for (i = 0; i < BLK_RING_SIZE; i++)
                info->shadow[i].req.id = i+1;

Xen-devel mailing list