From nobody Sun Oct 5 23:56:11 2025 Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49FEA221FD8; Mon, 28 Jul 2025 07:26:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687611; cv=none; b=UXKEskkXQhTaZffycD7t9FdvrLcg89DIxtkB6PdaYSWOahTBgEhNILV4GBMpkFoxPHAc62LcivKGER2FMVn2pHgSu5Zv2FdM7CEeDxQK5siurNhjB+WvI7IJVuOzCIgpWtSMJ8zBu9BcGEScGnjxMH4p06NBsaeq4I6Z5psMtQQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687611; c=relaxed/simple; bh=ekuqREdaljovJkJ2URqY0Sdhcj5S+sr8PGptexyekFk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WVEoCfcrzg4H2lnF+nHWvVXOgYBV7EpcQ+xR+7E6gNFbqym1v/iU+eXvSk8zFe5YZE0CEMzVL6Izm45U9HwQ/ajXd787at5D/8qq1vA1k5xrUGLFTfvTOAnDzT7+XqM0gDJFWGSlO8Yf9pDPEknDQm6MFdXFQw8T31UI7/sQgOw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=l6JoGfJy; arc=none smtp.client-ip=209.85.215.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l6JoGfJy" Received: by mail-pg1-f193.google.com with SMTP id 41be03b00d2f7-b3bad2f99f5so3412574a12.1; Mon, 28 Jul 2025 00:26:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753687607; x=1754292407; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MTwS2XVV2QUv/jukIeHPjcoQMfq7jhIqTve5aBCFmoo=; b=l6JoGfJy7qvrweGks7Xm3LzDY8iETwEnhOEFBNNnERN8s/Sl+z1ZMXdCSEf8eOhmze rCsipyPdE2vEKaUPVUXrfiwMcs1CSBNpjx1xWTfS7cmpmCaC3sKxc+OL6UQdB33kK/Bk +I4F7LDuXuxsl7sNzqZhHhyPG3QV5DhWhAd7v5pdA0YRZa5zJnu6Dnjg3gkk+qVD7kQg Gzd1Rmnhm7/TlMXyRJ6GnKgp11XagnCN1xYYtoxNuAskYbl7xXU52582g0X129Ww4HXz XUoMcbihyMVRQ2ciM17txnVi3/io/4zgukQyvbTBGAFuow/ZPFDsscqkwwNuj+MjxmSb ZM3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753687607; x=1754292407; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MTwS2XVV2QUv/jukIeHPjcoQMfq7jhIqTve5aBCFmoo=; b=ZcGdkq7reNdTeFdbq25LcA47I1Aet6+ZAdZoU6MbdkCfS3ZhwphftVxzKkO5Nc6nvX yoOhZjw81ZUJgAGWNi1bm/+8mWT8p7DK9EJkq1cyJRrrxIrlvR5BnJ0PpHkfp3NTfIly Ch55rlj3ITbwpGU89QXhfrkIVODvN+hY+H+YQQfQgATmkG+FxqHeg5DYuC9Z1Ow4dUOq Fbj9fCixUezT944dtUMxjkO3lHGCeHVkh+YZ4NHxyU3NzEzc4i2dUH8Uw4AY++ZtWFnG Lcby5gz/VCAJlkYV4qg2P2js8r9oFF8/hYnUNd22djWiJWbg72WDuF/K4i/bVuXqZq/T 2qAg== X-Forwarded-Encrypted: i=1; AJvYcCVidLlMRX2ISWM+/zf4bfF8JY1jOCNiDIg0A8f8OO0AP9kpHC4wAVLjv0K6td6MIk8W0LUnbqgopFEmzy10@vger.kernel.org, AJvYcCW3amOoPChXGcQH59cHW0M4na39noYFi9ft1PqltefhyBiz7Sl1arPspo43y+W12+CMyZbyDtwMa0QgJTVkWQhAMkIR@vger.kernel.org, AJvYcCWxQihMBGkVWIu47qOGGL6SnmnEoOpSotOxZmidqvHXJr9QcIDnzNNVevjpExjIlXbsjkQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/ZB0Wjo+/9ixTidh9yk0IBXNEnW1XAIkWE10kdxnsDIXHT9am VUH7QW7lug1SsGrbgk66qoz7Sf8CDFyv51GPc1wV7JkKjwuHXphseiw0 X-Gm-Gg: ASbGncuRIIqi+RTW3R2/mDK+MnkZ+abKmSFVzOx6TuIB/qZVmX13JZ74K9AOTDT1sp3 C/g88H1gLmX/rDmM1rJLOodHrEKRFYVSj8w4MTnUVLGBrFcyVdsRFy2J8gj8h/JydChPfu3gzV5 hAr7PzamLSAtkZ1TKHJxqALWFSo5KMkp0NUPjoT/ICDYmlzWWZ0u5jlkrJvFL+XjEtGsVw+dWQ5 r/63XGlpRsOJr5GRHnMmVWnS3uOvJqxZJzKZwAUckjPvVqkOeZl7aOuBuLg3ejoKxjFZjODiHtS meapjG22v0xoKJZMT5nVuhuvTkWX0MFj5MlFAuWA3aXSFKnTbDz7kkcgFosw1lxPba3uu3dPi04 jDsOZfBnaZuD1JNdBLGprTX0Hj/HC5w== X-Google-Smtp-Source: AGHT+IFZujQLig+JmW84tuanI9EFgMvyXmvThN4UpuMiNqiHxxf2qAqZjtlTbYr0HsgIWS1xzHr4qA== X-Received: by 2002:a17:90b:4a81:b0:31e:f30f:6d3b with SMTP id 98e67ed59e1d1-31ef30f715bmr3835718a91.2.1753687607351; Mon, 28 Jul 2025 00:26:47 -0700 (PDT) Received: from 7950hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-31e949bbf7asm4459599a91.9.2025.07.28.00.26.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 00:26:47 -0700 (PDT) From: Menglong Dong X-Google-Original-From: Menglong Dong To: alexei.starovoitov@gmail.com, mhiramat@kernel.org Cc: rostedt@goodmis.org, mathieu.desnoyers@efficios.com, hca@linux.ibm.com, revest@chromium.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH RFC bpf-next v2 1/4] fprobe: use rhltable for fprobe_ip_table Date: Mon, 28 Jul 2025 15:22:50 +0800 Message-ID: <20250728072637.1035818-2-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250728072637.1035818-1-dongml2@chinatelecom.cn> References: <20250728072637.1035818-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For now, all the kernel functions who are hooked by the fprobe will be added to the hash table "fprobe_ip_table". The key of it is the function address, and the value of it is "struct fprobe_hlist_node". The budget of the hash table is FPROBE_IP_TABLE_SIZE, which is 256. And this means the overhead of the hash table lookup will grow linearly if the count of the functions in the fprobe more than 256. When we try to hook all the kernel functions, the overhead will be huge. Therefore, replace the hash table with rhltable to reduce the overhead. Signed-off-by: Menglong Dong --- include/linux/fprobe.h | 2 +- kernel/trace/fprobe.c | 141 +++++++++++++++++++++++------------------ 2 files changed, 79 insertions(+), 64 deletions(-) diff --git a/include/linux/fprobe.h b/include/linux/fprobe.h index 702099f08929..e56a25a50eb5 100644 --- a/include/linux/fprobe.h +++ b/include/linux/fprobe.h @@ -26,7 +26,7 @@ typedef void (*fprobe_exit_cb)(struct fprobe *fp, unsigne= d long entry_ip, * @fp: The fprobe which owns this. */ struct fprobe_hlist_node { - struct hlist_node hlist; + struct rhlist_head hlist; unsigned long addr; struct fprobe *fp; }; diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c index ba7ff14f5339..640a0c47fc76 100644 --- a/kernel/trace/fprobe.c +++ b/kernel/trace/fprobe.c @@ -12,6 +12,7 @@ #include #include #include +#include =20 #include =20 @@ -41,47 +42,46 @@ * - RCU hlist traversal under disabling preempt */ static struct hlist_head fprobe_table[FPROBE_TABLE_SIZE]; -static struct hlist_head fprobe_ip_table[FPROBE_IP_TABLE_SIZE]; +static struct rhltable fprobe_ip_table; static DEFINE_MUTEX(fprobe_mutex); =20 -/* - * Find first fprobe in the hlist. It will be iterated twice in the entry - * probe, once for correcting the total required size, the second time is - * calling back the user handlers. - * Thus the hlist in the fprobe_table must be sorted and new probe needs to - * be added *before* the first fprobe. - */ -static struct fprobe_hlist_node *find_first_fprobe_node(unsigned long ip) +static u32 fprobe_node_hashfn(const void *data, u32 len, u32 seed) { - struct fprobe_hlist_node *node; - struct hlist_head *head; + return hash_ptr(*(unsigned long **)data, 32); +} =20 - head =3D &fprobe_ip_table[hash_ptr((void *)ip, FPROBE_IP_HASH_BITS)]; - hlist_for_each_entry_rcu(node, head, hlist, - lockdep_is_held(&fprobe_mutex)) { - if (node->addr =3D=3D ip) - return node; - } - return NULL; +static int fprobe_node_cmp(struct rhashtable_compare_arg *arg, + const void *ptr) +{ + unsigned long key =3D *(unsigned long *)arg->key; + const struct fprobe_hlist_node *n =3D ptr; + + return n->addr !=3D key; +} + +static u32 fprobe_node_obj_hashfn(const void *data, u32 len, u32 seed) +{ + const struct fprobe_hlist_node *n =3D data; + + return hash_ptr((void *)n->addr, 32); } -NOKPROBE_SYMBOL(find_first_fprobe_node); + +static const struct rhashtable_params fprobe_rht_params =3D { + .head_offset =3D offsetof(struct fprobe_hlist_node, hlist), + .key_offset =3D offsetof(struct fprobe_hlist_node, addr), + .key_len =3D sizeof_field(struct fprobe_hlist_node, addr), + .hashfn =3D fprobe_node_hashfn, + .obj_hashfn =3D fprobe_node_obj_hashfn, + .obj_cmpfn =3D fprobe_node_cmp, + .automatic_shrinking =3D true, +}; =20 /* Node insertion and deletion requires the fprobe_mutex */ static void insert_fprobe_node(struct fprobe_hlist_node *node) { - unsigned long ip =3D node->addr; - struct fprobe_hlist_node *next; - struct hlist_head *head; - lockdep_assert_held(&fprobe_mutex); =20 - next =3D find_first_fprobe_node(ip); - if (next) { - hlist_add_before_rcu(&node->hlist, &next->hlist); - return; - } - head =3D &fprobe_ip_table[hash_ptr((void *)ip, FPROBE_IP_HASH_BITS)]; - hlist_add_head_rcu(&node->hlist, head); + rhltable_insert(&fprobe_ip_table, &node->hlist, fprobe_rht_params); } =20 /* Return true if there are synonims */ @@ -92,9 +92,11 @@ static bool delete_fprobe_node(struct fprobe_hlist_node = *node) /* Avoid double deleting */ if (READ_ONCE(node->fp) !=3D NULL) { WRITE_ONCE(node->fp, NULL); - hlist_del_rcu(&node->hlist); + rhltable_remove(&fprobe_ip_table, &node->hlist, + fprobe_rht_params); } - return !!find_first_fprobe_node(node->addr); + return !!rhltable_lookup(&fprobe_ip_table, &node->addr, + fprobe_rht_params); } =20 /* Check existence of the fprobe */ @@ -249,9 +251,10 @@ static inline int __fprobe_kprobe_handler(unsigned lon= g ip, unsigned long parent static int fprobe_entry(struct ftrace_graph_ent *trace, struct fgraph_ops = *gops, struct ftrace_regs *fregs) { - struct fprobe_hlist_node *node, *first; + struct fprobe_hlist_node *node; unsigned long *fgraph_data =3D NULL; unsigned long func =3D trace->func; + struct rhlist_head *head, *pos; unsigned long ret_ip; int reserved_words; struct fprobe *fp; @@ -260,14 +263,12 @@ static int fprobe_entry(struct ftrace_graph_ent *trac= e, struct fgraph_ops *gops, if (WARN_ON_ONCE(!fregs)) return 0; =20 - first =3D node =3D find_first_fprobe_node(func); - if (unlikely(!first)) - return 0; - + rcu_read_lock(); + head =3D rhltable_lookup(&fprobe_ip_table, &func, fprobe_rht_params); reserved_words =3D 0; - hlist_for_each_entry_from_rcu(node, hlist) { + rhl_for_each_entry_rcu(node, pos, head, hlist) { if (node->addr !=3D func) - break; + continue; fp =3D READ_ONCE(node->fp); if (!fp || !fp->exit_handler) continue; @@ -278,17 +279,19 @@ static int fprobe_entry(struct ftrace_graph_ent *trac= e, struct fgraph_ops *gops, reserved_words +=3D FPROBE_HEADER_SIZE_IN_LONG + SIZE_IN_LONG(fp->entry_data_size); } - node =3D first; + rcu_read_unlock(); if (reserved_words) { fgraph_data =3D fgraph_reserve_data(gops->idx, reserved_words * sizeof(l= ong)); if (unlikely(!fgraph_data)) { - hlist_for_each_entry_from_rcu(node, hlist) { + rcu_read_lock(); + rhl_for_each_entry_rcu(node, pos, head, hlist) { if (node->addr !=3D func) - break; + continue; fp =3D READ_ONCE(node->fp); if (fp && !fprobe_disabled(fp)) fp->nmissed++; } + rcu_read_unlock(); return 0; } } @@ -299,12 +302,12 @@ static int fprobe_entry(struct ftrace_graph_ent *trac= e, struct fgraph_ops *gops, */ ret_ip =3D ftrace_regs_get_return_address(fregs); used =3D 0; - hlist_for_each_entry_from_rcu(node, hlist) { + rhl_for_each_entry_rcu(node, pos, head, hlist) { int data_size; void *data; =20 if (node->addr !=3D func) - break; + continue; fp =3D READ_ONCE(node->fp); if (!fp || fprobe_disabled(fp)) continue; @@ -448,25 +451,21 @@ static int fprobe_addr_list_add(struct fprobe_addr_li= st *alist, unsigned long ad return 0; } =20 -static void fprobe_remove_node_in_module(struct module *mod, struct hlist_= head *head, - struct fprobe_addr_list *alist) +static void fprobe_remove_node_in_module(struct module *mod, struct fprobe= _hlist_node *node, + struct fprobe_addr_list *alist) { - struct fprobe_hlist_node *node; int ret =3D 0; =20 - hlist_for_each_entry_rcu(node, head, hlist, - lockdep_is_held(&fprobe_mutex)) { - if (!within_module(node->addr, mod)) - continue; - if (delete_fprobe_node(node)) - continue; - /* - * If failed to update alist, just continue to update hlist. - * Therefore, at list user handler will not hit anymore. - */ - if (!ret) - ret =3D fprobe_addr_list_add(alist, node->addr); - } + if (!within_module(node->addr, mod)) + return; + if (delete_fprobe_node(node)) + return; + /* + * If failed to update alist, just continue to update hlist. + * Therefore, at list user handler will not hit anymore. + */ + if (!ret) + ret =3D fprobe_addr_list_add(alist, node->addr); } =20 /* Handle module unloading to manage fprobe_ip_table. */ @@ -474,8 +473,9 @@ static int fprobe_module_callback(struct notifier_block= *nb, unsigned long val, void *data) { struct fprobe_addr_list alist =3D {.size =3D FPROBE_IPS_BATCH_INIT}; + struct fprobe_hlist_node *node; + struct rhashtable_iter iter; struct module *mod =3D data; - int i; =20 if (val !=3D MODULE_STATE_GOING) return NOTIFY_DONE; @@ -486,8 +486,16 @@ static int fprobe_module_callback(struct notifier_bloc= k *nb, return NOTIFY_DONE; =20 mutex_lock(&fprobe_mutex); - for (i =3D 0; i < FPROBE_IP_TABLE_SIZE; i++) - fprobe_remove_node_in_module(mod, &fprobe_ip_table[i], &alist); + rhashtable_walk_enter(&fprobe_ip_table.ht, &iter); + do { + rhashtable_walk_start(&iter); + + while ((node =3D rhashtable_walk_next(&iter)) && !IS_ERR(node)) + fprobe_remove_node_in_module(mod, node, &alist); + + rhashtable_walk_stop(&iter); + } while (node =3D=3D ERR_PTR(-EAGAIN)); + rhashtable_walk_exit(&iter); =20 if (alist.index < alist.size && alist.index > 0) ftrace_set_filter_ips(&fprobe_graph_ops.ops, @@ -819,3 +827,10 @@ int unregister_fprobe(struct fprobe *fp) return ret; } EXPORT_SYMBOL_GPL(unregister_fprobe); + +static int __init fprobe_initcall(void) +{ + rhltable_init(&fprobe_ip_table, &fprobe_rht_params); + return 0; +} +late_initcall(fprobe_initcall); --=20 2.50.1 From nobody Sun Oct 5 23:56:11 2025 Received: from mail-pj1-f68.google.com (mail-pj1-f68.google.com [209.85.216.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6857A231A3B; Mon, 28 Jul 2025 07:26:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687613; cv=none; b=LvfPkZH5gTVdW41nXIF9GpNMUVi/5+FMw1sx8fgz99VRgtD1H19d5cN/4TCgzP9tDLPocpJ2ebrLZR76I8HHlkE7Zrgb4AY3feZFDV7LcCiqhuQg388MgzHoH3XyslFTtSibZgIPQZbPoe0RTn6v7fCwBa9DfWhzPGQBmEYvQfE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687613; c=relaxed/simple; bh=zudiWkkAlg6yySZkWMGW/IXw6hzgirR0YopZ0oI3JAs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PPKgbPt727q31yvEoO6sNCNkpy0C/vDansA6lNe+puoPtVuSNLjR+5peymWSsboFvEuy4U6VCfXtRy9hAilJmvx0N5ffWMiLwfhaqoVFW1/RmACjx45dVwv6mAzMXLxSdNPVhDSgzvRzzjMOFe/4jtd20LlXwb0at1p+TeaDIwQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gRAc4Nmm; arc=none smtp.client-ip=209.85.216.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gRAc4Nmm" Received: by mail-pj1-f68.google.com with SMTP id 98e67ed59e1d1-31ef50d8d57so394093a91.0; Mon, 28 Jul 2025 00:26:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753687611; x=1754292411; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=y8iwRQl4S0Ri7auKWOImDztrR8W3w7sQvsgC0R12G/0=; b=gRAc4NmmfgvWMgFH3sP/JeAU38nomaoZW8cHeZCmohCf9B7Pz5Ubtg2RjA4UDp7aUS QQ4xRG8Jel6ZzcDoC23pvfpwYJXOc7leSIjIqjyOoeQPQWT7rdty0UYgy7WtuPUzi0O2 hvlr+TklY1yFNCDi0gd4Qdi2AWJON9aR4SzBq+mLFuB6HfII27Cz76x3Qb8GkzooKT3n WAgzgSOr8/YnOynH2E6qE6HcLAe0ObjO0CZDDYXUvinYq8IDDhaq5THtb+Cth3JlgTNr IqehUlsypg6nRXMlT8uaT7J3SzZuanoEg/aK5rgQuUNQprfLeOfcC0ZHfCRi+rkO1rMc AcsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753687611; x=1754292411; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=y8iwRQl4S0Ri7auKWOImDztrR8W3w7sQvsgC0R12G/0=; b=kDxcpI7drvx7DYPwsji1m6+S6dBuqtQ78CDskS3JM8s09rXBZFpyd6B6ehu376xL3l vSa/d5VhUsXJj1D7dKWsWnNC/XB61b7IEhen5SkhQJTE/mtrfupD8OJRk+dodIFKVNUn lD7fdd+tJ9UpLUHymYACsV2qa8fCNUdQ1s57HVRKibNS72jRpHuaKtmV1KrsemU4YsvU jvnPLJHsg8OJ+rnK6QasNI39pYuOyFqp4jJuMfHt5bIzj70R8xzHXiPK6w6PLITxcQTw YIes1BskkzTNraA/FhteD39vyUz73B+uil+J7VwPuiy9ki/XcNGsHb6SSOX8q0TZYbD2 Nc8A== X-Forwarded-Encrypted: i=1; AJvYcCUgIWhmVPQmEsJKAM62Debr+lqhFwr7IGrwYcyYZtvAm2vUP7078gr9gEx/G0IadFvrjrw=@vger.kernel.org, AJvYcCVb1kcQaLRo97aBBjfYluMZQR4WAKlgpP8Ya+xr2nCOo0PgviQ4gvHykh2eVpSMhEm4HWxirkbaR1Ecy9P55OQUvmDb@vger.kernel.org, AJvYcCXb6CwlDlnwoXUY0R+gvOTWWXNusGIM0fTGoahYgIzXLy4/xZhhSoUL6zI3JrmGX02hfRvUdKdY94Ah8vzQ@vger.kernel.org X-Gm-Message-State: AOJu0Yz3sNq7hqjpXv48ElsCLmg1PB+JEgd+w4vOlHSohUBNoOYwRdaP sojQw5PSVw97xXRcoqSuz3Ee91kNIVO7E9Ez0o58esTIHmfaR7a7cjae X-Gm-Gg: ASbGnct/+lNH07EBj7qflhKKHFYkEnhaVXISgyAbuPpdN8yEWgT9mQxQK91kJQfgpSr 0a3+6X91koWggv6kxROLHF4qg0gxrViLjd8OWKKkoqmBeAH/XmIcZ2Q5IVXCtGsh/y1yvrHRVWl cA8bOtZS3ETwM+yPcJAlfEtX47WCjb12oMM8VVDImP26smfuDkfURYiRl0ENFOcHyv4KpiLpQZF Cued1FwWbFKEWw4P+cwei6I9NvXqzpQiEvYtwAnlA2IWFdta21dWNCqaF4BCLYT7Zt6PHmbdXJF M/n/Bt+0BNsIh5qbBGpYqsypOVBNGqJiDb9HQxHPeqzokZqcemipR8cft60cIvryO1GH74tdHI6 XcI1jn+JzhbtqcvJnjlg= X-Google-Smtp-Source: AGHT+IGX5hI0xOMRBS39G7QQApBvHC5rqfjHHC+lX+NkOiS304xvq30Gm0sNCZAm/R11cHzdXyQY1g== X-Received: by 2002:a17:90b:3a88:b0:311:ea13:2e63 with SMTP id 98e67ed59e1d1-31e77867003mr14763631a91.13.1753687610421; Mon, 28 Jul 2025 00:26:50 -0700 (PDT) Received: from 7950hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-31e949bbf7asm4459599a91.9.2025.07.28.00.26.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 00:26:50 -0700 (PDT) From: Menglong Dong X-Google-Original-From: Menglong Dong To: alexei.starovoitov@gmail.com, mhiramat@kernel.org Cc: rostedt@goodmis.org, mathieu.desnoyers@efficios.com, hca@linux.ibm.com, revest@chromium.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH RFC bpf-next v2 2/4] selftests/bpf: move get_ksyms and get_addrs to trace_helpers.c Date: Mon, 28 Jul 2025 15:22:51 +0800 Message-ID: <20250728072637.1035818-3-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250728072637.1035818-1-dongml2@chinatelecom.cn> References: <20250728072637.1035818-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We need to get all the kernel function that can be traced sometimes, so we move the get_syms() and get_addrs() in kprobe_multi_test.c to trace_helpers.c and rename it to bpf_get_ksyms() and bpf_get_addrs(). Signed-off-by: Menglong Dong --- .../bpf/prog_tests/kprobe_multi_test.c | 220 +----------------- tools/testing/selftests/bpf/trace_helpers.c | 214 +++++++++++++++++ tools/testing/selftests/bpf/trace_helpers.h | 3 + 3 files changed, 220 insertions(+), 217 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c b/t= ools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c index e19ef509ebf8..171706e78da8 100644 --- a/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/kprobe_multi_test.c @@ -422,220 +422,6 @@ static void test_unique_match(void) kprobe_multi__destroy(skel); } =20 -static size_t symbol_hash(long key, void *ctx __maybe_unused) -{ - return str_hash((const char *) key); -} - -static bool symbol_equal(long key1, long key2, void *ctx __maybe_unused) -{ - return strcmp((const char *) key1, (const char *) key2) =3D=3D 0; -} - -static bool is_invalid_entry(char *buf, bool kernel) -{ - if (kernel && strchr(buf, '[')) - return true; - if (!kernel && !strchr(buf, '[')) - return true; - return false; -} - -static bool skip_entry(char *name) -{ - /* - * We attach to almost all kernel functions and some of them - * will cause 'suspicious RCU usage' when fprobe is attached - * to them. Filter out the current culprits - arch_cpu_idle - * default_idle and rcu_* functions. - */ - if (!strcmp(name, "arch_cpu_idle")) - return true; - if (!strcmp(name, "default_idle")) - return true; - if (!strncmp(name, "rcu_", 4)) - return true; - if (!strcmp(name, "bpf_dispatcher_xdp_func")) - return true; - if (!strncmp(name, "__ftrace_invalid_address__", - sizeof("__ftrace_invalid_address__") - 1)) - return true; - return false; -} - -/* Do comparision by ignoring '.llvm.' suffixes. */ -static int compare_name(const char *name1, const char *name2) -{ - const char *res1, *res2; - int len1, len2; - - res1 =3D strstr(name1, ".llvm."); - res2 =3D strstr(name2, ".llvm."); - len1 =3D res1 ? res1 - name1 : strlen(name1); - len2 =3D res2 ? res2 - name2 : strlen(name2); - - if (len1 =3D=3D len2) - return strncmp(name1, name2, len1); - if (len1 < len2) - return strncmp(name1, name2, len1) <=3D 0 ? -1 : 1; - return strncmp(name1, name2, len2) >=3D 0 ? 1 : -1; -} - -static int load_kallsyms_compare(const void *p1, const void *p2) -{ - return compare_name(((const struct ksym *)p1)->name, ((const struct ksym = *)p2)->name); -} - -static int search_kallsyms_compare(const void *p1, const struct ksym *p2) -{ - return compare_name(p1, p2->name); -} - -static int get_syms(char ***symsp, size_t *cntp, bool kernel) -{ - size_t cap =3D 0, cnt =3D 0; - char *name =3D NULL, *ksym_name, **syms =3D NULL; - struct hashmap *map; - struct ksyms *ksyms; - struct ksym *ks; - char buf[256]; - FILE *f; - int err =3D 0; - - ksyms =3D load_kallsyms_custom_local(load_kallsyms_compare); - if (!ASSERT_OK_PTR(ksyms, "load_kallsyms_custom_local")) - return -EINVAL; - - /* - * The available_filter_functions contains many duplicates, - * but other than that all symbols are usable in kprobe multi - * interface. - * Filtering out duplicates by using hashmap__add, which won't - * add existing entry. - */ - - if (access("/sys/kernel/tracing/trace", F_OK) =3D=3D 0) - f =3D fopen("/sys/kernel/tracing/available_filter_functions", "r"); - else - f =3D fopen("/sys/kernel/debug/tracing/available_filter_functions", "r"); - - if (!f) - return -EINVAL; - - map =3D hashmap__new(symbol_hash, symbol_equal, NULL); - if (IS_ERR(map)) { - err =3D libbpf_get_error(map); - goto error; - } - - while (fgets(buf, sizeof(buf), f)) { - if (is_invalid_entry(buf, kernel)) - continue; - - free(name); - if (sscanf(buf, "%ms$*[^\n]\n", &name) !=3D 1) - continue; - if (skip_entry(name)) - continue; - - ks =3D search_kallsyms_custom_local(ksyms, name, search_kallsyms_compare= ); - if (!ks) { - err =3D -EINVAL; - goto error; - } - - ksym_name =3D ks->name; - err =3D hashmap__add(map, ksym_name, 0); - if (err =3D=3D -EEXIST) { - err =3D 0; - continue; - } - if (err) - goto error; - - err =3D libbpf_ensure_mem((void **) &syms, &cap, - sizeof(*syms), cnt + 1); - if (err) - goto error; - - syms[cnt++] =3D ksym_name; - } - - *symsp =3D syms; - *cntp =3D cnt; - -error: - free(name); - fclose(f); - hashmap__free(map); - if (err) - free(syms); - return err; -} - -static int get_addrs(unsigned long **addrsp, size_t *cntp, bool kernel) -{ - unsigned long *addr, *addrs, *tmp_addrs; - int err =3D 0, max_cnt, inc_cnt; - char *name =3D NULL; - size_t cnt =3D 0; - char buf[256]; - FILE *f; - - if (access("/sys/kernel/tracing/trace", F_OK) =3D=3D 0) - f =3D fopen("/sys/kernel/tracing/available_filter_functions_addrs", "r"); - else - f =3D fopen("/sys/kernel/debug/tracing/available_filter_functions_addrs"= , "r"); - - if (!f) - return -ENOENT; - - /* In my local setup, the number of entries is 50k+ so Let us initially - * allocate space to hold 64k entries. If 64k is not enough, incrementally - * increase 1k each time. - */ - max_cnt =3D 65536; - inc_cnt =3D 1024; - addrs =3D malloc(max_cnt * sizeof(long)); - if (addrs =3D=3D NULL) { - err =3D -ENOMEM; - goto error; - } - - while (fgets(buf, sizeof(buf), f)) { - if (is_invalid_entry(buf, kernel)) - continue; - - free(name); - if (sscanf(buf, "%p %ms$*[^\n]\n", &addr, &name) !=3D 2) - continue; - if (skip_entry(name)) - continue; - - if (cnt =3D=3D max_cnt) { - max_cnt +=3D inc_cnt; - tmp_addrs =3D realloc(addrs, max_cnt); - if (!tmp_addrs) { - err =3D -ENOMEM; - goto error; - } - addrs =3D tmp_addrs; - } - - addrs[cnt++] =3D (unsigned long)addr; - } - - *addrsp =3D addrs; - *cntp =3D cnt; - -error: - free(name); - fclose(f); - if (err) - free(addrs); - return err; -} - static void do_bench_test(struct kprobe_multi_empty *skel, struct bpf_kpro= be_multi_opts *opts) { long attach_start_ns, attach_end_ns; @@ -670,7 +456,7 @@ static void test_kprobe_multi_bench_attach(bool kernel) char **syms =3D NULL; size_t cnt =3D 0; =20 - if (!ASSERT_OK(get_syms(&syms, &cnt, kernel), "get_syms")) + if (!ASSERT_OK(bpf_get_ksyms(&syms, &cnt, kernel), "bpf_get_ksyms")) return; =20 skel =3D kprobe_multi_empty__open_and_load(); @@ -696,13 +482,13 @@ static void test_kprobe_multi_bench_attach_addr(bool = kernel) size_t cnt =3D 0; int err; =20 - err =3D get_addrs(&addrs, &cnt, kernel); + err =3D bpf_get_addrs(&addrs, &cnt, kernel); if (err =3D=3D -ENOENT) { test__skip(); return; } =20 - if (!ASSERT_OK(err, "get_addrs")) + if (!ASSERT_OK(err, "bpf_get_addrs")) return; =20 skel =3D kprobe_multi_empty__open_and_load(); diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/se= lftests/bpf/trace_helpers.c index 81943c6254e6..d24baf244d1f 100644 --- a/tools/testing/selftests/bpf/trace_helpers.c +++ b/tools/testing/selftests/bpf/trace_helpers.c @@ -17,6 +17,7 @@ #include #include #include +#include "bpf/hashmap.h" #include "bpf/libbpf_internal.h" =20 #define TRACEFS_PIPE "/sys/kernel/tracing/trace_pipe" @@ -519,3 +520,216 @@ void read_trace_pipe(void) { read_trace_pipe_iter(trace_pipe_cb, NULL, 0); } + +static size_t symbol_hash(long key, void *ctx __maybe_unused) +{ + return str_hash((const char *) key); +} + +static bool symbol_equal(long key1, long key2, void *ctx __maybe_unused) +{ + return strcmp((const char *) key1, (const char *) key2) =3D=3D 0; +} + +static bool is_invalid_entry(char *buf, bool kernel) +{ + if (kernel && strchr(buf, '[')) + return true; + if (!kernel && !strchr(buf, '[')) + return true; + return false; +} + +static bool skip_entry(char *name) +{ + /* + * We attach to almost all kernel functions and some of them + * will cause 'suspicious RCU usage' when fprobe is attached + * to them. Filter out the current culprits - arch_cpu_idle + * default_idle and rcu_* functions. + */ + if (!strcmp(name, "arch_cpu_idle")) + return true; + if (!strcmp(name, "default_idle")) + return true; + if (!strncmp(name, "rcu_", 4)) + return true; + if (!strcmp(name, "bpf_dispatcher_xdp_func")) + return true; + if (!strncmp(name, "__ftrace_invalid_address__", + sizeof("__ftrace_invalid_address__") - 1)) + return true; + return false; +} + +/* Do comparison by ignoring '.llvm.' suffixes. */ +static int compare_name(const char *name1, const char *name2) +{ + const char *res1, *res2; + int len1, len2; + + res1 =3D strstr(name1, ".llvm."); + res2 =3D strstr(name2, ".llvm."); + len1 =3D res1 ? res1 - name1 : strlen(name1); + len2 =3D res2 ? res2 - name2 : strlen(name2); + + if (len1 =3D=3D len2) + return strncmp(name1, name2, len1); + if (len1 < len2) + return strncmp(name1, name2, len1) <=3D 0 ? -1 : 1; + return strncmp(name1, name2, len2) >=3D 0 ? 1 : -1; +} + +static int load_kallsyms_compare(const void *p1, const void *p2) +{ + return compare_name(((const struct ksym *)p1)->name, ((const struct ksym = *)p2)->name); +} + +static int search_kallsyms_compare(const void *p1, const struct ksym *p2) +{ + return compare_name(p1, p2->name); +} + +int bpf_get_ksyms(char ***symsp, size_t *cntp, bool kernel) +{ + size_t cap =3D 0, cnt =3D 0; + char *name =3D NULL, *ksym_name, **syms =3D NULL; + struct hashmap *map; + struct ksyms *ksyms; + struct ksym *ks; + char buf[256]; + FILE *f; + int err =3D 0; + + ksyms =3D load_kallsyms_custom_local(load_kallsyms_compare); + if (!ksyms) + return -EINVAL; + + /* + * The available_filter_functions contains many duplicates, + * but other than that all symbols are usable to trace. + * Filtering out duplicates by using hashmap__add, which won't + * add existing entry. + */ + + if (access("/sys/kernel/tracing/trace", F_OK) =3D=3D 0) + f =3D fopen("/sys/kernel/tracing/available_filter_functions", "r"); + else + f =3D fopen("/sys/kernel/debug/tracing/available_filter_functions", "r"); + + if (!f) + return -EINVAL; + + map =3D hashmap__new(symbol_hash, symbol_equal, NULL); + if (IS_ERR(map)) { + err =3D libbpf_get_error(map); + goto error; + } + + while (fgets(buf, sizeof(buf), f)) { + if (is_invalid_entry(buf, kernel)) + continue; + + free(name); + if (sscanf(buf, "%ms$*[^\n]\n", &name) !=3D 1) + continue; + if (skip_entry(name)) + continue; + + ks =3D search_kallsyms_custom_local(ksyms, name, search_kallsyms_compare= ); + if (!ks) { + err =3D -EINVAL; + goto error; + } + + ksym_name =3D ks->name; + err =3D hashmap__add(map, ksym_name, 0); + if (err =3D=3D -EEXIST) { + err =3D 0; + continue; + } + if (err) + goto error; + + err =3D libbpf_ensure_mem((void **) &syms, &cap, + sizeof(*syms), cnt + 1); + if (err) + goto error; + + syms[cnt++] =3D ksym_name; + } + + *symsp =3D syms; + *cntp =3D cnt; + +error: + free(name); + fclose(f); + hashmap__free(map); + if (err) + free(syms); + return err; +} + +int bpf_get_addrs(unsigned long **addrsp, size_t *cntp, bool kernel) +{ + unsigned long *addr, *addrs, *tmp_addrs; + int err =3D 0, max_cnt, inc_cnt; + char *name =3D NULL; + size_t cnt =3D 0; + char buf[256]; + FILE *f; + + if (access("/sys/kernel/tracing/trace", F_OK) =3D=3D 0) + f =3D fopen("/sys/kernel/tracing/available_filter_functions_addrs", "r"); + else + f =3D fopen("/sys/kernel/debug/tracing/available_filter_functions_addrs"= , "r"); + + if (!f) + return -ENOENT; + + /* In my local setup, the number of entries is 50k+ so Let us initially + * allocate space to hold 64k entries. If 64k is not enough, incrementally + * increase 1k each time. + */ + max_cnt =3D 65536; + inc_cnt =3D 1024; + addrs =3D malloc(max_cnt * sizeof(long)); + if (addrs =3D=3D NULL) { + err =3D -ENOMEM; + goto error; + } + + while (fgets(buf, sizeof(buf), f)) { + if (is_invalid_entry(buf, kernel)) + continue; + + free(name); + if (sscanf(buf, "%p %ms$*[^\n]\n", &addr, &name) !=3D 2) + continue; + if (skip_entry(name)) + continue; + + if (cnt =3D=3D max_cnt) { + max_cnt +=3D inc_cnt; + tmp_addrs =3D realloc(addrs, max_cnt); + if (!tmp_addrs) { + err =3D -ENOMEM; + goto error; + } + addrs =3D tmp_addrs; + } + + addrs[cnt++] =3D (unsigned long)addr; + } + + *addrsp =3D addrs; + *cntp =3D cnt; + +error: + free(name); + fclose(f); + if (err) + free(addrs); + return err; +} diff --git a/tools/testing/selftests/bpf/trace_helpers.h b/tools/testing/se= lftests/bpf/trace_helpers.h index 2ce873c9f9aa..9437bdd4afa5 100644 --- a/tools/testing/selftests/bpf/trace_helpers.h +++ b/tools/testing/selftests/bpf/trace_helpers.h @@ -41,4 +41,7 @@ ssize_t get_rel_offset(uintptr_t addr); =20 int read_build_id(const char *path, char *build_id, size_t size); =20 +int bpf_get_ksyms(char ***symsp, size_t *cntp, bool kernel); +int bpf_get_addrs(unsigned long **addrsp, size_t *cntp, bool kernel); + #endif --=20 2.50.1 From nobody Sun Oct 5 23:56:11 2025 Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E957236A9F; Mon, 28 Jul 2025 07:26:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687616; cv=none; b=a8yagRjfgr19UGCygDzJen3iMNqDai56lRjmJui8KEq/POmI6zX7WU5mZbZCULUzTKSPiRVZZ9sLqDJ39h5hB3TT8ErmQE11gv3CrqGirJiTbvZ7GCtPGxs+VV7ieXKzDDlGAcMNb744wdakVyEW0or0hEaE5QzXvYmIWUdpS4Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687616; c=relaxed/simple; bh=TGw2ul2ZAldEcVHaU0fnT+T9Zm5AaMY7QcEq1fLdVSA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o7IZa58XnF7+fgfa5T7MY8mZ2XHfrpCvDXnyKwzrTH7QJ6uRx/12CTa78QLH+40FowB+VWCkR6nWXPN9nRcm9hFoG1oJNDRTKAP/UU7o+mU9CBfY86o1s9g84yMsrj2oobc4MDXExJLmKY0/awnKXUsy5xc8wHO8RBguUCNLPNY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mPY9NkHq; arc=none smtp.client-ip=209.85.216.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mPY9NkHq" Received: by mail-pj1-f66.google.com with SMTP id 98e67ed59e1d1-31eb40b050bso848166a91.0; Mon, 28 Jul 2025 00:26:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753687614; x=1754292414; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DGBbLIiLGqrmFvSwaYDbAojdCre78exL+6ZjHnBuXvE=; b=mPY9NkHqqRiVPqM2WAHhMtNIl5psfpS8hC5Hgu89sEZ3ANCKkoeaPZJfHywwBYU7+v Jb5y15TqxxNLigI6aNkqSjKn77wcflZPMD5q0dILU1kUZ7cYH+DuRFo+dP/HeNF2g8uM 7GK618Rp1ux1okrXxe9UD+X3+POxX4rVrWOJlkyFQun5ocE1B/wohWO2EC1FcDZ0i8Nw vz5w6+k8SB39i+MbjbIBVBhWuXJRpQDHll4EB1m1ZdF0bTwV9EGMq3PgN3IdLKQ/AxGO +PUmHEoVBpskQcsm1/xn085qYPMmlNDjcd7Oc9iWYIxPDATyIh11wZmmECM+r3JiGQSk UcuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753687614; x=1754292414; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DGBbLIiLGqrmFvSwaYDbAojdCre78exL+6ZjHnBuXvE=; b=CB+MUsVS2+9IW1yvgUKKHEwqt5zJKQo4Yq+h3WGDV9vhdLShFS+68mNaQGNl3taHxy i1W+HCj5W5TIzSi1qydEfuo1espHJ0HJVPxoHH/DKCqYIGt4oOtYZ1aZEOBX9HY9sjAg YsQDIVk3exI+vKvQHQN/k0urYLHfpGStsucYJBxAjzOgdkQjF/iCWC5WBzWG5aDTC5+u A+R+wjNjFZaiibJjJpUFGLiMwo6cJUvpesCVcI9/ofEMMaHv1b2ZngLjeGppr4CkkRT/ zVJ9jvwXUOVINIF5rf3W6G0+FMUO7jAkznnE3NX9EDxTcjgCnt3SNNbDxEJauRcHg0PE HVxA== X-Forwarded-Encrypted: i=1; AJvYcCU32zBR1bibepuyWOcTiBlIOgY+abO61TouccYPl8bSlPiIJPqxqa5LH/SxI5yyZkHq97dssJRuc0WHCEsS@vger.kernel.org, AJvYcCUOWXaWCnIuIKxmnuFqJ3npwivtDq+b7i9+9r3iUz1V/c7f0OnrylREjY+xd6avQj28I64=@vger.kernel.org, AJvYcCUdSg+V3SUgKbU9yLee25kbBYDcjvrHbvKB6hJIyWR2IEYYhah3FF5lCD9tqqZSZvn+JPTZLO6nfg/eValX2r5Scblc@vger.kernel.org X-Gm-Message-State: AOJu0YyeASbcWLkPmz5/4SdvHrq4JbxNL+ILpKEmOaV7UX5ElTZeM1DS cl8eLvHmNBrTw30YKj9AKnKwk8PiO6idwWgQbGEWW4qjwOodJKpbksnC X-Gm-Gg: ASbGncuwc4xDGxv2IJ1BFaw2Jrt1cG3JcmUqG07NTiMmO6AQ5EFLwmRzJ/LcJdxSGO5 5vQOJveJd+KAyUfDl6JNMIwShHO4fJtMKiIuobygFQhhHKPnTa6Qn3qVMiPJWVzfchQ6ISzaaed oSxCgGfaN1flG1IHLSJ3cSxaBT+E8+0D3KOwa1N0dePQPhivrv9D6NGg1+X5NHdCOqbvGjzLPNt npYXTFRK+CK3rZaBxV4X5H1fiuWEnDAUhWRiHx0XWM76jrmAMyjezk7dMuya2dvmnrn6ugF1Ow7 5QFvElahdSnGf34aTjN8GiG8Am+ah3nTC1XXt5fQL8FEjlUrofAhtrwXbkz4DKUqDobD8KETFZG SQquxTLFCGFsUN3x37ZTxEjKX3E/MRA== X-Google-Smtp-Source: AGHT+IF7jIYJLv6nMqQFak/nn9g9m+uvaHqaYClggpwcVWt9FynpsHR8SH9kO8l27gIScxMlb2slQg== X-Received: by 2002:a17:90b:35cb:b0:313:283e:e881 with SMTP id 98e67ed59e1d1-31e7785efe2mr17127850a91.11.1753687613470; Mon, 28 Jul 2025 00:26:53 -0700 (PDT) Received: from 7950hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-31e949bbf7asm4459599a91.9.2025.07.28.00.26.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 00:26:53 -0700 (PDT) From: Menglong Dong X-Google-Original-From: Menglong Dong To: alexei.starovoitov@gmail.com, mhiramat@kernel.org Cc: rostedt@goodmis.org, mathieu.desnoyers@efficios.com, hca@linux.ibm.com, revest@chromium.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH RFC bpf-next v2 3/4] selftests/bpf: skip recursive functions for kprobe_multi Date: Mon, 28 Jul 2025 15:22:52 +0800 Message-ID: <20250728072637.1035818-4-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250728072637.1035818-1-dongml2@chinatelecom.cn> References: <20250728072637.1035818-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some functions is recursive for the kprobe_multi and impact the benchmark results. So just skip them. Signed-off-by: Menglong Dong --- tools/testing/selftests/bpf/trace_helpers.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/testing/selftests/bpf/trace_helpers.c b/tools/testing/se= lftests/bpf/trace_helpers.c index d24baf244d1f..9da9da51b132 100644 --- a/tools/testing/selftests/bpf/trace_helpers.c +++ b/tools/testing/selftests/bpf/trace_helpers.c @@ -559,6 +559,22 @@ static bool skip_entry(char *name) if (!strncmp(name, "__ftrace_invalid_address__", sizeof("__ftrace_invalid_address__") - 1)) return true; + + if (!strcmp(name, "migrate_disable")) + return true; + if (!strcmp(name, "migrate_enable")) + return true; + if (!strcmp(name, "rcu_read_unlock_strict")) + return true; + if (!strcmp(name, "preempt_count_add")) + return true; + if (!strcmp(name, "preempt_count_sub")) + return true; + if (!strcmp(name, "__rcu_read_lock")) + return true; + if (!strcmp(name, "__rcu_read_unlock")) + return true; + return false; } =20 --=20 2.50.1 From nobody Sun Oct 5 23:56:11 2025 Received: from mail-pg1-f196.google.com (mail-pg1-f196.google.com [209.85.215.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5410F230BCE; Mon, 28 Jul 2025 07:26:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.196 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687618; cv=none; b=McSdBA4XUX6y/+D4W7+luGd+naX15LlKtv4XdyVeloaaB43fDpBdsg8SYO0ujBWmNecYPOELba4txFF51oSQfEyirLRW2aaSKx3X17koo/t5AyTnhcqmEFTPzhFkcYj/a2Y/mnp18xpI28nxzbHtkNY5OLLusKomqZPGtzaQx3M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753687618; c=relaxed/simple; bh=bRExeoONmR0WhrsbqFNroJ9+Vz1rBjIUMt3FwoFHMyQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mVKuxfEiPr53vv2DlUvbnEEHej0Fm1B1eBjgOXQmGPhiO9yZyI0gJSLoBdTeD6c2gOPvFXHxapvj+x8YjZ9KF2cDRqfGbtOC+ffn5AchZ4yrnVV0UYOaUDuvuLPNqKaG06Psf71FrRB88Ew5a26BFJ9oox/zSfJfhNh5+l8QcLs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XYbbrz90; arc=none smtp.client-ip=209.85.215.196 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XYbbrz90" Received: by mail-pg1-f196.google.com with SMTP id 41be03b00d2f7-b321bd36a41so3432769a12.2; Mon, 28 Jul 2025 00:26:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753687617; x=1754292417; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AjeNP1ojEwSXm7x5F0g4swwiLUfc7kqWz38lpPc+Rx8=; b=XYbbrz90LtDrnUwvInxDOSLeJHvn3fVoGMbH7ABuxmQF4H+stD5cH9m2huHLWnv3/n dsxFyajVcWnbA5F8zjvNKe8oNriZsnYShL10Mf9aJamcRY7G8uBENnDCwbkXxNt1N339 mPKUodOel3u31qBsA3UAQJpl6abrqAeded+gejR9kYBbx82e7JAzQSfRdmuVpTUYbsPM vOvo64gUg0lpDCLz38W7FLmvbcN89amUSbxVQHATVoRQR4Hv1gCPswogMVoFRvipluMp HOIPE6IN69dFSxRftCq2eS3FrmhkSbBxCQd5IuiFVgiXq6v1Ikz3eLL+4lG4xzpcSaZE zxbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753687617; x=1754292417; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AjeNP1ojEwSXm7x5F0g4swwiLUfc7kqWz38lpPc+Rx8=; b=sXfSAhRrIPiuHokX+37Ujim4OpTbWYw4qAmEdujbc/zMqy3a5OiqoColfJLIWH0FPu oBgqL4GOscWj14jQtmYPDd5fSVq0PNPC630T647iVV4YMZmnEZedyxwehE8CTgZmyo6i 4KaRD6tqo4LFbEB3DVKKRZHvK5JcGnbDOIGwhIjByMPf3xfB8g4KObQ+LBBD4v/g5oRB IMyQhG5jT2TyWgyix3JTO76kpBzsYhLl8zCDn0Zh27MZ2j5D9Qx301WAsYria2sIs4mJ qZLo4Zui8zlpc0mOo8H/Uu7uBy3vQp8la/t0T70y2cauGitwqPVeBzsUILSo9E1jSp1m IIFw== X-Forwarded-Encrypted: i=1; AJvYcCV5L8LhGKp4FstgElo3XRlpCo/J4pZSlaKkU9nU6rT3bOSa/bPErfDTyrQQ2zgVhfquIME=@vger.kernel.org, AJvYcCVYY3Iwb3K7sTwKMK9Hv37o7sRH1XmVxRrXEwPU+nh+NpGDzEihkURpJowyv5eLve1IUQgOxMk0130a23/sYFnghR7J@vger.kernel.org, AJvYcCX/Y4CGRjHrySaC/f34KAyJZQk/wExpkOoztHpBP/0GZxpjoHwWjcRHDOhkDztRxZVniQXkIBCHEiBHqNiN@vger.kernel.org X-Gm-Message-State: AOJu0Yz/qxNeHi/DY7ldkqoPGjLc+9n/IIY6T/U497S48oqp/HnhcZtV McH0we6wrcx1UJK+iqHmgmgHhXtJogMkvG3mv/Pls74+ZyifBgHqfYYl X-Gm-Gg: ASbGncu/CUadqIJmKeqWgCaUoyCWWnp8VFjrsw9VajOFP3l9Nk3h0VBbDC7IDLFiPZQ zDYmTTxySC5ieBBSvCPh15kPq1nAJ7I72mORc+NjEWO5EnWCfJoUZO3clhwlx7xmjvZTnnATl/b 2LLSnlOfsvLjzH8GVZZzKQ10b8ThIqguFonNaq/zDFuB83aJPZZ/x7ctoL/MeBrbmdqmu0oYT9C mhERUtcLusOKf2F+aAo794/uAW1mGkHunFnF9TVTDMh0XFBtGixLBM9Epde+EFOHglc8WVRakUO 5wcMtblBaKjiFSkurmM/qwSK98ajKtoaItmo2SVuTT0bBz5G3Rxqe3KY/VXmLjHVMGEktIiQMId pXfuXlvqoIzOu5uVUUEA= X-Google-Smtp-Source: AGHT+IFZC7ZzjzX5wLnDbw02CA57fWodl50nJAry8hSvo4JT90aZvZDnnQhekEdTf7UiFDu/FyYXOQ== X-Received: by 2002:a17:90b:37ce:b0:312:f650:c795 with SMTP id 98e67ed59e1d1-31e77a01339mr16768415a91.21.1753687616654; Mon, 28 Jul 2025 00:26:56 -0700 (PDT) Received: from 7950hx ([43.129.244.20]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-31e949bbf7asm4459599a91.9.2025.07.28.00.26.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 00:26:56 -0700 (PDT) From: Menglong Dong X-Google-Original-From: Menglong Dong To: alexei.starovoitov@gmail.com, mhiramat@kernel.org Cc: rostedt@goodmis.org, mathieu.desnoyers@efficios.com, hca@linux.ibm.com, revest@chromium.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH RFC bpf-next v2 4/4] selftests/bpf: add benchmark testing for kprobe-multi-all Date: Mon, 28 Jul 2025 15:22:53 +0800 Message-ID: <20250728072637.1035818-5-dongml2@chinatelecom.cn> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250728072637.1035818-1-dongml2@chinatelecom.cn> References: <20250728072637.1035818-1-dongml2@chinatelecom.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For now, the benchmark for kprobe-multi is single, which means there is only 1 function is hooked during testing. Add the testing "kprobe-multi-all", which will hook all the kernel functions during the benchmark. Signed-off-by: Menglong Dong --- tools/testing/selftests/bpf/bench.c | 2 ++ .../selftests/bpf/benchs/bench_trigger.c | 30 +++++++++++++++++++ .../selftests/bpf/benchs/run_bench_trigger.sh | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/bench.c b/tools/testing/selftests/= bpf/bench.c index ddd73d06a1eb..da971d8c5ae5 100644 --- a/tools/testing/selftests/bpf/bench.c +++ b/tools/testing/selftests/bpf/bench.c @@ -510,6 +510,7 @@ extern const struct bench bench_trig_kretprobe; extern const struct bench bench_trig_kprobe_multi; extern const struct bench bench_trig_kretprobe_multi; extern const struct bench bench_trig_fentry; +extern const struct bench bench_trig_kprobe_multi_all; extern const struct bench bench_trig_fexit; extern const struct bench bench_trig_fmodret; extern const struct bench bench_trig_tp; @@ -578,6 +579,7 @@ static const struct bench *benchs[] =3D { &bench_trig_kprobe_multi, &bench_trig_kretprobe_multi, &bench_trig_fentry, + &bench_trig_kprobe_multi_all, &bench_trig_fexit, &bench_trig_fmodret, &bench_trig_tp, diff --git a/tools/testing/selftests/bpf/benchs/bench_trigger.c b/tools/tes= ting/selftests/bpf/benchs/bench_trigger.c index 82327657846e..be5fe88862a4 100644 --- a/tools/testing/selftests/bpf/benchs/bench_trigger.c +++ b/tools/testing/selftests/bpf/benchs/bench_trigger.c @@ -226,6 +226,35 @@ static void trigger_fentry_setup(void) attach_bpf(ctx.skel->progs.bench_trigger_fentry); } =20 +static void trigger_kprobe_multi_all_setup(void) +{ + LIBBPF_OPTS(bpf_kprobe_multi_opts, opts); + struct bpf_program *prog; + struct bpf_link *link; + char **syms =3D NULL; + size_t cnt =3D 0; + + setup_ctx(); + prog =3D ctx.skel->progs.bench_trigger_kprobe_multi; + bpf_program__set_autoload(prog, true); + load_ctx(); + + if (bpf_get_ksyms(&syms, &cnt, true)) { + printf("failed to get ksyms\n"); + exit(1); + } + + printf("found %zu ksyms\n", cnt); + opts.syms =3D (const char **) syms; + opts.cnt =3D cnt; + link =3D bpf_program__attach_kprobe_multi_opts(prog, NULL, &opts); + if (!link) { + printf("failed to attach bpf_program__attach_kprobe_multi_opts to all\n"= ); + exit(1); + } + ctx.skel->links.bench_trigger_kprobe_multi =3D link; +} + static void trigger_fexit_setup(void) { setup_ctx(); @@ -512,6 +541,7 @@ BENCH_TRIG_KERNEL(kretprobe, "kretprobe"); BENCH_TRIG_KERNEL(kprobe_multi, "kprobe-multi"); BENCH_TRIG_KERNEL(kretprobe_multi, "kretprobe-multi"); BENCH_TRIG_KERNEL(fentry, "fentry"); +BENCH_TRIG_KERNEL(kprobe_multi_all, "kprobe-multi-all"); BENCH_TRIG_KERNEL(fexit, "fexit"); BENCH_TRIG_KERNEL(fmodret, "fmodret"); BENCH_TRIG_KERNEL(tp, "tp"); diff --git a/tools/testing/selftests/bpf/benchs/run_bench_trigger.sh b/tool= s/testing/selftests/bpf/benchs/run_bench_trigger.sh index a690f5a68b6b..886b6ffc9742 100755 --- a/tools/testing/selftests/bpf/benchs/run_bench_trigger.sh +++ b/tools/testing/selftests/bpf/benchs/run_bench_trigger.sh @@ -6,7 +6,7 @@ def_tests=3D( \ usermode-count kernel-count syscall-count \ fentry fexit fmodret \ rawtp tp \ - kprobe kprobe-multi \ + kprobe kprobe-multi kprobe-multi-all \ kretprobe kretprobe-multi \ ) =20 --=20 2.50.1