qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 2/3] virtio: access ISR atomically
Date: Tue, 15 Nov 2016 16:04:32 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0


On 15/11/2016 16:03, Christian Borntraeger wrote:
> 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....

Oops, will post v2.

Paolo

> 
>> ---
>>  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);
>>
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]