[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically
From: |
Christian Borntraeger |
Subject: |
Re: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically |
Date: |
Tue, 15 Nov 2016 16:03:40 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 |
On 11/15/2016 02:46 PM, Paolo Bonzini wrote:
> This will be needed once dataplane will be able to set it outside
> the big QEMU lock.
>
> Signed-off-by: Paolo Bonzini <address@hidden>
This is fixed by the followup patch, but this patch alone gives me
/home/cborntra/REPOS/qemu/hw/virtio/virtio.c: In function
‘virtio_notify_config’:
/home/cborntra/REPOS/qemu/hw/virtio/virtio.c:1375:20: error: ‘vq’ undeclared
(first use in this function)
virtio_set_isr(vq->vdev, 0x3);
^
/home/cborntra/REPOS/qemu/hw/virtio/virtio.c:1375:20: note: each undeclared
identifier is reported only once for each function it appears in
/home/cborntra/REPOS/qemu/rules.mak:60: recipe for target 'hw/virtio/virtio.o'
failed
make[1]: *** [hw/virtio/virtio.o] Error 1
make[1]: *** Waiting for unfinished jobs....
> ---
> hw/virtio/virtio-mmio.c | 6 +++---
> hw/virtio/virtio-pci.c | 9 +++------
> hw/virtio/virtio.c | 18 +++++++++++++-----
> 3 files changed, 19 insertions(+), 14 deletions(-)
>
> diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
> index a30270f..17412cb 100644
> --- a/hw/virtio/virtio-mmio.c
> +++ b/hw/virtio/virtio-mmio.c
> @@ -191,7 +191,7 @@ static uint64_t virtio_mmio_read(void *opaque, hwaddr
> offset, unsigned size)
> return virtio_queue_get_addr(vdev, vdev->queue_sel)
> >> proxy->guest_page_shift;
> case VIRTIO_MMIO_INTERRUPTSTATUS:
> - return vdev->isr;
> + return atomic_read(&vdev->isr);
> case VIRTIO_MMIO_STATUS:
> return vdev->status;
> case VIRTIO_MMIO_HOSTFEATURESSEL:
> @@ -299,7 +299,7 @@ static void virtio_mmio_write(void *opaque, hwaddr
> offset, uint64_t value,
> }
> break;
> case VIRTIO_MMIO_INTERRUPTACK:
> - vdev->isr &= ~value;
> + atomic_and(&vdev->isr, ~value);
> virtio_update_irq(vdev);
> break;
> case VIRTIO_MMIO_STATUS:
> @@ -347,7 +347,7 @@ static void virtio_mmio_update_irq(DeviceState *opaque,
> uint16_t vector)
> if (!vdev) {
> return;
> }
> - level = (vdev->isr != 0);
> + level = (atomic_read(&vdev->isr) != 0);
> DPRINTF("virtio_mmio setting IRQ %d\n", level);
> qemu_set_irq(proxy->irq, level);
> }
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index 62001b4..d5e99b0 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -73,7 +73,7 @@ static void virtio_pci_notify(DeviceState *d, uint16_t
> vector)
> msix_notify(&proxy->pci_dev, vector);
> else {
> VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> - pci_set_irq(&proxy->pci_dev, vdev->isr & 1);
> + pci_set_irq(&proxy->pci_dev, atomic_read(&vdev->isr) & 1);
> }
> }
>
> @@ -449,8 +449,7 @@ static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy,
> uint32_t addr)
> break;
> case VIRTIO_PCI_ISR:
> /* reading from the ISR also clears it. */
> - ret = vdev->isr;
> - vdev->isr = 0;
> + ret = atomic_xchg(&vdev->isr, 0);
> pci_irq_deassert(&proxy->pci_dev);
> break;
> case VIRTIO_MSI_CONFIG_VECTOR:
> @@ -1377,9 +1376,7 @@ static uint64_t virtio_pci_isr_read(void *opaque,
> hwaddr addr,
> {
> VirtIOPCIProxy *proxy = opaque;
> VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
> - uint64_t val = vdev->isr;
> -
> - vdev->isr = 0;
> + uint64_t val = atomic_xchg(&vdev->isr, 0);
> pci_irq_deassert(&proxy->pci_dev);
>
> return val;
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index 89b0b80..35255ad 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -945,7 +945,7 @@ void virtio_reset(void *opaque)
> vdev->guest_features = 0;
> vdev->queue_sel = 0;
> vdev->status = 0;
> - vdev->isr = 0;
> + atomic_set(&vdev->isr, 0);
> vdev->config_vector = VIRTIO_NO_VECTOR;
> virtio_notify_vector(vdev, vdev->config_vector);
>
> @@ -1318,10 +1318,18 @@ void virtio_del_queue(VirtIODevice *vdev, int n)
> vdev->vq[n].vring.num_default = 0;
> }
>
> +static void virtio_set_isr(VirtIODevice *vdev, int value)
> +{
> + uint8_t old = atomic_read(&vdev->isr);
> + if ((old & value) != value) {
> + atomic_or(&vdev->isr, value);
> + }
> +}
> +
> void virtio_irq(VirtQueue *vq)
> {
> trace_virtio_irq(vq);
> - vq->vdev->isr |= 0x01;
> + virtio_set_isr(vq->vdev, 0x1);
> virtio_notify_vector(vq->vdev, vq->vector);
> }
>
> @@ -1355,7 +1363,7 @@ void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
> }
>
> trace_virtio_notify(vdev, vq);
> - vdev->isr |= 0x01;
> + virtio_set_isr(vq->vdev, 0x1);
> virtio_notify_vector(vdev, vq->vector);
> }
>
> @@ -1364,7 +1372,7 @@ void virtio_notify_config(VirtIODevice *vdev)
> if (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK))
> return;
>
> - vdev->isr |= 0x03;
> + virtio_set_isr(vq->vdev, 0x3);
> vdev->generation++;
> virtio_notify_vector(vdev, vdev->config_vector);
> }
> @@ -1895,7 +1903,7 @@ void virtio_init(VirtIODevice *vdev, const char *name,
>
> vdev->device_id = device_id;
> vdev->status = 0;
> - vdev->isr = 0;
> + atomic_set(&vdev->isr, 0);
> vdev->queue_sel = 0;
> vdev->config_vector = VIRTIO_NO_VECTOR;
> vdev->vq = g_malloc0(sizeof(VirtQueue) * VIRTIO_QUEUE_MAX);
>
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, (continued)
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Paolo Bonzini, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Michael S. Tsirkin, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Paolo Bonzini, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Michael S. Tsirkin, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Alex Williamson, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Michael S. Tsirkin, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Alex Williamson, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Michael S. Tsirkin, 2016/11/15
- Re: [Qemu-devel] [PATCH 3/3] virtio: set ISR on dataplane notifications, Alex Williamson, 2016/11/15
[Qemu-devel] [PATCH 2/3] virtio: access ISR atomically, Paolo Bonzini, 2016/11/15
- Re: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically,
Christian Borntraeger <=
[Qemu-devel] [PATCH 1/3] virtio: introduce grab/release_ioeventfd to fix vhost, Paolo Bonzini, 2016/11/15
Re: [Qemu-devel] [PATCH for-2.8 0/3] virtio fixes, Stefan Hajnoczi, 2016/11/15
Re: [Qemu-devel] [PATCH for-2.8 0/3] virtio fixes, Christian Borntraeger, 2016/11/16