On 30.08.2018 16:15, Janosch Frank wrote: > We have to do down_write on the mm semaphore to set a bitfield in the > mm context. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> > Fixes: a4499382 ("KVM: s390: Add huge page enablement control") > --- > arch/s390/include/asm/mmu.h | 8 +++++++- > arch/s390/kvm/kvm-s390.c | 2 ++ > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h > index f31a15044c24..a8418e1379eb 100644 > --- a/arch/s390/include/asm/mmu.h > +++ b/arch/s390/include/asm/mmu.h > @@ -16,7 +16,13 @@ typedef struct { > unsigned long asce; > unsigned long asce_limit; > unsigned long vdso_base; > - /* The mmu context allocates 4K page tables. */ > + /* > + * The following bitfields need a down_write on the mm > + * semaphore when they are written to. As they are only > + * written once, they can be read without a lock. > + * > + * The mmu context allocates 4K page tables. > + */ > unsigned int alloc_pgste:1; > /* The mmu context uses extended page tables. */ > unsigned int has_pgste:1; > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index 8c039e12cb24..ac5da6b0b862 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -695,7 +695,9 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) > r = -EINVAL; > else { > r = 0; > + down_write(&kvm->mm->mmap_sem); > kvm->mm->context.allow_gmap_hpage_1m = 1; > + up_write(&kvm->mm->mmap_sem); > /* > * We might have to create fake 4k page > * tables. To avoid that the hardware works on > This is a theoretical scenario, right? (GMAP without vcpus will not be populated as far as I remember) -- Thanks, David / dhildenb