summaryrefslogtreecommitdiffstats
path: root/arch/x86/xen
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2011-08-24 09:54:24 -0700
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2011-08-24 09:54:24 -0700
commitf1c39625d63c9f8eba8f036429c10a9cb9e32920 (patch)
tree8ca13e0d5f9c0db22f9933c07a170d865a582fe3 /arch/x86/xen
parentfcb8ce5cfe30ca9ca5c9a79cdfe26d1993e65e0c (diff)
downloadlinux-f1c39625d63c9f8eba8f036429c10a9cb9e32920.tar.gz
linux-f1c39625d63c9f8eba8f036429c10a9cb9e32920.tar.bz2
linux-f1c39625d63c9f8eba8f036429c10a9cb9e32920.zip
xen: use non-tracing preempt in xen_clocksource_read()
The tracing code used sched_clock() to get tracing timestamps, which ends up calling xen_clocksource_read(). xen_clocksource_read() must disable preemption, but if preemption tracing is enabled, this results in infinite recursion. I've only noticed this when boot-time tracing tests are enabled, but it seems like a generic bug. It looks like it would also affect kvm_clocksource_read(). Reported-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Cc: Avi Kivity <avi@redhat.com> Cc: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/xen')
-rw-r--r--arch/x86/xen/time.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 5158c505bef9..163b4679556e 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -168,9 +168,10 @@ cycle_t xen_clocksource_read(void)
struct pvclock_vcpu_time_info *src;
cycle_t ret;
- src = &get_cpu_var(xen_vcpu)->time;
+ preempt_disable_notrace();
+ src = &__get_cpu_var(xen_vcpu)->time;
ret = pvclock_clocksource_read(src);
- put_cpu_var(xen_vcpu);
+ preempt_enable_notrace();
return ret;
}