2019-04-18 06:22:52

by Mao Han

[permalink] [raw]
Subject: [PATCH 1/1] csky: add page fault perf event support

This patch add support for page fault count, major fault count
and minorfault count. Without this patch page faults are not
sampled for perf event.

Performance counter stats for '/usr/lib/perf-test/callchain_test':
0 page-faults # 0.000 K/sec

Signed-off-by: Mao Han <[email protected]>
---
arch/csky/mm/fault.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/arch/csky/mm/fault.c b/arch/csky/mm/fault.c
index e1725f8..d07141d 100644
--- a/arch/csky/mm/fault.c
+++ b/arch/csky/mm/fault.c
@@ -17,6 +17,7 @@
#include <linux/vt_kern.h>
#include <linux/extable.h>
#include <linux/uaccess.h>
+#include <linux/perf_event.h>

#include <asm/hardirq.h>
#include <asm/mmu_context.h>
@@ -106,6 +107,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
return;
}
#endif
+
+ perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
/*
* If we're in an interrupt or have no user
* context, we must not take the fault..
@@ -153,10 +156,15 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
goto bad_area;
BUG();
}
- if (fault & VM_FAULT_MAJOR)
+ if (fault & VM_FAULT_MAJOR) {
tsk->maj_flt++;
- else
+ perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs,
+ address);
+ } else {
tsk->min_flt++;
+ perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs,
+ address);
+ }

up_read(&mm->mmap_sem);
return;
--
2.7.4


2019-04-19 18:33:17

by Guo Ren

[permalink] [raw]
Subject: Re: [PATCH 1/1] csky: add page fault perf event support

Looks good, nice Job, Maomao

On Thu, Apr 18, 2019 at 02:20:40PM +0800, Mao Han wrote:
> This patch add support for page fault count, major fault count
> and minorfault count. Without this patch page faults are not
> sampled for perf event.
>
> Performance counter stats for '/usr/lib/perf-test/callchain_test':
> 0 page-faults # 0.000 K/sec
>
> Signed-off-by: Mao Han <[email protected]>
> ---
> arch/csky/mm/fault.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/arch/csky/mm/fault.c b/arch/csky/mm/fault.c
> index e1725f8..d07141d 100644
> --- a/arch/csky/mm/fault.c
> +++ b/arch/csky/mm/fault.c
> @@ -17,6 +17,7 @@
> #include <linux/vt_kern.h>
> #include <linux/extable.h>
> #include <linux/uaccess.h>
> +#include <linux/perf_event.h>
>
> #include <asm/hardirq.h>
> #include <asm/mmu_context.h>
> @@ -106,6 +107,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
> return;
> }
> #endif
> +
> + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
> /*
> * If we're in an interrupt or have no user
> * context, we must not take the fault..
> @@ -153,10 +156,15 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
> goto bad_area;
> BUG();
> }
> - if (fault & VM_FAULT_MAJOR)
> + if (fault & VM_FAULT_MAJOR) {
> tsk->maj_flt++;
> - else
> + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs,
> + address);
> + } else {
> tsk->min_flt++;
> + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs,
> + address);
> + }
>
> up_read(&mm->mmap_sem);
> return;
> --
> 2.7.4
>