Skip to content

Commit 0fd08a3

Browse files
committed
xen/blkfront: harden blkfront against event channel storms
The Xen blkfront driver is still vulnerable for an attack via excessive number of events sent by the backend. Fix that by using lateeoi event channels. This is part of XSA-391 Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
1 parent 2b14864 commit 0fd08a3

1 file changed

Lines changed: 12 additions & 3 deletions

File tree

drivers/block/xen-blkfront.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,9 +1512,12 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
15121512
unsigned long flags;
15131513
struct blkfront_ring_info *rinfo = (struct blkfront_ring_info *)dev_id;
15141514
struct blkfront_info *info = rinfo->dev_info;
1515+
unsigned int eoiflag = XEN_EOI_FLAG_SPURIOUS;
15151516

1516-
if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
1517+
if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
1518+
xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS);
15171519
return IRQ_HANDLED;
1520+
}
15181521

15191522
spin_lock_irqsave(&rinfo->ring_lock, flags);
15201523
again:
@@ -1530,6 +1533,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
15301533
unsigned long id;
15311534
unsigned int op;
15321535

1536+
eoiflag = 0;
1537+
15331538
RING_COPY_RESPONSE(&rinfo->ring, i, &bret);
15341539
id = bret.id;
15351540

@@ -1646,13 +1651,17 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
16461651

16471652
spin_unlock_irqrestore(&rinfo->ring_lock, flags);
16481653

1654+
xen_irq_lateeoi(irq, eoiflag);
1655+
16491656
return IRQ_HANDLED;
16501657

16511658
err:
16521659
info->connected = BLKIF_STATE_ERROR;
16531660

16541661
spin_unlock_irqrestore(&rinfo->ring_lock, flags);
16551662

1663+
/* No EOI in order to avoid further interrupts. */
1664+
16561665
pr_alert("%s disabled for further use\n", info->gd->disk_name);
16571666
return IRQ_HANDLED;
16581667
}
@@ -1692,8 +1701,8 @@ static int setup_blkring(struct xenbus_device *dev,
16921701
if (err)
16931702
goto fail;
16941703

1695-
err = bind_evtchn_to_irqhandler(rinfo->evtchn, blkif_interrupt, 0,
1696-
"blkif", rinfo);
1704+
err = bind_evtchn_to_irqhandler_lateeoi(rinfo->evtchn, blkif_interrupt,
1705+
0, "blkif", rinfo);
16971706
if (err <= 0) {
16981707
xenbus_dev_fatal(dev, err,
16991708
"bind_evtchn_to_irqhandler failed");

0 commit comments

Comments
 (0)