Re: [PATCH v1 2/2] kvm/x86: Hyper-V SynIC timers tracepoints

2015-12-24 Thread Roman Kagan
On Wed, Dec 23, 2015 at 04:54:00PM +0300, Andrey Smetanin wrote:
> Trace the following Hyper SynIC timers events:
> * periodic timer start
> * one-shot timer start
> * timer callback
> * timer expiration and message delivery result
> * timer config setup
> * timer count setup
> * timer cleanup
> 
> Signed-off-by: Andrey Smetanin 
> CC: Gleb Natapov 
> CC: Paolo Bonzini 
> CC: Roman Kagan 
> CC: Denis V. Lunev 
> CC: [email protected]
> ---
>  arch/x86/kvm/hyperv.c |  27 +++-
>  arch/x86/kvm/trace.h  | 170 
> ++
>  2 files changed, 196 insertions(+), 1 deletion(-)

Reviewed-by: Roman Kagan 
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v1 2/2] kvm/x86: Hyper-V SynIC timers tracepoints

2015-12-23 Thread Andrey Smetanin
Trace the following Hyper SynIC timers events:
* periodic timer start
* one-shot timer start
* timer callback
* timer expiration and message delivery result
* timer config setup
* timer count setup
* timer cleanup

Signed-off-by: Andrey Smetanin 
CC: Gleb Natapov 
CC: Paolo Bonzini 
CC: Roman Kagan 
CC: Denis V. Lunev 
CC: [email protected]
---
 arch/x86/kvm/hyperv.c |  27 +++-
 arch/x86/kvm/trace.h  | 170 ++
 2 files changed, 196 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
index e69a823..d50675a 100644
--- a/arch/x86/kvm/hyperv.c
+++ b/arch/x86/kvm/hyperv.c
@@ -405,6 +405,9 @@ static void stimer_cleanup(struct kvm_vcpu_hv_stimer 
*stimer)
 {
struct kvm_vcpu *vcpu = stimer_to_vcpu(stimer);
 
+   trace_kvm_hv_stimer_cleanup(stimer_to_vcpu(stimer)->vcpu_id,
+   stimer->index);
+
hrtimer_cancel(&stimer->timer);
clear_bit(stimer->index,
  vcpu_to_hv_vcpu(vcpu)->stimer_pending_bitmap);
@@ -417,6 +420,8 @@ static enum hrtimer_restart stimer_timer_callback(struct 
hrtimer *timer)
struct kvm_vcpu_hv_stimer *stimer;
 
stimer = container_of(timer, struct kvm_vcpu_hv_stimer, timer);
+   trace_kvm_hv_stimer_callback(stimer_to_vcpu(stimer)->vcpu_id,
+stimer->index);
stimer_mark_pending(stimer, true);
 
return HRTIMER_NORESTART;
@@ -446,6 +451,11 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer)
} else
stimer->exp_time = time_now + stimer->count;
 
+   trace_kvm_hv_stimer_start_periodic(
+   stimer_to_vcpu(stimer)->vcpu_id,
+   stimer->index,
+   time_now, stimer->exp_time);
+
hrtimer_start(&stimer->timer,
  ktime_add_ns(ktime_now,
   100 * (stimer->exp_time - time_now)),
@@ -464,6 +474,10 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer)
return 0;
}
 
+   trace_kvm_hv_stimer_start_one_shot(stimer_to_vcpu(stimer)->vcpu_id,
+  stimer->index,
+  time_now, stimer->count);
+
hrtimer_start(&stimer->timer,
  ktime_add_ns(ktime_now, 100 * (stimer->count - time_now)),
  HRTIMER_MODE_ABS);
@@ -473,6 +487,9 @@ 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)
 {
+   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;
@@ -484,6 +501,9 @@ static int stimer_set_config(struct kvm_vcpu_hv_stimer 
*stimer, u64 config,
 static int stimer_set_count(struct kvm_vcpu_hv_stimer *stimer, u64 count,
bool host)
 {
+   trace_kvm_hv_stimer_set_count(stimer_to_vcpu(stimer)->vcpu_id,
+ stimer->index, count, host);
+
stimer_cleanup(stimer);
stimer->count = count;
if (stimer->count == 0)
@@ -562,8 +582,13 @@ static int stimer_send_msg(struct kvm_vcpu_hv_stimer 
*stimer)
 
 static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer)
 {
+   int r;
+
stimer->msg_pending = true;
-   if (!stimer_send_msg(stimer)) {
+   r = stimer_send_msg(stimer);
+   trace_kvm_hv_stimer_expiration(stimer_to_vcpu(stimer)->vcpu_id,
+  stimer->index, r);
+   if (!r) {
stimer->msg_pending = false;
if (!(stimer->config & HV_STIMER_PERIODIC))
stimer->config |= ~HV_STIMER_ENABLE;
diff --git a/arch/x86/kvm/trace.h b/arch/x86/kvm/trace.h
index 5be9c13..41010d8 100644
--- a/arch/x86/kvm/trace.h
+++ b/arch/x86/kvm/trace.h
@@ -1118,6 +1118,176 @@ TRACE_EVENT(kvm_hv_synic_set_msr,
  __entry->vcpu_id, __entry->msr, __entry->data, __entry->host)
 );
 
+/*
+ * Tracepoint for stimer_set_config.
+ */
+TRACE_EVENT(kvm_hv_stimer_set_config,
+   TP_PROTO(int vcpu_id, int timer_index, u64 config, bool host),
+   TP_ARGS(vcpu_id, timer_index, config, host),
+
+   TP_STRUCT__entry(
+   __field(int, vcpu_id)
+   __field(int, timer_index)
+   __field(u64, config)
+   __field(bool, host)
+   ),
+
+   TP_fast_assign(
+   __entry->vcpu_id = vcpu_id;
+   __entry->timer_index = timer_index;
+   __entry->config = config;
+   __entry->hos