From patchwork Fri Feb 13 05:40:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 5823141 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 9D1BBBF440 for ; Fri, 13 Feb 2015 05:51:23 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id F0455202FE for ; Fri, 13 Feb 2015 05:51:18 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3D470202DD for ; Fri, 13 Feb 2015 05:51:14 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YM97j-0006DP-HX; Fri, 13 Feb 2015 05:49:07 +0000 Received: from szxga03-in.huawei.com ([119.145.14.66]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YM97S-00066S-Q6 for linux-arm-kernel@lists.infradead.org; Fri, 13 Feb 2015 05:48:52 +0000 Received: from 172.24.2.119 (EHLO lggeml424-hub.china.huawei.com) ([172.24.2.119]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id BBW73096; Fri, 13 Feb 2015 13:47:21 +0800 (CST) Received: from kernel-host.huawei (10.107.197.247) by lggeml424-hub.china.huawei.com (10.72.61.34) with Microsoft SMTP Server id 14.3.158.1; Fri, 13 Feb 2015 13:47:11 +0800 From: Wang Nan To: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Subject: [RFC PATCH v3 06/26] ftrace: sort ftrace entries earlier. Date: Fri, 13 Feb 2015 13:40:31 +0800 Message-ID: <1423806031-61742-1-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1423805941-61407-1-git-send-email-wangnan0@huawei.com> References: <1423805941-61407-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020204.54DD8FEA.0051, ss=1, re=0.001, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: d0b8534d32769079747c100e55810b7d X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150212_214851_225014_5982B577 X-CRM114-Status: GOOD ( 11.65 ) X-Spam-Score: -2.3 (--) Cc: lizefan@huawei.com, x86@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP By extracting mcount sorting code and sort them earliler, futher patches will be able to determine whether an address is on an ftrace entry or not using bsearch(). ftrace_sort_mcount_area() will be called before, during and after ftrace_init (when module insertion). Ensure it sort kernel mcount table only once. Signed-off-by: Wang Nan --- include/linux/ftrace.h | 2 ++ init/main.c | 1 + kernel/trace/ftrace.c | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 1da6029..8db315a 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -701,8 +701,10 @@ static inline void __ftrace_enabled_restore(int enabled) #ifdef CONFIG_FTRACE_MCOUNT_RECORD extern void ftrace_init(void); +extern void ftrace_init_early(void); #else static inline void ftrace_init(void) { } +static inline void ftrace_init_early(void) { } #endif /* diff --git a/init/main.c b/init/main.c index 6f0f1c5f..eaafc3e 100644 --- a/init/main.c +++ b/init/main.c @@ -517,6 +517,7 @@ asmlinkage __visible void __init start_kernel(void) boot_cpu_init(); page_address_init(); pr_notice("%s", linux_banner); + ftrace_init_early(); setup_arch(&command_line); mm_init_cpumask(&init_mm); setup_command_line(command_line); diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 6c6cbb1..a75cfbe 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1169,6 +1169,7 @@ struct ftrace_page { static struct ftrace_page *ftrace_pages_start; static struct ftrace_page *ftrace_pages; +static bool kernel_mcount_sorted = false; static bool __always_inline ftrace_hash_empty(struct ftrace_hash *hash) { @@ -4743,6 +4744,32 @@ static void ftrace_swap_ips(void *a, void *b, int size) *ipb = t; } +static void ftrace_sort_mcount_area(unsigned long *start, unsigned long *end) +{ + extern unsigned long __start_mcount_loc[]; + extern unsigned long __stop_mcount_loc[]; + + unsigned long count; + bool is_kernel_mcount; + + count = end - start; + if (!count) + return; + + is_kernel_mcount = + (start == __start_mcount_loc) && + (end == __stop_mcount_loc); + + if (is_kernel_mcount && kernel_mcount_sorted) + return; + + sort(start, count, sizeof(*start), + ftrace_cmp_ips, ftrace_swap_ips); + + if (is_kernel_mcount) + kernel_mcount_sorted = true; +} + static int ftrace_process_locs(struct module *mod, unsigned long *start, unsigned long *end) @@ -4761,8 +4788,7 @@ static int ftrace_process_locs(struct module *mod, if (!count) return 0; - sort(start, count, sizeof(*start), - ftrace_cmp_ips, ftrace_swap_ips); + ftrace_sort_mcount_area(start, end); start_pg = ftrace_allocate_pages(count); if (!start_pg) @@ -4965,6 +4991,14 @@ void __init ftrace_init(void) ftrace_disabled = 1; } +void __init ftrace_init_early(void) +{ + extern unsigned long __start_mcount_loc[]; + extern unsigned long __stop_mcount_loc[]; + + ftrace_sort_mcount_area(__start_mcount_loc, __stop_mcount_loc); +} + /* Do nothing if arch does not support this */ void __weak arch_ftrace_update_trampoline(struct ftrace_ops *ops) {