Pierre Morel
2020-Sep-10 08:53 UTC
[PATCH v12 0/2] s390: virtio: let arch validate VIRTIO features
Hi all, The goal of the series is to give a chance to the architecture to validate VIRTIO device features. I changed VIRTIO_F_IOMMU_PLATFORM to VIRTIO_F_ACCESS_PLATFORM I forgot in drivers/virtio/Kconfig, and put back the inclusion of virtio_config.h for the definition of the callback in arch/s390/mm/init.c I wrongly removed in the last series. Regards, Pierre Pierre Morel (2): virtio: let arch advertise guest's memory access restrictions s390: virtio: PV needs VIRTIO I/O device protection arch/s390/Kconfig | 1 + arch/s390/mm/init.c | 11 +++++++++++ drivers/virtio/Kconfig | 6 ++++++ drivers/virtio/virtio.c | 15 +++++++++++++++ include/linux/virtio_config.h | 10 ++++++++++ 5 files changed, 43 insertions(+) -- 2.25.1 to v12 - replaced VIRTIO_F_IOMMU_PLATFORM with VIRTIO_F_ACCESS_PLATFORM in drivers/virtio/Kconfig (Halil) - suppress inaccurate part of the comment in patch 2 (Halil) - added back virtio_config.h to define arch_has_restricted_virtio_memory_access (kernel robot) to v11: - replaced VIRTIO_F_IOMMU_PLATFORM with VIRTIO_F_ACCESS_PLATFORM to v10: - removed virtio_config.h unnecessary include - wording (Connie) to v9: - move virtio tests back to virtio_finalize_features (Connie) - remove virtio device argument to v8: - refactoring by using an optional callback (Connie) to v7: - typo in warning message (Connie) to v6: - rewording warning messages (Connie, Halil) to v5: - return directly from S390 arch_validate_virtio_features() when the guest is not protected. (Connie) - Somme rewording (Connie, Michael) - moved back code from arch/s390/ ...kernel/uv.c to ...mm/init.c (Christian) to v4: - separate virtio and arch code (Pierre) - moved code from arch/s390/mm/init.c to arch/s390/kernel/uv.c (as interpreted from Heiko's comment) - moved validation inside the arch code (Connie) - moved the call to arch validation before VIRTIO_F_1 test (Michael) to v3: - add warning (Connie, Christian) - add comment (Connie) - change hook name (Halil, Connie) to v2: - put the test in virtio_finalize_features() (Connie) - put the test inside VIRTIO core (Jason) - pass a virtio device as parameter (Halil)
Pierre Morel
2020-Sep-10 08:53 UTC
[PATCH v12 1/2] virtio: let arch advertise guest's memory access restrictions
An architecture may restrict host access to guest memory, e.g. IBM s390 Secure Execution or AMD SEV. Provide a new Kconfig entry the architecture can select, CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS, when it provides the arch_has_restricted_virtio_memory_access callback to advertise to VIRTIO common code when the architecture restricts memory access from the host. The common code can then fail the probe for any device where VIRTIO_F_ACCESS_PLATFORM is required, but not set. Signed-off-by: Pierre Morel <pmorel at linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck at redhat.com> Reviewed-by: Halil Pasic <pasic at linux.ibm.com> --- drivers/virtio/Kconfig | 6 ++++++ drivers/virtio/virtio.c | 15 +++++++++++++++ include/linux/virtio_config.h | 10 ++++++++++ 3 files changed, 31 insertions(+) diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig index 5c92e4a50882..ef2d49430800 100644 --- a/drivers/virtio/Kconfig +++ b/drivers/virtio/Kconfig @@ -6,6 +6,12 @@ config VIRTIO bus, such as CONFIG_VIRTIO_PCI, CONFIG_VIRTIO_MMIO, CONFIG_RPMSG or CONFIG_S390_GUEST. +config ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS + bool + help + This option is selected if the architecture may need to enforce + VIRTIO_F_ACCESS_PLATFORM + menuconfig VIRTIO_MENU bool "Virtio drivers" default y diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c index a977e32a88f2..a2b3f12e10a2 100644 --- a/drivers/virtio/virtio.c +++ b/drivers/virtio/virtio.c @@ -176,6 +176,21 @@ int virtio_finalize_features(struct virtio_device *dev) if (ret) return ret; + ret = arch_has_restricted_virtio_memory_access(); + if (ret) { + if (!virtio_has_feature(dev, VIRTIO_F_VERSION_1)) { + dev_warn(&dev->dev, + "device must provide VIRTIO_F_VERSION_1\n"); + return -ENODEV; + } + + if (!virtio_has_feature(dev, VIRTIO_F_ACCESS_PLATFORM)) { + dev_warn(&dev->dev, + "device must provide VIRTIO_F_ACCESS_PLATFORM\n"); + return -ENODEV; + } + } + if (!virtio_has_feature(dev, VIRTIO_F_VERSION_1)) return 0; diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index 8fe857e27ef3..3f697c8c8205 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -540,4 +540,14 @@ static inline void virtio_cwrite64(struct virtio_device *vdev, virtio_cread_le((vdev), structname, member, ptr); \ _r; \ }) + +#ifdef CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS +int arch_has_restricted_virtio_memory_access(void); +#else +static inline int arch_has_restricted_virtio_memory_access(void) +{ + return 0; +} +#endif /* CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS */ + #endif /* _LINUX_VIRTIO_CONFIG_H */ -- 2.25.1
Pierre Morel
2020-Sep-10 08:53 UTC
[PATCH v12 2/2] s390: virtio: PV needs VIRTIO I/O device protection
If protected virtualization is active on s390, VIRTIO has only retricted access to the guest memory. Define CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS and export arch_has_restricted_virtio_memory_access to advertize VIRTIO if that's the case. Signed-off-by: Pierre Morel <pmorel at linux.ibm.com> Reviewed-by: Cornelia Huck <cohuck at redhat.com> Reviewed-by: Halil Pasic <pasic at linux.ibm.com> --- arch/s390/Kconfig | 1 + arch/s390/mm/init.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index b29fcc66ec39..938246200d39 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -820,6 +820,7 @@ menu "Virtualization" config PROTECTED_VIRTUALIZATION_GUEST def_bool n prompt "Protected virtualization guest support" + select ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS help Select this option, if you want to be able to run this kernel as a protected virtualization KVM guest. diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 0d282081dc1f..e27f050cb516 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -45,6 +45,7 @@ #include <asm/kasan.h> #include <asm/dma-mapping.h> #include <asm/uv.h> +#include <linux/virtio_config.h> pgd_t swapper_pg_dir[PTRS_PER_PGD] __section(.bss..swapper_pg_dir); @@ -160,6 +161,16 @@ bool force_dma_unencrypted(struct device *dev) return is_prot_virt_guest(); } +#ifdef CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS + +int arch_has_restricted_virtio_memory_access(void) +{ + return is_prot_virt_guest(); +} +EXPORT_SYMBOL(arch_has_restricted_virtio_memory_access); + +#endif + /* protected virtualization */ static void pv_init(void) { -- 2.25.1
Christian Borntraeger
2020-Sep-10 09:08 UTC
[PATCH v12 1/2] virtio: let arch advertise guest's memory access restrictions
On 10.09.20 10:53, Pierre Morel wrote:> An architecture may restrict host access to guest memory, > e.g. IBM s390 Secure Execution or AMD SEV. > > Provide a new Kconfig entry the architecture can select, > CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS, when it provides > the arch_has_restricted_virtio_memory_access callback to advertise > to VIRTIO common code when the architecture restricts memory access > from the host. > > The common code can then fail the probe for any device where > VIRTIO_F_ACCESS_PLATFORM is required, but not set. > > Signed-off-by: Pierre Morel <pmorel at linux.ibm.com> > Reviewed-by: Cornelia Huck <cohuck at redhat.com> > Reviewed-by: Halil Pasic <pasic at linux.ibm.com>Acked-by: Christian Borntraeger <borntraeger at de.ibm.com>> --- > drivers/virtio/Kconfig | 6 ++++++ > drivers/virtio/virtio.c | 15 +++++++++++++++ > include/linux/virtio_config.h | 10 ++++++++++ > 3 files changed, 31 insertions(+) > > diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig > index 5c92e4a50882..ef2d49430800 100644 > --- a/drivers/virtio/Kconfig > +++ b/drivers/virtio/Kconfig > @@ -6,6 +6,12 @@ config VIRTIO > bus, such as CONFIG_VIRTIO_PCI, CONFIG_VIRTIO_MMIO, CONFIG_RPMSG > or CONFIG_S390_GUEST. > > +config ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS > + bool > + help > + This option is selected if the architecture may need to enforce > + VIRTIO_F_ACCESS_PLATFORM > + > menuconfig VIRTIO_MENU > bool "Virtio drivers" > default y > diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c > index a977e32a88f2..a2b3f12e10a2 100644 > --- a/drivers/virtio/virtio.c > +++ b/drivers/virtio/virtio.c > @@ -176,6 +176,21 @@ int virtio_finalize_features(struct virtio_device *dev) > if (ret) > return ret; > > + ret = arch_has_restricted_virtio_memory_access(); > + if (ret) { > + if (!virtio_has_feature(dev, VIRTIO_F_VERSION_1)) { > + dev_warn(&dev->dev, > + "device must provide VIRTIO_F_VERSION_1\n"); > + return -ENODEV; > + } > + > + if (!virtio_has_feature(dev, VIRTIO_F_ACCESS_PLATFORM)) { > + dev_warn(&dev->dev, > + "device must provide VIRTIO_F_ACCESS_PLATFORM\n"); > + return -ENODEV; > + } > + } > + > if (!virtio_has_feature(dev, VIRTIO_F_VERSION_1)) > return 0; > > diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h > index 8fe857e27ef3..3f697c8c8205 100644 > --- a/include/linux/virtio_config.h > +++ b/include/linux/virtio_config.h > @@ -540,4 +540,14 @@ static inline void virtio_cwrite64(struct virtio_device *vdev, > virtio_cread_le((vdev), structname, member, ptr); \ > _r; \ > }) > + > +#ifdef CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS > +int arch_has_restricted_virtio_memory_access(void); > +#else > +static inline int arch_has_restricted_virtio_memory_access(void) > +{ > + return 0; > +} > +#endif /* CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS */ > + > #endif /* _LINUX_VIRTIO_CONFIG_H */ >
Christian Borntraeger
2020-Sep-10 09:09 UTC
[PATCH v12 2/2] s390: virtio: PV needs VIRTIO I/O device protection
On 10.09.20 10:53, Pierre Morel wrote:> If protected virtualization is active on s390, VIRTIO has only retricted > access to the guest memory. > Define CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS and export > arch_has_restricted_virtio_memory_access to advertize VIRTIO if that's > the case. > > Signed-off-by: Pierre Morel <pmorel at linux.ibm.com> > Reviewed-by: Cornelia Huck <cohuck at redhat.com> > Reviewed-by: Halil Pasic <pasic at linux.ibm.com>Acked-by: Christian Borntraeger <borntraeger at de.ibm.com> Michael, I am fine if this patch goes via the virtio tree.> --- > arch/s390/Kconfig | 1 + > arch/s390/mm/init.c | 11 +++++++++++ > 2 files changed, 12 insertions(+) > > diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig > index b29fcc66ec39..938246200d39 100644 > --- a/arch/s390/Kconfig > +++ b/arch/s390/Kconfig > @@ -820,6 +820,7 @@ menu "Virtualization" > config PROTECTED_VIRTUALIZATION_GUEST > def_bool n > prompt "Protected virtualization guest support" > + select ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS > help > Select this option, if you want to be able to run this > kernel as a protected virtualization KVM guest. > diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c > index 0d282081dc1f..e27f050cb516 100644 > --- a/arch/s390/mm/init.c > +++ b/arch/s390/mm/init.c > @@ -45,6 +45,7 @@ > #include <asm/kasan.h> > #include <asm/dma-mapping.h> > #include <asm/uv.h> > +#include <linux/virtio_config.h> > > pgd_t swapper_pg_dir[PTRS_PER_PGD] __section(.bss..swapper_pg_dir); > > @@ -160,6 +161,16 @@ bool force_dma_unencrypted(struct device *dev) > return is_prot_virt_guest(); > } > > +#ifdef CONFIG_ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS > + > +int arch_has_restricted_virtio_memory_access(void) > +{ > + return is_prot_virt_guest(); > +} > +EXPORT_SYMBOL(arch_has_restricted_virtio_memory_access); > + > +#endif > + > /* protected virtualization */ > static void pv_init(void) > { >
Christian Borntraeger
2020-Sep-22 12:15 UTC
[PATCH v12 0/2] s390: virtio: let arch validate VIRTIO features
Michael, are you going to pick this series? On 10.09.20 10:53, Pierre Morel wrote:> Hi all, > > The goal of the series is to give a chance to the architecture > to validate VIRTIO device features. > > I changed VIRTIO_F_IOMMU_PLATFORM to VIRTIO_F_ACCESS_PLATFORM > I forgot in drivers/virtio/Kconfig, and put back the inclusion > of virtio_config.h for the definition of the callback in > arch/s390/mm/init.c I wrongly removed in the last series. > > Regards, > Pierre > > > Pierre Morel (2): > virtio: let arch advertise guest's memory access restrictions > s390: virtio: PV needs VIRTIO I/O device protection > > arch/s390/Kconfig | 1 + > arch/s390/mm/init.c | 11 +++++++++++ > drivers/virtio/Kconfig | 6 ++++++ > drivers/virtio/virtio.c | 15 +++++++++++++++ > include/linux/virtio_config.h | 10 ++++++++++ > 5 files changed, 43 insertions(+) >
Michael S. Tsirkin
2020-Sep-22 13:52 UTC
[PATCH v12 0/2] s390: virtio: let arch validate VIRTIO features
Will do for the next Linux. On Tue, Sep 22, 2020 at 02:15:17PM +0200, Christian Borntraeger wrote:> Michael, > > are you going to pick this series? > > > On 10.09.20 10:53, Pierre Morel wrote: > > Hi all, > > > > The goal of the series is to give a chance to the architecture > > to validate VIRTIO device features. > > > > I changed VIRTIO_F_IOMMU_PLATFORM to VIRTIO_F_ACCESS_PLATFORM > > I forgot in drivers/virtio/Kconfig, and put back the inclusion > > of virtio_config.h for the definition of the callback in > > arch/s390/mm/init.c I wrongly removed in the last series. > > > > Regards, > > Pierre > > > > > > Pierre Morel (2): > > virtio: let arch advertise guest's memory access restrictions > > s390: virtio: PV needs VIRTIO I/O device protection > > > > arch/s390/Kconfig | 1 + > > arch/s390/mm/init.c | 11 +++++++++++ > > drivers/virtio/Kconfig | 6 ++++++ > > drivers/virtio/virtio.c | 15 +++++++++++++++ > > include/linux/virtio_config.h | 10 ++++++++++ > > 5 files changed, 43 insertions(+) > >
Possibly Parallel Threads
- [PATCH v11 2/2] s390: virtio: PV needs VIRTIO I/O device protection
- [PATCH v9 2/2] s390: virtio: PV needs VIRTIO I/O device protection
- [PATCH v10 2/2] s390: virtio: PV needs VIRTIO I/O device protection
- [PATCH v12 0/2] s390: virtio: let arch validate VIRTIO features
- [PATCH v12 0/2] s390: virtio: let arch validate VIRTIO features