From nobody Mon Feb 9 03:30:49 2026 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 024171A5AC; Wed, 3 Apr 2024 18:53:14 +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=1712170395; cv=none; b=OGV89bETpIr+cPsEoZXxgs5o/07oqNl7y9SVzvVFbtrEXwwuxQqwmb4z12758yZSHwpluNaY46APNV+EqYyqOm/5mxU/fEsm6Y6QCzJ2R69DY6LDl87C1HXKc8QSFohLjAN3060MbdRWTvCzgrry+gprKSlkOAlIU0ZRofwQWMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712170395; c=relaxed/simple; bh=LZLoBx1FU+I9eSqFIXpb6gxTsx2CaE+4KzYX9KyagFE=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition; b=EslFKyOQzjlhwBfINcwdgM6JtkZ7Yg/A6s+ak0TM2B2GiQuQa9PJI6bb1X1rRItHkfFxf5UCH+CgeuXxJWwx9vuvAaegL0pq/nNBgpoWHrpeSO8+b0Ql9Y9KdWwqweGGW8fSbOTOQ8NQkhLV55XbTJsOIGJyMy6BC8h3BQjUzDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Dx+7Z9Vg; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Dx+7Z9Vg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7454BC433C7; Wed, 3 Apr 2024 18:53:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712170394; bh=LZLoBx1FU+I9eSqFIXpb6gxTsx2CaE+4KzYX9KyagFE=; h=Date:From:To:Cc:Subject:Reply-To:From; b=Dx+7Z9Vg5hvLU+jMN0LJqQuSQhaH8NQZG+/PwBme8f25Wx4aeqe03JHWr6DbYPYwM ljpdxfhMwXJzEiV4wZYhk84PpzWRWexIqtaE+/CzQ0lqcjPGbDUznwiPDHjUhS1vNU FBjsKG/nip+ZqQgNqVDeEFLL0Lht+iXHWl3Fm5OcLeg8yqDKL3LeLCjI6Y8thKy33v /uyo1hIk8oklUSpTKYbFlTL6wMvuFZx3y48+0yPvlkEFGxc6CTBiituoK51jIYo3zT Ut0Iu5TtvZUfvWSMVBAT3iUYKcGTW5TGdId0nYcpDLtd8YAIgyKATXB7gmhgSHSQMr 4ihJ/72Zzl6OQ== Received: by paulmck-ThinkPad-P17-Gen-1.home (Postfix, from userid 1000) id 13991CE0D85; Wed, 3 Apr 2024 11:53:14 -0700 (PDT) Date: Wed, 3 Apr 2024 11:53:14 -0700 From: "Paul E. McKenney" To: linux-trace-kernel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Steven Rostedt , Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Jakub Kicinski , Alexei Starovoitov , Chris Mason Subject: [PATCH RFC ftrace] Asynchronous grace period for register_ftrace_direct() Message-ID: <7ed089be-c0c6-43b5-849a-05599cb32cfd@paulmck-laptop> Reply-To: paulmck@kernel.org Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Note that the immediate pressure for this patch should be relieved by the NAPI patch series [1], but this sort of problem could easily arise again. So would this change make sense? When running heavy test workloads with KASAN enabled, RCU Tasks grace periods can extend for many tens of seconds, significantly slowing trace registration. Therefore, make the registration-side RCU Tasks grace period be asynchronous via call_rcu_tasks(). Reported-by: Jakub Kicinski Reported-by: Alexei Starovoitov Reported-by: Chris Mason Signed-off-by: Paul E. McKenney Cc: Steven Rostedt Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index da1710499698b..6d21e4e97ed48 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -5366,6 +5366,13 @@ static void remove_direct_functions_hash(struct ftra= ce_hash *hash, unsigned long } } =20 +static void register_ftrace_direct_cb(struct rcu_head *rhp) +{ + struct ftrace_hash *fhp =3D container_of(rhp, struct ftrace_hash, rcu); + + free_ftrace_hash(fhp); +} + /** * register_ftrace_direct - Call a custom trampoline directly * for multiple functions registered in @ops @@ -5464,10 +5471,8 @@ int register_ftrace_direct(struct ftrace_ops *ops, u= nsigned long addr) out_unlock: mutex_unlock(&direct_mutex); =20 - if (free_hash && free_hash !=3D EMPTY_HASH) { - synchronize_rcu_tasks(); - free_ftrace_hash(free_hash); - } + if (free_hash && free_hash !=3D EMPTY_HASH) + call_rcu_tasks(&free_hash->rcu, register_ftrace_direct_cb); =20 if (new_hash) free_ftrace_hash(new_hash);