From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753671Ab2GUCWE (ORCPT ); Fri, 20 Jul 2012 22:22:04 -0400 Received: from hrndva-omtalb.mail.rr.com ([71.74.56.122]:28027 "EHLO hrndva-omtalb.mail.rr.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752104Ab2GUCVK (ORCPT ); Fri, 20 Jul 2012 22:21:10 -0400 X-Authority-Analysis: v=2.0 cv=StQSGYy0 c=1 sm=0 a=s5Htg7xnQOKvHEu9STBOug==:17 a=OpT9cpI26MMA:10 a=Ciwy3NGCPMMA:10 a=iN743hZM_R4A:10 a=5SG0PmZfjMsA:10 a=bbbx4UPp9XUA:10 a=meVymXHHAAAA:8 a=20KFwNOVAAAA:8 a=gRYtyi3C0LEDaDZG5tEA:9 a=QEXdDO2ut3YA:10 a=jEp0ucaQiEUA:10 a=jeBq3FmKZ4MA:10 a=Y8ZmLAAtlNnELQHCeYQA:9 a=s5Htg7xnQOKvHEu9STBOug==:117 X-Cloudmark-Score: 0 X-Originating-IP: 72.230.195.127 Message-Id: <20120721022109.971524546@goodmis.org> User-Agent: quilt/0.60-1 Date: Fri, 20 Jul 2012 22:19:55 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Andrew Morton , Masami Hiramatsu , Frederic Weisbecker , Thomas Gleixner , "H. Peter Anvin" Subject: [PATCH 12/19] ftrace: Add selftest to test function save-regs support References: <20120721021943.274162381@goodmis.org> Content-Disposition: inline; filename=0012-ftrace-Add-selftest-to-test-function-save-regs-suppo.patch Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature"; boundary="00GvhwF7k39YY" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --00GvhwF7k39YY Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable From: Steven Rostedt Add selftests to test the save-regs functionality of ftrace. If the arch supports saving regs, then it will make sure that regs is at least not NULL in the callback. If the arch does not support saving regs, it makes sure that the registering of the ftrace_ops that requests saving regs fails. It then tests the registering of the ftrace_ops succeeds if the 'IF_SUPPORTED' flag is set. Then it makes sure that the regs passed to the function is NULL. Signed-off-by: Steven Rostedt --- kernel/trace/trace.h | 2 +- kernel/trace/trace_selftest.c | 114 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 55e1f7f..593debe 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -472,11 +472,11 @@ extern void trace_find_cmdline(int pid, char comm[]); =20 #ifdef CONFIG_DYNAMIC_FTRACE extern unsigned long ftrace_update_tot_cnt; +#endif #define DYN_FTRACE_TEST_NAME trace_selftest_dynamic_test_func extern int DYN_FTRACE_TEST_NAME(void); #define DYN_FTRACE_TEST_NAME2 trace_selftest_dynamic_test_func2 extern int DYN_FTRACE_TEST_NAME2(void); -#endif =20 extern int ring_buffer_expanded; extern bool tracing_selftest_disabled; diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 86422f9..1003a4d 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -543,6 +543,116 @@ out: # define trace_selftest_function_recursion() ({ 0; }) #endif /* CONFIG_DYNAMIC_FTRACE */ =20 +static enum { + TRACE_SELFTEST_REGS_START, + TRACE_SELFTEST_REGS_FOUND, + TRACE_SELFTEST_REGS_NOT_FOUND, +} trace_selftest_regs_stat; + +static void trace_selftest_test_regs_func(unsigned long ip, + unsigned long pip, + struct ftrace_ops *op, + struct pt_regs *pt_regs) +{ + if (pt_regs) + trace_selftest_regs_stat =3D TRACE_SELFTEST_REGS_FOUND; + else + trace_selftest_regs_stat =3D TRACE_SELFTEST_REGS_NOT_FOUND; +} + +static struct ftrace_ops test_regs_probe =3D { + .func =3D trace_selftest_test_regs_func, + .flags =3D FTRACE_OPS_FL_RECURSION_SAFE | FTRACE_OPS_FL_SAVE_REGS, +}; + +static int +trace_selftest_function_regs(void) +{ + int save_ftrace_enabled =3D ftrace_enabled; + int save_tracer_enabled =3D tracer_enabled; + char *func_name; + int len; + int ret; + int supported =3D 0; + +#ifdef ARCH_SUPPORTS_FTRACE_SAVE_REGS + supported =3D 1; +#endif + + /* The previous test PASSED */ + pr_cont("PASSED\n"); + pr_info("Testing ftrace regs%s: ", + !supported ? "(no arch support)" : ""); + + /* enable tracing, and record the filter function */ + ftrace_enabled =3D 1; + tracer_enabled =3D 1; + + /* Handle PPC64 '.' name */ + func_name =3D "*" __stringify(DYN_FTRACE_TEST_NAME); + len =3D strlen(func_name); + + ret =3D ftrace_set_filter(&test_regs_probe, func_name, len, 1); + /* + * If DYNAMIC_FTRACE is not set, then we just trace all functions. + * This test really doesn't care. + */ + if (ret && ret !=3D -ENODEV) { + pr_cont("*Could not set filter* "); + goto out; + } + + ret =3D register_ftrace_function(&test_regs_probe); + /* + * Now if the arch does not support passing regs, then this should + * have failed. + */ + if (!supported) { + if (!ret) { + pr_cont("*registered save-regs without arch support* "); + goto out; + } + test_regs_probe.flags |=3D FTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED; + ret =3D register_ftrace_function(&test_regs_probe); + } + if (ret) { + pr_cont("*could not register callback* "); + goto out; + } + + + DYN_FTRACE_TEST_NAME(); + + unregister_ftrace_function(&test_regs_probe); + + ret =3D -1; + + switch (trace_selftest_regs_stat) { + case TRACE_SELFTEST_REGS_START: + pr_cont("*callback never called* "); + goto out; + + case TRACE_SELFTEST_REGS_FOUND: + if (supported) + break; + pr_cont("*callback received regs without arch support* "); + goto out; + + case TRACE_SELFTEST_REGS_NOT_FOUND: + if (!supported) + break; + pr_cont("*callback received NULL regs* "); + goto out; + } + + ret =3D 0; +out: + ftrace_enabled =3D save_ftrace_enabled; + tracer_enabled =3D save_tracer_enabled; + + return ret; +} + /* * Simple verification test of ftrace function tracer. * Enable ftrace, sleep 1/10 second, and then read the trace @@ -592,6 +702,10 @@ trace_selftest_startup_function(struct tracer *trace, = struct trace_array *tr) goto out; =20 ret =3D trace_selftest_function_recursion(); + if (ret) + goto out; + + ret =3D trace_selftest_function_regs(); out: ftrace_enabled =3D save_ftrace_enabled; tracer_enabled =3D save_tracer_enabled; --=20 1.7.10.4 --00GvhwF7k39YY Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJQChIWAAoJEIy3vGnGbaoABVkP/3SPHGiMurbW7NstI37eV2xq NfzlRl/qwoVVu2cH/bQ2UR0X74/ZcuZoUOfcr3zrDv0PVRDEwM4sgTpsjzhuUk+x fRw17lH5/veJH8Bnj1zeJr5oCzkZvO9RX7Z+pUXk5cEDlFHO7/H7cdDnxld67VHp sCcYeYldKM7w74zREwq9K0K3+v36fwHfd6p43uPG82TWknFTLoK8a0coTbngsPTB QWVGRAq8Wc4M30E13M7LX06yMitEdxGVN4FDBRvOsIrEFWtInvw5dbf1BvAj4zfc SCJtbZmIHNYNTu9gtwvyhd5UglFRQwlBhcW4siW+/NAIsUt/VspMJdzv0kZ+klqO oaY6oBZ0ltVfMaGfetEsNo/IIihd9PtDsQj1rF5dDUHe/MhtDuk7s2NVU5ztWm8P Sppammo9uNE3ywdJtKuuUmqhEM/76K3xkYmLom3UuGVa9aDoxWz5amlaLrxnUoN8 H9hEiIXqK3bhnEBgT+i/FU/hAXTYWUQd3/egPagTouPPzz83l+Y+Roy4tXgyrxGu CccLtmkoJqaa9w7q82ZSz4Med45wh/4u9BffcG09rV5QEjQpWZLqjfbYsuOXWEaU QmQyElTI3OClalEBec5Rnr1512tA65DdUQzHwVeca8fLcQijHWbAiBRDOgCSLZ8j SQRWIKULs7e1Ezt1ucFf =UGnb -----END PGP SIGNATURE----- --00GvhwF7k39YY--