From patchwork Mon Mar 2 14:24:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 5914131 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id F40029F380 for ; Mon, 2 Mar 2015 14:56:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2B9862021F for ; Mon, 2 Mar 2015 14:56:24 +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 4A8B120218 for ; Mon, 2 Mar 2015 14:56:23 +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 1YSRij-000401-Np; Mon, 02 Mar 2015 14:53:21 +0000 Received: from casper.infradead.org ([2001:770:15f::2]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YSRbs-0005rj-Es for linux-arm-kernel@bombadil.infradead.org; Mon, 02 Mar 2015 14:46:16 +0000 Received: from szxga02-in.huawei.com ([119.145.14.65]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YSRJG-0008An-Nh for linux-arm-kernel@lists.infradead.org; Mon, 02 Mar 2015 14:27:05 +0000 Received: from 172.24.2.119 (EHLO lggeml422-hub.china.huawei.com) ([172.24.2.119]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CHW85027; Mon, 02 Mar 2015 22:26:00 +0800 (CST) Received: from kernel-host.huawei (10.107.197.247) by lggeml422-hub.china.huawei.com (10.72.61.32) with Microsoft SMTP Server id 14.3.158.1; Mon, 2 Mar 2015 22:25:48 +0800 From: Wang Nan To: , , , , Subject: [RFC PATCH v4 21/34] ftrace: sort ftrace entries earlier. Date: Mon, 2 Mar 2015 22:24:59 +0800 Message-ID: <1425306312-3437-22-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> References: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150302_142703_552339_233C43A6 X-CRM114-Status: GOOD ( 14.99 ) X-Spam-Score: -4.2 (----) Cc: x86@kernel.org, lizefan@huawei.com, 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 679d49e..6d269ac 100644 --- a/init/main.c +++ b/init/main.c @@ -518,6 +518,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); init_kprobes_early(); mm_init_cpumask(&init_mm); diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 6c6cbb1..fa3cdd3 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -112,6 +112,7 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub; ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; static struct ftrace_ops global_ops; static struct ftrace_ops control_ops; +static bool kernel_mcount_sorted = false; static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, struct pt_regs *regs); @@ -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) {