Hi

On Fri, Jan 29, 2016 at 4:59 PM, Markus Armbruster <arm...@redhat.com> wrote:
> marcandre.lur...@redhat.com writes:
>
>> From: Marc-André Lureau <marcandre.lur...@redhat.com>
>>
>> Call ivshmem_setup_interrupts() with or without MSI, always allocate
>> msi_vectors that is going to be used in all case in the following patch.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
>> ---
>>  hw/misc/ivshmem.c | 27 +++++++++++++++++----------
>>  1 file changed, 17 insertions(+), 10 deletions(-)
>>
>> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
>> index dcfc8cc..11780b1 100644
>> --- a/hw/misc/ivshmem.c
>> +++ b/hw/misc/ivshmem.c
>> @@ -768,19 +768,28 @@ static void ivshmem_reset(DeviceState *d)
>>      ivshmem_use_msix(s);
>>  }
>>
>> -static int ivshmem_setup_msi(IVShmemState * s)
>> +static int ivshmem_setup_interrupts(IVShmemState *s, Error **errp)
>>  {
>> -    if (msix_init_exclusive_bar(PCI_DEVICE(s), s->vectors, 1)) {
>> -        return -1;
>> +    /* allocate QEMU callback data for receiving interrupts */
>> +    s->msi_vectors = g_malloc0(s->vectors * sizeof(MSIVector));
>> +    if (!s->msi_vectors) {
>
> Happens exactly when s->vectors is zero.  Is that a legitimate
> configuration?

msix_init_exclusive_bar() already failed with nvectors == 0. However
it is acceptable for !msi to have nvectors == 0. Fixed.

>> +        goto fail;
>>      }
>>
>> -    IVSHMEM_DPRINTF("msix initialized (%d vectors)\n", s->vectors);
>> +    if (ivshmem_has_feature(s, IVSHMEM_MSI)) {
>> +        if (msix_init_exclusive_bar(PCI_DEVICE(s), s->vectors, 1)) {
>> +            goto fail;
>> +        }
>>
>> -    /* allocate QEMU char devices for receiving interrupts */
>> -    s->msi_vectors = g_malloc0(s->vectors * sizeof(MSIVector));
>> +        IVSHMEM_DPRINTF("msix initialized (%d vectors)\n", s->vectors);
>> +        ivshmem_use_msix(s);
>> +    }
>>
>> -    ivshmem_use_msix(s);
>>      return 0;
>> +
>> +fail:
>> +    error_setg(errp, "failed to initialize interrupts");
>> +    return -1;
>>  }
>
> Recommend not to move the error_setg().  Keeps this function simpler, at
> no cost.

ok

>
>>
>>  static void ivshmem_enable_irqfd(IVShmemState *s)
>> @@ -946,9 +955,7 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error 
>> **errp)
>>          IVSHMEM_DPRINTF("using shared memory server (socket = %s)\n",
>>                          s->server_chr->filename);
>>
>> -        if (ivshmem_has_feature(s, IVSHMEM_MSI) &&
>> -            ivshmem_setup_msi(s)) {
>> -            error_setg(errp, "msix initialization failed");
>> +        if (ivshmem_setup_interrupts(s, errp) < 0) {
>>              return;
>>          }
>
> Yup, the only change is we now allocate s->msi_vectors whether we have
> IVSHMEM_MSI or not.
>



-- 
Marc-André Lureau

Reply via email to