git.samba.org
/
sfrench
/
cifs-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
KVM: s390: add proper locking for CMMA migration bitmap
[sfrench/cifs-2.6.git]
/
arch
/
s390
/
kvm
/
kvm-s390.c
diff --git
a/arch/s390/kvm/kvm-s390.c
b/arch/s390/kvm/kvm-s390.c
index abcd24fdde3fc9142768452dea3eaf839ec56648..52880e980a336a80263cd83c70aeabaad6726ea1 100644
(file)
--- a/
arch/s390/kvm/kvm-s390.c
+++ b/
arch/s390/kvm/kvm-s390.c
@@
-766,7
+766,7
@@
static void kvm_s390_sync_request_broadcast(struct kvm *kvm, int req)
/*
* Must be called with kvm->srcu held to avoid races on memslots, and with
/*
* 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)
{
*/
static int kvm_s390_vm_start_migration(struct kvm *kvm)
{
@@
-822,7
+822,7
@@
static int kvm_s390_vm_start_migration(struct kvm *kvm)
}
/*
}
/*
- * 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)
* kvm_s390_vm_start_migration.
*/
static int kvm_s390_vm_stop_migration(struct kvm *kvm)
@@
-837,6
+837,8
@@
static int kvm_s390_vm_stop_migration(struct kvm *kvm)
if (kvm->arch.use_cmma) {
kvm_s390_sync_request_broadcast(kvm, KVM_REQ_STOP_MIGRATION);
if (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);
vfree(mgs->pgste_bitmap);
}
kfree(mgs);
@@
-846,14
+848,12
@@
static int kvm_s390_vm_stop_migration(struct kvm *kvm)
static int kvm_s390_vm_set_migration(struct kvm *kvm,
struct kvm_device_attr *attr)
{
static 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:
switch (attr->attr) {
case KVM_S390_VM_MIGRATION_START:
- idx = srcu_read_lock(&kvm->srcu);
res = kvm_s390_vm_start_migration(kvm);
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);
break;
case KVM_S390_VM_MIGRATION_STOP:
res = kvm_s390_vm_stop_migration(kvm);
@@
-861,7
+861,7
@@
static int kvm_s390_vm_set_migration(struct kvm *kvm,
default:
break;
}
default:
break;
}
- mutex_unlock(&kvm->lock);
+ mutex_unlock(&kvm->
slots_
lock);
return res;
}
return res;
}
@@
-1751,7
+1751,9
@@
long kvm_arch_vm_ioctl(struct file *filp,
r = -EFAULT;
if (copy_from_user(&args, argp, sizeof(args)))
break;
r = -EFAULT;
if (copy_from_user(&args, argp, sizeof(args)))
break;
+ mutex_lock(&kvm->slots_lock);
r = kvm_s390_get_cmma_bits(kvm, &args);
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)
if (!r) {
r = copy_to_user(argp, &args, sizeof(args));
if (r)
@@
-1765,7
+1767,9
@@
long kvm_arch_vm_ioctl(struct file *filp,
r = -EFAULT;
if (copy_from_user(&args, argp, sizeof(args)))
break;
r = -EFAULT;
if (copy_from_user(&args, argp, sizeof(args)))
break;
+ mutex_lock(&kvm->slots_lock);
r = kvm_s390_set_cmma_bits(kvm, &args);
r = kvm_s390_set_cmma_bits(kvm, &args);
+ mutex_unlock(&kvm->slots_lock);
break;
}
default:
break;
}
default: