Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dcf46b94 authored by Zhang, Yanmin's avatar Zhang, Yanmin Committed by Ingo Molnar
Browse files

perf & kvm: Clean up some of the guest profiling callback API details



Fix some build bug and programming style issues:

 - use valid C
 - fix up various style details

Signed-off-by: default avatarZhang Yanmin <yanmin_zhang@linux.intel.com>
Cc: Avi Kivity <avi@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Sheng Yang <sheng@linux.intel.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: oerg Roedel <joro@8bytes.org>
Cc: Jes Sorensen <Jes.Sorensen@redhat.com>
Cc: Gleb Natapov <gleb@redhat.com>
Cc: Zachary Amsden <zamsden@redhat.com>
Cc: zhiteng.huang@intel.com
Cc: tim.c.chen@intel.com
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
LKML-Reference: <1271729638.2078.624.camel@ymzhang.sh.intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a1645ce1
Loading
Loading
Loading
Loading
+14 −6
Original line number Original line Diff line number Diff line
@@ -1752,23 +1752,31 @@ void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int ski
unsigned long perf_instruction_pointer(struct pt_regs *regs)
unsigned long perf_instruction_pointer(struct pt_regs *regs)
{
{
	unsigned long ip;
	unsigned long ip;

	if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
	if (perf_guest_cbs && perf_guest_cbs->is_in_guest())
		ip = perf_guest_cbs->get_guest_ip();
		ip = perf_guest_cbs->get_guest_ip();
	else
	else
		ip = instruction_pointer(regs);
		ip = instruction_pointer(regs);

	return ip;
	return ip;
}
}


unsigned long perf_misc_flags(struct pt_regs *regs)
unsigned long perf_misc_flags(struct pt_regs *regs)
{
{
	int misc = 0;
	int misc = 0;

	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
	if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) {
		misc |= perf_guest_cbs->is_user_mode() ?
		if (perf_guest_cbs->is_user_mode())
			PERF_RECORD_MISC_GUEST_USER :
			misc |= PERF_RECORD_MISC_GUEST_USER;
			PERF_RECORD_MISC_GUEST_KERNEL;
		else
	} else
			misc |= PERF_RECORD_MISC_GUEST_KERNEL;
		misc |= user_mode(regs) ? PERF_RECORD_MISC_USER :
	} else {
			PERF_RECORD_MISC_KERNEL;
		if (user_mode(regs))
			misc |= PERF_RECORD_MISC_USER;
		else
			misc |= PERF_RECORD_MISC_KERNEL;
	}

	if (regs->flags & PERF_EFLAGS_EXACT)
	if (regs->flags & PERF_EFLAGS_EXACT)
		misc |= PERF_RECORD_MISC_EXACT;
		misc |= PERF_RECORD_MISC_EXACT;


+4 −0
Original line number Original line Diff line number Diff line
@@ -3776,16 +3776,20 @@ static int kvm_is_in_guest(void)
static int kvm_is_user_mode(void)
static int kvm_is_user_mode(void)
{
{
	int user_mode = 3;
	int user_mode = 3;

	if (percpu_read(current_vcpu))
	if (percpu_read(current_vcpu))
		user_mode = kvm_x86_ops->get_cpl(percpu_read(current_vcpu));
		user_mode = kvm_x86_ops->get_cpl(percpu_read(current_vcpu));

	return user_mode != 0;
	return user_mode != 0;
}
}


static unsigned long kvm_get_guest_ip(void)
static unsigned long kvm_get_guest_ip(void)
{
{
	unsigned long ip = 0;
	unsigned long ip = 0;

	if (percpu_read(current_vcpu))
	if (percpu_read(current_vcpu))
		ip = kvm_rip_read(percpu_read(current_vcpu));
		ip = kvm_rip_read(percpu_read(current_vcpu));

	return ip;
	return ip;
}
}


+4 −6
Original line number Original line Diff line number Diff line
@@ -941,10 +941,8 @@ static inline void perf_event_mmap(struct vm_area_struct *vma)
}
}


extern struct perf_guest_info_callbacks *perf_guest_cbs;
extern struct perf_guest_info_callbacks *perf_guest_cbs;
extern int perf_register_guest_info_callbacks(
extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
		struct perf_guest_info_callbacks *);
extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
extern int perf_unregister_guest_info_callbacks(
		struct perf_guest_info_callbacks *);


extern void perf_event_comm(struct task_struct *tsk);
extern void perf_event_comm(struct task_struct *tsk);
extern void perf_event_fork(struct task_struct *tsk);
extern void perf_event_fork(struct task_struct *tsk);
@@ -1016,9 +1014,9 @@ static inline void
perf_bp_event(struct perf_event *event, void *data)			{ }
perf_bp_event(struct perf_event *event, void *data)			{ }


static inline int perf_register_guest_info_callbacks
static inline int perf_register_guest_info_callbacks
(struct perf_guest_info_callbacks *) {return 0; }
(struct perf_guest_info_callbacks *callbacks) { return 0; }
static inline int perf_unregister_guest_info_callbacks
static inline int perf_unregister_guest_info_callbacks
(struct perf_guest_info_callbacks *) {return 0; }
(struct perf_guest_info_callbacks *callbacks) { return 0; }


static inline void perf_event_mmap(struct vm_area_struct *vma)		{ }
static inline void perf_event_mmap(struct vm_area_struct *vma)		{ }
static inline void perf_event_comm(struct task_struct *tsk)		{ }
static inline void perf_event_comm(struct task_struct *tsk)		{ }