From patchwork Fri Apr 8 00:50:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 12805978 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AE376C433F5 for ; Fri, 8 Apr 2022 00:52:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=U/KRJZbt5Dq3Om+zt0H67hFFZy2X1NbNEnYb2mgv364=; b=vKnsOfUzIETRUc Gq8NFzH/d/n1pGYCxxbSeKIqJjqJ+HnfIAMuFGC2qtZHSDuznizOxMilvAI1Al6CI60gUJeBigfOb 1KZOlCA/B0DnkAmiOEWP2wMi7b1uU0LnDLcguSz4B6E4DnCjBLS7kzDTFKsSecXLWu0JecA5cn0su gg+sQzXo6bSty5TnhSUjxA5T99uORVJ6/qat8im2gTjP54rxdmeaobnJs2Go5hf2dYZOMQMQo2A5J V+QHaHISi3Gs7ADaK3aqyZxFpeoOkaTv0XfH9o37eBmz88pFNewmAgA5yN+vYeO/sdxdDa38fEE0C 8MQKfCXSCORk7rtnNiLg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nccps-00ESth-1V; Fri, 08 Apr 2022 00:50:48 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nccpp-00ESsl-0S for linux-arm-kernel@lists.infradead.org; Fri, 08 Apr 2022 00:50:46 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B8F58617F1; Fri, 8 Apr 2022 00:50:42 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 29F77C385A0; Fri, 8 Apr 2022 00:50:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649379042; bh=G1SKGXNbII2A8RDjVNJ0g6cGZNNhNqVNM++vL5zWAMo=; h=From:To:Cc:Subject:Date:From; b=gRg826YAodFudvp72TyLwo0NoB0Mtm4m/4Lg/Jqq8VJfjzMS2vPIZIyWY4e3fQFQK 3hVbvpRVPrGx+L1GJe1M5gju/40/jXaChqs4waiom5nuoWQswOyFDpKvpmi00Sy8P8 R68JSdHBmIQbwEprBxqIZy7jtTTkj9pUAr61hTTFOaZnPd9Idh5FcYBAl3d2X3EI2K qjxmODOKbIKdKznMMl4OPD+nSXGq6J72ht6o9DFUXBs8KHmivlLVunz3Ri8ggv58eP Dee9iLppxgLLThLVYlXNVdFkmqCoQXAdqTcTQAChRAnt8L6jKRIDMalVtQD+MXNQQ2 N6vjnknZhP7oA== From: Masami Hiramatsu To: Alexei Starovoitov , Alexei Starovoitov Cc: Daniel Borkmann , Shubham Bansal , Andrii Nakryiko , Masami Hiramatsu , bpf@vger.kernel.org, kernel-team@fb.com, Jiri Olsa , Steven Rostedt , "Naveen N . Rao" , Anil S Keshavamurthy , "David S . Miller" , linux-kernel@vger.kernel.org, Mark Rutland , Will Deacon , Ard Biesheuvel , Russell King , Catalin Marinas , linux-arm-kernel@lists.infradead.org Subject: [PATCH bpf v2 0/4] kprobes: rethook, ARM, arm64: Replace kretprobe trampoline with rethook Date: Fri, 8 Apr 2022 09:50:35 +0900 Message-Id: <164937903547.1272679.7244379141135199176.stgit@devnote2> X-Mailer: git-send-email 2.25.1 User-Agent: StGit/0.19 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220407_175045_169950_2330E475 X-CRM114-Status: GOOD ( 20.95 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi, Here is the 2nd version of the series for replacing kretprobe trampoline with rethook on ARM/arm64. I fixed some compiler warnings in this version. The previous version is here[1]; [1] https://lore.kernel.org/all/164915121498.982637.12787715964983738566.stgit@devnote2/T/#u This series includes a trivial bugfix for the arm unwinder to initialize an internal data structure([1/4]). This is not critical for stack trace, but required for rethook to find the LR register from the stack. This also have an update for the rethook interface, which allows us to check the rethook_hook() failure ([2/4]). This is also required for the rethook on arm because unwinder is able to fail. The rest of patches are replacing kretprobe trampoline with rethook on ARM ([3/4]) and arm64 ([4/4]). Background: This rethook came from Jiri's request of multiple kprobe for bpf[2]. He tried to solve an issue that starting bpf with multiple kprobe will take a long time because bpf-kprobe will wait for RCU grace period for sync rcu events. Jiri wanted to attach a single bpf handler to multiple kprobes and he tried to introduce multiple-probe interface to kprobe. So I asked him to use ftrace and kretprobe-like hook if it is only for the function entry and exit, instead of adding ad-hoc interface to kprobes. For this purpose, I introduced the fprobe (kprobe like interface for ftrace) with the rethook (this is a generic return hook feature for fprobe exit handler)[3]. [2] https://lore.kernel.org/all/20220104080943.113249-1-jolsa@kernel.org/T/#u [3] https://lore.kernel.org/all/164191321766.806991.7930388561276940676.stgit@devnote2/T/#u The rethook is basically same as the kretprobe trampoline. I just made it decoupled from kprobes. Eventually, the all arch dependent kretprobe trampolines will be replaced with the rethook trampoline instead of cloning the code. When I port the rethook for all arch which supports kretprobe, the legacy kretprobe specific code (which is for CONFIG_KRETPROBE_ON_RETHOOK=n) will be removed eventually. BTW, the arm Clang support for rethook is for kretprobes only. fprobe and ftrace seems not working with Clang yet. Thank you, --- Masami Hiramatsu (4): ARM: unwind: Initialize the lr_addr field of unwind_ctrl_block rethook,fprobe,kprobes: Check a failure in the rethook_hook() ARM: rethook: Replace kretprobe trampoline with rethook arm64: rethook: Replace kretprobe trampoline with rethook arch/arm/Kconfig | 1 arch/arm/include/asm/stacktrace.h | 5 + arch/arm/kernel/stacktrace.c | 13 +-- arch/arm/kernel/unwind.c | 1 arch/arm/probes/Makefile | 1 arch/arm/probes/kprobes/core.c | 62 ------------ arch/arm/probes/rethook.c | 127 +++++++++++++++++++++++++ arch/arm64/Kconfig | 1 arch/arm64/include/asm/kprobes.h | 2 arch/arm64/include/asm/stacktrace.h | 2 arch/arm64/kernel/Makefile | 1 arch/arm64/kernel/probes/Makefile | 1 arch/arm64/kernel/probes/kprobes.c | 15 --- arch/arm64/kernel/probes/kprobes_trampoline.S | 86 ----------------- arch/arm64/kernel/rethook.c | 28 ++++++ arch/arm64/kernel/rethook_trampoline.S | 87 +++++++++++++++++ arch/arm64/kernel/stacktrace.c | 9 +- arch/x86/kernel/rethook.c | 4 + include/linux/rethook.h | 4 - kernel/kprobes.c | 8 +- kernel/trace/fprobe.c | 5 + kernel/trace/rethook.c | 12 ++ 22 files changed, 287 insertions(+), 188 deletions(-) create mode 100644 arch/arm/probes/rethook.c delete mode 100644 arch/arm64/kernel/probes/kprobes_trampoline.S create mode 100644 arch/arm64/kernel/rethook.c create mode 100644 arch/arm64/kernel/rethook_trampoline.S -- Masami Hiramatsu (Linaro)