From nobody Sat Feb 7 09:42:37 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.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 D12702F39DD for ; Tue, 3 Feb 2026 02:27:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085659; cv=none; b=NZakoJEyT/TErACzyInIyyA645Nyf0p/3uvWwN0c1G+FzLAOLpZ55XXcUcOkUE4xG3u/Icssflfq/HLFBk/3NaB49YsuiKZlKjlOC4eQHQ8yqcrABzpRt7gbxenemyEZSiz/B0+SyvsRoMXC4gLL1oX45zz3d1ELwTEjxdIWMaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085659; c=relaxed/simple; bh=kSmjWLmcefmycBNqZaCB5fBXIFk5C4u57kzOKBBeOtc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hIBiKOpIuB97z1EHinyZFD2DBzluUqhpFHN6JAwnciS/etMZUX6+xR0EoHz3d83s42WqgHyjXfeTAnaY2o2tV52/nPaUbCJF2GuSBN0r7KM+ph8eP2qEXx/JPpEdf50IiYLmZC/4ECyt/d7ZlVTM5g8frsV3kmA0u0EQrQiLm6Y= 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=PuIFP+8w; arc=none smtp.client-ip=209.85.210.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="PuIFP+8w" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-82318702afbso4307573b3a.1 for ; Mon, 02 Feb 2026 18:27:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770085657; x=1770690457; 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=Bu1IOx9397kcg+x+veWwtPTpaDzd2JZvwlujnmQyLjg=; b=PuIFP+8wE0ggenSH5zzJ8M1OLbPGTwdT5poamgzfWgQDWkD4HNAFxZgKLI94pjY70i lE4nk36w9SLpfja7FeDMKoHF/zMXCeZLMjbQ7XyiYkVHRuf3LMyirNs+sUUQTdQLHIdx DYcuGEsnO1680jUj9t+zXSUTmfM/8QO4xc38s4PxxjdcZ+gOIG6AFkTdAo9zvhp308Oa lcEq3TvW+NmBT/LQ/iEpLfsuIDUY4/Yxey112ji2PjQIvtiISy/h8H/fYjh8mkCOJDVu Gd+kmCeQe0IMX2x2N5dAwTPNScYZItimmEJYb7fYAM9YCCp5LW02RCjtyzwe3A9dQ3Et ldmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770085657; x=1770690457; 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=Bu1IOx9397kcg+x+veWwtPTpaDzd2JZvwlujnmQyLjg=; b=MfWH7YoHfiRe4wRxxtyZNLJFMmrfv158lZWw2bAytFVdPUx2mLEJuVDCMTVcL4Sbdy FHrlWewshORWJYBt5oUJdZ03qryxwdtJzcQSUDXxswNYVV2nr2z3+uFT3CKV3ZuNdb9R BWtov6FHk7Nrnu8RIP6Nc2hoEqvFFye9Ag5uoEYHmUooQNMAxDX4eH71SaPiDBwHtxzz N6nJ3lzO69OnG1j9Lf7azGoiZMUcE1VfgEJ9lvwRNoe0exCnEtzU84pSrHnzEd4r0vl/ 4juj68pGnufGAnK1lRaCsMBpzPjVz1fay3GZvXr02qdB+oGEPXJpduJjtSyka3WEMmRY Ju8Q== X-Gm-Message-State: AOJu0Yz+GYe3kahTzHouZF8rRsSGTAexgt+p9fSOSThtv7qeeQl++TDB lmCdARvL4tvGH13gQT87hI4NMQng1qCb23DTuqZKugmmJlSj2oi9uBt1 X-Gm-Gg: AZuq6aIgKYJ3a4h2qGKHmR+8KwXXz+kBAld1pk9uYpNRav92Vt+a+lO/4KUqU58Zdwm kkmF7yC2joweWbJjyS2y9KWVGPl/+L3ALczHly2ChENTSGQKg/oRq07WM2+3OpMBiY96/YibGV5 1Kx3/jDs+2t+tQjA1vCqg5no8aO2/TqfRUAARdGwhSbXw0+lLS+vm4UifHPhxiTmn1NBCCZyzlR HxnpfZCTdI6NEXU9fNs+2XoFTM0CdhGrbzQiSK3HySc1Y/cfhk7Kjqh2yV4kMGWUZA7/NPBPVTs huMG808b0jxNEngRw9ibptic/3bswIkyc76v6DGhr98q4cMlfahggMHn3dASTUuY/VzbC/MgGwo iH7baHZUxSTUytZgwAJEYiTiTwJGYuPwkj9ekwa2+1hqxOGY95evemznNIaTP7w1R1QmJQkSmOb Tr/KDQWci7l4VTIU7hoYS+jYGCWcSYGDxmrQzWH1yRwrtllOWY3Clm X-Received: by 2002:a05:6a00:130f:b0:81f:3e3e:c1fd with SMTP id d2e1a72fcca58-823ab63fe4emr11969495b3a.5.1770085657235; Mon, 02 Feb 2026 18:27:37 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b58f38sm17803073b3a.24.2026.02.02.18.27.31 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 18:27:36 -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 Com Subject: [PATCH v5 1/3] bpf/verifier: allow calling bpf_kptr_xchg while holding a lock Date: Tue, 3 Feb 2026 10:27:10 +0800 Message-ID: <20260203022712.99347-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260203022712.99347-1-pilgrimtao@gmail.com> References: <20260203022712.99347-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 Com 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 Com --- 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 09:42:37 2026 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.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 1602F29ACDB for ; Tue, 3 Feb 2026 02:27:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085667; cv=none; b=C0Ue1OeCVC5Yib70HYyjeb7Gk2ubSDFtCo/AR3ang/UhLkrXkl1BxS4gQvOFfCltmUwNPWiJaV06ky0Qsd2bTTZMUdRxQ7Sd+jNAFB0TmDh5ibycjAFFJZJ55pnA00GJIA/OZ5paa6OvxmXz+/mXt6Mvk0swOkyxONUcBTqKL8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085667; c=relaxed/simple; bh=iDp5mMQgomUSRM/dl6unR+hbY+tl/eiQXHNaSYMScqE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FdXYcBYLGTkV4GnXPI+MEXPwGhdWo3wjx8FPuKIPrIoovWYuV6JJ/un923uj00RrGsvSJ+YFR7/7xvxarNVMtsi+oi6tclhWhDDIfnkldxKs6EKRt6JwhX3jsPkX/NP3fHI/nHqRg6pn31Ya3NvitbBf4P66aJSnUJV6+49xz+c= 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=AsQEScCG; arc=none smtp.client-ip=209.85.210.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="AsQEScCG" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-8231061d234so4321037b3a.1 for ; Mon, 02 Feb 2026 18:27:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770085664; x=1770690464; 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=UlSRLcIcWpZcJLzhBXNRpZvhO9QHJ8h5Vtb0I9fjCFA=; b=AsQEScCGz7dVyq6v6YvPhz8lXT35fZ/6g2l1/gVB+qLERMh884EDlP9YfhWqrbTyJV 5N7zL1TRuh8JI9VqBCk8W7TqZVfdSKpVO/YAdEmgS4NxDg/bR9McyP/Bl+BU9NlBKpQP it/q1WPAGfi4sx7BObReo/zwVMVfbtOLQyz/3eu3ireV/9Akc1UKMjsTAkat800xMpIL iycVV44QgULIYbEppljzQtR3Qhs9RLCxcwmquVEm+KRD8L27F15Ul8w2gNROs1C+CmAu L1kkIwH1y47wQsaI7WbQYgAo/GcVBE81pZHE/FXoeznTVkqnbnbf4AuMvabqlMwg309+ cQ6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770085664; x=1770690464; 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=UlSRLcIcWpZcJLzhBXNRpZvhO9QHJ8h5Vtb0I9fjCFA=; b=mwKgj+Z3dbVtKk0kQmpcSNoFXgvNzMlrPEnpbP8cYiG/vX1OplbXeJCWBOhsNWOfw9 NtTybZwOkdwxgtnt4CniVy3NEzpq1GPdZJJO7LZ34vUKH2cnLPYzIZuYdw9+soWBvXJV U8/n2j61cJQQcYfPf/I4vOuFFQodZLob4nZpk3izNt3kccq0HDMqXoQSwu3So7hxju4E 6zouG9SBcoMfkaQNOB5tbbv9OTgkfQEEzC1cGyfkImNK/Yo0HrroVozPyPcHMsW29ix5 PSVL7mGbN4yN9AE7tJjsa+bP7s5fmldOrIykUGH/uvl53MC5G+hArU9gLZXoiXXdHWw4 jnDQ== X-Gm-Message-State: AOJu0YzDEjNg/yvWFeX3mvjcD0qvF1ZlcRMEhKuTYdJc179rj1YSWW7e aCxaf53bDmNTpeT54iGdUR5TzrDwjD5D/R0+4Z185MrlPLq3rglNGqdP X-Gm-Gg: AZuq6aL4eQ964ufSAxJH4J7cK1/gRRDnz+LvyOs/F1/8wxeoHqUKTORe/iZUhDM9A3C usqXEMDlC+8coIh20mETFuYMtHiuqPbwnfxb4TKd7Y2NQMvMOKJOCnKHQyr7kZqLJFgv7nfvBLn SRTbRsneDZEOY7rRKd3euAtSnK4cHWVuUKNflNG7W2rvpbdvK17pDhGajlFMWuukNyeOXc1a0do Q62E8dw2QKyyM/Tu36qPk0cvmtkOxOuJAdaBeV2Qi2BFkvxXI7MA+3YHrk8ATFQEqmoLVTUznqB vAumaF+9uFYAozs7msvhoFIjAUsffv+JN+8GExjOkHnHMs55pJYarvzd3D/uuenbCdN/9CjyFIg iKadGwdahQi9Iw31CDTxTm1sxvvk0m9ibpsRV0j9TMq++9vOkfkPFJar8faNz3HkhXu53rgyTpo k8zd7ixKAF7nla1XpIyEzBKNvGGDwotNqg5kT4C7hxag== X-Received: by 2002:a05:6a00:4144:b0:81f:3eda:9d65 with SMTP id d2e1a72fcca58-823ab673221mr11716726b3a.18.1770085664078; Mon, 02 Feb 2026 18:27:44 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b58f38sm17803073b3a.24.2026.02.02.18.27.37 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 18:27:43 -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 Com Subject: [PATCH v5 2/3] bpf/verifier: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Tue, 3 Feb 2026 10:27:11 +0800 Message-ID: <20260203022712.99347-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260203022712.99347-1-pilgrimtao@gmail.com> References: <20260203022712.99347-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 Com 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 Com 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 09:42:37 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (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 5E6DD2EFD9E for ; Tue, 3 Feb 2026 02:27:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085672; cv=none; b=k1QdpvXeyWE0+z/8rB9tnUVAqbTspWxTmznAhdnDHD3s4e6qxL3q29gMK2UR6IfU6ZPy8Aed3gt98DgtU+VYXRlJKqyURZ43iFRSSymFYNW2LOqZ6sr4slOkXVP+6KmpANYEPGAZ3IpO+jK3VQ/ik8n8Y2xN43jQp42y3iE31Gw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770085672; c=relaxed/simple; bh=WFtoFxjcdZezrv1gLbNQFX2+Ofa+G5yH4J1QraPFtUk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EEplKENDM7FPKmDgqcE4GpmAOcaI5Uw087NVx65Yrd+WRyOFxPp1HeSsupem7T1PmZhOuzNFO3Uualc2Rcn8Lh/v4423XUqoy6JXJa7RyrUmGFlTR9LGuxcfDAnOhh0T19rbhJd0spmpuK0Ca4GZGZciZFhko+LJ4gUH3BNHp30= 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=GJLnFDcM; arc=none smtp.client-ip=209.85.210.170 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="GJLnFDcM" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-8230f2140beso161483b3a.1 for ; Mon, 02 Feb 2026 18:27:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770085671; x=1770690471; 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=kptoiBAzP0cGm1tfcA1aNJThIBf5tvZh/2gCBKBUxlo=; b=GJLnFDcM/5mCgUrQIhKL62by2MWA/Jw3DNfBk3hRyLk4U8OQGxpl4FPx1rO4af+qf0 dOCIJiJrBTDtXWw2npUL0z+L3D6Xj82LcyL7ROE6jKpiCG6AGPYgm+ZWEhb1gteBXFgl kTeZq+H9lSkQDVRYot6BpwL+9kj3h4ZtirsE5TygtiPgTdz1VI8qll85qUlI+nYXt5i8 qeRskU0e1iPcPq53kc9lthM2iYC/M4+sGYOJ/ovmdgEag/0n+Qs2vbbGCVDAwnjRqyxi SzyJIz6Wzvayek77VAsCYoe5s8tynDE/IDlooDHU+pvj/hy86BKQCapfJtSI4IiVAjrm 8ZYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770085671; x=1770690471; 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=kptoiBAzP0cGm1tfcA1aNJThIBf5tvZh/2gCBKBUxlo=; b=fcdvSoWooUeAyh3VW1T6iSQRnWhpjsg3cBWwfTwuZyKNSeO/IL+S4wdHNVOAu3LAMK dharmU4Lc/lfFrPXvU1OHOL6F8zA8diQxB8a9fty8vhf/ru2g3B55CtIdRIaYKw89Pt5 rY9CqfCxbNh5NCJ1a2RwmVJjw//UOZnhl2H9Scbn3x2PV/WF80lYibb5yapFhxX/3uHJ gbFV9KQuE0gK/tUmVc4IzHuUz7cYaQ/mLHdmpRRzXzVSaF0+xQj3nf/DO6JMZww4+8K3 Q/WPH82cY/0mBfjX8HPKnv3BNfPkKoTAtEc2p/uVxdtYMUFML2htnhr2qQpfZx4Ls5xe lltw== X-Gm-Message-State: AOJu0YxEtV2ShAKFhM/81v+QXPdsxfs6c5Jgmh6frB4mVWmSr75lZYcQ hB1ldgJvc0erfzjyeJvVuXF2eECSCn+lHr8UKJU08zSOOsvjmQZQQGg4 X-Gm-Gg: AZuq6aJQ5XmxTRrWP3HoWDn9McdQJg9MGLU5vwwtoo8QKoDw1Os8JDBaqJgm952ITsE kho+OVn9+wUEQpcLEPUYJMbGC9BlN6vJvgVTvMd9bI4ULGJ0Ai27oxKWg1UuYkrUjHamroNY9j2 xN3cPoJ9GrDZjaEYAZGelDNuM+P1Ih0ZRnIDIu5SIRuR5lHRp7MapUCOW2zpw2o7VtPlYotY7K5 0RJms2AxpDu69VAFY9wqNc61yWNbYOB8xmn5cMOtrtXnxAR2ib8P39hTB0R2WHlgAcMl16sWUkk K8/sWFSTnlwbt10pKJJ7tR53drM7jmdELMJ95BtvaB8QttNxsi2sp3AeDYdeEab6944VDlHIf6x XEUOCXmh/N6HXh4CULuNOqAZEgIWeGYlh0kqGaMqbnFqTJUBsdV9wagIfm2jeblZP3pfybPXcQa ycvs9eO5pIG00gdOwzHn1XMrSdiMZIJ2lZG3KM+treRg== X-Received: by 2002:a05:6a00:4395:b0:81d:e9b1:b6d6 with SMTP id d2e1a72fcca58-824043185c8mr1329098b3a.28.1770085670642; Mon, 02 Feb 2026 18:27:50 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82379b58f38sm17803073b3a.24.2026.02.02.18.27.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 18:27:50 -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 Com Subject: [PATCH v5 3/3] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Tue, 3 Feb 2026 10:27:12 +0800 Message-ID: <20260203022712.99347-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260203022712.99347-1-pilgrimtao@gmail.com> References: <20260203022712.99347-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 Com 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 Com 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 | 167 ++++++++++++++++++ 3 files changed, 177 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..069fc64b0167 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c @@ -0,0 +1,167 @@ +// 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); + + while (can_loop) { + bpf_spin_lock(&lock); + rb_n =3D bpf_rbtree_first(&root); + if (!rb_n) { + bpf_spin_unlock(&lock); + return 0; + } + + 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); + + node_data =3D bpf_kptr_xchg(&tnode->node_data, NULL); + if (node_data) + bpf_obj_drop(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)