Lines Matching refs:stimer

65 static void stimer_mark_pending(struct kvm_vcpu_hv_stimer *stimer,
224 struct kvm_vcpu_hv_stimer *stimer; in kvm_hv_notify_acked_sint() local
230 for (idx = 0; idx < ARRAY_SIZE(hv_vcpu->stimer); idx++) { in kvm_hv_notify_acked_sint()
231 stimer = &hv_vcpu->stimer[idx]; in kvm_hv_notify_acked_sint()
232 if (stimer->msg_pending && stimer->config.enable && in kvm_hv_notify_acked_sint()
233 !stimer->config.direct_mode && in kvm_hv_notify_acked_sint()
234 stimer->config.sintx == sint) in kvm_hv_notify_acked_sint()
235 stimer_mark_pending(stimer, false); in kvm_hv_notify_acked_sint()
587 static void stimer_mark_pending(struct kvm_vcpu_hv_stimer *stimer, in stimer_mark_pending() argument
590 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_mark_pending()
592 set_bit(stimer->index, in stimer_mark_pending()
599 static void stimer_cleanup(struct kvm_vcpu_hv_stimer *stimer) in stimer_cleanup() argument
601 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_cleanup()
603 trace_kvm_hv_stimer_cleanup(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_cleanup()
604 stimer->index); in stimer_cleanup()
606 hrtimer_cancel(&stimer->timer); in stimer_cleanup()
607 clear_bit(stimer->index, in stimer_cleanup()
609 stimer->msg_pending = false; in stimer_cleanup()
610 stimer->exp_time = 0; in stimer_cleanup()
615 struct kvm_vcpu_hv_stimer *stimer; in stimer_timer_callback() local
617 stimer = container_of(timer, struct kvm_vcpu_hv_stimer, timer); in stimer_timer_callback()
618 trace_kvm_hv_stimer_callback(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_timer_callback()
619 stimer->index); in stimer_timer_callback()
620 stimer_mark_pending(stimer, true); in stimer_timer_callback()
630 static int stimer_start(struct kvm_vcpu_hv_stimer *stimer) in stimer_start() argument
635 time_now = get_time_ref_counter(hv_stimer_to_vcpu(stimer)->kvm); in stimer_start()
638 if (stimer->config.periodic) { in stimer_start()
639 if (stimer->exp_time) { in stimer_start()
640 if (time_now >= stimer->exp_time) { in stimer_start()
643 div64_u64_rem(time_now - stimer->exp_time, in stimer_start()
644 stimer->count, &remainder); in stimer_start()
645 stimer->exp_time = in stimer_start()
646 time_now + (stimer->count - remainder); in stimer_start()
649 stimer->exp_time = time_now + stimer->count; in stimer_start()
652 hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_start()
653 stimer->index, in stimer_start()
654 time_now, stimer->exp_time); in stimer_start()
656 hrtimer_start(&stimer->timer, in stimer_start()
658 100 * (stimer->exp_time - time_now)), in stimer_start()
662 stimer->exp_time = stimer->count; in stimer_start()
663 if (time_now >= stimer->count) { in stimer_start()
670 stimer_mark_pending(stimer, false); in stimer_start()
674 trace_kvm_hv_stimer_start_one_shot(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_start()
675 stimer->index, in stimer_start()
676 time_now, stimer->count); in stimer_start()
678 hrtimer_start(&stimer->timer, in stimer_start()
679 ktime_add_ns(ktime_now, 100 * (stimer->count - time_now)), in stimer_start()
684 static int stimer_set_config(struct kvm_vcpu_hv_stimer *stimer, u64 config, in stimer_set_config() argument
688 old_config = {.as_uint64 = stimer->config.as_uint64}; in stimer_set_config()
689 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_set_config()
701 trace_kvm_hv_stimer_set_config(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_set_config()
702 stimer->index, config, host); in stimer_set_config()
704 stimer_cleanup(stimer); in stimer_set_config()
708 stimer->config.as_uint64 = new_config.as_uint64; in stimer_set_config()
710 if (stimer->config.enable) in stimer_set_config()
711 stimer_mark_pending(stimer, false); in stimer_set_config()
716 static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count, in stimer_set_count() argument
719 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_set_count()
725 trace_kvm_hv_stimer_set_count(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_set_count()
726 stimer->index, count, host); in stimer_set_count()
728 stimer_cleanup(stimer); in stimer_set_count()
729 stimer->count = count; in stimer_set_count()
731 if (stimer->count == 0) in stimer_set_count()
732 stimer->config.enable = 0; in stimer_set_count()
733 else if (stimer->config.auto_enable) in stimer_set_count()
734 stimer->config.enable = 1; in stimer_set_count()
737 if (stimer->config.enable) in stimer_set_count()
738 stimer_mark_pending(stimer, false); in stimer_set_count()
743 static int stimer_get_config(struct kvm_vcpu_hv_stimer *stimer, u64 *pconfig) in stimer_get_config() argument
745 *pconfig = stimer->config.as_uint64; in stimer_get_config()
749 static int stimer_get_count(struct kvm_vcpu_hv_stimer *stimer, u64 *pcount) in stimer_get_count() argument
751 *pcount = stimer->count; in stimer_get_count()
812 static int stimer_send_msg(struct kvm_vcpu_hv_stimer *stimer) in stimer_send_msg() argument
814 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_send_msg()
815 struct hv_message *msg = &stimer->msg; in stimer_send_msg()
823 bool no_retry = stimer->config.periodic; in stimer_send_msg()
825 payload->expiration_time = stimer->exp_time; in stimer_send_msg()
828 stimer->config.sintx, msg, in stimer_send_msg()
832 static int stimer_notify_direct(struct kvm_vcpu_hv_stimer *stimer) in stimer_notify_direct() argument
834 struct kvm_vcpu *vcpu = hv_stimer_to_vcpu(stimer); in stimer_notify_direct()
837 .vector = stimer->config.apic_vector in stimer_notify_direct()
845 static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer) in stimer_expiration() argument
847 int r, direct = stimer->config.direct_mode; in stimer_expiration()
849 stimer->msg_pending = true; in stimer_expiration()
851 r = stimer_send_msg(stimer); in stimer_expiration()
853 r = stimer_notify_direct(stimer); in stimer_expiration()
854 trace_kvm_hv_stimer_expiration(hv_stimer_to_vcpu(stimer)->vcpu_id, in stimer_expiration()
855 stimer->index, direct, r); in stimer_expiration()
857 stimer->msg_pending = false; in stimer_expiration()
858 if (!(stimer->config.periodic)) in stimer_expiration()
859 stimer->config.enable = 0; in stimer_expiration()
866 struct kvm_vcpu_hv_stimer *stimer; in kvm_hv_process_stimers() local
873 for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++) in kvm_hv_process_stimers()
875 stimer = &hv_vcpu->stimer[i]; in kvm_hv_process_stimers()
876 if (stimer->config.enable) { in kvm_hv_process_stimers()
877 exp_time = stimer->exp_time; in kvm_hv_process_stimers()
883 stimer_expiration(stimer); in kvm_hv_process_stimers()
886 if ((stimer->config.enable) && in kvm_hv_process_stimers()
887 stimer->count) { in kvm_hv_process_stimers()
888 if (!stimer->msg_pending) in kvm_hv_process_stimers()
889 stimer_start(stimer); in kvm_hv_process_stimers()
891 stimer_cleanup(stimer); in kvm_hv_process_stimers()
904 for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++) in kvm_hv_vcpu_uninit()
905 stimer_cleanup(&hv_vcpu->stimer[i]); in kvm_hv_vcpu_uninit()
936 static void stimer_prepare_msg(struct kvm_vcpu_hv_stimer *stimer) in stimer_prepare_msg() argument
938 struct hv_message *msg = &stimer->msg; in stimer_prepare_msg()
946 payload->timer_index = stimer->index; in stimer_prepare_msg()
951 static void stimer_init(struct kvm_vcpu_hv_stimer *stimer, int timer_index) in stimer_init() argument
953 memset(stimer, 0, sizeof(*stimer)); in stimer_init()
954 stimer->index = timer_index; in stimer_init()
955 hrtimer_init(&stimer->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); in stimer_init()
956 stimer->timer.function = stimer_timer_callback; in stimer_init()
957 stimer_prepare_msg(stimer); in stimer_init()
978 for (i = 0; i < ARRAY_SIZE(hv_vcpu->stimer); i++) in kvm_hv_vcpu_init()
979 stimer_init(&hv_vcpu->stimer[i], i); in kvm_hv_vcpu_init()