summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/virtual/kvm/devices/vm.txt16
-rw-r--r--arch/s390/include/uapi/asm/kvm.h7
-rw-r--r--arch/s390/kvm/kvm-s390.c43
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
9The groups and attributes per virtual machine, if any, are architecture 9The groups and attributes per virtual machine, if any, are architecture
10specific. 10specific.
11
121. GROUP: KVM_S390_VM_MEM_CTRL
13Architectures: s390
14
151.1. ATTRIBUTE: KVM_S390_VM_MEM_CTRL
16Parameters: none
17Returns: -EBUSY if already a vcpus is defined, otherwise 0
18
19Enables CMMA for the virtual machine
20
211.2. ATTRIBUTE: KVM_S390_VM_CLR_CMMA
22Parameteres: none
23Returns: 0
24
25Clear the CMMA status for all guest pages, so any pages the guest marked
26as 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 */
58struct kvm_regs { 65struct 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
261static 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
261static int kvm_s390_vm_set_attr(struct kvm *kvm, struct kvm_device_attr *attr) 290static 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;