Received: by 2002:a05:6500:1b41:b0:1fb:d597:ff75 with SMTP id cz1csp157701lqb; Tue, 4 Jun 2024 07:51:16 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVXnbTqSRX8Gj2eePRXalkXFhK2ljJdulCf+wUgRnwqm3C09QrSQQH1hfeI+OOzmxA99Sh7odRA8eFAkHgDX7SKk11zltEuD+CpIVqZjA== X-Google-Smtp-Source: AGHT+IGksP1b5ZKA930USM64tW0TYb/f3XUea9LFxdPRpcxBXGiBJWr9OXF7+huoc5yzFpmhT1lu X-Received: by 2002:a05:6a00:4b11:b0:6ea:d114:5ea1 with SMTP id d2e1a72fcca58-7024780a850mr13147550b3a.17.1717512675752; Tue, 04 Jun 2024 07:51:15 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717512675; cv=pass; d=google.com; s=arc-20160816; b=clYd0VhKxmvlGgC8ZUoybG0omOABtZcrJyMcech8+m16b4YskHsguStgLyuUFZYaFS tp071HDi4fJn1l5x/xN5PRJ4qPR3Rtt0ue0/tApqN97X6ZY7HxaGv/Q6vJi5zJc2A2Xz nP9rdCTVchk+a4SF/fFkdu7pw8EqixL3WKsKl9F0nynnryF9j37/blEBS5rBRE2qgrxU olZ+XD0xvG6epZi5maGNfcHzK3Lp2cracjdoJrepvXXO2kqrO6xZOBwgtNnfVNmoKyzc xMcUWCvoUEi9SgjNlNnCKMN/Kpio7NFjCKltiBi2z7gJza4xqiuQZ5PUdQxPDokw2K0a qhCQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:subject:cc:to:from:date:user-agent:message-id; bh=oWAEU0evvLQXhq47qPfy2AgSx0FmzyJkmTZq35WHmGI=; fh=/wy5e/q+z2qlOMkv0QH/u80KV4ZXPtz68q6c1OyjqGY=; b=lw7sQ0IMG2quBzIEelyk705sTv3Zm4uMnl0FQfckcIR5+MPwbFbZ+maDBAJ+riJfbP HTZN4vLfZ6J8biG/4/mnEmHrxoE6e4L22rJNNwW0xM0hgfhGdoMJXzSRU4VsexTuKF64 5GQliu6BwiDKfEDDJ5hSV+F1wDW6iPgDmcj/tcfrhc1w0sVNA7hwmHXpNGLnwb+c/yf+ YVixhmUJAds68sdRje8S1KntDsZ3k70k/wKc4NL0mcxbJGctP7ZdJeE5dRaLCH0VtgOw fqvSzg5dJLI0Md6rdZnprU+vWfLc+MOhwVEPAfUNQr4WpIyPIV6CTbXfWuPKtnCTgxWM FkKQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-200885-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-200885-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id d2e1a72fcca58-70242c277b2si8276674b3a.271.2024.06.04.07.51.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Jun 2024 07:51:15 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-200885-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-200885-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-200885-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 68E4D2875E3 for ; Tue, 4 Jun 2024 14:49:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 71B4D14F108; Tue, 4 Jun 2024 14:42:25 +0000 (UTC) Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E90E614A4D2; Tue, 4 Jun 2024 14:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717512139; cv=none; b=V65BHnEpejLQh5HmS5NigVAdbdrFnsmGIPis0BScprhKurXMQ5WbLI40UilVpET49AfMjfutMo7DfqeBAWf9JnY9zxWDzsiksR6+PQ6SX1Df4yGHcLSrYKa2ASucMyyTa5a/HisOSxSDt/4yLHj/nPpYNklldMS2Qbk7n0F+Yss= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717512139; c=relaxed/simple; bh=56JCgjcovGpheHGmVusKM6l0Qf+zYRUv21D8Cc+FmmI=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=kfat4RMUorb/3tmtzH3CxVk+BBhQCNZnH313QUD/Tl+61wPcnXyrkpSeOt0wbBWuzG73nPcZ3ALvsGNsZ2NF7sjh1qjD6SuGejhIHKhW1TQp8bOIRb3BEms3m1yK2B2lEjff24f41Bn/vnFP/kyz7URTDpIvjSP2pQcaYQZRuw4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id D5277C4AF0B; Tue, 4 Jun 2024 14:42:18 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1sEVMf-00000000Z50-47s2; Tue, 04 Jun 2024 10:42:17 -0400 Message-ID: <20240604144217.838674367@goodmis.org> User-Agent: quilt/0.68 Date: Tue, 04 Jun 2024 10:41:27 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Alexei Starovoitov , Florent Revest , Martin KaFai Lau , bpf , Sven Schnelle , Alexei Starovoitov , Jiri Olsa , Arnaldo Carvalho de Melo , Daniel Borkmann , Alan Maguire , Peter Zijlstra , Thomas Gleixner , Guo Ren Subject: [for-next][PATCH 24/27] function_graph: Use static_call and branch to optimize entry function References: <20240604144103.293353991@goodmis.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 From: "Steven Rostedt (Google)" In most cases function graph is used by a single user. Instead of calling a loop to call function graph callbacks in this case, call the function entry callback directly. Add a static_key that will be used to set the function graph logic to either do the loop (when more than one callback is registered) or to call the callback directly if there is only one registered callback. Link: https://lore.kernel.org/linux-trace-kernel/20240603190824.766858241@goodmis.org Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Cc: Alexei Starovoitov Cc: Florent Revest Cc: Martin KaFai Lau Cc: bpf Cc: Sven Schnelle Cc: Alexei Starovoitov Cc: Jiri Olsa Cc: Arnaldo Carvalho de Melo Cc: Daniel Borkmann Cc: Alan Maguire Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Guo Ren Reviewed-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt (Google) --- kernel/trace/fgraph.c | 77 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/kernel/trace/fgraph.c b/kernel/trace/fgraph.c index 4d566a0a741d..7c3b0261b1bb 100644 --- a/kernel/trace/fgraph.c +++ b/kernel/trace/fgraph.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -511,6 +512,10 @@ static struct fgraph_ops fgraph_stub = { .retfunc = ftrace_graph_ret_stub, }; +static struct fgraph_ops *fgraph_direct_gops = &fgraph_stub; +DEFINE_STATIC_CALL(fgraph_func, ftrace_graph_entry_stub); +DEFINE_STATIC_KEY_TRUE(fgraph_do_direct); + /** * ftrace_graph_stop - set to permanently disable function graph tracing * @@ -636,21 +641,34 @@ int function_graph_enter(unsigned long ret, unsigned long func, if (offset < 0) goto out; - for_each_set_bit(i, &fgraph_array_bitmask, - sizeof(fgraph_array_bitmask) * BITS_PER_BYTE) { - struct fgraph_ops *gops = fgraph_array[i]; - int save_curr_ret_stack; - - if (gops == &fgraph_stub) - continue; +#ifdef CONFIG_HAVE_STATIC_CALL + if (static_branch_likely(&fgraph_do_direct)) { + int save_curr_ret_stack = current->curr_ret_stack; - save_curr_ret_stack = current->curr_ret_stack; - if (ftrace_ops_test(&gops->ops, func, NULL) && - gops->entryfunc(&trace, gops)) - bitmap |= BIT(i); + if (static_call(fgraph_func)(&trace, fgraph_direct_gops)) + bitmap |= BIT(fgraph_direct_gops->idx); else /* Clear out any saved storage */ current->curr_ret_stack = save_curr_ret_stack; + } else +#endif + { + for_each_set_bit(i, &fgraph_array_bitmask, + sizeof(fgraph_array_bitmask) * BITS_PER_BYTE) { + struct fgraph_ops *gops = fgraph_array[i]; + int save_curr_ret_stack; + + if (gops == &fgraph_stub) + continue; + + save_curr_ret_stack = current->curr_ret_stack; + if (ftrace_ops_test(&gops->ops, func, NULL) && + gops->entryfunc(&trace, gops)) + bitmap |= BIT(i); + else + /* Clear out any saved storage */ + current->curr_ret_stack = save_curr_ret_stack; + } } if (!bitmap) @@ -1155,6 +1173,8 @@ void fgraph_update_pid_func(void) gops = container_of(op, struct fgraph_ops, ops); gops->entryfunc = ftrace_pids_enabled(op) ? fgraph_pid_func : gops->saved_func; + if (ftrace_graph_active == 1) + static_call_update(fgraph_func, gops->entryfunc); } } } @@ -1209,6 +1229,32 @@ static void init_task_vars(int idx) read_unlock(&tasklist_lock); } +static void ftrace_graph_enable_direct(bool enable_branch) +{ + trace_func_graph_ent_t func = NULL; + int i; + + for_each_set_bit(i, &fgraph_array_bitmask, + sizeof(fgraph_array_bitmask) * BITS_PER_BYTE) { + func = fgraph_array[i]->entryfunc; + fgraph_direct_gops = fgraph_array[i]; + } + if (WARN_ON_ONCE(!func)) + return; + + static_call_update(fgraph_func, func); + if (enable_branch) + static_branch_disable(&fgraph_do_direct); +} + +static void ftrace_graph_disable_direct(bool disable_branch) +{ + if (disable_branch) + static_branch_disable(&fgraph_do_direct); + static_call_update(fgraph_func, ftrace_graph_entry_stub); + fgraph_direct_gops = &fgraph_stub; +} + int register_ftrace_graph(struct fgraph_ops *gops) { int command = 0; @@ -1235,7 +1281,11 @@ int register_ftrace_graph(struct fgraph_ops *gops) ftrace_graph_active++; + if (ftrace_graph_active == 2) + ftrace_graph_disable_direct(true); + if (ftrace_graph_active == 1) { + ftrace_graph_enable_direct(false); register_pm_notifier(&ftrace_suspend_notifier); ret = start_graph_tracing(); if (ret) @@ -1292,6 +1342,11 @@ void unregister_ftrace_graph(struct fgraph_ops *gops) ftrace_shutdown_subops(&graph_ops, &gops->ops, command); + if (ftrace_graph_active == 1) + ftrace_graph_enable_direct(true); + else if (!ftrace_graph_active) + ftrace_graph_disable_direct(false); + if (!ftrace_graph_active) { ftrace_graph_return = ftrace_stub_graph; ftrace_graph_entry = ftrace_graph_entry_stub; -- 2.43.0