Peter Xu <peterx@xxxxxxxxxx> 於 2020年6月27日 週六 上午6:31寫道: > > Use the general page fault accounting by passing regs into handle_mm_fault(). > It naturally solve the issue of multiple page fault accounting when page fault > retry happened. > > Fix PERF_COUNT_SW_PAGE_FAULTS perf event manually for page fault retries, by > moving it before taking mmap_sem. > > CC: Nick Hu <nickhu@xxxxxxxxxxxxx> > CC: Greentime Hu <green.hu@xxxxxxxxx> > CC: Vincent Chen <deanbo422@xxxxxxxxx> > Signed-off-by: Peter Xu <peterx@xxxxxxxxxx> > --- > arch/nds32/mm/fault.c | 19 +++---------------- > 1 file changed, 3 insertions(+), 16 deletions(-) > > diff --git a/arch/nds32/mm/fault.c b/arch/nds32/mm/fault.c > index 22527129025c..e7344440623c 100644 > --- a/arch/nds32/mm/fault.c > +++ b/arch/nds32/mm/fault.c > @@ -122,6 +122,8 @@ void do_page_fault(unsigned long entry, unsigned long addr, > if (unlikely(faulthandler_disabled() || !mm)) > goto no_context; > > + perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); > + > /* > * As per x86, we may deadlock here. However, since the kernel only > * validly references user space from well defined areas of the code, > @@ -207,7 +209,7 @@ void do_page_fault(unsigned long entry, unsigned long addr, > * the fault. > */ > > - fault = handle_mm_fault(vma, addr, flags, NULL); > + fault = handle_mm_fault(vma, addr, flags, regs); > > /* > * If we need to retry but a fatal signal is pending, handle the > @@ -229,22 +231,7 @@ void do_page_fault(unsigned long entry, unsigned long addr, > goto bad_area; > } > > - /* > - * Major/minor page fault accounting is only done on the initial > - * attempt. If we go through a retry, it is extremely likely that the > - * page will be found in page cache at that point. > - */ > - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); > if (flags & FAULT_FLAG_ALLOW_RETRY) { > - if (fault & VM_FAULT_MAJOR) { > - tsk->maj_flt++; > - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, > - 1, regs, addr); > - } else { > - tsk->min_flt++; > - perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, > - 1, regs, addr); > - } > if (fault & VM_FAULT_RETRY) { > flags |= FAULT_FLAG_TRIED; > Hi Peter, Thank you. Acked-by: Greentime Hu <green.hu@xxxxxxxxx>