Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755325AbbDKKmB (ORCPT ); Sat, 11 Apr 2015 06:42:01 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:50571 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753579AbbDKKl6 (ORCPT ); Sat, 11 Apr 2015 06:41:58 -0400 Message-ID: <5528FA2B.8080400@huawei.com> Date: Sat, 11 Apr 2015 18:40:43 +0800 From: Xie XiuQi User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Naoya Horiguchi CC: "rostedt@goodmis.org" , "mingo@redhat.com" , "akpm@linux-foundation.org" , "kirill.shutemov@linux.intel.com" , "koct9i@gmail.com" , "hpa@linux.intel.com" , "hannes@cmpxchg.org" , "iamjoonsoo.kim@lge.com" , "luto@amacapital.net" , "nasa4836@gmail.com" , "gong.chen@linux.intel.com" , "bhelgaas@google.com" , "bp@suse.de" , "tony.luck@intel.com" , "linux-kernel@vger.kernel.org" , "linux-mm@kvack.org" Subject: Re: [RFC PATCH v3 2/2] tracing: add trace event for memory-failure References: <1428404731-21565-1-git-send-email-xiexiuqi@huawei.com> <1428404731-21565-3-git-send-email-xiexiuqi@huawei.com> <20150408013522.GA24617@hori1.linux.bs1.fc.nec.co.jp> In-Reply-To: <20150408013522.GA24617@hori1.linux.bs1.fc.nec.co.jp> Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.17.191] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6318 Lines: 197 On 2015/4/8 9:35, Naoya Horiguchi wrote: > On Tue, Apr 07, 2015 at 07:05:31PM +0800, Xie XiuQi wrote: >> RAS user space tools like rasdaemon which base on trace event, could >> receive mce error event, but no memory recovery result event. So, I >> want to add this event to make this scenario complete. >> >> This patch add a event at ras group for memory-failure. >> >> The output like below: >> # tracer: nop >> # >> # entries-in-buffer/entries-written: 2/2 #P:24 >> # >> # _-----=> irqs-off >> # / _----=> need-resched >> # | / _---=> hardirq/softirq >> # || / _--=> preempt-depth >> # ||| / delay >> # TASK-PID CPU# |||| TIMESTAMP FUNCTION >> # | | | |||| | | >> mce-inject-13150 [001] .... 277.019359: memory_failure_event: pfn 0x19869: recovery action for free buddy page: Delayed >> >> >> Cc: Tony Luck >> Cc: Steven Rostedt >> Signed-off-by: Xie XiuQi >> --- >> include/ras/ras_event.h | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ >> kernel/trace/trace.c | 2 +- >> mm/memory-failure.c | 2 ++ >> 3 files changed, 86 insertions(+), 1 deletion(-) >> >> diff --git a/include/ras/ras_event.h b/include/ras/ras_event.h >> index 79abb9c..52c75f2 100644 >> --- a/include/ras/ras_event.h >> +++ b/include/ras/ras_event.h >> @@ -11,6 +11,7 @@ >> #include >> #include >> #include >> +#include >> >> /* >> * MCE Extended Error Log trace event >> @@ -232,6 +233,88 @@ TRACE_EVENT(aer_event, >> __print_flags(__entry->status, "|", aer_uncorrectable_errors)) >> ); >> >> +/* >> + * memory-failure recovery action result event >> + * >> + * unsigned long pfn - Page Number of the corrupted page > > Hi XiuQi, > > I think "Page Frame Number" is better. OK, I will > > And embracing these definition code with #ifdef CONFIG_MEMORY_FAILURE might > be helpful if it reduces binary size for !CONFIG_MEMORY_FAILURE build? Sorry for reply late. I'll do it at next version. Thanks, Xie XiuQi > > Thanks, > Naoya Horiguchi > >> + * int type - Page types of the corrupted page >> + * int result - Result of recovery action >> + */ >> + >> +#define MF_ACTION_RESULT \ >> + EM ( MF_IGNORED, "Ignord" ) \ >> + EM ( MF_FAILED, "Failed" ) \ >> + EM ( MF_DELAYED, "Delayed" ) \ >> + EMe ( MF_RECOVERED, "Recovered" ) >> + >> +#define MF_PAGE_TYPE \ >> + EM ( MF_KERNEL, "reserved kernel page" ) \ >> + EM ( MF_KERNEL_HIGH_ORDER, "high-order kernel page" ) \ >> + EM ( MF_SLAB, "kernel slab page" ) \ >> + EM ( MF_DIFFERENT_COMPOUND, "different compound page after locking" ) \ >> + EM ( MF_POISONED_HUGE, "huge page already hardware poisoned" ) \ >> + EM ( MF_HUGE, "huge page" ) \ >> + EM ( MF_FREE_HUGE, "free huge page" ) \ >> + EM ( MF_UNMAP_FAILED, "unmapping failed page" ) \ >> + EM ( MF_DIRTY_SWAPCACHE, "dirty swapcache page" ) \ >> + EM ( MF_CLEAN_SWAPCACHE, "clean swapcache page" ) \ >> + EM ( MF_DIRTY_MLOCKED_LRU, "dirty mlocked LRU page" ) \ >> + EM ( MF_CLEAN_MLOCKED_LRU, "clean mlocked LRU page" ) \ >> + EM ( MF_DIRTY_UNEVICTABLE_LRU, "dirty unevictable LRU page" ) \ >> + EM ( MF_CLEAN_UNEVICTABLE_LRU, "clean unevictable LRU page" ) \ >> + EM ( MF_DIRTY_LRU, "dirty LRU page" ) \ >> + EM ( MF_CLEAN_LRU, "clean LRU page" ) \ >> + EM ( MF_TRUNCATED_LRU, "already truncated LRU page" ) \ >> + EM ( MF_BUDDY, "free buddy page" ) \ >> + EM ( MF_BUDDY_2ND, "free buddy page (2nd try)" ) \ >> + EMe ( MF_UNKNOWN, "unknown page" ) >> + >> +/* >> + * First define the enums in MM_ACTION_RESULT to be exported to userspace >> + * via TRACE_DEFINE_ENUM(). >> + */ >> +#undef EM >> +#undef EMe >> +#define EM(a,b) TRACE_DEFINE_ENUM(a); >> +#define EMe(a,b) TRACE_DEFINE_ENUM(a); >> + >> +MF_ACTION_RESULT >> +MF_PAGE_TYPE >> + >> +/* >> + * Now redefine the EM() and EMe() macros to map the enums to the strings >> + * that will be printed in the output. >> + */ >> +#undef EM >> +#undef EMe >> +#define EM(a,b) { a, b }, >> +#define EMe(a,b) { a, b } >> + >> +TRACE_EVENT(memory_failure_event, >> + TP_PROTO(unsigned long pfn, >> + int type, >> + int result), >> + >> + TP_ARGS(pfn, type, result), >> + >> + TP_STRUCT__entry( >> + __field(unsigned long, pfn) >> + __field(int, type) >> + __field(int, result) >> + ), >> + >> + TP_fast_assign( >> + __entry->pfn = pfn; >> + __entry->type = type; >> + __entry->result = result; >> + ), >> + >> + TP_printk("pfn %#lx: recovery action for %s: %s", >> + __entry->pfn, >> + __print_symbolic(__entry->type, MF_PAGE_TYPE), >> + __print_symbolic(__entry->result, MF_ACTION_RESULT) >> + ) >> +); >> #endif /* _TRACE_HW_EVENT_MC_H */ >> >> /* This part must be outside protection */ >> diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c >> index 25334e7..f5e8856 100644 >> --- a/kernel/trace/trace.c >> +++ b/kernel/trace/trace.c >> @@ -6776,7 +6776,7 @@ static struct notifier_block trace_module_nb = { >> }; >> #endif >> >> -static __init int tracer_init_debugfs(void) >> +static __init int tracer_init_tracefs(void) >> { >> struct dentry *d_tracer; >> >> diff --git a/mm/memory-failure.c b/mm/memory-failure.c >> index 34e9c65..d118af8 100644 >> --- a/mm/memory-failure.c >> +++ b/mm/memory-failure.c >> @@ -850,6 +850,8 @@ static struct page_state { >> */ >> static void action_result(unsigned long pfn, int type, int result) >> { >> + trace_memory_failure_event(pfn, type, result); >> + >> pr_err("MCE %#lx: recovery action for %s: %s\n", >> pfn, action_page_type[type], action_name[result]); >> } >> -- >> 1.8.3.1 >> -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > > . > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/