From patchwork Sun Feb 25 15:21:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 206076 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:a81b:b0:108:e6aa:91d0 with SMTP id bq27csp1623136dyb; Sun, 25 Feb 2024 07:24:39 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCXa0V2pCBn9ZifsdNNSsVpY1gm/yE3bkYlT8+cPAafQOLGYeNzxvsAe1ULgoIgm5GpFbTveGBZq+ZRXekZBqdTV27uUGg== X-Google-Smtp-Source: AGHT+IE1HXfdvYRJLUkHvDV84v6w5tvfQePLf72YAR2TuB5ui2JokAKVIJWfTbwGXMSe+KivhuRW X-Received: by 2002:a05:6602:1547:b0:7c7:cd51:4483 with SMTP id h7-20020a056602154700b007c7cd514483mr448719iow.4.1708874679481; Sun, 25 Feb 2024 07:24:39 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708874679; cv=pass; d=google.com; s=arc-20160816; b=0EiqsnpPcIcn42yZzjHayM26kHq6Whl7uGrDaz5Syfzv3Jtc0PeN2h0yPPZ5iOK0jx Q4Zz4xAp6jo7GFXta1Q68KrsSMt9ncJEqS5nYn+RE0EJtkJOpEuco4eCFBpcLXioMum9 YFuHUl2Gts/PVu5PMhyiv+6kj9HMuGlRNgKQiV3MkUUo0hvnT+f11GxHAnjGpUdMOjBN +9G7rbpJz8sFUR0QlPt4SJjCFI3aYlrXdUK1F1EGdiJQ9t7QCzfuHi0C3xd1zBOF/H3F gNUYp8KzlZnHZG/M73l3yJEomzYvkKvcylIOGV8CBrqle98pNt/Aj5+ANn5YZJYPYRAy c49Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:user-agent:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=g/RVfnmZcQdfRZB+YRyiXpHH94CCdK1xBgexCLFpl6s=; fh=SIgps5XdV0XNwjZfT2uAI7g3mrspDldK9Qs8qQAfoa4=; b=unyOEUbTJ7lUg0+F671Ww/8/yxm5oD8hn5d+PdIbmJr5WY0X7+oMhjeF7bF9OsN8ml DiL1WutPnaT9o9ihGniZ3nOF8h+BNqn8K79TYVxK0aOP4AX1Q75pwB9o5oAXoR85MsPL t4EE+CrYy3P+hD7ffomzBMeR+ebmVi6uc1MZNBCk7VuxrFRN75iVH+6X9Fxev9w2b412 6dsJUORQLy+gEy7gejedqIfw6IuUr3FmyzuOyvuURd7EAlF2E+Ai30Idbvq6O4BefZFA LmADwNlBvBBxFSLy69CoaI1Puo1isWgD1fnA48l00kwrqlVDmDSD6GU7KuTZXnm64XmB KEdw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=bnARb9D2; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-80163-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-80163-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id c2-20020a639602000000b005be03f0da68si2357822pge.13.2024.02.25.07.24.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Feb 2024 07:24:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-80163-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=bnARb9D2; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-80163-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-80163-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=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 351B0281DC5 for ; Sun, 25 Feb 2024 15:24:39 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1BCBD208CA; Sun, 25 Feb 2024 15:21:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bnARb9D2" 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 072E220337; Sun, 25 Feb 2024 15:21:32 +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=1708874493; cv=none; b=FCeKAZJD5VAp8+icWID72IuhtJeHMw6O0hhiH20VWbsR3O8oAEitgdPeKwwAaE0Y9srPSogHqpb1wBSiQFaAw9baF7jhyWkwsE7VCOAop5bfH/NyD/xqt56HJnJr6XpL6fYQac1Gyl7TWZmJOhd8l1stypUjJw114GrO3V+Vqiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708874493; c=relaxed/simple; bh=8t7YVZmoVUR7dCk/2nFP4SmQbrkuMwJVZH30PnGw0sc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=K78RsHeD4KACQo2ttVL17D0KYOq4gwpEz6DYrTdJAcpT2fgxQ3H+1GfkMCLY/Y7Ge5X0p6u2diLs8LPpOX4XaMg/8jTxflTHocRbT4KWeX3bh2GKM1bB8xpOR3bjca8KkuNwZVPizfiI3ha85kT8qS8RVD70IC/sc6JJhjbisNY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bnARb9D2; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36A58C433C7; Sun, 25 Feb 2024 15:21:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1708874492; bh=8t7YVZmoVUR7dCk/2nFP4SmQbrkuMwJVZH30PnGw0sc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bnARb9D2cWVEPl1cN2QGngW/vksydLMFzPGRjD1FKG/7XwUofwrqOv+MpV3ijchKp ATIIzgNMiZ0TTNMlc4KCjiyS9hf1yBQ1SRqMI5de1ynam2RFRhTc64Nq/jGmLjFaNr uWjalqMYmuSegzUe7680VOghKhklFXXstGAO2UpAw6NgsH0o1uRCj1mkFyNwS/gu42 aTl+8o/KkVr+XjPoKBbeNSbbDEQ2VNBru80YvQBA+DoRUqOjEGORe/BHGI1CAbissU VLdoyf1bZtvZCPD9H7it1M6sKf+UUI9+K5dSoXtrxK1+/DVh2neGZIuPnBOwGcOt1j 7eIniwHHJM9gQ== From: "Masami Hiramatsu (Google)" To: Alexei Starovoitov , Steven Rostedt , Florent Revest Cc: linux-trace-kernel@vger.kernel.org, LKML , Martin KaFai Lau , bpf , Sven Schnelle , Alexei Starovoitov , Jiri Olsa , Arnaldo Carvalho de Melo , Daniel Borkmann , Alan Maguire , Mark Rutland , Peter Zijlstra , Thomas Gleixner , Guo Ren Subject: [PATCH v8 35/35] Documentation: probes: Update fprobe on function-graph tracer Date: Mon, 26 Feb 2024 00:21:27 +0900 Message-Id: <170887448688.564249.10243428644704000282.stgit@devnote2> X-Mailer: git-send-email 2.34.1 In-Reply-To: <170887410337.564249.6360118840946697039.stgit@devnote2> References: <170887410337.564249.6360118840946697039.stgit@devnote2> User-Agent: StGit/0.19 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1791884975997231984 X-GMAIL-MSGID: 1791884975997231984 From: Masami Hiramatsu (Google) Update fprobe documentation for the new fprobe on function-graph tracer. This includes some bahvior changes and pt_regs to ftrace_regs interface change. Signed-off-by: Masami Hiramatsu (Google) --- Changes in v2: - Update @fregs parameter explanation. --- Documentation/trace/fprobe.rst | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/Documentation/trace/fprobe.rst b/Documentation/trace/fprobe.rst index 196f52386aaa..f58bdc64504f 100644 --- a/Documentation/trace/fprobe.rst +++ b/Documentation/trace/fprobe.rst @@ -9,9 +9,10 @@ Fprobe - Function entry/exit probe Introduction ============ -Fprobe is a function entry/exit probe mechanism based on ftrace. -Instead of using ftrace full feature, if you only want to attach callbacks -on function entry and exit, similar to the kprobes and kretprobes, you can +Fprobe is a function entry/exit probe mechanism based on the function-graph +tracer. +Instead of tracing all functions, if you want to attach callbacks on specific +function entry and exit, similar to the kprobes and kretprobes, you can use fprobe. Compared with kprobes and kretprobes, fprobe gives faster instrumentation for multiple functions with single handler. This document describes how to use fprobe. @@ -91,12 +92,14 @@ The prototype of the entry/exit callback function are as follows: .. code-block:: c - int entry_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct pt_regs *regs, void *entry_data); + int entry_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data); - void exit_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct pt_regs *regs, void *entry_data); + void exit_callback(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, struct ftrace_regs *fregs, void *entry_data); -Note that the @entry_ip is saved at function entry and passed to exit handler. -If the entry callback function returns !0, the corresponding exit callback will be cancelled. +Note that the @entry_ip is saved at function entry and passed to exit +handler. +If the entry callback function returns !0, the corresponding exit callback +will be cancelled. @fp This is the address of `fprobe` data structure related to this handler. @@ -112,12 +115,10 @@ If the entry callback function returns !0, the corresponding exit callback will This is the return address that the traced function will return to, somewhere in the caller. This can be used at both entry and exit. -@regs - This is the `pt_regs` data structure at the entry and exit. Note that - the instruction pointer of @regs may be different from the @entry_ip - in the entry_handler. If you need traced instruction pointer, you need - to use @entry_ip. On the other hand, in the exit_handler, the instruction - pointer of @regs is set to the current return address. +@fregs + This is the `ftrace_regs` data structure at the entry and exit. This + includes the function parameters, or the return values. So user can + access thos values via appropriate `ftrace_regs_*` APIs. @entry_data This is a local storage to share the data between entry and exit handlers. @@ -125,6 +126,17 @@ If the entry callback function returns !0, the corresponding exit callback will and `entry_data_size` field when registering the fprobe, the storage is allocated and passed to both `entry_handler` and `exit_handler`. +Entry data size and exit handlers on the same function +====================================================== + +Since the entry data is passed via per-task stack and it is has limited size, +the entry data size per probe is limited to `15 * sizeof(long)`. You also need +to take care that the different fprobes are probing on the same function, this +limit becomes smaller. The entry data size is aligned to `sizeof(long)` and +each fprobe which has exit handler uses a `sizeof(long)` space on the stack, +you should keep the number of fprobes on the same function as small as +possible. + Share the callbacks with kprobes ================================ @@ -165,8 +177,8 @@ This counter counts up when; - fprobe fails to take ftrace_recursion lock. This usually means that a function which is traced by other ftrace users is called from the entry_handler. - - fprobe fails to setup the function exit because of the shortage of rethook - (the shadow stack for hooking the function return.) + - fprobe fails to setup the function exit because of failing to allocate the + data buffer from the per-task shadow stack. The `fprobe::nmissed` field counts up in both cases. Therefore, the former skips both of entry and exit callback and the latter skips the exit