From nobody Sat Feb 7 17:42:10 2026 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 6D05227A904 for ; Sun, 1 Feb 2026 03:16:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915783; cv=none; b=ZRBrrkvIE4guSsx+NGA8eyS7BVoLu97Tizkm0WSMWYPkUON/zoYC+J0DdsAAZhBwfHxBnGqe6I2R7NimiAoVILZg/ukJYAxqgvGzLwqh0uC5s5x0S7ROaqy0jE2irwJKhHqoqxWh7ieHBjKJ4v6c6/JpctiCDzxpdRfL/qYEc2o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915783; c=relaxed/simple; bh=uUL3+hIqzzN4FF56+RZlxBho1NEz93n03uZmaBVx188=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SLPGK2YCtvouv+K+Ol2B5CyRHVaZlWwb5jyld6a4BaTZ6+nzSU96QrF9XK3Jvo4GyQK0bDfDzJ9Zl/wFIxFzuOWUHSE9uNX3GpWOE1Z5Ds3MmoMWRVk5UvWJI2XlwozfWOAbGPFpm+iUcU7g9tskz6tDgxZAJEgWXgMAOzdEkZE= 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=Y5ht4EZm; arc=none smtp.client-ip=209.85.210.181 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="Y5ht4EZm" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-81e8a9d521dso1890432b3a.2 for ; Sat, 31 Jan 2026 19:16:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769915781; x=1770520581; 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=32rXQW4BVZZQ4FbVA0RQJRaOaveBTs70Lc0Lq+KuBq8=; b=Y5ht4EZmA54Ut68q0sA1S71vHaQkGq7ry7LSRa8y/SHeaE2e3V+xe9KtzutxZJfD+F czxucIw7KK0Ug50P3KK7aX7+DAu7GzKSRk+3+LN1KezFB4NTtZSde7TUVEgw5TmhORn5 IE9LkaTqwwiX1w+0aQRRkwxTEZXN/qKATkDymLG0YGc7uX8o7GTSqvRG45XQFW4snjoI l69qrbNhOqDijRiBk01dfyNn83HHjQoT3b02RmwDbRtAvk8/Sm6HBHiGe4iheGXV9iZg rIKAGft9ivhgfBXpJrosp+t5Px8LvvmQb/M2S34KTThwx5+ZQBqT8O5A9exSmMClAUCh xk2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769915781; x=1770520581; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=32rXQW4BVZZQ4FbVA0RQJRaOaveBTs70Lc0Lq+KuBq8=; b=JWDm/AbLI8EsWdlByClXO3qXnQgZkeVGDhbH2BE6QrjYuP3oQQGM3RvDczpQWWtXIt dSBT+TUN2VOy/PAUbqxeNWBhqlPc9CpAxDRVCOIZ+l3WBzO8AKKj8cTc6RGdLodwYQyN donOQdW85FAyAmUHsc3abm55bZFCAZa3QHf4cUgvcYVeG+J2MldTzhxLkfLUFkf5b2zv zMHfo2iRGAvE6T8drBDHvJeg0owwWuCBR9ctgOXTfVhDY4RoSZ8wDFd5enjsxhLoKsWh VY/I5bskzqPPaq/bWVFlzDkr9814MXdX4o4Tr60EOXpgiHLsgFxOkWS+KPE5Xb+B7Oh/ 4VXg== X-Gm-Message-State: AOJu0YxWN7gglVZ1C6ZbWe0K7GvIaEDZlRISozEm8kzF4GDrQ9XXjanh f5qYhSb3eBSkZbL+BHncgLi4eWODrCJ3fpFnTjlHBN6f2Tv9U32/99v1 X-Gm-Gg: AZuq6aKHVQO4CbSDLNsLooFD5T5UutarB+d5A218dwEMaXmBBccJE1FzpE1ZvLIwTZK SW+z+rszfJvaoz62V9TH/Iy5JfEbd4b7nHllrNW+u/KY/y5iBB4ZwAzgpmEGGilhOrqmz9FYgTh ouoCmym7G6bSgppQ4QyRPGysErWx28XFgDHCJAKn+2LlhnfpEqfWawqwM8E5ITOXXOW3CeayBwQ 3G5z5ZdR/pCZ3NoZR8QhLczlKa2d/BeX+aopnT4r1l+ZPxV5tQwSHjz4Ar0gpQCtd+QzKjf2knN OxP3KXRNJLZfWr+qHe9TcOWnzS4yNRm3VU80miDhgTU1jIX5BmAmfmrsPBvThRnWbz71q9lSLm2 YFMJEumbL+fhytcnUwqKk9mgWIFwDu3xdPLy5duFmvIitpFUl1NlPc6WUVq176iEJ9DU8v3w51q 5MqsVmFaA7U8xYiv1T+dsbRefcCW07mFmcivgCoqXB4Q== X-Received: by 2002:a05:6a00:12d9:b0:7e8:4471:ae55 with SMTP id d2e1a72fcca58-823aa6ec46cmr7512905b3a.33.1769915780635; Sat, 31 Jan 2026 19:16:20 -0800 (PST) Received: from localhost.localdomain ([113.218.252.120]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b6b2bdsm11810818b3a.30.2026.01.31.19.16.16 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 31 Jan 2026 19:16:20 -0800 (PST) From: chengkaitao 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, shuah@kernel.org, yangfeng@kylinos.cn Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH v2 1/3] bpf/verifier: allow calling bpf_kptr_xchg while holding a lock Date: Sun, 1 Feb 2026 11:16:05 +0800 Message-ID: <20260201031607.32940-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260201031607.32940-1-pilgrimtao@gmail.com> References: <20260201031607.32940-1-pilgrimtao@gmail.com> 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" From: Chengkaitao For the following scenario: struct tree_node { struct bpf_rb_node node; struct request __kptr *req; u64 key; }; struct bpf_rb_root tree_root __contains(tree_node, node); struct bpf_spin_lock tree_lock; If we need to traverse all nodes in the rbtree, retrieve the __kptr pointer from each node, and read kernel data from the referenced object, using bpf_kptr_xchg appears unavoidable. This patch skips the BPF verifier checks for bpf_kptr_xchg when called while holding a lock. Signed-off-by: Chengkaitao --- kernel/bpf/verifier.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 3135643d5695..05a6a6606b6c 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -20387,7 +20387,8 @@ static int do_check_insn(struct bpf_verifier_env *e= nv, bool *do_print_state) =20 if (env->cur_state->active_locks) { if ((insn->src_reg =3D=3D BPF_REG_0 && - insn->imm !=3D BPF_FUNC_spin_unlock) || + insn->imm !=3D BPF_FUNC_spin_unlock && + insn->imm !=3D BPF_FUNC_kptr_xchg) || (insn->src_reg =3D=3D BPF_PSEUDO_KFUNC_CALL && (insn->off !=3D 0 || !kfunc_spin_allowed(insn->imm)))) { verbose(env, --=20 2.50.1 (Apple Git-155) From nobody Sat Feb 7 17:42:10 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (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 BE08827FB1E for ; Sun, 1 Feb 2026 03:16:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915787; cv=none; b=r70a1XGBriVrFcrXpjsC/jVCvx5p33YaCwVJdQ1pwMxl1tCw4Wf9omYQ+27lfCP2zQcC5CHj9oetITQ02BeXSBsYmWi5mylD7X/yJXfNQE2ZKrNBj+fAnAmKzWjkwC2K3wXvuVU0GFmpEKJZKeuKa3dwTI9z2TUd0arBV5B6NLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915787; c=relaxed/simple; bh=sWh4qRJW5wuJPUJ9xDpga/kqSm/hNDUxwTBOVpO7yLY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NRyzqVZDWSYy4rkLk3bOLimAafJJbW2b5MxuNJ0dgmwOiRZJdw5jeKx7aLgXaujRATMqpBIGl3hkg/Ew/KfC1pQySinrsqNuHZv7YApVf9pdezkkiK6hIi40oZaeK2x2VohPtrYGxzs4mF06el/qphEV+1CQkX5bNtk0y85jIpo= 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=N7DkMk6E; arc=none smtp.client-ip=209.85.210.171 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="N7DkMk6E" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-81f4f4d4822so1699821b3a.3 for ; Sat, 31 Jan 2026 19:16:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769915785; x=1770520585; 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=sMhSx+6lEu+8jKPgVw5bypgKSiK+gEAAE/MS9cV7FQc=; b=N7DkMk6Ei4jyLUgmG6n4QOYCluCj0s+R/Nr2YWcnnY3vh1hxplcbdFbu9mVpYEZcpp 0iXEh/pxQtbjuTbSGveiPAiDosmTnHPezV7NsCit9tXsdBGsQ24WYx+1PulETCJYA10q n3xUzzsUMaLzookq8VLiW6dOM7/+uMRINJ+Z08fSY7RTrt08Dw5p05PekVlszlVeI1Jn ifGYaKi/oh4x4iT3cRTZuxLFaVjkjUn+FV62khlbzf09d05hM0LGG36va2roehK62vkx y3VMSXwpdcRuxZFnsIzj/+vCcyCSeb6m02n+HUN+k5ryuefgniZxzwQOnioLG0M3k/Mk 2pow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769915785; x=1770520585; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=sMhSx+6lEu+8jKPgVw5bypgKSiK+gEAAE/MS9cV7FQc=; b=qCB0ukM7qMqzqI2vSPgP7Ujnh34vcqGK9ioUVjetaPUb52X7pfHgmiUtnRtXYqlW4a Q2yyMRJ+YbWDwSlxIqhPkZMbBMGxQY39WlNvJ1l9QrtDBNFCk5HRrDEwp79yqPGSlJtj Mg9PYuROXKFmoigAYU4Z7H/IB5d//puQmPEWq8KeSQ+FAkJGTNgQLXOl+ilpCtYP+7xj zUopwFqH2SVhLglqn3k68HbdwKSWGMVqPcZxjq9OwuQSYyQCkRpUkw4+7hvy7tlrGAv+ pJDpJXWkka6SEnvhtSVCSqivYA9Owz82Uxiv908yFi1Hxpt6rPB5JX3+vYL84c+0D09F +paQ== X-Gm-Message-State: AOJu0Yzgz6Pj9QNLiRsYteI9VgqqogQVTAE0ammXY8B7A9lQH1tKTfNv psglY6u7kAfca2176qhCaDcyXVi9QCAH3hK5vtLyX5JYLapLkKrqcfqy X-Gm-Gg: AZuq6aI5e1n6+KpCYAW5KIAsalXcPGaomP2SHaFV2bF49sU/q0nJtn1lP3X09sVSB93 TOjTEvsWfOYbitkAhkJ+o1xi8BpZ4B/WnIuMrCydXUTsWMECDEnWwNGs48OPqT3y//x2F1S0LoE VSZUUHT3ZdIYo+DwHY3vx8qqErK2eBZxPL9FlnWYlI8yTLJKb11gRwQ9zi+tYV6iL3r32Kuky8I 1Fd48tZFd8AMyJg5Awang8AEbyg3UPEODW1uiuX6KTjIvhpc2nFYpr5kEwXnnwjgQkkoUa6fKAm neg7ha8SveWeY232a31gweU2JShokgdapWGMH5tC21AM8oaP/RYDt8BgkoDO95LmRI3EpoxQ7J0 tTtxyJO/5WnfeJFsW3+sfat/QOXraz6t8DXL+jsSuyP2F6BeL4vJyJQf0gnkEHqFC3gqgUxuFoi 4awgl5wmgqyoh2tyAOwGPumKITRHN7pX4FB/cQRbVhxw== X-Received: by 2002:a05:6a00:a21a:b0:821:85a4:3f75 with SMTP id d2e1a72fcca58-823aa67f131mr7379254b3a.12.1769915784990; Sat, 31 Jan 2026 19:16:24 -0800 (PST) Received: from localhost.localdomain ([113.218.252.120]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b6b2bdsm11810818b3a.30.2026.01.31.19.16.20 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 31 Jan 2026 19:16:24 -0800 (PST) From: chengkaitao 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, shuah@kernel.org, yangfeng@kylinos.cn Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH v2 2/3] bpf/verifier: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Sun, 1 Feb 2026 11:16:06 +0800 Message-ID: <20260201031607.32940-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260201031607.32940-1-pilgrimtao@gmail.com> References: <20260201031607.32940-1-pilgrimtao@gmail.com> 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" From: Chengkaitao When traversing an rbtree using bpf_rbtree_left/right, if bpf_kptr_xchg is used to access the __kptr pointer contained in a node, it currently requires first removing the node with bpf_rbtree_remove and clearing the NON_OWN_REF flag, then re-adding the node to the original rbtree with bpf_rbtree_add after usage. This process significantly degrades rbtree traversal performance. The patch enables accessing __kptr pointers with the NON_OWN_REF flag set while holding the lock, eliminating the need for this remove-read-readd sequence. Signed-off-by: Chengkaitao Signed-off-by: Feng Yang --- kernel/bpf/verifier.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 05a6a6606b6c..bb3ff4bbb3a2 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -9260,7 +9260,8 @@ static const struct bpf_reg_types timer_types =3D { .= types =3D { PTR_TO_MAP_VALUE } static const struct bpf_reg_types kptr_xchg_dest_types =3D { .types =3D { PTR_TO_MAP_VALUE, - PTR_TO_BTF_ID | MEM_ALLOC + PTR_TO_BTF_ID | MEM_ALLOC, + PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF } }; static const struct bpf_reg_types dynptr_types =3D { @@ -9420,6 +9421,7 @@ static int check_reg_type(struct bpf_verifier_env *en= v, u32 regno, } case PTR_TO_BTF_ID | MEM_ALLOC: case PTR_TO_BTF_ID | MEM_PERCPU | MEM_ALLOC: + case PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF: if (meta->func_id !=3D BPF_FUNC_spin_lock && meta->func_id !=3D BPF_FUNC= _spin_unlock && meta->func_id !=3D BPF_FUNC_kptr_xchg) { verifier_bug(env, "unimplemented handling of MEM_ALLOC"); --=20 2.50.1 (Apple Git-155) From nobody Sat Feb 7 17:42:10 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 42D74280324 for ; Sun, 1 Feb 2026 03:16:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915791; cv=none; b=B6iahVewZSQQVk0jmoLh0YNH+ik18umcvNmsdu0J6gpWkhR9/QchUmICuvrzMcZ9alNgATo5a4vr+f7Q8r2StnIwrYiN1LmgnPJKFA54k8kqIJizN44Axuc9abY2oOAcwg/b1krztNjtbpqhZeP4tMEiT57PqddsilRWDskn9FY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769915791; c=relaxed/simple; bh=dwNUmlxcqa+1GX66MgxUDlnEQ+lIyB0CeInZdZx1Ebc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=E/HOYEh/uQ6E29Ywk0DGKiNbECFaKx8WyvAkymZn5RVR4tdsWYNt001WjSUoj1dUPIR3adOSFwv2pLpjrIhZlRzks1YLilrgzltsshvYgghzIBmMXuYLlk8BxotbnzKkim6Sqqy8Opw76lsgAU/J/6EbCWqKLNxGS7zjSwCmUx8= 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=TQt34JlX; arc=none smtp.client-ip=209.85.216.41 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="TQt34JlX" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-3543b9f60e3so1061174a91.3 for ; Sat, 31 Jan 2026 19:16:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769915789; x=1770520589; 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=aGPWhoujPZMCC5voFQpQuLH7IyYWH0J71f2m4GWhuCE=; b=TQt34JlXm0gJ3jbTUuD5/jkvInSwTLJWZFnCz65fr+zlTpHBEMZpO+iQYhXZEZTVQg 3mDlCT1ZhvovzpkZVGjkVTjJBq5j9jEf/3YY2uhNQN0xkWHuTimRuNt32X0TjUsDGLyW yG6I/pjfk2Fh+rmN/tCp6XfGjwYMRnTz9dUuBRiIetbzdRCWs+KUZmf2yhNxsN4z32xt sDryAUVJpso9p8ioeHj9iYyNoVZnITQXcMQ7XTtmXURzpR3cxbz2ATlSvLWZ2/+l+96r tE6w054Kl/SOyIwlUCOxXzHLdF01OeFU7S6zbpygXMCAEcyx9CiO7bu5YsJ0bsFPyMkr ADig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769915789; x=1770520589; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aGPWhoujPZMCC5voFQpQuLH7IyYWH0J71f2m4GWhuCE=; b=mVquk0sdhpkMXCaogxpAC2Cy1ELBwP9iKgWwhS+eqwnsHPG6Xi/IvPmuT2xXgB8w8Y ayrDdFUtNDE7UGZNA3L25NerY+iwV3msgyjejnOhTZp3FhqDq9/dSO6B8poQWfVEHjea qJWhFr8pg0Lj+jiJuhlbPILx27tTNZZnpkYTgr4I0DCbR8PKx/AyIeNLKtO/TasvHY2P bH1C6OCo2HIjFDISFuJI5wYhAZVOq/IXKl9WnFzZ7Ty73O3/LZ7laKInM8B4e1JykyFK aKe2XPO4xZ/HFipbrSEZMza6KSXPRx1PAqhnwkeh4ClgoiAnLCUeOyO5yw3tL0eoefQt 3GYQ== X-Gm-Message-State: AOJu0Yw+anb2SCx6Fs5ZjYxJC7945QVMYoYJnfSFXiQDl+6ek5nT/Xuc ynJtjAiqY02JaHBrDt1hiPFEMB5ZjK0xIeHKQYy95v1PWd3vEo5GxgOf X-Gm-Gg: AZuq6aK6GFA0BvHeW9JYgQ2okcaVvAEYRRrz7S3wnWlJ9TezOkJP14120m4Bxbyi/77 ECEnV/qHstj+bACFSnLkv7ksWztNCGLDvenoppxDgak0mF10cXWJusy237japGSGUNGlLQjjK4D qaU90ZRHWr/px+D9YpT6YgRwteFSIRdTf55zC+GQbHM0xrJgwb54NTwp4OHVscwXtnuM9yxjsXy SOMloloP6ML3OGLh/Nf2nlOhJLXVaYaDacTHbY5A7SbbEm4rE+rCAyXR5DMbHJSrl24ADjfD1NK XV3+Rxp246HCPwBY3sgfpXbN6z8N0WhnW6QD1rQuXvKbFjMBoC7fEYlzV8aO4hH4sDmEa24VagC JPqyAwTXrG1KYJfGxd2h7tv6uttDws/PL8nHIJdLMkn01O6Feubokf478rHmP6xmgJORaTAw8Is hAT3PmwpfH90J92pQddB989MI5yG/aiTlXL353XMwsvg== X-Received: by 2002:a17:90b:4c0f:b0:340:7b2e:64cc with SMTP id 98e67ed59e1d1-3543b32ae3emr8324057a91.15.1769915789441; Sat, 31 Jan 2026 19:16:29 -0800 (PST) Received: from localhost.localdomain ([113.218.252.120]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b6b2bdsm11810818b3a.30.2026.01.31.19.16.25 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 31 Jan 2026 19:16:29 -0800 (PST) From: chengkaitao 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, shuah@kernel.org, yangfeng@kylinos.cn Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH v2 3/3] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Sun, 1 Feb 2026 11:16:07 +0800 Message-ID: <20260201031607.32940-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260201031607.32940-1-pilgrimtao@gmail.com> References: <20260201031607.32940-1-pilgrimtao@gmail.com> 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" From: Chengkaitao 1. Allow using bpf_kptr_xchg under lock-held context. 2. The rb_node contains a __kptr pointer, eliminating the need to perform the remove-read-readd operation sequence. This patch implements the following workflow: 1. Construct a rbtree with 16 elements. 2. Traverse the rbtree, locate the kptr pointer in the target node, and read the content pointed to by the pointer. 3. Remove all nodes from the rbtree. Signed-off-by: Chengkaitao Signed-off-by: Feng Yang --- .../testing/selftests/bpf/prog_tests/rbtree.c | 6 + .../selftests/bpf/progs/rbtree_search_kptr.c | 164 ++++++++++++++++++ 2 files changed, 170 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/rbtree_search_kptr.c diff --git a/tools/testing/selftests/bpf/prog_tests/rbtree.c b/tools/testin= g/selftests/bpf/prog_tests/rbtree.c index d8f3d7a45fe9..a854fb38e418 100644 --- a/tools/testing/selftests/bpf/prog_tests/rbtree.c +++ b/tools/testing/selftests/bpf/prog_tests/rbtree.c @@ -9,6 +9,7 @@ #include "rbtree_btf_fail__wrong_node_type.skel.h" #include "rbtree_btf_fail__add_wrong_type.skel.h" #include "rbtree_search.skel.h" +#include "rbtree_search_kptr.skel.h" =20 static void test_rbtree_add_nodes(void) { @@ -193,3 +194,8 @@ void test_rbtree_search(void) { RUN_TESTS(rbtree_search); } + +void test_rbtree_search_kptr(void) +{ + RUN_TESTS(rbtree_search_kptr); +} diff --git a/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c b/tools= /testing/selftests/bpf/progs/rbtree_search_kptr.c new file mode 100644 index 000000000000..5b853d6cb5a8 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2026 KylinSoft Corporation. */ + +#include +#include +#include "bpf_misc.h" +#include "bpf_experimental.h" + +#define NR_NODES 16 + +struct node_data { + int data; +}; + +struct tree_node { + struct bpf_rb_node node; + u64 key; + struct node_data __kptr * node_data; +}; + +#define private(name) (SEC(".data." #name) __hidden __aligned(8)) + +private(A) struct bpf_rb_root root __contains(tree_node, node); +private(A) struct bpf_spin_lock lock; + +static bool less(struct bpf_rb_node *a, const struct bpf_rb_node *b) +{ + struct tree_node *node_a, *node_b; + + node_a =3D container_of(a, struct tree_node, node); + node_b =3D container_of(b, struct tree_node, node); + + return node_a->key < node_b->key; +} + +SEC("syscall") +__retval(0) +long rbtree_search_kptr(void *ctx) +{ + struct tree_node *tnode; + struct bpf_rb_node *rb_n; + struct node_data __kptr * node_data; + int lookup_key =3D NR_NODES / 2; + int lookup_data =3D NR_NODES / 2; + int i, data, ret =3D 0; + + for (i =3D 0; i < NR_NODES && can_loop; i++) { + tnode =3D bpf_obj_new(typeof(*tnode)); + if (!tnode) + return __LINE__; + + node_data =3D bpf_obj_new(typeof(*node_data)); + if (!node_data) { + bpf_obj_drop(tnode); + return __LINE__; + } + + tnode->key =3D i; + node_data->data =3D i; + + node_data =3D bpf_kptr_xchg(&tnode->node_data, node_data); + if (node_data) + bpf_obj_drop(node_data); + + bpf_spin_lock(&lock); + bpf_rbtree_add(&root, &tnode->node, less); + bpf_spin_unlock(&lock); + } + + bpf_spin_lock(&lock); + rb_n =3D bpf_rbtree_root(&root); + while (rb_n && can_loop) { + tnode =3D container_of(rb_n, struct tree_node, node); + node_data =3D bpf_kptr_xchg(&tnode->node_data, NULL); + if (!node_data) { + ret =3D __LINE__; + goto fail; + } + + data =3D node_data->data; + node_data =3D bpf_kptr_xchg(&tnode->node_data, node_data); + if (node_data) { + bpf_spin_unlock(&lock); + bpf_obj_drop(node_data); + return __LINE__; + } + + if (lookup_key =3D=3D tnode->key) { + if (data =3D=3D lookup_data) + break; + + ret =3D __LINE__; + goto fail; + } + + if (lookup_key < tnode->key) + rb_n =3D bpf_rbtree_left(&root, rb_n); + else + rb_n =3D bpf_rbtree_right(&root, rb_n); + } + bpf_spin_unlock(&lock); + + rb_n =3D NULL; + while (rb_n && can_loop) { + bpf_spin_lock(&lock); + rb_n =3D bpf_rbtree_first(&root); + if (!rb_n) { + ret =3D __LINE__; + goto fail; + } + + rb_n =3D bpf_rbtree_remove(&root, rb_n); + if (!rb_n) { + ret =3D __LINE__; + goto fail; + } + bpf_spin_unlock(&lock); + + tnode =3D container_of(rb_n, struct tree_node, node); + bpf_obj_drop(tnode->node_data); + bpf_obj_drop(tnode); + } + + return 0; +fail: + bpf_spin_unlock(&lock); + return ret; +} + + +SEC("syscall") +__failure __msg("R1 type=3Dscalar expected=3Dmap_value, ptr_, ptr_") +long non_own_ref_kptr_xchg_no_lock(void *ctx) +{ + struct tree_node *tnode; + struct bpf_rb_node *rb_n; + struct node_data __kptr * node_data; + int data; + + bpf_spin_lock(&lock); + rb_n =3D bpf_rbtree_first(&root); + if (!rb_n) { + bpf_spin_unlock(&lock); + return __LINE__; + } + bpf_spin_unlock(&lock); + + tnode =3D container_of(rb_n, struct tree_node, node); + node_data =3D bpf_kptr_xchg(&tnode->node_data, NULL); + if (!node_data) + return __LINE__; + + data =3D node_data->data; + if (data < 0) + return __LINE__; + + node_data =3D bpf_kptr_xchg(&tnode->node_data, node_data); + if (node_data) + return __LINE__; + + return 0; +} + +char _license[] SEC("license") =3D "GPL"; --=20 2.50.1 (Apple Git-155)