diff options
| -rw-r--r-- | Documentation/virtual/kvm/devices/vm.txt | 16 | ||||
| -rw-r--r-- | arch/s390/include/uapi/asm/kvm.h | 7 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 43 |
3 files changed, 66 insertions, 0 deletions
diff --git a/Documentation/virtual/kvm/devices/vm.txt b/Documentation/virtual/kvm/devices/vm.txt index 562bee6e600b..0d16f96c0eac 100644 --- a/Documentation/virtual/kvm/devices/vm.txt +++ b/Documentation/virtual/kvm/devices/vm.txt | |||
| @@ -8,3 +8,19 @@ and controls. | |||
| 8 | 8 | ||
| 9 | The groups and attributes per virtual machine, if any, are architecture | 9 | The groups and attributes per virtual machine, if any, are architecture |
| 10 | specific. | 10 | specific. |
| 11 | |||
| 12 | 1. GROUP: KVM_S390_VM_MEM_CTRL | ||
| 13 | Architectures: s390 | ||
| 14 | |||
| 15 | 1.1. ATTRIBUTE: KVM_S390_VM_MEM_CTRL | ||
| 16 | Parameters: none | ||
| 17 | Returns: -EBUSY if already a vcpus is defined, otherwise 0 | ||
| 18 | |||
| 19 | Enables CMMA for the virtual machine | ||
| 20 | |||
| 21 | 1.2. ATTRIBUTE: KVM_S390_VM_CLR_CMMA | ||
| 22 | Parameteres: none | ||
| 23 | Returns: 0 | ||
| 24 | |||
| 25 | Clear the CMMA status for all guest pages, so any pages the guest marked | ||
| 26 | as unused are again used any may not be reclaimed by the host. | ||
diff --git a/arch/s390/include/uapi/asm/kvm.h b/arch/s390/include/uapi/asm/kvm.h index c003c6a73b1e..e35c79821d29 100644 --- a/arch/s390/include/uapi/asm/kvm.h +++ b/arch/s390/include/uapi/asm/kvm.h | |||
| @@ -54,6 +54,13 @@ struct kvm_s390_io_adapter_req { | |||
| 54 | __u64 addr; | 54 | __u64 addr; |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | /* kvm attr_group on vm fd */ | ||
| 58 | #define KVM_S390_VM_MEM_CTRL 0 | ||
| 59 | |||
| 60 | /* kvm attributes for mem_ctrl */ | ||
| 61 | #define KVM_S390_VM_MEM_ENABLE_CMMA 0 | ||
| 62 | #define KVM_S390_VM_MEM_CLR_CMMA 1 | ||
| 63 | |||
| 57 | /* for KVM_GET_REGS and KVM_SET_REGS */ | 64 | /* for KVM_GET_REGS and KVM_SET_REGS */ |
| 58 | struct kvm_regs { | 65 | struct kvm_regs { |
| 59 | /* general purpose regs for s390 */ | 66 | /* general purpose regs for s390 */ |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index fc2fe49488c0..fe2396cc0856 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
| @@ -258,11 +258,43 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) | |||
| 258 | return r; | 258 | return r; |
| 259 | } | 259 | } |
| 260 | 260 | ||
| 261 | static int kvm_s390_mem_control(struct kvm *kvm, struct kvm_device_attr *attr) | ||
| 262 | { | ||
| 263 | int ret; | ||
| 264 | unsigned int idx; | ||
| 265 | switch (attr->attr) { | ||
| 266 | case KVM_S390_VM_MEM_ENABLE_CMMA: | ||
| 267 | ret = -EBUSY; | ||
| 268 | mutex_lock(&kvm->lock); | ||
| 269 | if (atomic_read(&kvm->online_vcpus) == 0) { | ||
| 270 | kvm->arch.use_cmma = 1; | ||
| 271 | ret = 0; | ||
| 272 | } | ||
| 273 | mutex_unlock(&kvm->lock); | ||
| 274 | break; | ||
| 275 | case KVM_S390_VM_MEM_CLR_CMMA: | ||
| 276 | mutex_lock(&kvm->lock); | ||
| 277 | idx = srcu_read_lock(&kvm->srcu); | ||
| 278 | page_table_reset_pgste(kvm->arch.gmap->mm, 0, TASK_SIZE, false); | ||
| 279 | srcu_read_unlock(&kvm->srcu, idx); | ||
| 280 | mutex_unlock(&kvm->lock); | ||
| 281 | ret = 0; | ||
| 282 | break; | ||
| 283 | default: | ||
| 284 | ret = -ENXIO; | ||
| 285 | break; | ||
| 286 | } | ||
| 287 | return ret; | ||
| 288 | } | ||
| 289 | |||
| 261 | static int kvm_s390_vm_set_attr(struct kvm *kvm, struct kvm_device_attr *attr) | 290 | static int kvm_s390_vm_set_attr(struct kvm *kvm, struct kvm_device_attr *attr) |
| 262 | { | 291 | { |
| 263 | int ret; | 292 | int ret; |
| 264 | 293 | ||
| 265 | switch (attr->group) { | 294 | switch (attr->group) { |
| 295 | case KVM_S390_VM_MEM_CTRL: | ||
| 296 | ret = kvm_s390_mem_control(kvm, attr); | ||
| 297 | break; | ||
| 266 | default: | 298 | default: |
| 267 | ret = -ENXIO; | 299 | ret = -ENXIO; |
| 268 | break; | 300 | break; |
| @@ -281,6 +313,17 @@ static int kvm_s390_vm_has_attr(struct kvm *kvm, struct kvm_device_attr *attr) | |||
| 281 | int ret; | 313 | int ret; |
| 282 | 314 | ||
| 283 | switch (attr->group) { | 315 | switch (attr->group) { |
| 316 | case KVM_S390_VM_MEM_CTRL: | ||
| 317 | switch (attr->attr) { | ||
| 318 | case KVM_S390_VM_MEM_ENABLE_CMMA: | ||
| 319 | case KVM_S390_VM_MEM_CLR_CMMA: | ||
| 320 | ret = 0; | ||
| 321 | break; | ||
| 322 | default: | ||
| 323 | ret = -ENXIO; | ||
| 324 | break; | ||
| 325 | } | ||
| 326 | break; | ||
| 284 | default: | 327 | default: |
| 285 | ret = -ENXIO; | 328 | ret = -ENXIO; |
| 286 | break; | 329 | break; |
