Message ID | 20220204155349.63238-11-imbrenda@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: s390: pv: implement lazy destroy for reboot | expand |
Hi Claudio, I love your patch! Yet something to improve: [auto build test ERROR on kvm/queue] [also build test ERROR on v5.17-rc2 next-20220204] [cannot apply to kvms390/next s390/features] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Claudio-Imbrenda/KVM-s390-pv-implement-lazy-destroy-for-reboot/20220204-235609 base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue config: s390-randconfig-r044-20220131 (https://download.01.org/0day-ci/archive/20220205/202202050525.5A9HirW8-lkp@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a73e4ce6a59b01f0e37037761c1e6889d539d233) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install s390 cross compiling tool for clang build # apt-get install binutils-s390x-linux-gnu # https://github.com/0day-ci/linux/commit/9ee65f25ad996d38f6935360c99a89e72024174b git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Claudio-Imbrenda/KVM-s390-pv-implement-lazy-destroy-for-reboot/20220204-235609 git checkout 9ee65f25ad996d38f6935360c99a89e72024174b # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=s390 SHELL=/bin/bash arch/s390/kvm/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): In file included from arch/s390/kvm/pv.c:9: In file included from include/linux/kvm_host.h:41: In file included from include/linux/kvm_para.h:5: In file included from include/uapi/linux/kvm_para.h:37: In file included from arch/s390/include/asm/kvm_para.h:25: In file included from arch/s390/include/asm/diag.h:12: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:464:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __raw_readb(PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:477:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:37:59: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) __swab16((__force __u16)(__le16)(x)) ^ include/uapi/linux/swab.h:102:54: note: expanded from macro '__swab16' #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) ^ In file included from arch/s390/kvm/pv.c:9: In file included from include/linux/kvm_host.h:41: In file included from include/linux/kvm_para.h:5: In file included from include/uapi/linux/kvm_para.h:37: In file included from arch/s390/include/asm/kvm_para.h:25: In file included from arch/s390/include/asm/diag.h:12: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:490:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr)); ~~~~~~~~~~ ^ include/uapi/linux/byteorder/big_endian.h:35:59: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) __swab32((__force __u32)(__le32)(x)) ^ include/uapi/linux/swab.h:115:54: note: expanded from macro '__swab32' #define __swab32(x) (__u32)__builtin_bswap32((__u32)(x)) ^ In file included from arch/s390/kvm/pv.c:9: In file included from include/linux/kvm_host.h:41: In file included from include/linux/kvm_para.h:5: In file included from include/uapi/linux/kvm_para.h:37: In file included from arch/s390/include/asm/kvm_para.h:25: In file included from arch/s390/include/asm/diag.h:12: In file included from include/linux/if_ether.h:19: In file included from include/linux/skbuff.h:31: In file included from include/linux/dma-mapping.h:10: In file included from include/linux/scatterlist.h:9: In file included from arch/s390/include/asm/io.h:75: include/asm-generic/io.h:501:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writeb(value, PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:511:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:521:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr); ~~~~~~~~~~ ^ include/asm-generic/io.h:609:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:617:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:625:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] readsl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:634:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesb(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:643:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesw(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ include/asm-generic/io.h:652:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] writesl(PCI_IOBASE + addr, buffer, count); ~~~~~~~~~~ ^ >> arch/s390/kvm/pv.c:255:3: error: implicit declaration of function 'mmu_notifier_register' [-Werror,-Wimplicit-function-declaration] mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); ^ arch/s390/kvm/pv.c:255:3: note: did you mean 'mmu_notifier_release'? include/linux/mmu_notifier.h:679:20: note: 'mmu_notifier_release' declared here static inline void mmu_notifier_release(struct mm_struct *mm) ^ 12 warnings and 1 error generated. vim +/mmu_notifier_register +255 arch/s390/kvm/pv.c 210 211 int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) 212 { 213 struct uv_cb_cgc uvcb = { 214 .header.cmd = UVC_CMD_CREATE_SEC_CONF, 215 .header.len = sizeof(uvcb) 216 }; 217 int cc, ret; 218 u16 dummy; 219 220 ret = kvm_s390_pv_alloc_vm(kvm); 221 if (ret) 222 return ret; 223 224 /* Inputs */ 225 uvcb.guest_stor_origin = 0; /* MSO is 0 for KVM */ 226 uvcb.guest_stor_len = kvm->arch.pv.guest_len; 227 uvcb.guest_asce = kvm->arch.gmap->asce; 228 uvcb.guest_sca = (unsigned long)kvm->arch.sca; 229 uvcb.conf_base_stor_origin = (u64)kvm->arch.pv.stor_base; 230 uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; 231 232 cc = uv_call_sched(0, (u64)&uvcb); 233 *rc = uvcb.header.rc; 234 *rrc = uvcb.header.rrc; 235 KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", 236 uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc); 237 238 /* Outputs */ 239 kvm->arch.pv.handle = uvcb.guest_handle; 240 241 atomic_inc(&kvm->mm->context.protected_count); 242 if (cc) { 243 if (uvcb.header.rc & UVC_RC_NEED_DESTROY) { 244 kvm_s390_pv_deinit_vm(kvm, &dummy, &dummy); 245 } else { 246 atomic_dec(&kvm->mm->context.protected_count); 247 kvm_s390_pv_dealloc_vm(kvm); 248 } 249 return -EIO; 250 } 251 kvm->arch.gmap->guest_handle = uvcb.guest_handle; 252 /* Add the notifier only once. No races because we hold kvm->lock */ 253 if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { 254 kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; > 255 mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); 256 } 257 return 0; 258 } 259 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Claudio, I love your patch! Yet something to improve: [auto build test ERROR on kvm/queue] [also build test ERROR on v5.17-rc2 next-20220204] [cannot apply to kvms390/next s390/features] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Claudio-Imbrenda/KVM-s390-pv-implement-lazy-destroy-for-reboot/20220204-235609 base: https://git.kernel.org/pub/scm/virt/kvm/kvm.git queue config: s390-randconfig-r044-20220203 (https://download.01.org/0day-ci/archive/20220205/202202050519.HMLLILGz-lkp@intel.com/config) compiler: s390-linux-gcc (GCC) 11.2.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/0day-ci/linux/commit/9ee65f25ad996d38f6935360c99a89e72024174b git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Claudio-Imbrenda/KVM-s390-pv-implement-lazy-destroy-for-reboot/20220204-235609 git checkout 9ee65f25ad996d38f6935360c99a89e72024174b # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=s390 SHELL=/bin/bash arch/s390/kvm/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): arch/s390/kvm/pv.c: In function 'kvm_s390_pv_init_vm': >> arch/s390/kvm/pv.c:255:17: error: implicit declaration of function 'mmu_notifier_register'; did you mean 'mmu_notifier_release'? [-Werror=implicit-function-declaration] 255 | mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); | ^~~~~~~~~~~~~~~~~~~~~ | mmu_notifier_release cc1: some warnings being treated as errors vim +255 arch/s390/kvm/pv.c 210 211 int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) 212 { 213 struct uv_cb_cgc uvcb = { 214 .header.cmd = UVC_CMD_CREATE_SEC_CONF, 215 .header.len = sizeof(uvcb) 216 }; 217 int cc, ret; 218 u16 dummy; 219 220 ret = kvm_s390_pv_alloc_vm(kvm); 221 if (ret) 222 return ret; 223 224 /* Inputs */ 225 uvcb.guest_stor_origin = 0; /* MSO is 0 for KVM */ 226 uvcb.guest_stor_len = kvm->arch.pv.guest_len; 227 uvcb.guest_asce = kvm->arch.gmap->asce; 228 uvcb.guest_sca = (unsigned long)kvm->arch.sca; 229 uvcb.conf_base_stor_origin = (u64)kvm->arch.pv.stor_base; 230 uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; 231 232 cc = uv_call_sched(0, (u64)&uvcb); 233 *rc = uvcb.header.rc; 234 *rrc = uvcb.header.rrc; 235 KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", 236 uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc); 237 238 /* Outputs */ 239 kvm->arch.pv.handle = uvcb.guest_handle; 240 241 atomic_inc(&kvm->mm->context.protected_count); 242 if (cc) { 243 if (uvcb.header.rc & UVC_RC_NEED_DESTROY) { 244 kvm_s390_pv_deinit_vm(kvm, &dummy, &dummy); 245 } else { 246 atomic_dec(&kvm->mm->context.protected_count); 247 kvm_s390_pv_dealloc_vm(kvm); 248 } 249 return -EIO; 250 } 251 kvm->arch.gmap->guest_handle = uvcb.guest_handle; 252 /* Add the notifier only once. No races because we hold kvm->lock */ 253 if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { 254 kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; > 255 mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); 256 } 257 return 0; 258 } 259 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
On 2/4/22 16:53, Claudio Imbrenda wrote: > Add an mmu_notifier for protected VMs. The callback function is > triggered when the mm is torn down, and will attempt to convert all > protected vCPUs to non-protected. This allows the mm teardown to use > the destroy page UVC instead of export. > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > arch/s390/include/asm/kvm_host.h | 2 ++ > arch/s390/kvm/pv.c | 20 ++++++++++++++++++++ > 2 files changed, 22 insertions(+) > > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > index a22c9266ea05..1bccb8561ba9 100644 > --- a/arch/s390/include/asm/kvm_host.h > +++ b/arch/s390/include/asm/kvm_host.h > @@ -19,6 +19,7 @@ > #include <linux/kvm.h> > #include <linux/seqlock.h> > #include <linux/module.h> > +#include <linux/mmu_notifier.h> > #include <asm/debug.h> > #include <asm/cpu.h> > #include <asm/fpu/api.h> > @@ -921,6 +922,7 @@ struct kvm_s390_pv { > u64 guest_len; > unsigned long stor_base; > void *stor_var; > + struct mmu_notifier mmu_notifier; > }; > > struct kvm_arch{ > diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c > index f1e812a45acb..d3b8fd9b5b3e 100644 > --- a/arch/s390/kvm/pv.c > +++ b/arch/s390/kvm/pv.c > @@ -193,6 +193,21 @@ int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > return -EIO; > } > > +static void kvm_s390_pv_mmu_notifier_release(struct mmu_notifier *subscription, > + struct mm_struct *mm) > +{ > + struct kvm *kvm = container_of(subscription, struct kvm, arch.pv.mmu_notifier); Are we sure that the kvm pointer is still valid at this point? > + u16 dummy; > + > + mutex_lock(&kvm->lock); Against what are we locking here? > + kvm_s390_cpus_from_pv(kvm, &dummy, &dummy); I'd guess that we can't really have a second kvm_s390_cpus_from_pv() call in flight, right? If the mm is being torn down there would be no code left that can execute the IOCTL. > + mutex_unlock(&kvm->lock); > +} > + > +static const struct mmu_notifier_ops kvm_s390_pv_mmu_notifier_ops = { > + .release = kvm_s390_pv_mmu_notifier_release, > +}; > + > int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > { > struct uv_cb_cgc uvcb = { > @@ -234,6 +249,11 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > return -EIO; > } > kvm->arch.gmap->guest_handle = uvcb.guest_handle; > + /* Add the notifier only once. No races because we hold kvm->lock */ > + if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { > + kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; > + mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); > + } > return 0; > } > >
On Mon, 7 Feb 2022 12:04:56 +0100 Janosch Frank <frankja@linux.ibm.com> wrote: > On 2/4/22 16:53, Claudio Imbrenda wrote: > > Add an mmu_notifier for protected VMs. The callback function is > > triggered when the mm is torn down, and will attempt to convert all > > protected vCPUs to non-protected. This allows the mm teardown to use > > the destroy page UVC instead of export. > > > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > > --- > > arch/s390/include/asm/kvm_host.h | 2 ++ > > arch/s390/kvm/pv.c | 20 ++++++++++++++++++++ > > 2 files changed, 22 insertions(+) > > > > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > > index a22c9266ea05..1bccb8561ba9 100644 > > --- a/arch/s390/include/asm/kvm_host.h > > +++ b/arch/s390/include/asm/kvm_host.h > > @@ -19,6 +19,7 @@ > > #include <linux/kvm.h> > > #include <linux/seqlock.h> > > #include <linux/module.h> > > +#include <linux/mmu_notifier.h> > > #include <asm/debug.h> > > #include <asm/cpu.h> > > #include <asm/fpu/api.h> > > @@ -921,6 +922,7 @@ struct kvm_s390_pv { > > u64 guest_len; > > unsigned long stor_base; > > void *stor_var; > > + struct mmu_notifier mmu_notifier; > > }; > > > > struct kvm_arch{ > > diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c > > index f1e812a45acb..d3b8fd9b5b3e 100644 > > --- a/arch/s390/kvm/pv.c > > +++ b/arch/s390/kvm/pv.c > > @@ -193,6 +193,21 @@ int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > > return -EIO; > > } > > > > +static void kvm_s390_pv_mmu_notifier_release(struct mmu_notifier *subscription, > > + struct mm_struct *mm) > > +{ > > + struct kvm *kvm = container_of(subscription, struct kvm, arch.pv.mmu_notifier); > > Are we sure that the kvm pointer is still valid at this point? it should be, because KVM is torn down after the mm. which is the whole reason why the notifier is needed. on the other hand, I realized that I should have unregistered the notifier somewhere, which I forgot to do. the best place would be KVM teardown, which then also guarantees that the notifier can only be called with a valid struct kvm > > > + u16 dummy; > > + > > + mutex_lock(&kvm->lock); > > Against what are we locking here? > > > + kvm_s390_cpus_from_pv(kvm, &dummy, &dummy); > > I'd guess that we can't really have a second kvm_s390_cpus_from_pv() > call in flight, right? If the mm is being torn down there would be no > code left that can execute the IOCTL. yeah makes sense > > > + mutex_unlock(&kvm->lock); > > +} > > + > > +static const struct mmu_notifier_ops kvm_s390_pv_mmu_notifier_ops = { > > + .release = kvm_s390_pv_mmu_notifier_release, > > +}; > > + > > int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > > { > > struct uv_cb_cgc uvcb = { > > @@ -234,6 +249,11 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > > return -EIO; > > } > > kvm->arch.gmap->guest_handle = uvcb.guest_handle; > > + /* Add the notifier only once. No races because we hold kvm->lock */ > > + if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { > > + kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; > > + mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); > > + } > > return 0; > > } > > > > >
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index a22c9266ea05..1bccb8561ba9 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -19,6 +19,7 @@ #include <linux/kvm.h> #include <linux/seqlock.h> #include <linux/module.h> +#include <linux/mmu_notifier.h> #include <asm/debug.h> #include <asm/cpu.h> #include <asm/fpu/api.h> @@ -921,6 +922,7 @@ struct kvm_s390_pv { u64 guest_len; unsigned long stor_base; void *stor_var; + struct mmu_notifier mmu_notifier; }; struct kvm_arch{ diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c index f1e812a45acb..d3b8fd9b5b3e 100644 --- a/arch/s390/kvm/pv.c +++ b/arch/s390/kvm/pv.c @@ -193,6 +193,21 @@ int kvm_s390_pv_deinit_vm(struct kvm *kvm, u16 *rc, u16 *rrc) return -EIO; } +static void kvm_s390_pv_mmu_notifier_release(struct mmu_notifier *subscription, + struct mm_struct *mm) +{ + struct kvm *kvm = container_of(subscription, struct kvm, arch.pv.mmu_notifier); + u16 dummy; + + mutex_lock(&kvm->lock); + kvm_s390_cpus_from_pv(kvm, &dummy, &dummy); + mutex_unlock(&kvm->lock); +} + +static const struct mmu_notifier_ops kvm_s390_pv_mmu_notifier_ops = { + .release = kvm_s390_pv_mmu_notifier_release, +}; + int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) { struct uv_cb_cgc uvcb = { @@ -234,6 +249,11 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) return -EIO; } kvm->arch.gmap->guest_handle = uvcb.guest_handle; + /* Add the notifier only once. No races because we hold kvm->lock */ + if (kvm->arch.pv.mmu_notifier.ops != &kvm_s390_pv_mmu_notifier_ops) { + kvm->arch.pv.mmu_notifier.ops = &kvm_s390_pv_mmu_notifier_ops; + mmu_notifier_register(&kvm->arch.pv.mmu_notifier, kvm->mm); + } return 0; }
Add an mmu_notifier for protected VMs. The callback function is triggered when the mm is torn down, and will attempt to convert all protected vCPUs to non-protected. This allows the mm teardown to use the destroy page UVC instead of export. Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> --- arch/s390/include/asm/kvm_host.h | 2 ++ arch/s390/kvm/pv.c | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+)