aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2010-04-23 06:49:06 -0400
committerAvi Kivity <avi@redhat.com>2010-05-17 05:19:15 -0400
commit8d3b9323095ae977406c7f4e73c9aa0f47682cc2 (patch)
tree43ebc414eb8401e8bde250242c9c5d2572e43e70
parentd14769377a247d4e7b570592a090474c8a059938 (diff)
parent6eca8cc35b50af1037bc919106dd6dd332c959c2 (diff)
Merge remote branch 'tip/perf/core'
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--arch/x86/kernel/cpu/perf_event.c20
-rw-r--r--arch/x86/kvm/x86.c4
-rw-r--r--include/linux/perf_event.h10
-rw-r--r--tools/perf/util/probe-event.c2
4 files changed, 23 insertions, 13 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index 2ea78abf69d9..7de70613e6c3 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1752,23 +1752,31 @@ void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int ski
1752unsigned long perf_instruction_pointer(struct pt_regs *regs) 1752unsigned long perf_instruction_pointer(struct pt_regs *regs)
1753{ 1753{
1754 unsigned long ip; 1754 unsigned long ip;
1755
1755 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) 1756 if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
1756 ip = perf_guest_cbs->get_guest_ip(); 1757 ip = perf_guest_cbs->get_guest_ip();
1757 else 1758 else
1758 ip = instruction_pointer(regs); 1759 ip = instruction_pointer(regs);
1760
1759 return ip; 1761 return ip;
1760} 1762}
1761 1763
1762unsigned long perf_misc_flags(struct pt_regs *regs) 1764unsigned long perf_misc_flags(struct pt_regs *regs)
1763{ 1765{
1764 int misc = 0; 1766 int misc = 0;
1767
1765 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { 1768 if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
1766 misc |= perf_guest_cbs->is_user_mode() ? 1769 if (perf_guest_cbs->is_user_mode())
1767 PERF_RECORD_MISC_GUEST_USER : 1770 misc |= PERF_RECORD_MISC_GUEST_USER;
1768 PERF_RECORD_MISC_GUEST_KERNEL; 1771 else
1769 } else 1772 misc |= PERF_RECORD_MISC_GUEST_KERNEL;
1770 misc |= user_mode(regs) ? PERF_RECORD_MISC_USER : 1773 } else {
1771 PERF_RECORD_MISC_KERNEL; 1774 if (user_mode(regs))
1775 misc |= PERF_RECORD_MISC_USER;
1776 else
1777 misc |= PERF_RECORD_MISC_KERNEL;
1778 }
1779
1772 if (regs->flags & PERF_EFLAGS_EXACT) 1780 if (regs->flags & PERF_EFLAGS_EXACT)
1773 misc |= PERF_RECORD_MISC_EXACT; 1781 misc |= PERF_RECORD_MISC_EXACT;
1774 1782
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index cf37ac6644e0..848c814e8c3c 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3965,16 +3965,20 @@ static int kvm_is_in_guest(void)
3965static int kvm_is_user_mode(void) 3965static int kvm_is_user_mode(void)
3966{ 3966{
3967 int user_mode = 3; 3967 int user_mode = 3;
3968
3968 if (percpu_read(current_vcpu)) 3969 if (percpu_read(current_vcpu))
3969 user_mode = kvm_x86_ops->get_cpl(percpu_read(current_vcpu)); 3970 user_mode = kvm_x86_ops->get_cpl(percpu_read(current_vcpu));
3971
3970 return user_mode != 0; 3972 return user_mode != 0;
3971} 3973}
3972 3974
3973static unsigned long kvm_get_guest_ip(void) 3975static unsigned long kvm_get_guest_ip(void)
3974{ 3976{
3975 unsigned long ip = 0; 3977 unsigned long ip = 0;
3978
3976 if (percpu_read(current_vcpu)) 3979 if (percpu_read(current_vcpu))
3977 ip = kvm_rip_read(percpu_read(current_vcpu)); 3980 ip = kvm_rip_read(percpu_read(current_vcpu));
3981
3978 return ip; 3982 return ip;
3979} 3983}
3980 3984
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 24de5f181a41..ace31fbac513 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -941,10 +941,8 @@ static inline void perf_event_mmap(struct vm_area_struct *vma)
941} 941}
942 942
943extern struct perf_guest_info_callbacks *perf_guest_cbs; 943extern struct perf_guest_info_callbacks *perf_guest_cbs;
944extern int perf_register_guest_info_callbacks( 944extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
945 struct perf_guest_info_callbacks *); 945extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
946extern int perf_unregister_guest_info_callbacks(
947 struct perf_guest_info_callbacks *);
948 946
949extern void perf_event_comm(struct task_struct *tsk); 947extern void perf_event_comm(struct task_struct *tsk);
950extern void perf_event_fork(struct task_struct *tsk); 948extern void perf_event_fork(struct task_struct *tsk);
@@ -1016,9 +1014,9 @@ static inline void
1016perf_bp_event(struct perf_event *event, void *data) { } 1014perf_bp_event(struct perf_event *event, void *data) { }
1017 1015
1018static inline int perf_register_guest_info_callbacks 1016static inline int perf_register_guest_info_callbacks
1019(struct perf_guest_info_callbacks *) {return 0; } 1017(struct perf_guest_info_callbacks *callbacks) { return 0; }
1020static inline int perf_unregister_guest_info_callbacks 1018static inline int perf_unregister_guest_info_callbacks
1021(struct perf_guest_info_callbacks *) {return 0; } 1019(struct perf_guest_info_callbacks *callbacks) { return 0; }
1022 1020
1023static inline void perf_event_mmap(struct vm_area_struct *vma) { } 1021static inline void perf_event_mmap(struct vm_area_struct *vma) { }
1024static inline void perf_event_comm(struct task_struct *tsk) { } 1022static inline void perf_event_comm(struct task_struct *tsk) { }
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 3967f8f63d0d..4fb480367c3e 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1263,7 +1263,7 @@ static struct strlist *get_kprobe_trace_event_names(int fd, bool include_group)
1263 1263
1264static int write_kprobe_trace_event(int fd, struct kprobe_trace_event *tev) 1264static int write_kprobe_trace_event(int fd, struct kprobe_trace_event *tev)
1265{ 1265{
1266 int ret; 1266 int ret = 0;
1267 char *buf = synthesize_kprobe_trace_command(tev); 1267 char *buf = synthesize_kprobe_trace_command(tev);
1268 1268
1269 if (!buf) { 1269 if (!buf) {