From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50019) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPBSk-00023X-4U for qemu-devel@nongnu.org; Fri, 29 Jan 2016 10:59:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aPBSf-0004iW-4U for qemu-devel@nongnu.org; Fri, 29 Jan 2016 10:59:54 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55764) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aPBSe-0004iR-V3 for qemu-devel@nongnu.org; Fri, 29 Jan 2016 10:59:49 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 4B29333A8B8 for ; Fri, 29 Jan 2016 15:59:48 +0000 (UTC) From: Markus Armbruster References: <1450697444-30119-1-git-send-email-marcandre.lureau@redhat.com> <1450697444-30119-7-git-send-email-marcandre.lureau@redhat.com> Date: Fri, 29 Jan 2016 16:59:45 +0100 In-Reply-To: <1450697444-30119-7-git-send-email-marcandre.lureau@redhat.com> (marcandre lureau's message of "Mon, 21 Dec 2015 12:30:42 +0100") Message-ID: <878u3874we.fsf@blackfin.pond.sub.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 6/8] ivshmem: generalize ivshmem_setup_interrupts List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: marcandre.lureau@redhat.com Cc: qemu-devel@nongnu.org marcandre.lureau@redhat.com writes: > From: Marc-Andr=C3=A9 Lureau > > 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=C3=A9 Lureau > --- > 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); > } >=20=20 > -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 =3D g_malloc0(s->vectors * sizeof(MSIVector)); > + if (!s->msi_vectors) { Happens exactly when s->vectors is zero. Is that a legitimate configuration? > + goto fail; > } >=20=20 > - 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; > + } >=20=20 > - /* allocate QEMU char devices for receiving interrupts */ > - s->msi_vectors =3D g_malloc0(s->vectors * sizeof(MSIVector)); > + IVSHMEM_DPRINTF("msix initialized (%d vectors)\n", s->vectors); > + ivshmem_use_msix(s); > + } >=20=20 > - 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. >=20=20 > 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 =3D %s)\n", > s->server_chr->filename); >=20=20 > - 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.