@@ -1319,11 +1319,13 @@ static irqreturn_t blkif_interrupt(int i
unsigned long flags;
struct blkfront_info *info = (struct blkfront_info *)dev_id;
int error;
+ unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
spin_lock_irqsave(&info->io_lock, flags);
if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
spin_unlock_irqrestore(&info->io_lock, flags);
+ xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
return IRQ_HANDLED;
}
@@ -1340,6 +1342,8 @@ static irqreturn_t blkif_interrupt(int i
unsigned long id;
unsigned int op;
+ eoiflag = 0;
+
RING_COPY_RESPONSE(&info->ring, i, &bret);
id = bret.id;
@@ -1444,6 +1448,8 @@ static irqreturn_t blkif_interrupt(int i
spin_unlock_irqrestore(&info->io_lock, flags);
+ xen_irq_lateeoi(irq, eoiflag);
+
return IRQ_HANDLED;
err:
@@ -1451,6 +1457,8 @@ static irqreturn_t blkif_interrupt(int i
spin_unlock_irqrestore(&info->io_lock, flags);
+ /* No EOI in order to avoid further interrupts. */
+
pr_alert("%s disabled for further use\n", info->gd->disk_name);
return IRQ_HANDLED;
}
@@ -1489,8 +1497,8 @@ static int setup_blkring(struct xenbus_d
if (err)
goto fail;
- err = bind_evtchn_to_irqhandler(info->evtchn, blkif_interrupt, 0,
- "blkif", info);
+ err = bind_evtchn_to_irqhandler_lateeoi(info->evtchn, blkif_interrupt,
+ 0, "blkif", info);
if (err <= 0) {
xenbus_dev_fatal(dev, err,
"bind_evtchn_to_irqhandler failed");