Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp617547iof; Mon, 6 Jun 2022 09:27:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwoWN93CK7Mseccc5IxPswj6qZr9gZoIK+gc3Ud2oBKizB7vBG8qEGkhiJY7N8NxFU//+3y X-Received: by 2002:a63:8043:0:b0:3fc:d9e7:2357 with SMTP id j64-20020a638043000000b003fcd9e72357mr20562453pgd.405.1654532844449; Mon, 06 Jun 2022 09:27:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654532844; cv=none; d=google.com; s=arc-20160816; b=f1PDKSCaK5NtefmbSd+8nKbz748b1ELw5YVSOMpsTILpA5e41TvVOLxPO0CNmqZUXo lfvpnJBd/+JGZigCFg8CX6Zr6EPfdv6GMWvJNtt89VnyyYtjqUKsArky95cVTzKaz0ek 8gKSCxRSB8QXCwSowy5tyl2oA5RSND0adWxwOtHWEKMBAobJKEIop0VNZXB0i+4qW5ht Kn1kOgXafDD+PuUScSiZMnOOmAgtzhlwHWVTB6u4UpSGfU69Drt3wRr1fessup1p9nkC 6BwLpZFuLqZqwVg6836ZNzH9x/QppV89Dz+7FoERXhbTYlEHwNXS9pZL6uBCtSqrDuiY sS4A== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=HhPxGGkIV9aqD/daCoGu4xLDT4wIphgUYJ96fMx9qE0=; b=fKe40hIQniRoX+wmB8JtlSt7GQFokD0VSa8jM/PqzcpbE3RUl4Q88Z+R7RnqqCax+9 0zisubH3lSuTjWgCGtvNZH9Pu35mXaiiQaeK+mCW8wJEvLDf6V9SAkUK7TTXB1A3BtBM YXfU2G1howzgODBJEDbmc5y07gqXCH7ugmeTZi8JeSOEyfP9of0t24r+0fDktPtr9bqz /wU8P0aeOp4br8ja/6ZNTqOKry3K7Jq/e1GdWE0PIxQDQJdEaEd3TC9bU/tkvyUxOYmE Esqa4B6MSavi2SqFjC02hTtGLEM7LqxRNCwSbBImlfjk/Pxl+8cEZ5Wr9AMIkg1gfKJY Lsaw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Eb7DBYNs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id s20-20020a056a0008d400b0050d3ccc654fsi16617614pfu.10.2022.06.06.09.27.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 09:27:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Eb7DBYNs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A75CF1B185F; Mon, 6 Jun 2022 09:10:57 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241559AbiFFQKe (ORCPT + 99 others); Mon, 6 Jun 2022 12:10:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241534AbiFFQKS (ORCPT ); Mon, 6 Jun 2022 12:10:18 -0400 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 74B991A7D1B for ; Mon, 6 Jun 2022 09:10:15 -0700 (PDT) Received: by mail-pl1-x635.google.com with SMTP id q18so12438879pln.12 for ; Mon, 06 Jun 2022 09:10:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=HhPxGGkIV9aqD/daCoGu4xLDT4wIphgUYJ96fMx9qE0=; b=Eb7DBYNsJRvRKxdal/A5ngoZjG6BemmrY5eRZneOiJiEJjFVcYhYOfSI99RFZbqMe8 rWWO3GQnWhYmsP+taTndgR+x0yI/Z2EzbtrzWHt2QyEBec5BUZyjoqBc5PdaqfAJfhKp 0oRoyfnoSI6ICcYn85+63XTVeRz9dKJr8X3d0sZbBF3UPQvMQilUJHatQSqtDRZ/SjqP Rr68NDpTd2Ux6ZHwyF/IWYERtOIRriNzbQfJT186pseM2oYXV+960hlMbMeSwj5xnG0g vIF9/yzu9DJeYtLdWoF5dABAFt2OzkDga4Ub2YWhbWT2Ha0xdXyBvQPQXg8D2WSoIqnk zERg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=HhPxGGkIV9aqD/daCoGu4xLDT4wIphgUYJ96fMx9qE0=; b=sRfzSgaP7pvRlxSG2jQwYLDpzUkepgTUeco5ywcZGXSIbw+lvQCMVNYUB/s9I5qkx0 etXi2K5lknZwyJPNd7nT6t3rztlpPaS0Fsyte81RggkE8iHbkTVwNQDyZj7qCqgLFOVp 5RbSJynT7EzUMedKx8cY5WSRYGtPBOE68LXz317bDkjiSLOQrQdbybD8orFf8oAvD7h8 QFR0L5NtqKpt/JS3QI5FmirdtY7JIAtQ9N1X7IYhvaTW3Bh8AUG+VR1PzdAjj+Lu9db1 2SCUEjm6HFq4FmR/7VpJNgnuw0zwiBhGelV9cJnbLxjBlBoWntkbzluBwzkfSs7Okh1b 7f5A== X-Gm-Message-State: AOAM532xjAUu3RDziO5pDzaOH051Pg3f2ur7B08OHcE9zLobrPWRuJgi RDTtCrbtVA06POchR2e/Jok= X-Received: by 2002:a17:90b:4a8e:b0:1e4:e2bd:7ff1 with SMTP id lp14-20020a17090b4a8e00b001e4e2bd7ff1mr30935665pjb.58.1654531814943; Mon, 06 Jun 2022 09:10:14 -0700 (PDT) Received: from localhost.localdomain (li567-56.members.linode.com. [192.155.81.56]) by smtp.gmail.com with ESMTPSA id l63-20020a632542000000b003fc4001fd5fsm10777246pgl.10.2022.06.06.09.10.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jun 2022 09:10:14 -0700 (PDT) From: Jeff Xie To: rostedt@goodmis.org Cc: mingo@redhat.com, mhiramat@kernel.org, zanussi@kernel.org, linux-kernel@vger.kernel.org, Jeff Xie Subject: [PATCH v12 0/4] trace: Introduce objtrace trigger to trace the kernel object Date: Tue, 7 Jun 2022 00:09:39 +0800 Message-Id: <20220606160943.663180-1-xiehuan09@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no 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 Introduce a method based on function tracer to trace any object and get the value of the object dynamically. the object can be obtained from the dynamic event (kprobe_event/uprobe_event) or the static event(tracepoint). Usage: When using the kprobe event, only need to set the objtrace(a new trigger), we can get the value of the object. The object is from the setting of the kprobe event. For example: For the function bio_add_page(): int bio_add_page(struct bio *bio, struct page *page, unsigned int len, unsigned int offset) Firstly, we can set the base of the object, thus the first string "arg1" stands for the value of the first parameter of this function bio_add_gage(), # echo 'p bio_add_page arg1=$arg1' > ./kprobe_events Secondly, we can get the value dynamically based on above object. find the offset of the bi_size in struct bio: $ gdb vmlinux (gdb) p &(((struct bio *)0)->bi_iter.bi_size) $1 = (unsigned int *) 0x28 # echo 'objtrace:add:arg1,0x28:u32:1 if comm == "cat"' > ./events/kprobes/ \ p_bio_add_page_0/trigger # cd /sys/kernel/debug/tracing/ # echo 'p bio_add_page arg1=$arg1' > ./kprobe_events # echo 'objtrace:add:arg1,0x28:u32:1 if comm == "cat"' > ./events/kprobes/p_bio_add_page_0/trigger # du -sh /test.txt 12.0K /test.txt # cat /test.txt > /dev/null # cat ./trace # tracer: nop # # entries-in-buffer/entries-written: 128/128 #P:4 # # _-----=> irqs-off/BH-disabled # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / _-=> migrate-disable # |||| / delay # TASK-PID CPU# ||||| TIMESTAMP FUNCTION # | | | ||||| | | cat-117 [002] ...1. 1.602243: __bio_try_merge_page <-bio_add_page object:0xffff88811bee4000 value:0x0 cat-117 [002] ...1. 1.602244: __bio_add_page <-bio_add_page object:0xffff88811bee4000 value:0x0 cat-117 [002] ...2. 1.602244: bio_add_page <-ext4_mpage_readpages object:0xffff88811bee4000 value:0x1000 cat-117 [002] ...1. 1.602245: __bio_try_merge_page <-bio_add_page object:0xffff88811bee4000 value:0x1000 cat-117 [002] ...1. 1.602245: __bio_add_page <-bio_add_page object:0xffff88811bee4000 value:0x1000 cat-117 [002] ...2. 1.602245: bio_add_page <-ext4_mpage_readpages object:0xffff88811bee4000 value:0x2000 cat-117 [002] ...1. 1.602245: __bio_try_merge_page <-bio_add_page object:0xffff88811bee4000 value:0x2000 cat-117 [002] ...1. 1.602245: __bio_add_page <-bio_add_page object:0xffff88811bee4000 value:0x2000 cat-117 [002] ...1. 1.602245: submit_bio <-ext4_mpage_readpages object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602245: submit_bio_noacct <-ext4_mpage_readpages object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: __submit_bio <-submit_bio_noacct object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: submit_bio_checks <-__submit_bio object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: __cond_resched <-submit_bio_checks object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: should_fail_bio <-submit_bio_checks object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: blk_mq_submit_bio <-submit_bio_noacct object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: blk_attempt_plug_merge <-blk_mq_submit_bio object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602246: blk_mq_sched_bio_merge <-blk_mq_submit_bio object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602247: __rcu_read_lock <-blk_mq_submit_bio object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602247: __rcu_read_unlock <-blk_mq_submit_bio object:0xffff88811bee4000 value:0x3000 cat-117 [002] ...1. 1.602247: __blk_mq_alloc_requests <-blk_mq_submit_bio object:0xffff88811bee4000 value:0x3000 -0 [002] d..3. 1.602298: bio_endio <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602298: mpage_end_io <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602298: __read_end_io <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602300: bio_put <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602300: bio_free <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602300: mempool_free <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602300: mempool_free_slab <-blk_update_request object:0xffff88811bee4000 value:0x0 -0 [002] d..3. 1.602300: kmem_cache_free <-blk_update_request object:0xffff88811bee4000 value:0x0 ... Almost all changelogs were suggested by Masami(mhiramat@kernel.org) and steve(rostedt@goodmis.org), thank you all so much. v12: - use the %zu to print the sizeof Reported-by: kernel test robot Suggested-by: Nathan Chancellor v11: - remove useless atomic counting methods for num_traced_obj - make array objtrace_fetch_types null terminated - add raw_spin_lock_init for obj_data_lock v10: - support ftrace instances - use trace_buffer_lock_reserve instead of trace_event_buffer_lock_reserve - a lot of cleanup work has been done mainly for event_object_trigger_parse v9: - fix objtrace trigger output was incomplete - fix the objtrace trigger was removed when using the existed parameter on event. - add testcase for the second fix above. v8: - revert to use per-cpu recursion for the function trace_object_events_call - recover the filter when getting the value of the object - simplify the implementation for the function get_object_value - fix the build error v7: - use fixed-size array for object pool instead of list structure - use ftrace_test_recursion_trylock for function trace hook function - fix trace_object_ref reference count in the init_trace_object - invoke exit_trace_object no matter whether data->ops->free is null in the unregister_object_trigger - release private_data of event_trigger_data in the trace_object_trigger_free - remove [RFC] tag v6: - change the objtrace trigger syntax. - add patchset description - add /README v5: - add testcasts - add check the field->size - add lockless to search object - describe the object trace more clearly in Kconfig v4: - please ignore the v4 which is the same as v3 v3: - change the objfilter to objtrace - add a command to the objfilter syntax - change to get the value of the object - use trace_find_event_field to find the field instead of using argN - get data from @rec in the event trigger callback funciton v2: - adding a "objfilter" trigger to update object Jeff Xie (4): trace: Add trace any kernel object trace/objtrace: Get the value of the object trace/objtrace: Add testcases for objtrace trace/objtrace: Add documentation for objtrace Documentation/trace/events.rst | 83 +++ include/linux/trace_events.h | 1 + kernel/trace/Kconfig | 10 + kernel/trace/Makefile | 1 + kernel/trace/trace.c | 11 + kernel/trace/trace.h | 21 + kernel/trace/trace_entries.h | 18 + kernel/trace/trace_events_trigger.c | 5 +- kernel/trace/trace_object.c | 615 ++++++++++++++++++ kernel/trace/trace_output.c | 40 ++ .../ftrace/test.d/trigger/trigger-objtrace.tc | 41 ++ 11 files changed, 844 insertions(+), 2 deletions(-) create mode 100644 kernel/trace/trace_object.c create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/trigger-objtrace.tc Jeff Xie (4): trace: Add trace any kernel object trace/objtrace: Get the value of the object trace/objtrace: Add testcases for objtrace trace/objtrace: Add documentation for objtrace Documentation/trace/events.rst | 83 +++ include/linux/trace_events.h | 1 + kernel/trace/Kconfig | 10 + kernel/trace/Makefile | 1 + kernel/trace/trace.c | 11 + kernel/trace/trace.h | 21 + kernel/trace/trace_entries.h | 18 + kernel/trace/trace_events_trigger.c | 5 +- kernel/trace/trace_object.c | 615 ++++++++++++++++++ kernel/trace/trace_output.c | 40 ++ .../ftrace/test.d/trigger/trigger-objtrace.tc | 41 ++ 11 files changed, 844 insertions(+), 2 deletions(-) create mode 100644 kernel/trace/trace_object.c create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/trigger-objtrace.tc base-commit: b39181f7c6907dc66ff937b74758671fa6ba430c -- 2.25.1