| From avi@redhat.com Thu Jan 12 14:56:45 2012 |
| From: Avi Kivity <avi@redhat.com> |
| Date: Thu, 12 Jan 2012 12:39:51 +0200 |
| Subject: KVM guest: prevent tracing recursion with kvmclock |
| To: stable@vger.kernel.org |
| Cc: kvm@vger.kernel.org, Marcelo Tosatti <mtosatti@redhat.com> |
| Message-ID: <1326364794-18150-2-git-send-email-avi@redhat.com> |
| |
| From: Avi Kivity <avi@redhat.com> |
| |
| (cherry picked from commit 95ef1e52922cf75b1ea2eae54ef886f2cc47eecb) |
| |
| Prevent tracing of preempt_disable() in get_cpu_var() in |
| kvm_clock_read(). When CONFIG_DEBUG_PREEMPT is enabled, |
| preempt_disable/enable() are traced and this causes the function_graph |
| tracer to go into an infinite recursion. By open coding the |
| preempt_disable() around the get_cpu_var(), we can use the notrace |
| version which prevents preempt_disable/enable() from being traced and |
| prevents the recursion. |
| |
| Based on a similar patch for Xen from Jeremy Fitzhardinge. |
| |
| Tested-by: Gleb Natapov <gleb@redhat.com> |
| Acked-by: Steven Rostedt <rostedt@goodmis.org> |
| Signed-off-by: Avi Kivity <avi@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/x86/kernel/kvmclock.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/kernel/kvmclock.c |
| +++ b/arch/x86/kernel/kvmclock.c |
| @@ -74,9 +74,10 @@ static cycle_t kvm_clock_read(void) |
| struct pvclock_vcpu_time_info *src; |
| cycle_t ret; |
| |
| - src = &get_cpu_var(hv_clock); |
| + preempt_disable_notrace(); |
| + src = &__get_cpu_var(hv_clock); |
| ret = pvclock_clocksource_read(src); |
| - put_cpu_var(hv_clock); |
| + preempt_enable_notrace(); |
| return ret; |
| } |
| |