From patchwork Thu Apr 27 01:17:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Masami Hiramatsu (Google)" X-Patchwork-Id: 8701 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp603347vqo; Wed, 26 Apr 2023 18:19:11 -0700 (PDT) X-Google-Smtp-Source: AKy350bqgdWsdAlMwNUCoHFI/WBrTTosKD5HeJ74uA9dbQRQKqGRj5ggMw810vFkQH7JKobaMP/d X-Received: by 2002:a17:902:c74a:b0:1a5:a1b:bbd8 with SMTP id q10-20020a170902c74a00b001a50a1bbbd8mr19446732plq.45.1682558351391; Wed, 26 Apr 2023 18:19:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682558351; cv=none; d=google.com; s=arc-20160816; b=aXOm1ZVtLUuI+WiNAKs7/9dx7Y8jws9Ur59BLv+RDhhcTVudEI+iYABlRISHrbChUY PREjlDleoJ+tQugdzJ5hH3vMt0duiHPIKMk6DgwJglKyPtFzhkylDgDQRDmeEwXD3N+o gk5BFYVlPCcO55tpU+6cz3eV+PW0EtYJPsaHG2lCt/NrhNgcrMkmSzCuhUW/RxVv6/Kd utFuc0CJwzmRw1sJWJjWRmqbnvrOD1A1GTezlKuwvN2/J+l4mA+mLA/cDGtCzT7PAGsl iyKIgn82EkyS7rtW2AYlbAUxnDYniHJg2P5zsmdOb0Gh5pPukb/gWlyAGLa9o+xzBpkj SUoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:message-id:date:subject:cc:to:from:dkim-signature; bh=gw/SdBG2DM6DCci9qQh68CXDUXqtASF0tEH/gwhRtQM=; b=vWB2/fn3cFdegt7H/VAT4sct2oFbSpEKbv4tFLUjiu15Am5VClrGFte4MN1FnEJ/Iy ES4woiG8cePVYlmDy/4IeM7TRLrDmTkumUQx35fzWO41f1Qii076hwiLyn42dORJqmsF Op4ruCvJoLoZpzMw69QaNedVxyBGw2Qt06nPI9XMJNvxD4PFXZpvR+RGZHa6iMM3zLMR adswJdPoiyQvnvIZDCQun7mxSnxYQCRH3dsyBaYoPh5+KpWgNhS5K1Z1Bp9PcGjJkpqZ k74fFvsRdj46ovhc0Zdy2JByBUYwuyyS/xz0JvTsPw4xBPTIO9B3WRtWGdkcHj1KNaDF e0eg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=fOOXe3Bc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k3-20020a170902d58300b001a527a498fcsi17168034plh.169.2023.04.26.18.18.59; Wed, 26 Apr 2023 18:19:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=fOOXe3Bc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242825AbjD0BSA (ORCPT + 99 others); Wed, 26 Apr 2023 21:18:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242812AbjD0BRy (ORCPT ); Wed, 26 Apr 2023 21:17:54 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4E58240C0; Wed, 26 Apr 2023 18:17:50 -0700 (PDT) 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 D0F1E639B2; Thu, 27 Apr 2023 01:17:49 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4426AC433D2; Thu, 27 Apr 2023 01:17:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1682558269; bh=FABAoRqVbw20oe41N800uwj2LNMxav062B7Ytby3tmQ=; h=From:To:Cc:Subject:Date:From; b=fOOXe3BcwkMsZsyd2v6lLGEe4cQKO0vVAe2ljiAzWHGvJEbY6lF5JIDKaAV16EEJ5 j5ClYBYoIhzYOhjzuIZ5tgixJCVrAIF7ErmKXBONsQEJAhggQ4DTexjZOLpOGfTh8a H7tErRFgLefKciWEZ/wvKvYakjL6zKvv25napbONsSSVSaUyI1cQRfluIHwaZ4dzqN AEeYu1O6xxmWralx6KdjthvTcckSYfGiNa7osCw9O2zSgrCcS31yaoPXmWVc4tnhTW T0DCK9Izu5ChUommducF7HhGn1pSnmu5sqWZLGxyCTcC4R87vduNLq5DQ8+4hSqsKL U90iLalCNlaIw== From: "Masami Hiramatsu (Google)" To: linux-trace-kernel@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Steven Rostedt , mhiramat@kernel.org, Florent Revest , Mark Rutland , Will Deacon , Mathieu Desnoyers , Martin KaFai Lau , bpf@vger.kernel.org Subject: [PATCH v7 00/11] tracing: Add fprobe events Date: Thu, 27 Apr 2023 10:17:45 +0900 Message-ID: <168255826500.2565678.17719875734305974633.stgit@mhiramat.roam.corp.google.com> X-Mailer: git-send-email 2.40.1.495.gc816e09b53d-goog User-Agent: StGit/0.19 MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764290306253569740?= X-GMAIL-MSGID: =?utf-8?q?1764290306253569740?= Hi, Here is the 7th version of improve fprobe and add a basic fprobe event support for ftrace (tracefs) and perf. Here is the previous version. https://lore.kernel.org/all/168234755610.2210510.12133559313738141202.stgit@mhiramat.roam.corp.google.com/ This version is rebased on the latest linux-trace/for-next, fixes bpf_get_btf_vmlinux() return value check [6/11] and adds new BTF $retval type support [9/11] (I forgot to implement this feature last time). Also updates according to the BTF $retval type support. You can also get this series from: git://git.kernel.org/pub/scm/linux/kernel/git/mhiramat/linux.git topic/fprobe-event-ext With this fprobe events, we can continue to trace function entry/exit even if the CONFIG_KPROBES_ON_FTRACE is not available. Since CONFIG_KPROBES_ON_FTRACE requires the CONFIG_DYNAMIC_FTRACE_WITH_REGS, it is not available if the architecture only supports CONFIG_DYNAMIC_FTRACE_WITH_ARGS (e.g. arm64). And that means kprobe events can not probe function entry/exit effectively on such architecture. But this problem can be solved if the dynamic events supports fprobe events because fprobe events doesn't use kprobe but ftrace via fprobe. FPROBE EVENTS ============= Fprobe events allows user to add new events on the entry and exit of kernel functions (which can be ftraced). Unlike kprobe events, the fprobe events can only probe the function entry and exit, and it can only trace the function args, return value, and stacks. (no registers) For probing function body, users can continue to use the kprobe events. The tracepoint probe events (tprobe events) also allows user to add new events dynamically on the tracepoint. Most of the tracepoint already has trace-events, so this feature is useful if you only want to know a specific parameter, or trace the tracepoints which has no trace-events (e.g. sched_*_tp tracepoints only exposes the tracepoints.) The fprobe events syntax is; f[:[GRP/][EVENT]] FUNCTION [FETCHARGS] f[MAXACTIVE][:[GRP/][EVENT]] FUNCTION%return [FETCHARGS] And tracepoint probe events syntax is; t[:[GRP/][EVENT]] TRACEPOINT [FETCHARGS] This series includes BTF argument support for fprobe/tracepoint events, and kprobe events. This allows us to fetch a specific function parameter by name, and all parameters by '$$args'. Note that enabling this feature, you need to enable CONFIG_BPF_SYSCALL and confirm that your arch supports CONFIG_HAVE_FUNCTION_ARG_ACCESS_API. E.g. # echo 't kfree ptr' >> dynamic_events # echo 'f kfree object' >> dynamic_events # cat dynamic_events t:tracepoints/kfree kfree ptr=ptr f:fprobes/kfree__entry kfree object=object # echo 1 > events/fprobes/enable # echo 1 > events/tracepoints/enable # echo > trace # head -n 20 trace | tail # TASK-PID CPU# ||||| TIMESTAMP FUNCTION # | | | ||||| | | tail-84 [000] ..... 1324.561958: kfree__entry: (kfree+0x4/0x140) object=0xffff888006383c00 tail-84 [000] ...1. 1324.561961: kfree: (__probestub_kfree+0x4/0x10) ptr=0xffff888006383c00 tail-84 [000] ..... 1324.561988: kfree__entry: (kfree+0x4/0x140) object=0x0 tail-84 [000] ...1. 1324.561988: kfree: (__probestub_kfree+0x4/0x10) ptr=0x0 tail-84 [000] ..... 1324.561989: kfree__entry: (kfree+0x4/0x140) object=0xffff88800671e600 tail-84 [000] ...1. 1324.561989: kfree: (__probestub_kfree+0x4/0x10) ptr=0xffff88800671e600 tail-84 [000] ..... 1324.562368: kfree__entry: (kfree+0x4/0x140) object=0xffff8880065e0580 tail-84 [000] ...1. 1324.562369: kfree: (__probestub_kfree+0x4/0x10) ptr=0xffff8880065e0580 Thank you, --- Masami Hiramatsu (Google) (11): fprobe: Pass return address to the handlers tracing/probes: Add fprobe events for tracing function entry and exit. selftests/ftrace: Add fprobe related testcases tracing/probes: Add tracepoint support on fprobe_events tracing/probes: Move event parameter fetching code to common parser tracing/probes: Support function parameters if BTF is available tracing/probes: Add $$args meta argument for all function args tracing/probes: Add BTF retval type support selftests/ftrace: Add tracepoint probe test case selftests/ftrace: Add BTF arguments test cases Documentation: tracing/probes: Add fprobe event tracing document Documentation/trace/fprobetrace.rst | 187 +++ Documentation/trace/index.rst | 1 include/linux/fprobe.h | 11 include/linux/rethook.h | 2 include/linux/trace_events.h | 3 include/linux/tracepoint-defs.h | 1 include/linux/tracepoint.h | 5 kernel/kprobes.c | 1 kernel/trace/Kconfig | 25 kernel/trace/Makefile | 1 kernel/trace/bpf_trace.c | 6 kernel/trace/fprobe.c | 17 kernel/trace/rethook.c | 3 kernel/trace/trace.c | 13 kernel/trace/trace.h | 11 kernel/trace/trace_eprobe.c | 44 - kernel/trace/trace_fprobe.c | 1194 ++++++++++++++++++++ kernel/trace/trace_kprobe.c | 33 - kernel/trace/trace_probe.c | 504 +++++++- kernel/trace/trace_probe.h | 43 + kernel/trace/trace_uprobe.c | 8 lib/test_fprobe.c | 10 samples/fprobe/fprobe_example.c | 6 .../ftrace/test.d/dynevent/add_remove_btfarg.tc | 54 + .../ftrace/test.d/dynevent/add_remove_fprobe.tc | 26 .../ftrace/test.d/dynevent/add_remove_tprobe.tc | 27 .../ftrace/test.d/dynevent/fprobe_syntax_errors.tc | 99 ++ .../ftrace/test.d/dynevent/tprobe_syntax_errors.tc | 82 + .../ftrace/test.d/kprobe/kprobe_syntax_errors.tc | 13 29 files changed, 2290 insertions(+), 140 deletions(-) create mode 100644 Documentation/trace/fprobetrace.rst create mode 100644 kernel/trace/trace_fprobe.c create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/add_remove_btfarg.tc create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/add_remove_fprobe.tc create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/add_remove_tprobe.tc create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/fprobe_syntax_errors.tc create mode 100644 tools/testing/selftests/ftrace/test.d/dynevent/tprobe_syntax_errors.tc -- Masami Hiramatsu (Google)