x86/kvm/hyper-v: use stimer config definition from hyperv-tlfs.h
authorVitaly Kuznetsov <vkuznets@redhat.com>
Mon, 26 Nov 2018 15:47:30 +0000 (16:47 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Dec 2018 16:59:57 +0000 (17:59 +0100)
As a preparation to implementing Direct Mode for Hyper-V synthetic
timers switch to using stimer config definition from hyperv-tlfs.h.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/hyperv-tlfs.h
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/hyperv.c

index ce438d4..a2fa7ab 100644 (file)
@@ -723,12 +723,6 @@ struct hv_enlightened_vmcs {
 
 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL                     0xFFFF
 
-#define HV_STIMER_ENABLE               (1ULL << 0)
-#define HV_STIMER_PERIODIC             (1ULL << 1)
-#define HV_STIMER_LAZY                 (1ULL << 2)
-#define HV_STIMER_AUTOENABLE           (1ULL << 3)
-#define HV_STIMER_SINT(config)         (__u8)(((config) >> 16) & 0x0F)
-
 /* Define synthetic interrupt controller flag constants. */
 #define HV_EVENT_FLAGS_COUNT           (256 * 8)
 #define HV_EVENT_FLAGS_LONG_COUNT      (256 / sizeof(unsigned long))
index f5c2ce4..ddeddf2 100644 (file)
@@ -497,7 +497,7 @@ struct kvm_mtrr {
 struct kvm_vcpu_hv_stimer {
        struct hrtimer timer;
        int index;
-       u64 config;
+       union hv_stimer_config config;
        u64 count;
        u64 exp_time;
        struct hv_message msg;
index e3c0760..15849d2 100644 (file)
@@ -172,9 +172,8 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint)
        stimers_pending = 0;
        for (idx = 0; idx < ARRAY_SIZE(hv_vcpu->stimer); idx++) {
                stimer = &hv_vcpu->stimer[idx];
-               if (stimer->msg_pending &&
-                   (stimer->config & HV_STIMER_ENABLE) &&
-                   HV_STIMER_SINT(stimer->config) == sint) {
+               if (stimer->msg_pending && stimer->config.enable &&
+                   stimer->config.sintx == sint) {
                        set_bit(stimer->index,
                                hv_vcpu->stimer_pending_bitmap);
                        stimers_pending++;
@@ -468,7 +467,7 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer)
        time_now = get_time_ref_counter(stimer_to_vcpu(stimer)->kvm);
        ktime_now = ktime_get();
 
-       if (stimer->config & HV_STIMER_PERIODIC) {
+       if (stimer->config.periodic) {
                if (stimer->exp_time) {
                        if (time_now >= stimer->exp_time) {
                                u64 remainder;
@@ -517,13 +516,15 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer)
 static int stimer_set_config(struct kvm_vcpu_hv_stimer *stimer, u64 config,
                             bool host)
 {
+       union hv_stimer_config new_config = {.as_uint64 = config};
+
        trace_kvm_hv_stimer_set_config(stimer_to_vcpu(stimer)->vcpu_id,
                                       stimer->index, config, host);
 
        stimer_cleanup(stimer);
-       if ((stimer->config & HV_STIMER_ENABLE) && HV_STIMER_SINT(config) == 0)
-               config &= ~HV_STIMER_ENABLE;
-       stimer->config = config;
+       if (stimer->config.enable && new_config.sintx == 0)
+               new_config.enable = 0;
+       stimer->config.as_uint64 = new_config.as_uint64;
        stimer_mark_pending(stimer, false);
        return 0;
 }
@@ -537,16 +538,16 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count,
        stimer_cleanup(stimer);
        stimer->count = count;
        if (stimer->count == 0)
-               stimer->config &= ~HV_STIMER_ENABLE;
-       else if (stimer->config & HV_STIMER_AUTOENABLE)
-               stimer->config |= HV_STIMER_ENABLE;
+               stimer->config.enable = 0;
+       else if (stimer->config.auto_enable)
+               stimer->config.enable = 1;
        stimer_mark_pending(stimer, false);
        return 0;
 }
 
 static int stimer_get_config(struct kvm_vcpu_hv_stimer *stimer, u64 *pconfig)
 {
-       *pconfig = stimer->config;
+       *pconfig = stimer->config.as_uint64;
        return 0;
 }
 
@@ -624,12 +625,12 @@ static int stimer_send_msg(struct kvm_vcpu_hv_stimer *stimer)
         * To avoid piling up periodic ticks, don't retry message
         * delivery for them (within "lazy" lost ticks policy).
         */
-       bool no_retry = stimer->config & HV_STIMER_PERIODIC;
+       bool no_retry = stimer->config.periodic;
 
        payload->expiration_time = stimer->exp_time;
        payload->delivery_time = get_time_ref_counter(vcpu->kvm);
        return synic_deliver_msg(vcpu_to_synic(vcpu),
-                                HV_STIMER_SINT(stimer->config), msg,
+                                stimer->config.sintx, msg,
                                 no_retry);
 }
 
@@ -643,8 +644,8 @@ static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer)
                                       stimer->index, r);
        if (!r) {
                stimer->msg_pending = false;
-               if (!(stimer->config & HV_STIMER_PERIODIC))
-                       stimer->config &= ~HV_STIMER_ENABLE;
+               if (!(stimer->config.periodic))
+                       stimer->config.enable = 0;
        }
 }
 
@@ -658,7 +659,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu)
        for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++)
                if (test_and_clear_bit(i, hv_vcpu->stimer_pending_bitmap)) {
                        stimer = &hv_vcpu->stimer[i];
-                       if (stimer->config & HV_STIMER_ENABLE) {
+                       if (stimer->config.enable) {
                                exp_time = stimer->exp_time;
 
                                if (exp_time) {
@@ -668,7 +669,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu)
                                                stimer_expiration(stimer);
                                }
 
-                               if ((stimer->config & HV_STIMER_ENABLE) &&
+                               if ((stimer->config.enable) &&
                                    stimer->count) {
                                        if (!stimer->msg_pending)
                                                stimer_start(stimer);