aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>2014-10-09 09:01:38 -0400
committerChristian Borntraeger <borntraeger@de.ibm.com>2015-01-23 07:25:36 -0500
commit9fbd80828cef1b1bba5a293609a021047bb86a7e (patch)
treeec495e61c2574c9bb76c21840a9c15b50ddec018
parentea5f496925755bc5e13adbdcfcb841bc2848913b (diff)
KVM: s390: clear the pfault queue if user space sets the invalid token
We need a way to clear the async pfault queue from user space (e.g. for resets and SIGP SET ARCHITECTURE). This patch simply clears the queue as soon as user space sets the invalid pfault token. The definition of the invalid token is moved to uapi. Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
-rw-r--r--arch/s390/include/asm/kvm_host.h1
-rw-r--r--arch/s390/include/uapi/asm/kvm.h3
-rw-r--r--arch/s390/kvm/kvm-s390.c4
3 files changed, 7 insertions, 1 deletions
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 4de479e47f71..b6170520380b 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -469,7 +469,6 @@ struct kvm_vcpu_arch {
469 }; 469 };
470 struct gmap *gmap; 470 struct gmap *gmap;
471 struct kvm_guestdbg_info_arch guestdbg; 471 struct kvm_guestdbg_info_arch guestdbg;
472#define KVM_S390_PFAULT_TOKEN_INVALID (-1UL)
473 unsigned long pfault_token; 472 unsigned long pfault_token;
474 unsigned long pfault_select; 473 unsigned long pfault_select;
475 unsigned long pfault_compare; 474 unsigned long pfault_compare;
diff --git a/arch/s390/include/uapi/asm/kvm.h b/arch/s390/include/uapi/asm/kvm.h
index 9c01159cf667..7e9165e1bec5 100644
--- a/arch/s390/include/uapi/asm/kvm.h
+++ b/arch/s390/include/uapi/asm/kvm.h
@@ -108,6 +108,9 @@ struct kvm_guest_debug_arch {
108 struct kvm_hw_breakpoint __user *hw_bp; 108 struct kvm_hw_breakpoint __user *hw_bp;
109}; 109};
110 110
111/* for KVM_SYNC_PFAULT and KVM_REG_S390_PFTOKEN */
112#define KVM_S390_PFAULT_TOKEN_INVALID 0xffffffffffffffffULL
113
111#define KVM_SYNC_PREFIX (1UL << 0) 114#define KVM_SYNC_PREFIX (1UL << 0)
112#define KVM_SYNC_GPRS (1UL << 1) 115#define KVM_SYNC_GPRS (1UL << 1)
113#define KVM_SYNC_ACRS (1UL << 2) 116#define KVM_SYNC_ACRS (1UL << 2)
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 9bdc9f927e82..bfb2b990da9b 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -936,6 +936,8 @@ static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
936 case KVM_REG_S390_PFTOKEN: 936 case KVM_REG_S390_PFTOKEN:
937 r = get_user(vcpu->arch.pfault_token, 937 r = get_user(vcpu->arch.pfault_token,
938 (u64 __user *)reg->addr); 938 (u64 __user *)reg->addr);
939 if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
940 kvm_clear_async_pf_completion_queue(vcpu);
939 break; 941 break;
940 case KVM_REG_S390_PFCOMPARE: 942 case KVM_REG_S390_PFCOMPARE:
941 r = get_user(vcpu->arch.pfault_compare, 943 r = get_user(vcpu->arch.pfault_compare,
@@ -1408,6 +1410,8 @@ static void sync_regs(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
1408 vcpu->arch.pfault_token = kvm_run->s.regs.pft; 1410 vcpu->arch.pfault_token = kvm_run->s.regs.pft;
1409 vcpu->arch.pfault_select = kvm_run->s.regs.pfs; 1411 vcpu->arch.pfault_select = kvm_run->s.regs.pfs;
1410 vcpu->arch.pfault_compare = kvm_run->s.regs.pfc; 1412 vcpu->arch.pfault_compare = kvm_run->s.regs.pfc;
1413 if (vcpu->arch.pfault_token == KVM_S390_PFAULT_TOKEN_INVALID)
1414 kvm_clear_async_pf_completion_queue(vcpu);
1411 } 1415 }
1412 kvm_run->kvm_dirty_regs = 0; 1416 kvm_run->kvm_dirty_regs = 0;
1413} 1417}