Skip to content

Commit fc4a91a

Browse files
jasowanggregkh
authored andcommitted
Revert "virtio_pci: harden MSI-X interrupts"
commit eb4cecb upstream. This reverts commit 9e35276. Issue were reported for the drivers that are using affinity managed IRQ where manually toggling IRQ status is not expected. And we forget to enable the interrupts in the restore path as well. In the future, we will rework on the interrupt hardening. Fixes: 9e35276 ("virtio_pci: harden MSI-X interrupts") Reported-by: Marc Zyngier <[email protected]> Reported-by: Stefano Garzarella <[email protected]> Signed-off-by: Jason Wang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 1f74d67 commit fc4a91a

File tree

4 files changed

+12
-32
lines changed

4 files changed

+12
-32
lines changed

drivers/virtio/virtio_pci_common.c

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ MODULE_PARM_DESC(force_legacy,
2424
"Force legacy mode for transitional virtio 1 devices");
2525
#endif
2626

27-
/* disable irq handlers */
28-
void vp_disable_cbs(struct virtio_device *vdev)
27+
/* wait for pending irq handlers */
28+
void vp_synchronize_vectors(struct virtio_device *vdev)
2929
{
3030
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
3131
int i;
@@ -34,20 +34,7 @@ void vp_disable_cbs(struct virtio_device *vdev)
3434
synchronize_irq(vp_dev->pci_dev->irq);
3535

3636
for (i = 0; i < vp_dev->msix_vectors; ++i)
37-
disable_irq(pci_irq_vector(vp_dev->pci_dev, i));
38-
}
39-
40-
/* enable irq handlers */
41-
void vp_enable_cbs(struct virtio_device *vdev)
42-
{
43-
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
44-
int i;
45-
46-
if (vp_dev->intx_enabled)
47-
return;
48-
49-
for (i = 0; i < vp_dev->msix_vectors; ++i)
50-
enable_irq(pci_irq_vector(vp_dev->pci_dev, i));
37+
synchronize_irq(pci_irq_vector(vp_dev->pci_dev, i));
5138
}
5239

5340
/* the notify function used when creating a virt queue */
@@ -154,8 +141,7 @@ static int vp_request_msix_vectors(struct virtio_device *vdev, int nvectors,
154141
snprintf(vp_dev->msix_names[v], sizeof *vp_dev->msix_names,
155142
"%s-config", name);
156143
err = request_irq(pci_irq_vector(vp_dev->pci_dev, v),
157-
vp_config_changed, IRQF_NO_AUTOEN,
158-
vp_dev->msix_names[v],
144+
vp_config_changed, 0, vp_dev->msix_names[v],
159145
vp_dev);
160146
if (err)
161147
goto error;
@@ -174,8 +160,7 @@ static int vp_request_msix_vectors(struct virtio_device *vdev, int nvectors,
174160
snprintf(vp_dev->msix_names[v], sizeof *vp_dev->msix_names,
175161
"%s-virtqueues", name);
176162
err = request_irq(pci_irq_vector(vp_dev->pci_dev, v),
177-
vp_vring_interrupt, IRQF_NO_AUTOEN,
178-
vp_dev->msix_names[v],
163+
vp_vring_interrupt, 0, vp_dev->msix_names[v],
179164
vp_dev);
180165
if (err)
181166
goto error;
@@ -352,7 +337,7 @@ static int vp_find_vqs_msix(struct virtio_device *vdev, unsigned nvqs,
352337
"%s-%s",
353338
dev_name(&vp_dev->vdev.dev), names[i]);
354339
err = request_irq(pci_irq_vector(vp_dev->pci_dev, msix_vec),
355-
vring_interrupt, IRQF_NO_AUTOEN,
340+
vring_interrupt, 0,
356341
vp_dev->msix_names[msix_vec],
357342
vqs[i]);
358343
if (err)

drivers/virtio/virtio_pci_common.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,8 @@ static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev)
101101
return container_of(vdev, struct virtio_pci_device, vdev);
102102
}
103103

104-
/* disable irq handlers */
105-
void vp_disable_cbs(struct virtio_device *vdev);
106-
/* enable irq handlers */
107-
void vp_enable_cbs(struct virtio_device *vdev);
104+
/* wait for pending irq handlers */
105+
void vp_synchronize_vectors(struct virtio_device *vdev);
108106
/* the notify function used when creating a virt queue */
109107
bool vp_notify(struct virtqueue *vq);
110108
/* the config->del_vqs() implementation */

drivers/virtio/virtio_pci_legacy.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ static void vp_reset(struct virtio_device *vdev)
9898
/* Flush out the status write, and flush in device writes,
9999
* including MSi-X interrupts, if any. */
100100
vp_legacy_get_status(&vp_dev->ldev);
101-
/* Disable VQ/configuration callbacks. */
102-
vp_disable_cbs(vdev);
101+
/* Flush pending VQ/configuration callbacks. */
102+
vp_synchronize_vectors(vdev);
103103
}
104104

105105
static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
@@ -185,7 +185,6 @@ static void del_vq(struct virtio_pci_vq_info *info)
185185
}
186186

187187
static const struct virtio_config_ops virtio_pci_config_ops = {
188-
.enable_cbs = vp_enable_cbs,
189188
.get = vp_get,
190189
.set = vp_set,
191190
.get_status = vp_get_status,

drivers/virtio/virtio_pci_modern.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ static void vp_reset(struct virtio_device *vdev)
172172
*/
173173
while (vp_modern_get_status(mdev))
174174
msleep(1);
175-
/* Disable VQ/configuration callbacks. */
176-
vp_disable_cbs(vdev);
175+
/* Flush pending VQ/configuration callbacks. */
176+
vp_synchronize_vectors(vdev);
177177
}
178178

179179
static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
@@ -380,7 +380,6 @@ static bool vp_get_shm_region(struct virtio_device *vdev,
380380
}
381381

382382
static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
383-
.enable_cbs = vp_enable_cbs,
384383
.get = NULL,
385384
.set = NULL,
386385
.generation = vp_generation,
@@ -398,7 +397,6 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
398397
};
399398

400399
static const struct virtio_config_ops virtio_pci_config_ops = {
401-
.enable_cbs = vp_enable_cbs,
402400
.get = vp_get,
403401
.set = vp_set,
404402
.generation = vp_generation,

0 commit comments

Comments
 (0)