Commit 6a058a1e authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini

x86/kvm/hyper-v: use stimer config definition from hyperv-tlfs.h

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: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 0aa67255
...@@ -723,12 +723,6 @@ struct hv_enlightened_vmcs { ...@@ -723,12 +723,6 @@ struct hv_enlightened_vmcs {
#define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL 0xFFFF #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 synthetic interrupt controller flag constants. */
#define HV_EVENT_FLAGS_COUNT (256 * 8) #define HV_EVENT_FLAGS_COUNT (256 * 8)
#define HV_EVENT_FLAGS_LONG_COUNT (256 / sizeof(unsigned long)) #define HV_EVENT_FLAGS_LONG_COUNT (256 / sizeof(unsigned long))
......
...@@ -497,7 +497,7 @@ struct kvm_mtrr { ...@@ -497,7 +497,7 @@ struct kvm_mtrr {
struct kvm_vcpu_hv_stimer { struct kvm_vcpu_hv_stimer {
struct hrtimer timer; struct hrtimer timer;
int index; int index;
u64 config; union hv_stimer_config config;
u64 count; u64 count;
u64 exp_time; u64 exp_time;
struct hv_message msg; struct hv_message msg;
......
...@@ -172,9 +172,8 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint) ...@@ -172,9 +172,8 @@ static void kvm_hv_notify_acked_sint(struct kvm_vcpu *vcpu, u32 sint)
stimers_pending = 0; stimers_pending = 0;
for (idx = 0; idx < ARRAY_SIZE(hv_vcpu->stimer); idx++) { for (idx = 0; idx < ARRAY_SIZE(hv_vcpu->stimer); idx++) {
stimer = &hv_vcpu->stimer[idx]; stimer = &hv_vcpu->stimer[idx];
if (stimer->msg_pending && if (stimer->msg_pending && stimer->config.enable &&
(stimer->config & HV_STIMER_ENABLE) && stimer->config.sintx == sint) {
HV_STIMER_SINT(stimer->config) == sint) {
set_bit(stimer->index, set_bit(stimer->index,
hv_vcpu->stimer_pending_bitmap); hv_vcpu->stimer_pending_bitmap);
stimers_pending++; stimers_pending++;
...@@ -468,7 +467,7 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer) ...@@ -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); time_now = get_time_ref_counter(stimer_to_vcpu(stimer)->kvm);
ktime_now = ktime_get(); ktime_now = ktime_get();
if (stimer->config & HV_STIMER_PERIODIC) { if (stimer->config.periodic) {
if (stimer->exp_time) { if (stimer->exp_time) {
if (time_now >= stimer->exp_time) { if (time_now >= stimer->exp_time) {
u64 remainder; u64 remainder;
...@@ -517,13 +516,15 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer) ...@@ -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, static int stimer_set_config(struct kvm_vcpu_hv_stimer *stimer, u64 config,
bool host) bool host)
{ {
union hv_stimer_config new_config = {.as_uint64 = config};
trace_kvm_hv_stimer_set_config(stimer_to_vcpu(stimer)->vcpu_id, trace_kvm_hv_stimer_set_config(stimer_to_vcpu(stimer)->vcpu_id,
stimer->index, config, host); stimer->index, config, host);
stimer_cleanup(stimer); stimer_cleanup(stimer);
if ((stimer->config & HV_STIMER_ENABLE) && HV_STIMER_SINT(config) == 0) if (stimer->config.enable && new_config.sintx == 0)
config &= ~HV_STIMER_ENABLE; new_config.enable = 0;
stimer->config = config; stimer->config.as_uint64 = new_config.as_uint64;
stimer_mark_pending(stimer, false); stimer_mark_pending(stimer, false);
return 0; return 0;
} }
...@@ -537,16 +538,16 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count, ...@@ -537,16 +538,16 @@ static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count,
stimer_cleanup(stimer); stimer_cleanup(stimer);
stimer->count = count; stimer->count = count;
if (stimer->count == 0) if (stimer->count == 0)
stimer->config &= ~HV_STIMER_ENABLE; stimer->config.enable = 0;
else if (stimer->config & HV_STIMER_AUTOENABLE) else if (stimer->config.auto_enable)
stimer->config |= HV_STIMER_ENABLE; stimer->config.enable = 1;
stimer_mark_pending(stimer, false); stimer_mark_pending(stimer, false);
return 0; return 0;
} }
static int stimer_get_config(struct kvm_vcpu_hv_stimer *stimer, u64 *pconfig) static int stimer_get_config(struct kvm_vcpu_hv_stimer *stimer, u64 *pconfig)
{ {
*pconfig = stimer->config; *pconfig = stimer->config.as_uint64;
return 0; return 0;
} }
...@@ -624,12 +625,12 @@ static int stimer_send_msg(struct kvm_vcpu_hv_stimer *stimer) ...@@ -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 * To avoid piling up periodic ticks, don't retry message
* delivery for them (within "lazy" lost ticks policy). * 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->expiration_time = stimer->exp_time;
payload->delivery_time = get_time_ref_counter(vcpu->kvm); payload->delivery_time = get_time_ref_counter(vcpu->kvm);
return synic_deliver_msg(vcpu_to_synic(vcpu), return synic_deliver_msg(vcpu_to_synic(vcpu),
HV_STIMER_SINT(stimer->config), msg, stimer->config.sintx, msg,
no_retry); no_retry);
} }
...@@ -643,8 +644,8 @@ static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer) ...@@ -643,8 +644,8 @@ static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer)
stimer->index, r); stimer->index, r);
if (!r) { if (!r) {
stimer->msg_pending = false; stimer->msg_pending = false;
if (!(stimer->config & HV_STIMER_PERIODIC)) if (!(stimer->config.periodic))
stimer->config &= ~HV_STIMER_ENABLE; stimer->config.enable = 0;
} }
} }
...@@ -658,7 +659,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu) ...@@ -658,7 +659,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu)
for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++) for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++)
if (test_and_clear_bit(i, hv_vcpu->stimer_pending_bitmap)) { if (test_and_clear_bit(i, hv_vcpu->stimer_pending_bitmap)) {
stimer = &hv_vcpu->stimer[i]; stimer = &hv_vcpu->stimer[i];
if (stimer->config & HV_STIMER_ENABLE) { if (stimer->config.enable) {
exp_time = stimer->exp_time; exp_time = stimer->exp_time;
if (exp_time) { if (exp_time) {
...@@ -668,7 +669,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu) ...@@ -668,7 +669,7 @@ void kvm_hv_process_stimers(struct kvm_vcpu *vcpu)
stimer_expiration(stimer); stimer_expiration(stimer);
} }
if ((stimer->config & HV_STIMER_ENABLE) && if ((stimer->config.enable) &&
stimer->count) { stimer->count) {
if (!stimer->msg_pending) if (!stimer->msg_pending)
stimer_start(stimer); stimer_start(stimer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment