From patchwork Mon Feb 17 17:23:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juntong Deng X-Patchwork-Id: 13978376 X-Patchwork-Delegate: bpf@iogearbox.net Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2072.outbound.protection.outlook.com [40.92.90.72]) (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 B78964EB51; Mon, 17 Feb 2025 17:26:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.90.72 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813170; cv=fail; b=ru6DAiIEICJYLCyR4U0PNH61O/VhIZukJsthksveOzIs/Nt1V/KclXcRkg7J4wcZwszJMXJwCFVtovz9YeFa+HBUIz7kYpSJwCoJXUt3wKhlFLXtJH2KXLrqu88NqZg6+SArD6SX8WIxMA/UMtmBSaWnx0UWnTNLBWUoD95U28I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813170; c=relaxed/simple; bh=uZyrKme2tCXnb7MvZUcujjsBOJeNdWhoOWfkCwisZbs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=uwHQ/uGP3IibzapFVV09OhvGRnn7ego8YbadZgyb0B5SDAblHj7U+EpfjMrrbg/qhlQVgQ9o1DGpD+qRXMBeUgInYaOEKrAXoF3R9iUR6wxhQyBf2eCFPw/aYE6cvLyyh3P+FHdQoRY8YdeEv7kGM7INzp1lDHwSdT+jmKA9dXo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com; spf=pass smtp.mailfrom=outlook.com; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b=MrtLmmrq; arc=fail smtp.client-ip=40.92.90.72 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=outlook.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b="MrtLmmrq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Jl1lwHAeG+6WwJm3N2teldOZ8r9WyGf3cSUAExc5+S9e6ciZKfraMuK1K7BOAJO71tre8mDRaL+Btic4pKVASDggpXLwT7gYHNSO8HGFUpmJGDvdOsJsqjilJA8JkUj+w1VaXot+va9qLd5NwH9cXT1ETgrt4WsM7n2wHHpPATGIDHhk/4QlggTQOgLJbs52gDe0od57f0LFu1KbtAaCA2WcTJWgKfz5nUNlR42U7E3BDe4tj05ANrfF1iintsoq3mrs5Wl/sU5+PolaRcxPP3t/1o2YoVB9ZRNtkjVWAXlbBCJ6GdQtX3xxwRnlHLclcmByY1qEiFUQr13/8+14Aw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d4md4asjGChWOidZdqmwKyZ0PWGkOJXry09dz2xmGuo=; b=OkRclrHmzB0K4dKHvl0MeXd/IDL2PvGvfFHJ8+AetDqyG/ynR2Zb1gV4oV375FBeGOt0O97llrk9zBcjqmwD7RIuviVtMOnPxeU8jPkTgrFIFWB4vqA+GL9zbTo2XeVhkoEejLbrjC9L9EwSr7tk1EJK1IzzZI+pZgtC7gl1D7GUbcF0ZQEILwd1ta93axA5Crn4jjhIGmi7k3F8HXKv7tzx3SANsVK6NdOEsW6492j1x8PloC8PQg1ys69tZ4X5/oDullw0jd/3u1vM4NDbhMggEy4rLGZ31ISIXD99nGvJJh+hc12IRjG+w7jb9YJMsOphjZLMWKEfLoNCcIklyw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d4md4asjGChWOidZdqmwKyZ0PWGkOJXry09dz2xmGuo=; b=MrtLmmrqRQlKYOQ2IteToCxVQIl01AASozfmNM+6SSWnETAqyWSgFU0Fwv5gFVfe6Ag0Uv4B7Ory4xbbSouYB3/ecM3ba7gUOJ0r8eBaTOMxGXN51MV6VaUQ2BNTLEqm7WJt/YIxN1nazdrFt/82HjnFfOwDcLIePA+cwQe0J2O3KrzShoAOxIodzg22wtADTTRrm1jY9kL+cMM2Vy9CVA2LuXaVtRg2YDmIjcA3otnXlzMnZLwHWHlZ7PeO3n9+Bp69YWJZPA1QyoHLuR5Yt0LUzyIKhPutbwvOegzlFW5kILndPZbphYzTKg6Tfz4UO2G1U74SEErD4JZR7qlbqQ== Received: from AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) by DBAPR03MB6613.eurprd03.prod.outlook.com (2603:10a6:10:19b::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.19; Mon, 17 Feb 2025 17:26:05 +0000 Received: from AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8]) by AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8%5]) with mapi id 15.20.8445.016; Mon, 17 Feb 2025 17:26:05 +0000 From: Juntong Deng To: ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, memxor@gmail.com, snorcht@gmail.com Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH bpf-next 1/3] bpf: Add BPF debug mode Date: Mon, 17 Feb 2025 17:23:48 +0000 Message-ID: X-Mailer: git-send-email 2.39.5 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0024.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ae::19) To AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) X-Microsoft-Original-Message-ID: <20250217172350.56184-1-juntong.deng@outlook.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR03MB5080:EE_|DBAPR03MB6613:EE_ X-MS-Office365-Filtering-Correlation-Id: 86d140b4-6029-4f65-9694-08dd4f782878 X-Microsoft-Antispam: BCL:0;ARA:14566002|5072599009|19110799003|15080799006|8060799006|461199028|440099028|3412199025|19111999003|41001999003; X-Microsoft-Antispam-Message-Info: H9hx185upfSNaN19KMJ1GmadWsQ4lwj1N83qa7LNrFcEWK/6ZYy+nXZz38IwIpo3CvIGot7vZafm//u91E3SOXPj2lIaR2BVS4nPNAP6DVycaDzbJrt2BQvpQQA87BrtUx/VYdTnaM3C/aq+CoqUOFh/zKEjdXpRG3WwKgI29wheFa3T3jawbr9PmF3jh0hC2N+MmOUUPsxOGf+bOaPHBuDhe0hl7As3xWP0Ak1IqzqNoLbaFDZqLXsNuqwXAUfmXjCiVGXgylHxPfwHciet9A4PNIWAM0VCRJSaE05OjYa+Cxn5jV+xBgrZIGGmlQ4BU0Q7oNmyUyZCmHs+mJ4/8FvSf1FFw3IZ8n0yLA9ZWr22aRx/Vijuhue2aBIhlYekats2ryBn92z3QDanSntdHmua94aijan7jbwKaom3n4y2i/gjE0ZroYxBmT06OpzmB641BzhDJN06yZqdQk50KQ2dnHfrRqR7KeH2Xy/ZzF/AKwZxfR8RCwdMObKwDU5nPcyZSugtQyhaWjJgLn8PJNNsDV0eO158kEy5RDNiUSoCT5+OE1he7fwoV1T+1DwLxSoC12Ai6JO403NhDHVDcNJBJGyiW8cBbf8C7Ow3630Wk6x5i36S4rKpIO2AeLbzmmmsIU86f6uqjFWvRG8p/OQzuqwBujGmkYTHdjJS3GyoujO4lmIyO7CrCg6ZvIcn60gQQPkaTz1YIfALcZBg9oMggd09Mhvq7gRoz6V8AJp0ZZxaTa1ud539hToDkEvsHEEQV7/vX5H547j/ObN3np0MIbq56D7TT8EqDI15K+OPBQ8bgJJ7FBQervDUfqslA2xwWjG0vFrXbnsQ/Q45EgfJmkz1dKFj0k7Qt078RcQ57a4Nz7YGL1AOU/4ZYCpDUaj8TIXKHKHZgOCSvjVeRdrq8+GU/um6uFm9Vr0NrHPXjChGgPRSyd2ac3wNEg2mS4N6pPw4UUTzuTeQpZ7TMG2lECrldqlt+W5mbCDwiBJplC7BfdRSU3/TQgML8952y3fQVJwfPgWkB3iU3UpN1SFWdiOawvqsWx7zBbcI67r7uPwatU0CSv6B7cw9qIhAsL68O4ei000QsCm/725NNXb70ZV9mEhLSI8/Sd7W8Ng= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: l6WlnY1hd6K82nkfd70Im9Ej7sZ0CTPWoy+cD4MZxOm665uR2SjXOflqVFWZnZUH5Pl6kHfsHDd0gzqRsxl0ldFGw/K1CnXOxyJbfW23gRFbqGhnT44n/TH4Z1ETPXpuNVhkoUng5mXQSGpc/d6b7iLnFmmZ734bH8mfHY138iO3gnSNTFR3Ss0g9Ue0+/zMnEq70pPeJTQEtyUyLBRxZpE5/SO39S7cwB3fryGHnoFH2/HTYJtOtxb8gqLG3l58uEgCK95NnTVG99oduwS0k6usibkbNDhcJ7pAGTjVPs0Ja345ZXIlWSm7Amrkgd/We3HLWrNkwyfANm/3grIoo1qW0Xf0nLRqNTBTljiUlCpA1K0JYi8hYg1+oFTro06QtphWyJUvry54a15a2EkG7Q0pusVYd/6G6vAZpZbTpi/8RIgjEZZcGYmRK4qPw+LgHQTzyYFBV2eoRLHn3J1yHp+qSlYo+8FKh0uccxEria3O3m0AjTupX0ohK/4wYlo5gNSsUSMF1t0w0qcXsswZv/A2Nik0iOeZcMYpHVPNaOCDfi5FWSc5JVamP2VoCAjUzZbyS0GkV7WqVmdYt3Nn3AE3bZN4g0sv7tnglnDa1qGc6TIJrKCfDiT9Lo7h2rP4EZRNhhVFv7MAxkewEzP0myhSgb//DgeB3QeFooBLf04zr5Ajn8ixRN+jyVfxqKRHebzRztwQ5+CYMXO03x26EvZktpW8Xn0OtDyJlIrnIDaOXIzXfPBgay7PiGzKNAcj41yHUeFCVOjTZ/SsMo70yrSBxEgmyhsXaRuGQPPNbDJFIxxcDbiJFPqn39UDVlGKJo7jGcKHuTUeYt8JbWeSYCK2Enu4CDDuTL5g0VCS1zAykmKuEZ63rJKuxRp7La1eaM43M5gobRdyWhvzz2hrEWozFiOk7ZJ2DcNRWqBE3azuRvgduCKj3DfVeOH/G/NIFgp/1EwMG8Vii1Nalt88t9ewJbY3ISUglZ393qcXuCJqihDUuPBaCSCCwyuEQIjAj2/DKo894Nr7XDBoCWvkSNN3t0kq452ujdNx/WgxcpBzoN0H08vQVIE7ICjyum7ThCcP6kKUkxHoADYO2gROD1CJho4qYiKumQJTJctnVJyFWQ1tdH0fobmAxT3t68ZhjihwvQhwSAJmc+e27SUAK8deFuX46tTqhSbQ45tHVZxXHrd6GvA3tvlUu8WC7dwYtsrHXDJuuqGpmS8Me2FJAudVCxFRWkGvgGd5iRVV3aUpXPc9o37MW/vb1+Y5yquh X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 86d140b4-6029-4f65-9694-08dd4f782878 X-MS-Exchange-CrossTenant-AuthSource: AM6PR03MB5080.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Feb 2025 17:26:05.3218 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR03MB6613 X-Patchwork-Delegate: bpf@iogearbox.net X-Patchwork-State: RFC This patch adds BPF debug mode. When a bpf program is in debug mode, all calls to kfuncs and helpers are traced and output to the trace ring buffer, including arguments and return values, in a strace-like format. Signed-off-by: Juntong Deng --- include/linux/bpf.h | 3 ++- include/uapi/linux/bpf.h | 1 + kernel/bpf/syscall.c | 4 +++- tools/include/uapi/linux/bpf.h | 2 ++ tools/lib/bpf/libbpf.c | 6 ++++++ tools/lib/bpf/libbpf.h | 2 ++ 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 1bc90d805872..c8585b436d0b 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1614,7 +1614,8 @@ struct bpf_prog { call_get_stack:1, /* Do we call bpf_get_stack() or bpf_get_stackid() */ call_get_func_ip:1, /* Do we call get_func_ip() */ tstamp_type_access:1, /* Accessed __sk_buff->tstamp_type */ - sleepable:1; /* BPF program is sleepable */ + sleepable:1, /* BPF program is sleepable */ + debug_mode:1; enum bpf_prog_type type; /* Type of BPF program */ enum bpf_attach_type expected_attach_type; /* For some prog types */ u32 len; /* Number of filter blocks */ diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index fff6cdb8d11a..6c68a16a5549 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1272,6 +1272,7 @@ enum bpf_perf_event_type { /* The verifier internal test flag. Behavior is undefined */ #define BPF_F_TEST_REG_INVARIANTS (1U << 7) +#define BPF_F_DEBUG_MODE (1U << 8) /* link_create.kprobe_multi.flags used in LINK_CREATE command for * BPF_TRACE_KPROBE_MULTI attach type to create return probe. */ diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index c420edbfb7c8..1261315c2410 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -2757,7 +2757,8 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr, u32 uattr_size) BPF_F_XDP_HAS_FRAGS | BPF_F_XDP_DEV_BOUND_ONLY | BPF_F_TEST_REG_INVARIANTS | - BPF_F_TOKEN_FD)) + BPF_F_TOKEN_FD | + BPF_F_DEBUG_MODE)) return -EINVAL; bpf_prog_load_fixup_attach_type(attr); @@ -2870,6 +2871,7 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr, u32 uattr_size) prog->expected_attach_type = attr->expected_attach_type; prog->sleepable = !!(attr->prog_flags & BPF_F_SLEEPABLE); + prog->debug_mode = !!(attr->prog_flags & BPF_F_DEBUG_MODE); prog->aux->attach_btf = attach_btf; prog->aux->attach_btf_id = attr->attach_btf_id; prog->aux->dst_prog = dst_prog; diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index fff6cdb8d11a..3b700cb86836 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1272,6 +1272,8 @@ enum bpf_perf_event_type { /* The verifier internal test flag. Behavior is undefined */ #define BPF_F_TEST_REG_INVARIANTS (1U << 7) +#define BPF_F_DEBUG_MODE (1U << 8) + /* link_create.kprobe_multi.flags used in LINK_CREATE command for * BPF_TRACE_KPROBE_MULTI attach type to create return probe. */ diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 194809da5172..2ff3f2a597b3 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -689,6 +689,7 @@ struct bpf_object { bool loaded; bool has_subcalls; bool has_rodata; + bool debug_mode; struct bpf_gen *gen_loader; @@ -7520,6 +7521,8 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog load_attr.log_level = log_level; load_attr.prog_flags = prog->prog_flags; load_attr.fd_array = obj->fd_array; + if (obj->debug_mode) + load_attr.prog_flags |= BPF_F_DEBUG_MODE; load_attr.token_fd = obj->token_fd; if (obj->token_fd) @@ -7972,6 +7975,7 @@ static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, char *log_buf; size_t log_size; __u32 log_level; + bool debug_mode; if (obj_buf && !obj_name) return ERR_PTR(-EINVAL); @@ -7996,6 +8000,7 @@ static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, log_buf = OPTS_GET(opts, kernel_log_buf, NULL); log_size = OPTS_GET(opts, kernel_log_size, 0); log_level = OPTS_GET(opts, kernel_log_level, 0); + debug_mode = OPTS_GET(opts, debug_mode, false); if (log_size > UINT_MAX) return ERR_PTR(-EINVAL); if (log_size && !log_buf) @@ -8018,6 +8023,7 @@ static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf, obj->log_buf = log_buf; obj->log_size = log_size; obj->log_level = log_level; + obj->debug_mode = debug_mode; if (token_path) { obj->token_path = strdup(token_path); diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 3020ee45303a..191547045b7e 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -123,6 +123,8 @@ struct bpf_object_open_opts { */ const char *object_name; /* parse map definitions non-strictly, allowing extra attributes/data */ + bool debug_mode; + /* open debug mode */ bool relaxed_maps; /* maps that set the 'pinning' attribute in their definition will have * their pin_path attribute set to a file in this directory, and be From patchwork Mon Feb 17 17:23:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juntong Deng X-Patchwork-Id: 13978377 X-Patchwork-Delegate: bpf@iogearbox.net Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2081.outbound.protection.outlook.com [40.92.91.81]) (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 191ED229B05; Mon, 17 Feb 2025 17:27:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.91.81 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813272; cv=fail; b=d+rOqzufUEg9hYy4G76zNybMkAAy4f2CgjenusEjDDeDMqB+8dB0DqPW0BilprfDmc04aFJ5EAqOUQw8MyEbsbmEKl1oH/XRqz43lNyAyL7XkNoZASV8y5p96wguBpo5v673C9TnLatXOeuLSnLn+ZRIzQJih0jR0vUbLtd2xf0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813272; c=relaxed/simple; bh=Y/g6qXI2dFspDb7A2+0na/3GmlOt7ZpwEfzakNGPoqo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=T+deys6EzszLEXLwEFWJPLBMSiiOJ4CSkU9ISD9Kdo3ws/H8NI4fGyyPGlo6m0y9tCfq4wkLS85Gh0YIZOonbiQj+hX7yHeDjEflTCm+Bcryw6GJteswnef94ks7PL79LmIKmBVx+1yqraIg7tJeLfiO33Mxq6k3ZpdZZA3PdNo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com; spf=pass smtp.mailfrom=outlook.com; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b=iNG6cM3d; arc=fail smtp.client-ip=40.92.91.81 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=outlook.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b="iNG6cM3d" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=H9VF8BEBnyFB+LHZrNo3yxWuT9By4dqARSu20XH7TjY2X5pxO0Q67DoxlDycIGbanghqLLtURl+RXokHV/IT1sdUxThCn1xl+AJGQ1HXCqGUmCBsF0eyY4Ax8UAHqFUpdqNDv9iTqciAPaRnbQ9SPSh08TJikb+1lkSCXP6bCAl2pK1tPPAmEcLyfZjolPpnCKADfpGUwK91sT/96ldYO7v3hIIQ+ES54LqIKnSp/A5qy05gOkTqHKtQ7FW0ZZUUWgF5+wy7+hv+mHphN0ULQ04PpV5sQB+QD1Lxir8pgGQtXmdWAnCSZbKn3cquK00bKoytEUkEwZGagaG9f6yoMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4Kc6JLowibTlb9Z3Kq57oZKxBJCZwTi9sKmJoBW8kx4=; b=CsvHuhuLSNd6WpUFwCdRXPSOBnKhxFWTj+G80E/9tN1pALj+R5ie7qJQErIiI0YPdV9mogvlvEajb4vRzcykZw301M9nhwHG+lVYBbinhb83qCoxdx40StTHjrfsU1fF9r/mnAEMsZeIT8XOi0Z9TOy0AvhpoePSxq+ecaVBvBd/sqkBM1aNWOXhv/UBLh/b/eyTMfcMtvRrVwXwfIPr1/ltxuiFw6oCB2i9TxlquiTUDVKyc+tCIhnorNtPa2A6HF09YDirFsx6grTduv6YNfL7iZARw32UXjPMYtHaepzrSKa2cb/kKOb4UFTzcLFxJ0zGZqNrYtUjbIxLkxybCA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4Kc6JLowibTlb9Z3Kq57oZKxBJCZwTi9sKmJoBW8kx4=; b=iNG6cM3dHJ2uRup6ZoMYxaTprOOMvt6VzTiRCFuDZYlwCIZ8OMPP5plKqFNPlx+H46R4GFYORBRVIQofj/7nEcZ3y3TWxqQEedVSq+NzWZyMljCLM0AyJur/fI3KV3YD8D0/QGavKSKzi4FjKcg92PrU3ObGnmI0vg7bW/VRSWEPPY4dzCBNcgzPySL91uVn3GWCGkEC1kaRqQ4BnkidAq+A3LmmWU9Aqf/cbHiQokaMfGwNLeWDmrZ+x5kkynh8l7AcSj6fHe4+JMIPHYtunSgmv3mfFwyEl5mqEtkotzqZatm5qgc+iekgu9E8CLXotQpePV62K74tsiBjRqICkg== Received: from AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) by DBAPR03MB6613.eurprd03.prod.outlook.com (2603:10a6:10:19b::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.19; Mon, 17 Feb 2025 17:27:46 +0000 Received: from AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8]) by AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8%5]) with mapi id 15.20.8445.016; Mon, 17 Feb 2025 17:27:46 +0000 From: Juntong Deng To: ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, memxor@gmail.com, snorcht@gmail.com Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH bpf-next 2/3] bpf: Add bpf_runtime_kfunc_tracing_hook Date: Mon, 17 Feb 2025 17:23:49 +0000 Message-ID: X-Mailer: git-send-email 2.39.5 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0024.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ae::19) To AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) X-Microsoft-Original-Message-ID: <20250217172350.56184-2-juntong.deng@outlook.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR03MB5080:EE_|DBAPR03MB6613:EE_ X-MS-Office365-Filtering-Correlation-Id: af192bcd-3b9d-4441-58fd-08dd4f7864c7 X-Microsoft-Antispam: BCL:0;ARA:14566002|5072599009|19110799003|15080799006|8060799006|461199028|440099028|3412199025|41001999003; X-Microsoft-Antispam-Message-Info: X9IvEg28ukM7lLkThR5RwZH7iHOhlOjR0f4ZO9gVWoseSs1Dq0g2+PVzD8KkvD7rATCIwXscO0SZ4R+1n+W1+OgplGsOPGk7G9wqV9h7rxxKRXPq4J1Qjy8WD/1R+EACc5meRt7eBhw4gKdXJuiG0FZrBttL/qkItenvghsb6HkXNr0sD/+CVUhYH59WawxPNyJCYW2Vb3lMBVitUh3La5oRln24wZZUP84EOUdKBDPXNn7+UbisbzI1T8c7lmitK8MQbw266OkMfHaZNrO2CjhcB522uV6LqIU1tSdxpF3+Heo3jMrgsWm4DnWP3vsNc/Na519bhRAQthJkP1mSu+j0yV2My97bvLBKl0w2n0dT6N39OIcz0DoqM6xU51OtikHtw2uD92+CiaNru7ufLwJ2Vwa5eK0wBvnRlq53mH2d+ZsJWiOl4kjxRgE8tbSZoBziSf9xvLrOfR6owO1hFmgCOlPNctAWk2avP2kkMWg3N8dsNOlQM4M6btheHmemRahgQ2SNc0w4h/3TReNt85ILzrZWJrQgj/EZ6yOAR2qrwjSeFlB8VVmugbzFjN+CyXwoMdyt8QGIkTJE/qZZHhXwlnZ/1mIAPDXXt70EwWHImw0ZtQaeUa1HzlmGEfvPvp7OcK4Me5Gq4670PQSc/64Ugzlv1NjRJMe608iOu4PjxKR66ryqKbyq/o7RlHKW2syHpFtbngJrn9nyCfDJZNsnCz2kiCjq4D2ipmNM/zkkHMA26xyoGkaLU2hQgssYOfJYQ1glvwIz3fbrFXoMBCumSUQV50johjXXeLOGG0va6ZGqBxxosDL4BIBPF4wmqK/tkz3CrWlaQGj0EI/oyFwrmNJfOZOsMxpX6jG2Em9GD8zYEZtXaQph/X3chbWNnnUyVE7RtlAyG2/3xpHNfqxcAoZEIhMG9mGFVI26Jx8aGsfHii675wgrWiKAOqYsPRXXeOOcYKlMUY7zH54QieK8B/4T3mfVR/b/O8+8Fcu+P2m8I+X6ajBd7cJ+Xk3ZhVgk0fVWMmzo3iGmj1r24Cfakys0IEAsMw6qMD/Wy9xawvfAqw3H1nndxxi4gwTievknYQmet/lo4sfQlCaByA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Ve4eTiIgLzT0HuEQVrcFTduu7PQjFk0LlZcjC1NXhCNBmGKXhMwU3qK0a+YcpSQoRXPEouJW1IEDHQYAlynW021ZqDZh+cmOTHLjpCWf9bLTi4rpNTB08z3A2PG4D2bykamHDbXOLFh664Nyp4zKp4i4cRSX17lRl9D1gyElJiA7iFDmxhXMUDhXDfx2KsLBy2WbrCTiBTGONSOz0D5OiS2wzHE6BNIXvZ+UgQGYttLdLuE1mdcToJKpyfpErUaSaNBveWIzOB0F2moGw7+b0x5FOnXRe2xoWvNx4KLPBev2wIUHFl01sJ/xl76a73uJeqVxNP+hXd0awUh0nUyUNdhLqiPPiiD25tCmYRIlBAwmo5kwOPkUE5M52xkv7dPqs7VWXn6tS3ZlUPyBK6uMseztYDFy8clYf5BbFB/0Nen7i0aJXPSQItUqCG9Ks3x10tRcVFTKByzGK13PfWorU+aPp6ZllZ2K0Prbo6BOK8gzZ/C2TXV3r/bmEw+bMr3sQN87tm+sQtzdJ4v3t11Cun0VH1MmDxTYBeEqfhz0RvL7l5wxxum0uupkbMDZq8mfvKQ+ki1NotYDtvgPBu3UPhPhv5QJhLPi2+us3pceTQMY7Puv3Bli+pxGLnsjRHoJjq5C1zNMhwUdxLOAxFD8jMxQpwCeya27V2wDrqrq80s7hV+RUT+Bu7LbeL6FkQZH0TEPNgBSv9RKvAxsRw34DmcJofE10B0A6yZaLOt1VjetAIDXyaBsUJuNp7P4v5+0VXy+/XPxhj89hpp/RFSNYfvRD15It3oqvZgq1OLNEDH9t4FmryeuELGZDDKxXlZENKl8S2uZGNHLH0vF2stcsnkUfNXuZt6opfgaD6xwFNuYvDnXcuXm5pHsfQxsxQhd985U7Y2lX4x4ihQMTKPHZLV99D5sKEZRwr9bgigEXXkk95X2d09pOk2cJcRn3EF2LTP7Oc9xwEqyn2LlCUUE4TLAG2sB28olJh8a9bod55JZ9Apx5BnOh50Ih1vXbST0Kz1wrIYPfOA/2WmA45mDK/9JnHcY+NKtB2679nRnsbflDRApYl70Z1Ua5ljwR/bq5jqhTVWCwJl7fO45zC6mnh8e1nS8a41cM9ScOMguzjjdcpYj9t7fuLbWg50TTGGD452zrxa7YqeXWcKHRmJzfZ7ld7eR6JDFSbBjQaqyhhLT9Yxfx0E2nRkCp9Udi1uDmhAC49PqkZiKvjUGVMunFnBIbKZWSIIrWjRnEbSEPL7OGr0XlDoSeQd5quwDWRrV X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: af192bcd-3b9d-4441-58fd-08dd4f7864c7 X-MS-Exchange-CrossTenant-AuthSource: AM6PR03MB5080.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Feb 2025 17:27:46.7779 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR03MB6613 X-Patchwork-Delegate: bpf@iogearbox.net X-Patchwork-State: RFC This patch adds the bpf_runtime_kfunc_tracing_hook. When a bpf program is in BPF debug mode, all calls to kfuncs and helpers will be installed with bpf_runtime_kfunc_tracing_hook. The arguments, return value, and timestamp of this call are recorded in bpf_runtime_kfunc_tracing_hook. Since this is a proof of concept, I output the information to the tracing ring buffer directly in bpf_runtime_kfunc_tracing_hook. In actual implementation, bpf_runtime_kfunc_tracing_hook should only be responsible for recording information. Parsing and outputting information should be done in another thread to avoid affecting the performance of the bpf program. Signed-off-by: Juntong Deng --- arch/x86/net/bpf_jit_comp.c | 2 +- include/linux/btf.h | 4 ++- kernel/bpf/btf.c | 72 ++++++++++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index da579e835731..93714ec975e2 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -2198,7 +2198,7 @@ st: if (is_imm8(insn->off)) ip += 2; } ip += x86_call_depth_emit_accounting(&prog, func, ip); - runtime_hook = select_bpf_runtime_hook(func); + runtime_hook = select_bpf_runtime_hook(func, bpf_prog); if (runtime_hook) { emit_mov_imm64(&prog, X86_REG_R9, (long)func >> 32, (u32) (long)func); diff --git a/include/linux/btf.h b/include/linux/btf.h index 46681181e2bc..c4195479d0c1 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -571,7 +571,9 @@ void *bpf_runtime_acquire_hook(void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6); void bpf_runtime_release_hook(void *arg1, void *arg2, void *arg3, void *arg4, void *arg5, void *arg6); -void *select_bpf_runtime_hook(void *kfunc); +void *bpf_runtime_kfunc_tracing_hook(void *arg1, void *arg2, void *arg3, + void *arg4, void *arg5, void *arg6); +void *select_bpf_runtime_hook(void *kfunc, struct bpf_prog *bpf_prog); const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id); void btf_set_base_btf(struct btf *btf, const struct btf *base_btf); int btf_relocate(struct btf *btf, const struct btf *base_btf, __u32 **map_ids); diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 917d91494d00..4d114d2739ac 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -9740,12 +9740,82 @@ void bpf_runtime_release_hook(void *arg1, void *arg2, void *arg3, print_bpf_active_refs(); } -void *select_bpf_runtime_hook(void *kfunc) +void *bpf_runtime_kfunc_tracing_hook(void *arg1, void *arg2, void *arg3, + void *arg4, void *arg5, void *arg6 /* kfunc addr */) +{ + char kfunc_name[KSYM_SYMBOL_LEN], helper_proto_name[KSYM_SYMBOL_LEN]; + const void *args[5] = {arg1, arg2, arg3, arg4, arg5}; + const struct btf_type *kfunc_type, *kfunc_proto; + struct bpf_func_proto *helper_proto; + int i, vlen = 0, index = 0; + unsigned long rem_usec; + bpf_kfunc_t kfunc; + bool return_void; + void *kfunc_ret; + struct btf *btf; + char str[300]; + u32 kfunc_id; + u64 ts_nsec; + + kfunc = (bpf_kfunc_t)arg6; + kfunc_ret = kfunc(arg1, arg2, arg3, arg4, arg5); + ts_nsec = ktime_get_ns(); + + /* In actual implementation, the following part should be executed in + * another thread to avoid affecting the performance of the bpf program. + */ + rem_usec = do_div(ts_nsec, NSEC_PER_SEC) / 1000; + sprint_symbol_no_offset(kfunc_name, (unsigned long)kfunc); + sprintf(helper_proto_name, "%s_proto", kfunc_name); + helper_proto = (struct bpf_func_proto *)kallsyms_lookup_name(helper_proto_name); + if (helper_proto) { + for (i = 0; i < 5; i++) { + if (helper_proto->arg_type[i] == ARG_DONTCARE) + break; + vlen = i + 1; + } + return_void = helper_proto->ret_type == RET_VOID ? true : false; + } else { + btf = bpf_get_btf_vmlinux(); + kfunc_id = btf_find_by_name_kind(btf, kfunc_name, BTF_KIND_FUNC); + if (kfunc_id < 0) + return kfunc_ret; + + kfunc_type = btf_type_by_id(btf, kfunc_id); + kfunc_proto = btf_type_by_id(btf, kfunc_type->type); + vlen = btf_type_vlen(kfunc_proto); + return_void = kfunc_proto->type == 0 ? true : false; + } + + memset(str, 0, sizeof(str)); + index += sprintf(str + index, "%s", "("); + for (i = 0; i < vlen; i++) { + if (i == vlen - 1) + index += sprintf(str + index, "%lx", (unsigned long)args[i]); + else + index += sprintf(str + index, "%lx,", (unsigned long)args[i]); + } + + if (return_void) + sprintf(str + index, "%s", ")"); + else + sprintf(str + index, ") = %lx", (unsigned long)kfunc_ret); + + trace_printk("[%lu.%06lu] %s%s\n", + (unsigned long)ts_nsec, rem_usec, kfunc_name, str); + + return kfunc_ret; +} + +void *select_bpf_runtime_hook(void *kfunc, struct bpf_prog *bpf_prog) { struct btf_struct_kfunc *struct_kfunc, dummy_key; struct btf_struct_kfunc_tab *tab; struct btf *btf; + if (bpf_prog->debug_mode) + return bpf_runtime_kfunc_tracing_hook; + btf = bpf_get_btf_vmlinux(); dummy_key.kfunc_addr = (unsigned long)kfunc; From patchwork Mon Feb 17 17:23:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juntong Deng X-Patchwork-Id: 13978378 X-Patchwork-Delegate: bpf@iogearbox.net Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazolkn19013066.outbound.protection.outlook.com [52.103.32.66]) (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 50AB321C9F1; Mon, 17 Feb 2025 17:29:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.103.32.66 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813393; cv=fail; b=q5tGkwKIpOjnDrQFznEmfYx25mFS+ZAsVEQ/M7LIgLgeFkhtlmNLVU0U4qsiVf40nTDIQNMOm9D97Z4TuuHEnAIL1Wn7ybr1V9xfmnoFQPjY5b3f3npyQ7E7RNwn3D5EhRgVQVhpexRsU4LVzezcgjYVN2UTNJJOyyGnjj5M5Gc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739813393; c=relaxed/simple; bh=xVdRs7wh2ymh+3IV8Kl4HwVqaEMKIvNZnUVpdfSRGAw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=lif1B9u8LDvzngvicJ+ABWEZX5mTvK1GIV+NY2mVGX2+y2NzMycZQijVfodyPEj4WLeIfUtfFKOYqUZL/xs88oi7CelnVOxjAaYcoo452xEADIrYrkv7jJPzDL34Ao8r6jwbp3tm+qDzij8Vdbhc9fqW73sUUT4FiM+En0ttDYc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com; spf=pass smtp.mailfrom=outlook.com; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b=i2JfOwoT; arc=fail smtp.client-ip=52.103.32.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=outlook.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=outlook.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=outlook.com header.i=@outlook.com header.b="i2JfOwoT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IorTRtmFRIhlguJ5slqXRODJC0xfzbaZjbS4BBvFjk/p9IQm7MOAVROT5Wn2+3CgAkucc8/n8oMELQYEUxNglwVI+3fIUtCnIWlJry3SvxGfn+eRdUJXfQL1fQew9EOwsqSXuCFDSDOcyWTN42s8H8pbuuH1x1tQfwhqteAvnwG94JqRyi8Nsnl3Wg/1lLDoSB9kkCiZnFzXsSFm51mLPv22U3vKesmG6acztzX3wfOn5CKOapkhfhDzEl5Xceo/zkUYio1z0QnqyN00tpWWLdBjRe/nBwWfJeoDSHJXjMBees4wTnnCLzjt0+m/m++ys+7Tt0RNxwUgQLdR793dQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6SxPd8xW+U2Z0veDEotp3KNIz10EIFTL9qxJCVoHTDI=; b=J9tGeWzBmqgdsmwQKMACUQy2G1GY/fzNuBv2r8OKRtr+6Ad56FYIqcUTuBtmW4nDKLxsTeIKemVd/vIOLKUHU0TwX74qjvoALWCJMQZHc2KyzgiQ0sSVekOJoO4gTPU2wipi/IOnI2c73kcVbGb6yPaeVvtO0hAeWFWycLKy6AwNGm2SX0wZhprUar6kJjapzA+Sy8eVFtKxYLVA2ZAMKg8eSD1wdNQJc6q8kP5JfBsJ9/v8nWebXKzUHBQjMC8NBzFox/RZvz7m0SU/MPz7tm8uWdagRtFqbnZrF7+eTfRW6d/pNofDJrmWFotE6M22iIhjSORy9jbhcs0mzPLBOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6SxPd8xW+U2Z0veDEotp3KNIz10EIFTL9qxJCVoHTDI=; b=i2JfOwoTy5Rhjy/RzCryNtF+9j8/M8hJ93RvdGwuQcjtsgVSb04kpsikWFVHmEBqNkSAU+zNo5ynGuUVFFyCvAtxAKGEwwZ18jSC/1voZYrM97aWm3GiP+128D0/pwjKY/X+VtuPq0JqLz/dddBiTgYeRjj0E+5JlA56zK2RRNDh1LHCrg4H1ADylO3zcjMphKep8xzyqiw44ZYfUdsRFYxN94XYz+RdDOGv+6DQ7GlFpWsELgrgrxW6oLqnEMCzzlTJZqBDKXBy2aj58Hwh8Ylf6VCMJtp/p15jiQgeIOQJOu5M05MyRXW9+rWfeOqZrnBqMp9ukqGx2mh0l+A90w== Received: from AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) by AS8PR03MB8665.eurprd03.prod.outlook.com (2603:10a6:20b:54b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.18; Mon, 17 Feb 2025 17:29:48 +0000 Received: from AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8]) by AM6PR03MB5080.eurprd03.prod.outlook.com ([fe80::a16:9eb8:6868:f6d8%5]) with mapi id 15.20.8445.016; Mon, 17 Feb 2025 17:29:48 +0000 From: Juntong Deng To: ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com, andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org, yonghong.song@linux.dev, kpsingh@kernel.org, sdf@fomichev.me, haoluo@google.com, jolsa@kernel.org, memxor@gmail.com, snorcht@gmail.com Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH bpf-next 3/3] selftests/bpf: Add test case for demonstrating BPF debug mode. Date: Mon, 17 Feb 2025 17:23:50 +0000 Message-ID: X-Mailer: git-send-email 2.39.5 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0024.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ae::19) To AM6PR03MB5080.eurprd03.prod.outlook.com (2603:10a6:20b:90::20) X-Microsoft-Original-Message-ID: <20250217172350.56184-3-juntong.deng@outlook.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM6PR03MB5080:EE_|AS8PR03MB8665:EE_ X-MS-Office365-Filtering-Correlation-Id: 4df9cb48-1a8d-401e-1abe-08dd4f78ad9e X-Microsoft-Antispam: BCL:0;ARA:14566002|19110799003|5072599009|8060799006|15080799006|461199028|3412199025|440099028|41001999003; X-Microsoft-Antispam-Message-Info: IrryblkVOJtyINkH2YExK/AE9nDJr9lw/AyRPgYJ9vGSGksXgonz2ySLBRYcXJdN1OlueC/C57xP6jU5k/mVOAuFiHOh/UsP6PBNj/UcOtlo0LkvEK5VGmvbyKd73w7zFfQ7/XQy/xqn4SyCeMJs0LesqS/fr1wuzWaMfpVOJxCaM3BIkcvupue+SPhyWU/gg7U+0kOuZm57X+D2CvHGUoX03gsx2m3+C1nAcqwWz1Y+z0wHOm6aTU0MB+Yl7ZikEoj2OSfXoQECrXW07HltDDfczH41Y0WZhUfCQdU0acsXeeD1re7WmKSasjslIlknVbizg+dnJP3X3QiZDAlhbP9g0u2cHvxCO9jembXb+BnThi6bPF2uPts7PCkd2fZWZz+AW2XeRgOZbL+IWQd1Hvx5fRuqPA2Euu+Q9MjbpcDyUITMCkN0uLKuYz5I2dye+Yx1GiLBJI/zgQnaktojoNQkNod4osjkD9SZHI99U+osBPjdZUvPW84798oBKOCw3JUdUEBzuFVNpzFW9dH+T5Mk1OHVwTYjRJz8s8vFpo0z1oE1L/s1j19HtReVIsY6QAcKxi9JubQkNZ8B/YCD99iuoErG1cUtYglvFZGVEm7NU7IpES2CkQJQM5o9V7JrPNKltySUcb/IKzmbGxgmcGTJ5XzONXheQ7anJ0XQ+Zv66X6EwXc6SEQ3BWcECX9c6qobfE2Bfs6GucAWNYQdXaqgGyUVIOWudCBqCtVm5adlP8CzU/7iQA+T0S0gfMmiLC54KIvCN9MwLVBIy0o6y2f8oMRHXfmAnBpfwQ75MhU3V29lxZ4dfBAmi/QdF+ZV86kp3qFA5pyP0GS4JI7iX/99dMoztUCJHdhsXtHXaTvkFG9+NZyApp3WNy32vp8pBtE/JgnnjuqsKWwlpnpl0EX8wBpq3pY+ok11TY3qGRiu2mAOlWWf4eisr6UPwrUMsc5sFmBcTIR9MEK97uEK22vzdMjV6hpDOJp8q1OqGj/gpIdLFc0Oef2sEkS4kfrZ3yVpe4ZWse9qtXaI8rMr8dYyZ0+1WbRQ8JqGirlo3MwyL3VlOh/eiG4l9SHr0AYw6Bq20krpxpCrAC70UKKnJA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DE59tFUyY6Ki/tTgMKZ9V+l4ZTZHR6s7vAFTuLg2B+Bf83SFV1NNkqTnW0chSzOH0ZY3GXlWJqcv84x5eabvfpkBcdROvCilYH5jTtFXTRpoMysXqA5S0GArdsfdWc80x+N/QxTDgTG4eJOsBvVKdLg5aeCPrd52Rl72bUIgaznmHxF1onVCU6GjUvoPvCh8X6cHveZwYnM9Fmt/y1y5l5Uw3WVf5/wlbUGwH+0DtDV3nZNpoXOdixv7+uhz+nBgl7HIecYtnESLbhIV34NynDETCCBIlTX2qKg4WKBZ6aBqfkzpEUbWy35vYSv+ZcGmUZP729tQt63Gm12XIElGbjHT99kfClGVlHx6Kbq+ab3awqB8pxsL7vOtcGxYMa2o8vIW/E6RMw/LZAyJLOEAGbbCiixnTRqUo4m0jN0CFZ5zGBv5KfmM10U/g+2hNVroFEGbZKJwL2lBsnacIpGg7RBa4A73lsljZ3SP4CFivhly4mvR3glfK1Yv7VzZ57AAI1BRfspX5XRPQfpvLfuwnSDHjoYnf9qYdCpnqK3MjWrg7GrG/yR+PxwmkEZNxs8btRTYBycYhx1E0iHz7JhG7uDd5sIIoAnYj5B7+BOLofmoOByAa6BEUGB+xtDtn5YuefUX4OEjeryZER9ZQVtR6OH1u0/rS6nWRvRcpPbSJ5JeyBlqpxEClYjcZqXbatee2zj0HuUesx8+jhB3EgFoQgYqjQtG9d9CajSc79JDXBgMn7pvYJjAsF1stqcbdKpoRRhoY0/CwhfOaSUu1eCRGCNVxrC7N0xkIIbAPXHBUq+O/lq2omkHYvAqDikNGZJU9fzSORNnnD9fpou8+i00jzcehmmOvVhuHvgt8AmHFP+x0xqpgmpQ5TunLE2BUWro/1nDHr3QoVtIHnTeIV0JNwEghK+CkAmhHnGFlUcBUnOc2xIvF3JMiN7Tu3E6+q/F9vZgWb1cSDhv/lZX8EgXuvy5RxLOz9E/o+WpW+Mki8OPhUyi1m4Cy5VuD1U9T6CkB5YjBZtLmd80enMAaU9Vn9Lvv38pMkFjikMJ4XdfpyM53U+zEdTbIt4EWvUIG5DahzsHvLbhyqnAE49bFb9+XQDAS0/5O50oIPAPDY38V1yfvSAMCVnNUdBJFRypHIGt3ub7FmWLfqZc1amJ6VR9/0TgpN8ux5e0vHMFnCeyAJHTsNkgI22wh52gjDeukpVQE1swYXHwp+PKDWGrotBkIB0ZmqH7+xrUKX/NYLK24JV54Ci4KWLLycQn1SEJX5I0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4df9cb48-1a8d-401e-1abe-08dd4f78ad9e X-MS-Exchange-CrossTenant-AuthSource: AM6PR03MB5080.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Feb 2025 17:29:48.6922 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR03MB8665 X-Patchwork-Delegate: bpf@iogearbox.net X-Patchwork-State: RFC This patch adds test case for demonstrating BPF debug mode. Signed-off-by: Juntong Deng --- tools/testing/selftests/bpf_debug/Makefile | 136 ++++++++++++++++++ tools/testing/selftests/bpf_debug/debug.bpf.c | 39 +++++ tools/testing/selftests/bpf_debug/debug.c | 24 ++++ 3 files changed, 199 insertions(+) create mode 100644 tools/testing/selftests/bpf_debug/Makefile create mode 100644 tools/testing/selftests/bpf_debug/debug.bpf.c create mode 100644 tools/testing/selftests/bpf_debug/debug.c diff --git a/tools/testing/selftests/bpf_debug/Makefile b/tools/testing/selftests/bpf_debug/Makefile new file mode 100644 index 000000000000..4afaf2407128 --- /dev/null +++ b/tools/testing/selftests/bpf_debug/Makefile @@ -0,0 +1,136 @@ +# SPDX-License-Identifier: GPL-2.0 +include ../../../build/Build.include +include ../../../scripts/Makefile.arch +include ../../../scripts/Makefile.include +include ../lib.mk + +CUR_DIR := $(abspath .) +REPO_ROOT := $(abspath ../../../..) +TOOLS_DIR := $(REPO_ROOT)/tools +TOOLSINC_DIR := $(TOOLS_DIR)/include +BPFTOOL_DIR := $(TOOLS_DIR)/bpf/bpftool +UAPI_DIR := $(TOOLSINC_DIR)/uapi +LIB_DIR := $(TOOLS_DIR)/lib +LIBBPF_DIR := $(LIB_DIR)/bpf +GEN_DIR := $(REPO_ROOT)/include/generated +GEN_HDR := $(GEN_DIR)/autoconf.h + +OUTPUT_DIR := $(CUR_DIR)/build +INCLUDE_DIR := $(OUTPUT_DIR)/include +SBIN_DIR:= $(OUTPUT_DIR)/sbin +OBJ_DIR := $(OUTPUT_DIR)/obj +DEBUGOBJ_DIR := $(OBJ_DIR)/debug +LIBBPF_OUTPUT := $(OBJ_DIR)/libbpf/libbpf.a +LIBBPF_OBJ_DIR := $(OBJ_DIR)/libbpf +LIBBPF_OBJ := $(LIBBPF_OBJ_DIR)/libbpf.a + +DEFAULT_BPFTOOL := $(SBIN_DIR)/bpftool +BPFTOOL ?= $(DEFAULT_BPFTOOL) + +VMLINUX_BTF_PATHS ?= ../../../../vmlinux \ + /sys/kernel/btf/vmlinux \ + /boot/vmlinux-$(shell uname -r) +VMLINUX_BTF ?= $(abspath $(firstword $(wildcard $(VMLINUX_BTF_PATHS)))) +ifeq ($(VMLINUX_BTF),) +$(error Cannot find a vmlinux for VMLINUX_BTF at any of "$(VMLINUX_BTF_PATHS)") +endif + +ifneq ($(wildcard $(GEN_HDR)),) + GENFLAGS := -DHAVE_GENHDR +endif + +CFLAGS += -g -O2 -rdynamic -pthread -Wall -Werror $(GENFLAGS) \ + -I$(INCLUDE_DIR) -I$(GEN_DIR) -I$(LIB_DIR) \ + -I$(TOOLSINC_DIR) -I$(UAPI_DIR) -I$(CUR_DIR)/include \ + -Wno-unused-command-line-argument + +LDFLAGS = -lelf -lz + +IS_LITTLE_ENDIAN = $(shell $(CC) -dM -E - &1 \ + | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }') \ +$(shell $(1) -dM -E - $@ +else + $(call msg,CP,,$@) + $(Q)cp "$(VMLINUX_H)" $@ +endif + +$(DEBUGOBJ_DIR)/%.bpf.o: %.bpf.c $(INCLUDE_DIR)/vmlinux.h | $(LIBBPF_OBJ) $(DEBUGOBJ_DIR) + $(call msg,CLANG-BPF,,$(notdir $@)) + $(Q)$(CLANG) $(BPF_CFLAGS) -target bpf -c $< -o $@ + +$(INCLUDE_DIR)/%.bpf.skel.h: $(DEBUGOBJ_DIR)/%.bpf.o $(INCLUDE_DIR)/vmlinux.h $(BPFTOOL) | $(INCLUDE_DIR) + $(call msg,GEN-SKEL,,$(notdir $@)) + $(Q)$(BPFTOOL) gen skeleton $< > $@ + +$(TEST_GEN_PROGS_OBJ): $(DEBUGOBJ_DIR)/%.o: %.c $(INCLUDE_DIR)/%.bpf.skel.h | $(DEBUGOBJ_DIR) + $(call msg,CLANG,,$(notdir $@)) + $(Q)$(CLANG) $(CFLAGS) -c $< -o $@ + +$(TEST_GEN_PROGS): $(SBIN_DIR)/%: $(DEBUGOBJ_DIR)/%.o $(LIBBPF_OBJ) | $(SBIN_DIR) + $(call msg,CLANG-LINK,,$(notdir $@)) + $(Q)$(CLANG) $(CFLAGS) $(LDFLAGS) $^ -o $@ + +override define CLEAN + rm -rf $(OUTPUT_DIR) +endef + +all: $(TEST_GEN_PROGS) + +.PHONY: all clean help + +.DEFAULT_GOAL := all + +.DELETE_ON_ERROR: + +.SECONDARY: diff --git a/tools/testing/selftests/bpf_debug/debug.bpf.c b/tools/testing/selftests/bpf_debug/debug.bpf.c new file mode 100644 index 000000000000..8832cd0e584e --- /dev/null +++ b/tools/testing/selftests/bpf_debug/debug.bpf.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include +#include +#include + +char LICENSE[] SEC("license") = "GPL"; + +void bpf_task_release(struct task_struct *p) __ksym; +struct task_struct *bpf_task_from_pid(s32 pid) __ksym; + +struct bpf_cpumask *bpf_cpumask_create(void) __ksym; +void bpf_cpumask_release(struct bpf_cpumask *cpumask) __ksym; + +SEC("syscall") +int test_debug_mode(void *arg) +{ + struct bpf_cpumask *cpumask; + struct task_struct *task; + struct bpf_iter_num it; + int *v, pid; + + bpf_iter_num_new(&it, 1, 3); + while ((v = bpf_iter_num_next(&it))) { + task = bpf_task_from_pid(*v); + if (task) { + pid = BPF_CORE_READ(task, pid); + bpf_task_release(task); + } + } + bpf_iter_num_destroy(&it); + + cpumask = bpf_cpumask_create(); + if (cpumask) + bpf_cpumask_release(cpumask); + + return 0; +} diff --git a/tools/testing/selftests/bpf_debug/debug.c b/tools/testing/selftests/bpf_debug/debug.c new file mode 100644 index 000000000000..1df7ccfeb26d --- /dev/null +++ b/tools/testing/selftests/bpf_debug/debug.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include "debug.bpf.skel.h" + +int main(int argc, char **argv) +{ + LIBBPF_OPTS(bpf_object_open_opts, opts); + struct debug_bpf *skel; + int err, prog_fd; + + opts.debug_mode = true; + + skel = debug_bpf__open_opts(&opts); + + err = debug_bpf__load(skel); + prog_fd = bpf_program__fd(skel->progs.test_debug_mode); + err = bpf_prog_test_run_opts(prog_fd, NULL); + + debug_bpf__destroy(skel); + return err; +}