Patch "KVM: s390: add proper locking for CMMA migration bitmap" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
KVM: s390: add proper locking for CMMA migration bitmap
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-s390-add-proper-locking-for-cmma-migration-bitmap.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1de1ea7efeb9e8543212210e34518b4049ccd285Mon Sep 17 00:00:00 2001
From: Christian Borntraeger <[email protected]>
Date: Fri, 22 Dec 2017 10:54:20 +0100
Subject: KVM: s390: add proper locking for CMMA migration bitmap
From: Christian Borntraeger <[email protected]>
commit 1de1ea7efeb9e8543212210e34518b4049ccd285 upstream.
Some parts of the cmma migration bitmap is already protected with the kvm->lock (e.g. the migration start). On the other hand the read of the cmma bits is not protected against a concurrent free, neither is the emulation of the ESSA instruction. Let's extend the locking to all related ioctls by using the slots lock for
- kvm_s390_vm_start_migration
- kvm_s390_vm_stop_migration
- kvm_s390_set_cmma_bits
- kvm_s390_get_cmma_bits
In addition to that, we use synchronize_srcu before freeing the migration structure as all users hold kvm->srcu for read. (e.g. the ESSA handler).
--- arch/s390/kvm/kvm-s390.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
arch/s390/kvm/kvm-s390.c +11 -7
@@ -768,7 +768,7 @@ static void kvm_s390_sync_request_broadc/* * Must be called with kvm->srcu held to avoid races on memslots, and with -* kvm->lock to avoid races with ourselves and kvm_s390_vm_stop_migration. +* kvm->slots_lock to avoid races with ourselves and kvm_s390_vm_stop_migration. */ static int kvm_s390_vm_start_migration (struct kvm *kvm) {
@@ -824,7 +824,7 @@ static int kvm_s390_vm_start_migration(s }/* -* Must be called with kvm->lock to avoid races with ourselves and +* Must be called with kvm->slots_lock to avoid races with ourselves and * kvm_s390_vm_start_migration. */ static int kvm_s390_vm_stop_migration (struct kvm *kvm)
@@ -839,6 +839,8 @@ static int kvm_s390_vm_stop_migration(stif (kvm->arch.use_cmma) {kvm_s390_sync_request_broadcast (kvm,KVM_REQ_STOP_MIGRATION ); +/* We have to wait for the essa emulation to finish */ +synchronize_srcu (&kvm->srcu);vfree (mgs->pgste_bitmap); }kfree (mgs);
@@ -848,14 +850,12 @@ static int kvm_s390_vm_stop_migration(ststatic int kvm_s390_vm_set_migration (struct kvm *kvm,struct kvm_device_attr *attr) { -int idx, res = -ENXIO ; +int res = -ENXIO ; -mutex_lock (&kvm->lock); +mutex_lock (&kvm->slots_lock);switch (attr->attr) {case KVM_S390_VM_MIGRATION_START : - idx =srcu_read_lock (&kvm->srcu); res =kvm_s390_vm_start_migration (kvm); -srcu_read_unlock (&kvm->srcu, idx);break ;case KVM_S390_VM_MIGRATION_STOP : res =kvm_s390_vm_stop_migration (kvm);
@@ -863,7 +863,7 @@ static int kvm_s390_vm_set_migration(strdefault :break ; } -mutex_unlock (&kvm->lock); +mutex_unlock (&kvm->slots_lock);return res; }
@@ -1753,7 +1753,9 @@ long kvm_arch_vm_ioctl(struct file *filp r = -EFAULT ;if (copy_from_user (&args, argp,sizeof (args)))break ; +mutex_lock (&kvm->slots_lock); r =kvm_s390_get_cmma_bits (kvm, &args); +mutex_unlock (&kvm->slots_lock);if (!r) { r =copy_to_user (argp, &args,sizeof (args));if (r)
@@ -1767,7 +1769,9 @@ long kvm_arch_vm_ioctl(struct file *filp r = -EFAULT ;if (copy_from_user (&args, argp,sizeof (args)))break ; +mutex_lock (&kvm->slots_lock); r =kvm_s390_set_cmma_bits (kvm, &args); +mutex_unlock (&kvm->slots_lock);break ; }default :
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/kvm-s390-add-proper-locking-for-cmma-migration-bitmap.patch