From nobody Sat Feb 7 23:23:23 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (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 5B0F62DFF1D for ; Mon, 2 Feb 2026 05:58:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011921; cv=none; b=UCsC6+K1ISDiXkVz4pQKeD1SygsJRi3QhH8CUOE6r5kHy8PH8GT41X7KuQobS0W22o02J/tc2BF9DRaYvmo65yU6I89vMz2HOmhW4o0rqSk4ondIrhInmD0oPK58a5yFMIfiVKI+b+HxxzggtA8LIOAsaBR94YF18LxVefw0zRg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011921; c=relaxed/simple; bh=uUL3+hIqzzN4FF56+RZlxBho1NEz93n03uZmaBVx188=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TlCEMmqvnozymNGmj360uYTySLR8NfbkdkyeTg0KvI6gqjtzzYov4jSKoUj4UOMXmXWE41vk1VjxNv7qp7IKQI59HrD4Zizuw8LebyLXlmM5plb8g/op6RczBqoLFzArti2HKsRheZpBVIJgTmZQTwR71NqKTHgxiD3Pb7iH7Ls= 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=Zfyqaqaz; arc=none smtp.client-ip=209.85.214.175 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="Zfyqaqaz" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2a09d981507so28758015ad.1 for ; Sun, 01 Feb 2026 21:58:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770011920; x=1770616720; 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=Zfyqaqaz4Mx2MA20CZsGw4ppd1SZgf4inyGhFsQKWnbn2i1y0AHD7oeB8+F0PaBVCu UZb99d0Xy4wCCcd1Iqu6ro4lJnQwEk0p3O89TrjSsDvQYeG8TYIj9AqYO+Z5NCv4WWU1 5B9qTUNfKkGELUm3ZDfAOS2ml4eMTX1HXXcgBQ+q7mV4vTx0OXRp/gX6REPGDYLhkOcX 9Sdn+vaIxi4prkZoH2roAueM8bI1nwldYwfmT2ab3M7QBl28o596dz52bt8F/CLK2A5r Q66OTJtPHyPMnkzrEXo4SeQsbJf55o+sg1hg35uOmMiojavebauwGLS8ETDRWrsiWOlR 9MdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770011920; x=1770616720; 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=JFVkakcLcv2WQU83tijJRH1GI09a/EWPgC4yrSZz3yzzcqZ98mw6vh4y+UJf5GRu6N P20X09s3tb1vrNYZX+TFgklQn3xYakSRRW66d/ehf7eIwq7yLRxztB7HCPdQNHivHLfV vPIqdrLPrQg3Zyhp+Wi2sYhgZJjIlIuR18pz+AwwLZ+dcI9BQcocEoiV2eSnvv+6ntaT +KrRapKZsNNdy37osmFGF4I4iWykyZuUr/p7eoqdb9bosLQcadFO8Kpp94CP8Opgf27x 5zZV4btVsGqjWyj88YZr9YydK/WphO0Pt8W0XiqLy1vtY/7YWk0XSfujqdJz7AJ/WQLA yIgQ== X-Gm-Message-State: AOJu0YyJN3pS5yAUDBnYD4iIXAyhKFLXuWOC9hBkkLFuu+f53xU8DLOP UbVOKOQBwYs79iH8339EpGTPzbzVW3n8TcD8Bsk2YgOOdpMcCH2KGTPp X-Gm-Gg: AZuq6aJPAwTHDrs0Le0xkr9WK4Yv6oq+TTdEas5ylnGRVaQeS9p4pOmWawg46xAWLCJ wm9t/vMO4pqwWwY1C5rpWfjiKUs5IqyTdwAmyr3hOsrX7ktAZUnyC+BgtbAegDcPP+frSsZ+b5q CEQkIfSz/o9p8kEc1qtEQI1DuHSmOWYVeQaPAEdDw3RoaiGJ82DdAdC/NqJ0+4++LuC4Oqp7i4/ zGKcxDNJOR3nTaQ6YXbNE54qCftoNtCYsTPVtTSl9xjzJOitxV4F1rxXd1dSYK4sNVRO8AkzyY4 P2yyk/5clqReCaF3/a74t8D0KTMPZ+ZxBh0goC8tsVgJ8/3TjzNPy5Kh4kq576OJTBmPlTT7H3m ML7vKcCRrN3GPPiTacbG2AtLvzsMNceHnDoGdmZYM3b5Q9EsIB4ApNCuZEBOI2hcGAsaNWV72kp wWrvsLO8/kYz/my/IrtlBgK4Utdc/YTL/sGd6dvZkNKw== X-Received: by 2002:a17:902:e749:b0:2a7:5f26:aaf9 with SMTP id d9443c01a7336-2a8bd4c6f2cmr147962965ad.14.1770011919560; Sun, 01 Feb 2026 21:58:39 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b4173a2sm139121185ad.30.2026.02.01.21.58.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 01 Feb 2026 21:58:39 -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, alexei.starovoitov@gmail.com Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH RESEND v3 1/3] bpf/verifier: allow calling bpf_kptr_xchg while holding a lock Date: Mon, 2 Feb 2026 13:58:16 +0800 Message-ID: <20260202055818.78231-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202055818.78231-1-pilgrimtao@gmail.com> References: <20260202055818.78231-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 23:23:23 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (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 496DC2DFF1D for ; Mon, 2 Feb 2026 05:58:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011928; cv=none; b=OFgYn9hlvSNvngnnHHPxAuZM/DDsLydzbgDouXMWD/oHs3bKAXZ7KhqXi5k4zw0Te1qI+5Ij71j+xuTIhY3xefJguwp8BA2Mp0LeUMk8p6cIYbsygo5BUK8YUCKGprlFef5X8u+hK88vcHWr919qN93cERvdFwULR334K+kW1M4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011928; c=relaxed/simple; bh=sWh4qRJW5wuJPUJ9xDpga/kqSm/hNDUxwTBOVpO7yLY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d6ANh18zrEENvc0zlGAEpy1FeSSB04z3MzoGEWouBO2yuGvTQzreb9OoZOfHOl3ubs2qW/qpPRBk7JoMhsRQPaUmZ/0CSRRR3YJori5w5rXRpuXMwJP+4fF806UWIhlyJOyEPy9WyRphl4I+Trpjqe2WKmWCJxNNXkwzpuK6O6Q= 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=XJDgfcNU; arc=none smtp.client-ip=209.85.214.176 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="XJDgfcNU" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2a8a7269547so38823575ad.0 for ; Sun, 01 Feb 2026 21:58:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770011927; x=1770616727; 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=XJDgfcNU3PKMjQmczVXjyk+N85UEXf+o6htBYWFPlYS691hqn9sK8eUZV1AWL5sJwu l8YUeahfnHxylM/mn/Kbbr992lBfHDFbksYfP1WAMDyhy0I4busrxJB03iAqYk/hYWu8 JGdBx1IHhpXotF/qcp5Q+amVA0vQ/zVoSF2iZjryZ4aZ2ZM2W1qPDDblQlZP1lGa4W4T 44nSjryfOvn0pXdqg5pXf7mLl3l2Qmx5V4IyUQhBo6G51D2yZQAMuxlkly+XfF5VKZ0V Z5DgAnBbLpDhd38U7fLvBcv6VZLgFQcuSrcmunWABHlLC86MTumV/zIfsj9K0gRxKnur salQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770011927; x=1770616727; 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=ifQkZs9udEEQxWuLqngSsAaP1kHj5tSRVOxlu+PwUMD2KsFKFkVP4MYXkEqzel4GhU Q6jfIuMVzqZarbS6H2tWD1e5nDU8dbYl+Mc9ZjqhZ8F7FRcAQtim/+JahNHkI/nrZbwC rBs2gPqSTvfUNxnyJCy3AufCA4ITPAHdTdrtXaBXfQTCoV0plB7TXJnwJx+LjZXcpA1S 4wFkJl9kSXQ01kzWjcA8v0PLbzeNpei4ytj7N2Dm2cfOxhoOtsa/9iQYee3QLI/lvL7V TzNEn7o/1G1ayIB635xZFgF0lj9vioESZPp5oPgpw4me7G64G4SlZo8bPdR0D5SH/ZtX +B1g== X-Gm-Message-State: AOJu0YwPMm4LZFMUAZfs4YgvzGWxJgGNEtqPJOrPxzlFdALc0P81f272 +FKlBnuFQS7VJGNfJ5x13qZ4oZuMMCdE9qLHHAyiot9N2No3XMDJqM03 X-Gm-Gg: AZuq6aKgGvg7MT3kriubUdAy+wYdg7RYrpECAFwICgqpco1eZ3VWseuV1ZO+VwJQJtx jnKuYPhabcdiwKdwkDLc2PmSf9YrZIyZDYoUGFKt6L6QwtRvR2cMt4Q894HmoxQUxiaP21Fg70V nM6t46lGjH8dHJSr0KiLIU8uJVaDsNWFPL9UY82hkOleWIMErDPXrXMeggStpQv56PAWLEXoZl9 DowoYu71dWMUhr0f6ZuH0MvXlgcwVNLLf1hENC4xpU1bISTgSrX/EMbTBSR1FoQxSTehKi2AmwD OMhEyUZgyV/8LqsPy43mlh9DPYKyBOvC2X229bq4ouwgmIKn7b5Us2KnD+kgMJF44o6NAXXc8Ah KroFta6torF65WrStOMF1LW1aHC2KrHbWRGNP4uYYA0UGzD66D/3rKWvcFDi74cUVLXv2g01URY KF7cBQ1PaTtRKWkbv67xpwqhjZai+wt/LoqK/rqpwcvg== X-Received: by 2002:a17:902:f544:b0:2a7:fe78:a344 with SMTP id d9443c01a7336-2a8d959c5a1mr111982815ad.6.1770011926631; Sun, 01 Feb 2026 21:58:46 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b4173a2sm139121185ad.30.2026.02.01.21.58.39 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 01 Feb 2026 21:58:46 -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, alexei.starovoitov@gmail.com Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH RESEND v3 2/3] bpf/verifier: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Mon, 2 Feb 2026 13:58:17 +0800 Message-ID: <20260202055818.78231-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202055818.78231-1-pilgrimtao@gmail.com> References: <20260202055818.78231-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 23:23:23 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 C6E592E3AEA for ; Mon, 2 Feb 2026 05:58:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011936; cv=none; b=O8awTHXG5EfUUfUZfPBhEEB99ZJ9LNMLVZ2t9C9XSCouiFM9MyA92b2BhTYQoStQ062MlAYLw3CQzx7vT1ILhpZM/RipThcsyLTjWn5BWTrXCcMGhbSsf6LM2ImOdpouvbZFwzYozkh1GYVnWGVMNi5+AyPM2vBF1mF0DoOQFWg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770011936; c=relaxed/simple; bh=WqMh59Jh7O6oTHdQ7P3uwRCuoF1pABsvr7CUqtI/TbU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FB/0Sk10zqXSFcnecNcTmFKWZIJqVZPDh+xRDwmZOTds5/4bJDMq8dlkc5wNtSWAa0oJtqZQHw1f1oF9kKWniapSROhs481hxQNHvYSaHqRzKyZ/oBp9boimSqdoZqpRevnsAPXucRIP6AaMXeYgOJ7OwME+mV0Lj0eTc7MjyP0= 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=Mf0cvh5j; arc=none smtp.client-ip=209.85.214.182 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="Mf0cvh5j" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2a79ded11a2so27222565ad.3 for ; Sun, 01 Feb 2026 21:58:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770011934; x=1770616734; 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=0IVHOGSx4NXgsONy8xwysVIqdktjCEZu5P7F2LVYkzA=; b=Mf0cvh5jL+vOQAU6nIfyr/yzyDHgRpzs6NS8q4GgCTkRykWsw2HCwh8GuK+adUi6kd PwuMvAt7WhTplOTsPdZJTaQ1/+6H7RO/tqAAEQ7mJpNB7dMwyQtGLDZTjDyI3VO+oxuE Qz9Z6EWvQ5oY/yRaiJhDHUYFBI04JtQN14j478PPr9evGeu44b39AlnBLd97Bu/MWtwM t0oXpmVFmyztqNVTrwp0F8nzBgnSAFqN7ipZLpRRc9uPTVvgBWY8O+r5UT4BVlcnhL86 kK8TuqZElbXTwnOUjv5WHJavztuiIf1uu0zH/dQJt9jDPb1jWauVaQyuoHJWzPn2/P6v IJ3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770011934; x=1770616734; 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=0IVHOGSx4NXgsONy8xwysVIqdktjCEZu5P7F2LVYkzA=; b=lo1gkvPoTyV0SXab4Xihm/VW6IagVPXRrFBhwS4DFqR2YG5b4K1CvQAJdXNEIoQR3N g44c+b3Xzm7HowQsjkIw3PtzPLhO1V4y7L979kN7dXcVQqLvNZJ8OtJJC+02LFmktyN3 MAa4vrLh2f6Cj5ZoxZ5tbMw6KhNJM7EsY97cv/IeGUQM36zoHrNlzamBj5az5dx327GG FLNWQTNWy82YSqMpW0HX50xbRLueUETDMvt88jq3NBBEO1MyriSy4N6hbJdl7tF+PVYC JCyA+REv/7Iecm6R/dO5Poc299rcDs+d9ZMRz0+z/eY6k6xATgdc9i/5fsrIFvsD46wS a9Pw== X-Gm-Message-State: AOJu0Yy72rw3LaS54r7fPN0sAV7oxvu8X8v7iNuQGqrRAG4xUklrZZR8 CKF6Cka5SnCF1WW9z0NxIQRPUGKM0fqWiVyIUDvKEycjyRaekaLU97sK X-Gm-Gg: AZuq6aITBL2xiWGXdNznCll4o2jN6rVbQwQzY7a0j77uL1RbKOobP6O4PyXR2nF8Jg2 Zmt5idQ0akvRPDknTIVNxMqPL2rHk96pFQ9JcNtVVa9aDr7X/Pga31TAJY2ToiDynn5l1j9/UlT rjcIzHt2iJka438+Cmv0qMVha3XR1mWZAT77AtRW0bVixMh7f/tLB4IA7BY2HssKzkvFPGoU6lN 7h3Kjt0Vi8wO3Ts24IefrFVXbpGIVBNNLyxQODEFR3AMqG2aMVX2upL49Ljo97Z581VioEDJ1wE CWFjK7diryflrUDlxOzoLdloi8Bvm1eXhHwKA8B8D43xo3FJmlESGyytYLJIQimC8dFAdmVrW+X ZljDHVx1HGS8OWs2/0hdEGtfGak4MqMs+JEh5gCokz4K0QB9dnQgnhBgIv79c+2OA8wrUCkhzCC UVVuu+1LmwUdZSxyKTsbBcZ5sSUHgG3hotOrGpHpTgWQ9ZcJA+ulUl X-Received: by 2002:a17:903:24e:b0:297:f0a8:e84c with SMTP id d9443c01a7336-2a8d993fa57mr109015545ad.52.1770011933936; Sun, 01 Feb 2026 21:58:53 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b4173a2sm139121185ad.30.2026.02.01.21.58.47 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 01 Feb 2026 21:58:53 -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, alexei.starovoitov@gmail.com Cc: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, Chengkaitao Subject: [PATCH RESEND v3 3/3] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Mon, 2 Feb 2026 13:58:18 +0800 Message-ID: <20260202055818.78231-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202055818.78231-1-pilgrimtao@gmail.com> References: <20260202055818.78231-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 while holding a lock. 2. When the rb_node contains a __kptr pointer, we do not need to perform a remove-read-add operation. 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 + tools/testing/selftests/bpf/progs/bpf_misc.h | 4 + .../selftests/bpf/progs/rbtree_search_kptr.c | 164 ++++++++++++++++++ 3 files changed, 174 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/bpf_misc.h b/tools/testing/s= elftests/bpf/progs/bpf_misc.h index c9bfbe1bafc1..0904fe14ad1d 100644 --- a/tools/testing/selftests/bpf/progs/bpf_misc.h +++ b/tools/testing/selftests/bpf/progs/bpf_misc.h @@ -188,6 +188,10 @@ #define POINTER_VALUE 0xbadcafe #define TEST_DATA_LEN 64 =20 +#ifndef __aligned +#define __aligned(x) __attribute__((aligned(x))) +#endif + #ifndef __used #define __used __attribute__((used)) #endif 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..1345c7f441c1 --- /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)