From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49273) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YBCy9-00033z-J5 for qemu-devel@nongnu.org; Tue, 13 Jan 2015 20:42:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YBCy4-0000Qn-Eq for qemu-devel@nongnu.org; Tue, 13 Jan 2015 20:42:01 -0500 Date: Wed, 14 Jan 2015 12:41:59 +1100 From: David Gibson Message-ID: <20150114014159.GR3654@voom.BigPond> References: <1420417588-32562-1-git-send-email-gwshan@linux.vnet.ibm.com> <1420417588-32562-3-git-send-email-gwshan@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qjXtncIm5b3tWrFJ" Content-Disposition: inline In-Reply-To: <1420417588-32562-3-git-send-email-gwshan@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH v15 2/2] sPAPR: Implement sPAPRPHBClass::eeh_handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gavin Shan Cc: aik@ozlabs.ru, alex.williamson@redhat.com, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, agraf@suse.de --qjXtncIm5b3tWrFJ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Jan 05, 2015 at 11:26:28AM +1100, Gavin Shan wrote: > The patch implements sPAPRPHBClass::eeh_handler so that the > EEH RTAS requests can be routed to VFIO for further handling. >=20 > Signed-off-by: Gavin Shan > --- > hw/ppc/spapr_pci_vfio.c | 56 +++++++++++++++++++++++++++++++++++++++++++= ++++++ > hw/vfio/common.c | 1 + > 2 files changed, 57 insertions(+) >=20 > diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c > index 144912b..73652a9 100644 > --- a/hw/ppc/spapr_pci_vfio.c > +++ b/hw/ppc/spapr_pci_vfio.c > @@ -71,6 +71,61 @@ static void spapr_phb_vfio_finish_realize(sPAPRPHBStat= e *sphb, Error **errp) > spapr_tce_get_iommu(tcet)); > } > =20 > +static int spapr_phb_vfio_eeh_handler(sPAPRPHBState *sphb, int req, int = opt) > +{ > + sPAPRPHBVFIOState *svphb =3D SPAPR_PCI_VFIO_HOST_BRIDGE(sphb); > + struct vfio_eeh_pe_op op =3D { .argsz =3D sizeof(op) }; This is a local variable, which means it won't be initialized. You never memset() it and it's not obvious that all fields get initialized, which makes it dangerous to pass to an ioctl(). > + int cmd; > + > + switch (req) { > + case RTAS_EEH_REQ_SET_OPTION: > + switch (opt) { > + case RTAS_EEH_DISABLE: > + cmd =3D VFIO_EEH_PE_DISABLE; > + break; > + case RTAS_EEH_ENABLE: > + cmd =3D VFIO_EEH_PE_ENABLE; > + break; > + case RTAS_EEH_THAW_IO: > + cmd =3D VFIO_EEH_PE_UNFREEZE_IO; > + break; > + case RTAS_EEH_THAW_DMA: > + cmd =3D VFIO_EEH_PE_UNFREEZE_DMA; > + break; > + default: > + return -EINVAL; > + } > + break; > + case RTAS_EEH_REQ_GET_STATE: > + cmd =3D VFIO_EEH_PE_GET_STATE; > + break; > + case RTAS_EEH_REQ_RESET: > + switch (opt) { > + case RTAS_SLOT_RESET_DEACTIVATE: > + cmd =3D VFIO_EEH_PE_RESET_DEACTIVATE; > + break; > + case RTAS_SLOT_RESET_HOT: > + cmd =3D VFIO_EEH_PE_RESET_HOT; > + break; > + case RTAS_SLOT_RESET_FUNDAMENTAL: > + cmd =3D VFIO_EEH_PE_RESET_FUNDAMENTAL; > + break; > + default: > + return -EINVAL; > + } > + break; > + case RTAS_EEH_REQ_CONFIGURE: > + cmd =3D VFIO_EEH_PE_CONFIGURE; > + break; > + default: > + return -EINVAL; > + } > + > + op.op =3D cmd; > + return vfio_container_ioctl(&svphb->phb.iommu_as, svphb->iommugroupi= d, > + VFIO_EEH_PE_OP, &op); Don't you need some sort of translation from the errnos the ioctl() returns into RTAS error codes? > +} > + > static void spapr_phb_vfio_reset(DeviceState *qdev) > { > /* Do nothing */ > @@ -84,6 +139,7 @@ static void spapr_phb_vfio_class_init(ObjectClass *kla= ss, void *data) > dc->props =3D spapr_phb_vfio_properties; > dc->reset =3D spapr_phb_vfio_reset; > spc->finish_realize =3D spapr_phb_vfio_finish_realize; > + spc->eeh_handler =3D spapr_phb_vfio_eeh_handler; > } > =20 > static const TypeInfo spapr_phb_vfio_info =3D { > diff --git a/hw/vfio/common.c b/hw/vfio/common.c > index cf483ff..8a10c8b 100644 > --- a/hw/vfio/common.c > +++ b/hw/vfio/common.c > @@ -948,6 +948,7 @@ int vfio_container_ioctl(AddressSpace *as, int32_t gr= oupid, > switch (req) { > case VFIO_CHECK_EXTENSION: > case VFIO_IOMMU_SPAPR_TCE_GET_INFO: > + case VFIO_EEH_PE_OP: > break; > default: > /* Return an error on unknown requests */ --=20 David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson --qjXtncIm5b3tWrFJ Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJUtclnAAoJEGw4ysog2bOSqjoQANXsIAovbhmv0GP5ndTmxyMq qy5jU9Vow9Bqqs66L8/iCn85pA5ndtS5+jBzajg8f+XL0cpbgoYdQAf1YQFoYIY9 r/lpOMfj5Im0xjUv2obiTNE7hFTJpt9bD1OMMhLU21EndoMLpmws3PSvcHtTuANf Pncst6iTZf8v/2V90ei43VsWRdhooUx+aojfuZDfKwbHCThGW4Nm4UNBPzh/UUJN k9u75rqC7v/RNmyGL+wzs4IXU7qQOBqFLePnUN02sPVslPG9U/jy09wiMukcerP4 0k0r4hLsWeLYNrDZCH/TLiYjrG94Ne/nkukq9b2/6Ya5+nuE2BYx0pJdTREjReR3 gO3crxhYXNxzK4ZxNYrc1U9BXhkxE7E5Z+pvgyGDrqV1wYiyAC6tEkAjIxX2gtxl vamPNlF5hD05dR1da9JXHjzWIjQRubWfbAVzrL83ObzkaR58ZPgafn6kU2xTGcBl PJGWBMSuTtw7SgrtI5yyqrSlSvjZFXXbjdvtb2FbaMLotikf/zOINtkj8uUQ3H84 YnZGSzBzXzBwG6eYHQcldJMvhzWdBBHWvwRsszYgWDVKuUf/NvCotFqcmj92q6H5 rz6VsT+K7C+EYzV0p98P+hfDuqOr2pWp0oFnGa/ZgkAKlqccJWHbtcq+03uhU9dC mhYobvVbxCF4YBmRtIC3 =nhOS -----END PGP SIGNATURE----- --qjXtncIm5b3tWrFJ--