Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp1009745ybp; Fri, 4 Oct 2019 08:16:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqylhoZm+t10OARq3e7GR6ABZ0MgC9scbGd5lHLj1lOQE4J40bVL2/7MzCb/dhsfvsePy9iA X-Received: by 2002:a17:906:2542:: with SMTP id j2mr12985165ejb.278.1570202212424; Fri, 04 Oct 2019 08:16:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570202212; cv=none; d=google.com; s=arc-20160816; b=lhdQlx9jggxIGrpK6vNTU9HGaVNM00r+Q6Rj6XT1UbWufNPFt6YVZPVugcRivUCavr MQKsS9Lsn8hpRYrXACYPXwoycQ/FMhNUld/r/y79cP3wYIN7ZiK0LmPaKryzAmgSa6Aa qzExM/IrLlOIy63LQ78ZTml58jzlxhwvl+2UcO+xUqovo2Q8T8yvex9aS3bOZudMW7ki MLLlH5g3fXrdTDgwYEu4g7Z1LZ3rcS116g2Y7BVjy35RYnzRraH9g1U8Wx2vuSNdz3nC KRnTkLH+hC+zQAlPO3A+liLziWYgTFPer/AgH83KVorIML5up95+YxUjishMX3gfBvz+ zsIw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date; bh=xBG17eLlb0pPF/xZIezqWeT9FU7UB/2/fMNVJPMwAiE=; b=yW3l++eJti/Y9B2xDGf42ZgPU6+qZ/Rb32qIRgLHRBTrqbd+yjBZLDBBx65fGxa4Lg WHBvTMu7xtfu/REx5LXCP4scQYOOdNCJP7KFYgnRrTUFWRI2eJbhN6eChf5IzKzXgEOc 2WHtmKppzIE9ATJywwgkMqjrQwnKwQifhWPBP+FlVo2LgbMhaONL3znyWVH4LOuutkKI V3HTSM+K0vnEPQrBuVt1m80YD4AJP3DOthY5oBT69uFrEqlyDDfV6Th+hsugu4YQKEOj kYRT9oUVU78Faaf1lIMs+J9WI+kRq/yhLD/nfzKiCN7bDQzeZ2WOUMvx1i238OK9rOFa UsuQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ch10si2915492ejb.89.2019.10.04.08.16.27; Fri, 04 Oct 2019 08:16:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389539AbfJDPNV convert rfc822-to-8bit (ORCPT + 99 others); Fri, 4 Oct 2019 11:13:21 -0400 Received: from mail.kernel.org ([198.145.29.99]:51612 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389086AbfJDPNV (ORCPT ); Fri, 4 Oct 2019 11:13:21 -0400 Received: from gandalf.local.home (cpe-66-24-58-225.stny.res.rr.com [66.24.58.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 95BCB21D81; Fri, 4 Oct 2019 15:13:19 +0000 (UTC) Date: Fri, 4 Oct 2019 11:13:18 -0400 From: Steven Rostedt To: Daniel Bristot de Oliveira Cc: Peter Zijlstra , linux-kernel@vger.kernel.org, x86@kernel.org, Nadav Amit , Andy Lutomirski , Dave Hansen , Song Liu , Masami Hiramatsu Subject: Re: [PATCH 3/3] x86/ftrace: Use text_poke() Message-ID: <20191004111318.1083d205@gandalf.local.home> In-Reply-To: <761c5baf-598d-c2da-bd3e-2a669bf16b50@redhat.com> References: <20190827180622.159326993@infradead.org> <20190827181147.166658077@infradead.org> <20191002182106.GC4643@worktop.programming.kicks-ass.net> <20191003181045.7fb1a5b3@gandalf.local.home> <7b4196a4-b6e1-7e55-c3e1-a02d97c262c7@redhat.com> <20191004094014.72a990ee@gandalf.local.home> <761c5baf-598d-c2da-bd3e-2a669bf16b50@redhat.com> X-Mailer: Claws Mail 3.17.3 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 4 Oct 2019 16:44:35 +0200 Daniel Bristot de Oliveira wrote: > On 04/10/2019 15:40, Steven Rostedt wrote: > > On Fri, 4 Oct 2019 10:10:47 +0200 > > Daniel Bristot de Oliveira wrote: > > > >> [ In addition ] > >> > >> Currently, ftrace_rec entries are ordered inside the group of functions, but > >> "groups of function" are not ordered. So, the current int3 handler does a (*): > >> > >> for_each_group_of_functions: > >> check if the ip is in the range ----> n by the number of groups. > >> do a bsearch. ----> log(n) by the numbers of entry > >> in the group. > >> > >> If, instead, it uses an ordered vector, the complexity would be log(n) by the > >> total number of entries, which is better. So, how bad is the idea of: > > BTW, I'm currently rewriting the grouping of the vectors, in order to > > shrink the size of each dyn_ftrace_rec (as we discussed at Kernel > > Recipes). I can make the groups all sorted in doing so, thus we can > > load the sorted if that's needed, without doing anything special. > > > > Good! if you do they sorted and store the amount of entries in a variable, we > can have things done for a future "optimized" version. > You mean something like this? -- Steve From 9b85c08d796dc953cf9b9331d1aed4c3052b09b9 Mon Sep 17 00:00:00 2001 From: "Steven Rostedt (VMware)" Date: Tue, 1 Oct 2019 14:38:07 -0400 Subject: [PATCH] ftrace: Add information on number of page groups allocated Looking for ways to shrink the size of the dyn_ftrace structure, knowing the information about how many pages and the number of groups of those pages, is useful in working out the best ways to save on memory. This adds one info print on how many groups of pages were used to allocate the ftrace dyn_ftrace structures, and also shows the number of pages and groups in the dyn_ftrace_total_info (which is used for debugging). Signed-off-by: Steven Rostedt (VMware) --- kernel/trace/ftrace.c | 14 ++++++++++++++ kernel/trace/trace.c | 21 +++++++++++++++------ kernel/trace/trace.h | 2 ++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index c4cc048eb594..244e2d9083a6 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -2860,6 +2860,8 @@ static void ftrace_shutdown_sysctl(void) static u64 ftrace_update_time; unsigned long ftrace_update_tot_cnt; +unsigned long ftrace_number_of_pages; +unsigned long ftrace_number_of_groups; static inline int ops_traces_mod(struct ftrace_ops *ops) { @@ -2984,6 +2986,9 @@ static int ftrace_allocate_records(struct ftrace_page *pg, int count) goto again; } + ftrace_number_of_pages += 1 << order; + ftrace_number_of_groups++; + cnt = (PAGE_SIZE << order) / ENTRY_SIZE; pg->size = cnt; @@ -3039,6 +3044,8 @@ ftrace_allocate_pages(unsigned long num_to_init) start_pg = pg->next; kfree(pg); pg = start_pg; + ftrace_number_of_pages -= 1 << order; + ftrace_number_of_groups--; } pr_info("ftrace: FAILED to allocate memory for functions\n"); return NULL; @@ -5788,6 +5795,8 @@ void ftrace_release_mod(struct module *mod) free_pages((unsigned long)pg->records, order); tmp_page = pg->next; kfree(pg); + ftrace_number_of_pages -= 1 << order; + ftrace_number_of_groups--; } } @@ -6129,6 +6138,8 @@ void ftrace_free_mem(struct module *mod, void *start_ptr, void *end_ptr) *last_pg = pg->next; order = get_count_order(pg->size / ENTRIES_PER_PAGE); free_pages((unsigned long)pg->records, order); + ftrace_number_of_pages -= 1 << order; + ftrace_number_of_groups--; kfree(pg); pg = container_of(last_pg, struct ftrace_page, next); if (!(*last_pg)) @@ -6184,6 +6195,9 @@ void __init ftrace_init(void) __start_mcount_loc, __stop_mcount_loc); + pr_info("ftrace: allocated %ld pages with %ld groups\n", + ftrace_number_of_pages, ftrace_number_of_groups); + set_ftrace_early_filters(); return; diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index e917aa783675..bb41a70c5189 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -7548,14 +7548,23 @@ static ssize_t tracing_read_dyn_info(struct file *filp, char __user *ubuf, size_t cnt, loff_t *ppos) { - unsigned long *p = filp->private_data; - char buf[64]; /* Not too big for a shallow stack */ + unsigned long *p = ftrace_update_tot_cnt; + ssize_t ret; + char *buf; int r; - r = scnprintf(buf, 63, "%ld", *p); - buf[r++] = '\n'; + r = snprintf(NULL, 0, "%ld pages:%d groups: %d\n"); + r++; + buf = kmalloc(r, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + r = scnprintf(buf, r, "%ld pages:%d groups: %d\n", + ftrace_update_tot_cnt, + ftrace_number_of_pages, + ftrace_number_of_groups); - return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); + ret = simple_read_from_buffer(ubuf, cnt, ppos, buf, r); } static const struct file_operations tracing_dyn_info_fops = { @@ -8747,7 +8756,7 @@ static __init int tracer_init_tracefs(void) #ifdef CONFIG_DYNAMIC_FTRACE trace_create_file("dyn_ftrace_total_info", 0444, d_tracer, - &ftrace_update_tot_cnt, &tracing_dyn_info_fops); + NULL, &tracing_dyn_info_fops); #endif create_trace_instances(d_tracer); diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index f801d154ff6a..f6f92a6c5cec 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -802,6 +802,8 @@ extern void trace_event_follow_fork(struct trace_array *tr, bool enable); #ifdef CONFIG_DYNAMIC_FTRACE extern unsigned long ftrace_update_tot_cnt; +extern unsigned long ftrace_number_of_pages; +extern unsigned long ftrace_number_of_groups; void ftrace_init_trace_array(struct trace_array *tr); #else static inline void ftrace_init_trace_array(struct trace_array *tr) { } -- 2.20.1