From: Pierre Morel <pmorel@linux.ibm.com>
To: Matthew Rosato <mjrosato@linux.ibm.com>, linux-s390@vger.kernel.org
Cc: alex.williamson@redhat.com, cohuck@redhat.com,
schnelle@linux.ibm.com, farman@linux.ibm.com,
borntraeger@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com,
gerald.schaefer@linux.ibm.com, agordeev@linux.ibm.com,
frankja@linux.ibm.com, david@redhat.com, imbrenda@linux.ibm.com,
vneethv@linux.ibm.com, oberpar@linux.ibm.com,
freude@linux.ibm.com, thuth@redhat.com, pasic@linux.ibm.com,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 25/30] vfio-pci/zdev: wire up zPCI interpretive execution support
Date: Tue, 25 Jan 2022 14:01:19 +0100 [thread overview]
Message-ID: <17ccab21-b654-636f-2dfa-57014f4cd4eb@linux.ibm.com> (raw)
In-Reply-To: <20220114203145.242984-26-mjrosato@linux.ibm.com>
On 1/14/22 21:31, Matthew Rosato wrote:
> Introduce support for VFIO_DEVICE_FEATURE_ZPCI_INTERP, which is a new
> VFIO_DEVICE_FEATURE ioctl. This interface is used to indicate that an
> s390x vfio-pci device wishes to enable/disable zPCI interpretive
> execution, which allows zPCI instructions to be executed directly by
> underlying firmware without KVM involvement.
>
> Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
> ---
> arch/s390/include/asm/kvm_pci.h | 1 +
> drivers/vfio/pci/vfio_pci_core.c | 2 +
> drivers/vfio/pci/vfio_pci_zdev.c | 78 ++++++++++++++++++++++++++++++++
> include/linux/vfio_pci_core.h | 10 ++++
> include/uapi/linux/vfio.h | 7 +++
> include/uapi/linux/vfio_zdev.h | 15 ++++++
> 6 files changed, 113 insertions(+)
>
> diff --git a/arch/s390/include/asm/kvm_pci.h b/arch/s390/include/asm/kvm_pci.h
> index 97a90b37c87d..dc00c3f27a00 100644
> --- a/arch/s390/include/asm/kvm_pci.h
> +++ b/arch/s390/include/asm/kvm_pci.h
> @@ -35,6 +35,7 @@ struct kvm_zdev {
> struct kvm_zdev_ioat ioat;
> struct zpci_fib fib;
> struct notifier_block nb;
> + bool interp;
NIT: s/interp/interpretation/ ?
> };
>
> int kvm_s390_pci_dev_open(struct zpci_dev *zdev);
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index fc57d4d0abbe..2b2d64a2190c 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -1172,6 +1172,8 @@ long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,
> mutex_unlock(&vdev->vf_token->lock);
>
> return 0;
> + case VFIO_DEVICE_FEATURE_ZPCI_INTERP:
> + return vfio_pci_zdev_feat_interp(vdev, feature, arg);
> default:
> return -ENOTTY;
> }
> diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_zdev.c
> index 5c2bddc57b39..4339f48b98bc 100644
> --- a/drivers/vfio/pci/vfio_pci_zdev.c
> +++ b/drivers/vfio/pci/vfio_pci_zdev.c
> @@ -54,6 +54,10 @@ static int zpci_group_cap(struct zpci_dev *zdev, struct vfio_info_cap *caps)
> .version = zdev->version
> };
>
> + /* Some values are different for interpreted devices */
> + if (zdev->kzdev && zdev->kzdev->interp)
> + cap.maxstbl = zdev->maxstbl;
> +
> return vfio_info_add_capability(caps, &cap.header, sizeof(cap));
> }
>
> @@ -138,6 +142,72 @@ int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
> return ret;
> }
>
> +int vfio_pci_zdev_feat_interp(struct vfio_pci_core_device *vdev,
> + struct vfio_device_feature feature,
> + unsigned long arg)
> +{
> + struct zpci_dev *zdev = to_zpci(vdev->pdev);
> + struct vfio_device_zpci_interp *data;
> + struct vfio_device_feature *feat;
> + unsigned long minsz;
> + int size, rc;
> +
> + if (!zdev || !zdev->kzdev)
> + return -EINVAL;
> +
> + /* If PROBE specified, return probe results immediately */
> + if (feature.flags & VFIO_DEVICE_FEATURE_PROBE)
> + return kvm_s390_pci_interp_probe(zdev);
> +
> + /* GET and SET are mutually exclusive */
> + if ((feature.flags & VFIO_DEVICE_FEATURE_GET) &&
> + (feature.flags & VFIO_DEVICE_FEATURE_SET))
> + return -EINVAL;
Isn't the check already done in VFIO core?
> +
> + size = sizeof(*feat) + sizeof(*data);
> + feat = kzalloc(size, GFP_KERNEL);
> + if (!feat)
> + return -ENOMEM;
> +
> + data = (struct vfio_device_zpci_interp *)&feat->data;
> + minsz = offsetofend(struct vfio_device_feature, flags);
> +
> + if (feature.argsz < minsz + sizeof(*data))
> + return -EINVAL;
> +
> + /* Get the rest of the payload for GET/SET */
> + rc = copy_from_user(data, (void __user *)(arg + minsz),
> + sizeof(*data));
> + if (rc)
> + rc = -EINVAL;
> +
> + if (feature.flags & VFIO_DEVICE_FEATURE_GET) {
> + if (zdev->gd != 0)
> + data->flags = VFIO_DEVICE_ZPCI_FLAG_INTERP;
> + else
> + data->flags = 0;
> + data->fh = zdev->fh;
> + /* userspace is using host fh, give interpreted clp values */
> + zdev->kzdev->interp = true;
> +
> + if (copy_to_user((void __user *)arg, feat, size))
> + rc = -EFAULT;
> + } else if (feature.flags & VFIO_DEVICE_FEATURE_SET) {
> + if (data->flags == VFIO_DEVICE_ZPCI_FLAG_INTERP)
> + rc = kvm_s390_pci_interp_enable(zdev);
> + else if (data->flags == 0)
> + rc = kvm_s390_pci_interp_disable(zdev);
> + else
> + rc = -EINVAL;
> + } else {
> + /* Neither GET nor SET were specified */
> + rc = -EINVAL;
> + }
> +
> + kfree(feat);
> + return rc;
> +}
> +
> static int vfio_pci_zdev_group_notifier(struct notifier_block *nb,
> unsigned long action, void *data)
> {
> @@ -164,6 +234,7 @@ void vfio_pci_zdev_open(struct vfio_pci_core_device *vdev)
> return;
>
> zdev->kzdev->nb.notifier_call = vfio_pci_zdev_group_notifier;
> + zdev->kzdev->interp = false;
>
> if (vfio_register_notifier(vdev->vdev.dev, VFIO_GROUP_NOTIFY,
> &events, &zdev->kzdev->nb))
> @@ -180,5 +251,12 @@ void vfio_pci_zdev_release(struct vfio_pci_core_device *vdev)
> vfio_unregister_notifier(vdev->vdev.dev, VFIO_GROUP_NOTIFY,
> &zdev->kzdev->nb);
>
> + /*
> + * If the device was using interpretation, don't trust that userspace
> + * did the appropriate cleanup
> + */
> + if (zdev->gd != 0)
> + kvm_s390_pci_interp_disable(zdev);
> +
> kvm_s390_pci_dev_release(zdev);
> }
> diff --git a/include/linux/vfio_pci_core.h b/include/linux/vfio_pci_core.h
> index 05287f8ac855..0db2b1051931 100644
> --- a/include/linux/vfio_pci_core.h
> +++ b/include/linux/vfio_pci_core.h
> @@ -198,6 +198,9 @@ static inline int vfio_pci_igd_init(struct vfio_pci_core_device *vdev)
> #ifdef CONFIG_VFIO_PCI_ZDEV
> extern int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
> struct vfio_info_cap *caps);
> +int vfio_pci_zdev_feat_interp(struct vfio_pci_core_device *vdev,
> + struct vfio_device_feature feature,
> + unsigned long arg);
> void vfio_pci_zdev_open(struct vfio_pci_core_device *vdev);
> void vfio_pci_zdev_release(struct vfio_pci_core_device *vdev);
> #else
> @@ -207,6 +210,13 @@ static inline int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
> return -ENODEV;
> }
>
> +static inline int vfio_pci_zdev_feat_interp(struct vfio_pci_core_device *vdev,
> + struct vfio_device_feature feature,
> + unsigned long arg)
> +{
> + return -ENOTTY;
> +}
> +
> static inline void vfio_pci_zdev_open(struct vfio_pci_core_device *vdev)
> {
> }
> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
> index ef33ea002b0b..b9a75485b8e7 100644
> --- a/include/uapi/linux/vfio.h
> +++ b/include/uapi/linux/vfio.h
> @@ -1002,6 +1002,13 @@ struct vfio_device_feature {
> */
> #define VFIO_DEVICE_FEATURE_PCI_VF_TOKEN (0)
>
> +/*
> + * Provide support for enabling interpretation of zPCI instructions. This
> + * feature is only valid for s390x PCI devices. Data provided when setting
> + * and getting this feature is futher described in vfio_zdev.h
> + */
> +#define VFIO_DEVICE_FEATURE_ZPCI_INTERP (1)
> +
> /* -------- API for Type1 VFIO IOMMU -------- */
>
> /**
> diff --git a/include/uapi/linux/vfio_zdev.h b/include/uapi/linux/vfio_zdev.h
> index b4309397b6b2..575f0410dc66 100644
> --- a/include/uapi/linux/vfio_zdev.h
> +++ b/include/uapi/linux/vfio_zdev.h
> @@ -75,4 +75,19 @@ struct vfio_device_info_cap_zpci_pfip {
> __u8 pfip[];
> };
>
> +/**
> + * VFIO_DEVICE_FEATURE_ZPCI_INTERP
> + *
> + * This feature is used for enabling zPCI instruction interpretation for a
> + * device. No data is provided when setting this feature. When getting
> + * this feature, the following structure is provided which details whether
> + * or not interpretation is active and provides the guest with host device
> + * information necessary to enable interpretation.
> + */
> +struct vfio_device_zpci_interp {
> + __u64 flags;
> +#define VFIO_DEVICE_ZPCI_FLAG_INTERP 1
> + __u32 fh; /* Host device function handle */
> +};
> +
> #endif
>
Otherwise LGTM
--
Pierre Morel
IBM Lab Boeblingen
next prev parent reply other threads:[~2022-01-25 13:01 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-14 20:31 [PATCH v2 00/30] KVM: s390: enable zPCI for interpretive execution Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 01/30] s390/sclp: detect the zPCI load/store interpretation facility Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 02/30] s390/sclp: detect the AISII facility Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 03/30] s390/sclp: detect the AENI facility Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 04/30] s390/sclp: detect the AISI facility Matthew Rosato
2022-01-17 7:57 ` Thomas Huth
2022-01-14 20:31 ` [PATCH v2 05/30] s390/airq: pass more TPI info to airq handlers Matthew Rosato
2022-01-17 8:27 ` Thomas Huth
2022-01-14 20:31 ` [PATCH v2 06/30] s390/airq: allow for airq structure that uses an input vector Matthew Rosato
2022-01-17 12:29 ` Claudio Imbrenda
2022-01-18 18:52 ` Matthew Rosato
2022-01-18 9:50 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 07/30] s390/pci: externalize the SIC operation controls and routine Matthew Rosato
2022-01-17 16:19 ` Niklas Schnelle
2022-01-26 10:07 ` Claudio Imbrenda
2022-01-27 9:57 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 08/30] s390/pci: stash associated GISA designation Matthew Rosato
2022-01-24 14:08 ` Pierre Morel
2022-01-24 15:12 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 09/30] s390/pci: export some routines related to RPCIT processing Matthew Rosato
2022-01-18 9:51 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 10/30] s390/pci: stash dtsm and maxstbl Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 11/30] s390/pci: add helper function to find device by handle Matthew Rosato
2022-01-18 9:53 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 12/30] s390/pci: get SHM information from list pci Matthew Rosato
2022-01-18 10:36 ` Pierre Morel
2022-01-26 10:13 ` Claudio Imbrenda
2022-01-27 13:41 ` Pierre Morel
2022-01-27 15:14 ` Matthew Rosato
2022-01-27 10:29 ` Niklas Schnelle
2022-01-14 20:31 ` [PATCH v2 13/30] s390/pci: return status from zpci_refresh_trans Matthew Rosato
2022-01-19 18:13 ` Pierre Morel
2022-01-26 10:45 ` Claudio Imbrenda
2022-01-27 10:30 ` Niklas Schnelle
2022-01-14 20:31 ` [PATCH v2 14/30] KVM: s390: pci: add basic kvm_zdev structure Matthew Rosato
2022-01-17 16:25 ` Pierre Morel
2022-01-18 17:32 ` Pierre Morel
2022-01-18 18:39 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 15/30] KVM: s390: pci: do initial setup for AEN interpretation Matthew Rosato
2022-01-19 18:06 ` Pierre Morel
2022-01-19 20:19 ` Matthew Rosato
2022-01-25 12:23 ` Pierre Morel
2022-01-25 14:57 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 16/30] KVM: s390: pci: enable host forwarding of Adapter Event Notifications Matthew Rosato
2022-01-17 17:38 ` Pierre Morel
2022-01-18 17:25 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 17/30] KVM: s390: mechanism to enable guest zPCI Interpretation Matthew Rosato
2022-01-24 14:24 ` Pierre Morel
2022-01-24 15:28 ` Matthew Rosato
2022-01-24 17:15 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 18/30] KVM: s390: pci: provide routines for enabling/disabling interpretation Matthew Rosato
2022-01-24 14:36 ` Pierre Morel
2022-01-24 15:14 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 19/30] KVM: s390: pci: provide routines for enabling/disabling interrupt forwarding Matthew Rosato
2022-01-25 12:41 ` Pierre Morel
2022-01-25 15:44 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 20/30] KVM: s390: pci: provide routines for enabling/disabling IOAT assist Matthew Rosato
2022-01-25 13:29 ` Pierre Morel
2022-01-25 14:47 ` Matthew Rosato
2022-01-26 8:30 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 21/30] KVM: s390: pci: handle refresh of PCI translations Matthew Rosato
2022-01-19 9:29 ` Pierre Morel
2022-01-19 16:39 ` Matthew Rosato
2022-01-19 18:25 ` Pierre Morel
2022-01-19 20:02 ` Matthew Rosato
2022-01-20 9:47 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 22/30] KVM: s390: intercept the rpcit instruction Matthew Rosato
2022-01-18 11:05 ` Pierre Morel
2022-01-18 17:27 ` Matthew Rosato
2022-01-18 17:54 ` Pierre Morel
2022-01-19 14:06 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 23/30] vfio/pci: re-introduce CONFIG_VFIO_PCI_ZDEV Matthew Rosato
2022-01-18 17:20 ` Pierre Morel
2022-01-18 17:32 ` Matthew Rosato
2022-01-18 17:45 ` Pierre Morel
2022-01-18 18:05 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 24/30] vfio-pci/zdev: wire up group notifier Matthew Rosato
2022-01-18 17:34 ` Pierre Morel
2022-01-18 18:37 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 25/30] vfio-pci/zdev: wire up zPCI interpretive execution support Matthew Rosato
2022-01-25 13:01 ` Pierre Morel [this message]
2022-01-25 14:21 ` Matthew Rosato
2022-01-14 20:31 ` [PATCH v2 26/30] vfio-pci/zdev: wire up zPCI adapter interrupt forwarding support Matthew Rosato
2022-01-19 17:10 ` Pierre Morel
2022-01-19 17:20 ` Matthew Rosato
2022-01-25 12:36 ` Pierre Morel
2022-01-25 14:16 ` Matthew Rosato
2022-01-26 8:24 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 27/30] vfio-pci/zdev: wire up zPCI IOAT assist support Matthew Rosato
2022-01-19 14:03 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 28/30] vfio-pci/zdev: add DTSM to clp group capability Matthew Rosato
2022-01-19 13:48 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 29/30] KVM: s390: introduce CPU feature for zPCI Interpretation Matthew Rosato
2022-01-19 13:39 ` Pierre Morel
2022-01-14 20:31 ` [PATCH v2 30/30] MAINTAINERS: additional files related kvm s390 pci passthrough Matthew Rosato
2022-01-14 20:49 ` [PATCH v2 00/30] KVM: s390: enable zPCI for interpretive execution Matthew Rosato
2022-01-19 18:10 ` Pierre Morel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=17ccab21-b654-636f-2dfa-57014f4cd4eb@linux.ibm.com \
--to=pmorel@linux.ibm.com \
--cc=agordeev@linux.ibm.com \
--cc=alex.williamson@redhat.com \
--cc=borntraeger@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=farman@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=freude@linux.ibm.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mjrosato@linux.ibm.com \
--cc=oberpar@linux.ibm.com \
--cc=pasic@linux.ibm.com \
--cc=schnelle@linux.ibm.com \
--cc=thuth@redhat.com \
--cc=vneethv@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.