|
@@ -15,6 +15,7 @@
|
|
#include "qapi/error.h"
|
|
#include "qapi/error.h"
|
|
#include "qapi/qapi-commands-virtio.h"
|
|
#include "qapi/qapi-commands-virtio.h"
|
|
#include "trace.h"
|
|
#include "trace.h"
|
|
|
|
+#include "qemu/defer-call.h"
|
|
#include "qemu/error-report.h"
|
|
#include "qemu/error-report.h"
|
|
#include "qemu/log.h"
|
|
#include "qemu/log.h"
|
|
#include "qemu/main-loop.h"
|
|
#include "qemu/main-loop.h"
|
|
@@ -2445,6 +2446,16 @@ static bool virtio_should_notify(VirtIODevice *vdev, VirtQueue *vq)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Batch irqs while inside a defer_call_begin()/defer_call_end() section */
|
|
|
|
+static void virtio_notify_irqfd_deferred_fn(void *opaque)
|
|
|
|
+{
|
|
|
|
+ EventNotifier *notifier = opaque;
|
|
|
|
+ VirtQueue *vq = container_of(notifier, VirtQueue, guest_notifier);
|
|
|
|
+
|
|
|
|
+ trace_virtio_notify_irqfd_deferred_fn(vq->vdev, vq);
|
|
|
|
+ event_notifier_set(notifier);
|
|
|
|
+}
|
|
|
|
+
|
|
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq)
|
|
void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq)
|
|
{
|
|
{
|
|
WITH_RCU_READ_LOCK_GUARD() {
|
|
WITH_RCU_READ_LOCK_GUARD() {
|
|
@@ -2471,7 +2482,7 @@ void virtio_notify_irqfd(VirtIODevice *vdev, VirtQueue *vq)
|
|
* to an atomic operation.
|
|
* to an atomic operation.
|
|
*/
|
|
*/
|
|
virtio_set_isr(vq->vdev, 0x1);
|
|
virtio_set_isr(vq->vdev, 0x1);
|
|
- event_notifier_set(&vq->guest_notifier);
|
|
|
|
|
|
+ defer_call(virtio_notify_irqfd_deferred_fn, &vq->guest_notifier);
|
|
}
|
|
}
|
|
|
|
|
|
static void virtio_irq(VirtQueue *vq)
|
|
static void virtio_irq(VirtQueue *vq)
|