From nobody Sun Feb 8 10:49:59 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 DBAF01E260C for ; Sun, 8 Feb 2026 02:49:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518953; cv=none; b=BR20z5noTQ2IV4su6SDbmr5JwPHP65yH9Yc6EqCgZSF2nr/pSFpPf/ll0PvkPW6iZ0xcr6IfSxPTA8LCHIr0D1ZzYWh2a3eXmZLcDdU1SeqP7XE7TX0iXLJuJa/vFvUA7/7w9OBo4ewsJU7BtYsKLtT8ixkWH4of5H16+OTXQE0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518953; c=relaxed/simple; bh=dZ8/xKkTAFkHi86Z6ZuDxvGdLye8g4djv43rb0NZrDs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BSivEIc/wihi1FYRj6GodZPI5ygTrVeVfLrWN62/KgWFIMa99z8WZmHjaAcArX2kELEwLx6WYCLinLSsGQYysQfCVTbSyelp16b1GcVh2HvbutcHAfCuIqSj7hex9K/iHTYYCfFBjkwFceR4GmcskFGa+TkQEtC0IshR6qUUgZc= 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=NBIk1urY; arc=none smtp.client-ip=209.85.214.177 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="NBIk1urY" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2a962230847so8945085ad.3 for ; Sat, 07 Feb 2026 18:49:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770518952; x=1771123752; 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=XUvK02mPR1NAypKry79/XuiDmQeUURl3TvGI0OGIX0Y=; b=NBIk1urYaOJ0Lssvt3oF2j+IRAm/+RCTyUujXkbslhQ7FMxSwbKv87C7VKVqdy8fwb 43Mw9NQ2yHC5ntlMX+7u/tSlEejPP2keejSoaO3BCKTdQfAPN6SThepVHyIr091c90/C 6Q0kgvLEnvbY0pagLvVHbV9f5adXT8X5LT8ieTzXVDTILLh98v7EfKy+/oE4dNGqB0X9 AtEqGA5AZyItAGbd719ZtctnPiniGqUEQ7MIPGLkKX3B56Dmt+AUSq1SGbuunnRm+zIi 9rXGTiiCreQ0OwhA1KZvKIQaAK9h/x0907d6E3ndOpGSLSVtOGchsH90HmvOz+incc33 88Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770518952; x=1771123752; 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=XUvK02mPR1NAypKry79/XuiDmQeUURl3TvGI0OGIX0Y=; b=ZmpnJHo9GLPT4VtFB+0MxnOufe4qu5wWB61iC0pS1WuiIGzDDMMqIOTHFd1MxipWTu wy84q/1Pe5iSryeLoazi33S3EMZ+lGCjBCCrS+xnt+yoT62z6Fi844EHzFC9J4Q8dT02 NicBWlLYmew1sj4BPlNHKZc6VjmJtQ+sbmIqmhCGqHyXuzt0s0LUqyGv51oefFtaUDT3 3xkGnfWC81Iwqv137+QvpSbAUxxdCVbWrOQAueXbTmhaYd5DAHMaV+S/y/CJbuwrhmvZ U4TiZ6o6j32DFxwGothIh/dp7lso2RIaspYW8cTkl6EZdaWhetrO5SHKjLRIHm1VKxas 19QA== X-Gm-Message-State: AOJu0YyHIi02jcVODCgSJCUNDwHci397nlRzRbAhi17zhZCg5COCoMdv M9ZmT4aDwM89XcMtfpBzb47lkRwDNtLTpT5viNjvUILvtIvoeOG+hbjK X-Gm-Gg: AZuq6aLhz0QY+hytb450XOxColwGol1oEbknaBsq4Ar/n436EUpFHCvimYCwKtYjKLi RqdjeZSFzpRbZLow78bxQnOTo/jS8RwgdZr3FFjw9R6vkjk7ssxaoyawpHP2iTZNVa2dWVaOvI2 bVvKrGuJ1ECbP6YvOveVHGMHQxfYErfQMB6yGcUN2MIWoa0ipQR/+Yc5GPZoGTRWhinIY6GN5Kh yZ2hnKAOnjw2jOe3SJXim9qV9tLTLIxRXURmgw4OVjwHxF/EhLB5Mc+bQGNTmq40cyOL5UNhuo0 eEvkEtXZBiKbgiPst1Eu303Nb/xWwA2DUP+RA7UHES7k4/bF25NOVmxsBPU7Z1xXGgFjYwfLBph dv3JTz9+7IC3IU7jOo+i4qmN7wj1rGEiXRqgf5n1zjrTBGgewzwSRxrmL6WUaaA3rU1NOOG/8cX RGxXGCFkSTc8FRc2dqg+PRy/2lci9HEEsBRyt3QSXb X-Received: by 2002:a17:902:e5c3:b0:2aa:daf9:697e with SMTP id d9443c01a7336-2aadaf9706bmr12330795ad.48.1770518952131; Sat, 07 Feb 2026 18:49:12 -0800 (PST) Received: from localhost.localdomain ([113.218.252.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a9521b9f5esm67194715ad.51.2026.02.07.18.49.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 07 Feb 2026 18:49:11 -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, Kaitao Cheng Subject: [PATCH v6 1/5] bpf/verifier: allow calling bpf_kptr_xchg while holding a lock Date: Sun, 8 Feb 2026 10:48:42 +0800 Message-ID: <20260208024846.18653-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260208024846.18653-1-pilgrimtao@gmail.com> References: <20260208024846.18653-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: Kaitao Cheng 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: Kaitao Cheng --- 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 Sun Feb 8 10:49:59 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.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 DB1D32848BA for ; Sun, 8 Feb 2026 02:49:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518964; cv=none; b=Bqjag5bS+5W1xuFuEaxyia+PUSj9Fh4YK66q1OgHelYfjjL6sMjQEuSKkMGQvueEeT6sz71tro/Bm20bkIEbL79Kcca+7A4oIxFS/6hdkk9RHK4uuSYvJ9+lHULGOxAooJKwJG+l5ueFYm77P3Ycy4ykYSSr1EDVD/YvmXCh1LM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518964; c=relaxed/simple; bh=/foDnsw9txtdA8j295ZjAzzfzsK+5/oJh72tn7OOjPA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HpCrW5lxp46GPrO9YImbUN9VFEeVlEXXCSsvChvg6ksYyWGiBytXNVv2rcMY1RNiAtKqG4TvhD8qyb1S9kF/EwDfby08pjd/dHWChnq+byut71vExJSsrcMBO32iWMgH1r/KRM+OvF004I9piikwQlrq8t/AZRAx40yDj1LFE5M= 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=HW8alwmX; arc=none smtp.client-ip=209.85.214.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="HW8alwmX" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2aad1dc8856so3232495ad.1 for ; Sat, 07 Feb 2026 18:49:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770518963; x=1771123763; 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=OQ8kSHh93BFAAIINgkYl0/hpSL7dAAj2kQue7tV1qds=; b=HW8alwmXSd4s7gwBCEf4wYuu0QL2ntgiDE0FfIDFh7ZhbOECo9FH7fsVR2u8a+cu+b wtS55Yg57debJ5S5zDqiSO1hFeMuTSaHnl19pXIcc497Isruq9oIebZADEeEercVqplj t0FYKu7QbnROKJK6boLa5IuBxgk4G9ZKqyim7DaIVEVIx8Q/wim+9jWj4D1NljRiOhPs QjfZ0dP/ycKvysllyoIUA4MA464fL9a1YqLOqOtFBqJ/VIEq9W0Yd2HQrGHWR7UxbC9T uRHX9BQ4PBO0K1EkpsM+6ayy2irNmOpBKIG39nL06lgwxS27fTjhjDH9PRbcB6U1BkkO Nz6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770518963; x=1771123763; 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=OQ8kSHh93BFAAIINgkYl0/hpSL7dAAj2kQue7tV1qds=; b=B46LL0tJJ3nsksKag07EMP0AZ1iRFniIiccxi1OIUe4r95opgtagtV5PqFGAcNiB6A yy2b8LBhc6r8wN+6KLJLAbLU8QQv+ivLNYEt4tyTcuVVIDwHfdzglTMHsfSMW1gVA+e9 M4yK+f9jieNedgryaTjXFKV6Isk81rQ8ew8x4E9TGJvpHRcD/YNbeTiZCsE8gFP7k01h h9nWVs+HsJiQXQ6blGwVxmZktrDQOTMyBk33OVTAFDYR00nIg2WBISEMWDVOZAcUZVNN 340o45CRMSbeVB3qiBA9dNxMklSzh8gbamxZ8c6KIAFw1UIAQkSXT4q4VwX85bAgTXA2 G+Vg== X-Gm-Message-State: AOJu0Ywsh/UcPEZovoBPWOMSX8rfYjlUgj91lob2hmexGDccHc/pVv40 eHhge4g1qEbX020eFjTowDRtcvLop7hJAiavBOUJbUFT1qHfvQnz9sr1 X-Gm-Gg: AZuq6aJdHT0CkNL+OqxM68hL5ZlXC2Zhptlk94HluilL5O6GsBb7bdfvGTyaSB97rsq +bQ2GAK83J65FfVKTGmwDuetjmxeeHiDoImLOr5cN9rqB79ajutF9AK24tbvOXmNURT8xEshThQ 69XJHpLpsrlG5RNXtdPKGxR1G7/1CR35RzIKRToPEFi9Ac9unRKlttteWOWMFSNqtjuu4PzFS+K WEwvo/9O5DdD4NhazP3ys8sBl6ki5TduLlcQKZnG9T+wClBNgl+hhdrYbeL/yM3MxrCvrrsYjtl KnHdJXYsLwZV+zJToYxgtA8gfiS1+/IzCY85h3TU0HCKxbJlBPYX1rCxSFeagsAoAOzmyfJJNR2 8vUnhakHXhHtZnPC4HlLn0z3t8bk0zFTmSURRYCK064vi/R7uBxuz7NvNWMkrqnMsFBAO/b//iF oKKI/LeeO10PWKMNStAQu6sHxGg15GkzR1QiQPFLIs X-Received: by 2002:a17:903:2b0c:b0:2a0:c1e4:e25 with SMTP id d9443c01a7336-2a95194449fmr73990145ad.54.1770518963312; Sat, 07 Feb 2026 18:49:23 -0800 (PST) Received: from localhost.localdomain ([113.218.252.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a9521b9f5esm67194715ad.51.2026.02.07.18.49.12 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 07 Feb 2026 18:49:23 -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, Kaitao Cheng Subject: [PATCH v6 2/5] bpf/verifier: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Sun, 8 Feb 2026 10:48:43 +0800 Message-ID: <20260208024846.18653-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260208024846.18653-1-pilgrimtao@gmail.com> References: <20260208024846.18653-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: Kaitao Cheng 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-add sequence. Signed-off-by: Kaitao Cheng 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 Sun Feb 8 10:49:59 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (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 95C9A287263 for ; Sun, 8 Feb 2026 02:49:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518974; cv=none; b=m+LdNQ9TQJu6/1RmKCJeLlanPJhPJ/wd4iF06HQlGHrUMVe1mJ6NuMxftyKgnon72qSQ/Wom7cG9tHU4RpZ2vg0p8bxOAR1VzJDqroAtyK/ks2N/8RFyulQIPZ9JVDPW+OS+36pT7Dqo9Hxjsl0++Aj4JFFgXzy2PKtBgyfDqsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518974; c=relaxed/simple; bh=HyK27wmWpvNXYaxDWFYLGlawGlu1xGVw5LGjGH+YMNc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EFLfM5+Z7eiHDAbZaYbYVpKhm9Zt3gLXoFSZ/s9dG2VmVrS99tTVzSqTTkoeamFxW+wnY07qEZrH1O49JOfPlrrcocoiTcZaf8sJXhXg6yBu/BwBe1Fmzsjnp3ipXcYvH9lxdiqolyBmJU4KNTCoJSmRs/6MM3OfnHgISBdZvxg= 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=hGRjvio8; arc=none smtp.client-ip=209.85.214.169 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="hGRjvio8" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2a9042df9a2so10321285ad.2 for ; Sat, 07 Feb 2026 18:49:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770518974; x=1771123774; 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=dxmSnsFITlfMEb8wiQ5FrXf9I6S3N1VemzQNQpL3mIU=; b=hGRjvio8jOeJ5hu9lMkTJKy6KApSwf1Js+LUGFx9RpiAnXxxxZQ9Krm+432qf0cGEM OlAZp5Y7wHP7Lre0doV0t2bR8Su8qSfiGPW9BuErkkHWRHtlIcbwHKwsuGLKmrNH8rWB 1kk09USWu6lSBo4VOkQr3GAMqmexow6dKG06LMhEcZfWlZRf9EVmiGxkXm7TlIjLA+RB H/9kl5+VxUJptmEee/4HQVSm1ZalVLpqHiTbVieXNIu2PXO21NCukbSB3E2dm6kfR0jI MmP595Un365Y9jHOnzKFvh/ESI8vH+zjZWgInpuYLNP1EjB/k6imk9lKZRSLprz1UJBb uUtA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770518974; x=1771123774; 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=dxmSnsFITlfMEb8wiQ5FrXf9I6S3N1VemzQNQpL3mIU=; b=iF+6VPs4xKRirNVomqgOkpbVK0OsMRimP+IbiDjUQwsSg24DMxZcolZlJBxB8k+jPp dQLa90IADuj/PPC7kYvHXFWOBRVtcMtXTTeFZrYGA3SXEniOWkJaPvt8ROgNn2vI1XAH RMJRmy44sFj1WAq0f91gFqrHreGcCDzt8q1tCEKUt7Z48vWBKa76G9vDvRNZGYIlJ1Uo XlKj/LqLLkETfCM2SbWX9t8aP+u8X2S/rYhDhnV60E5FG9dkh3J52wcQS1HY0xBneRkL qQMg6ri/rxHUyMckhhTMNTABYXEMR9ogTl5NM2W7bZZ9iBpiilhMcSFGxJc8KtFz3aZU lnxA== X-Gm-Message-State: AOJu0Yz8a8Geh0q3r9lAbjgxGGSiNK3Clb0fBGtkobx1NsG7XO+F0TL0 EyjvZ24xv90X9V8/g0ZXsVRfe/TH+DXIrkvelQ6m/yFB6filHZfawNnw X-Gm-Gg: AZuq6aIf0ddruMHuH2WkW045nHF1jAVMbRlkywF+5SRx5qaC+Jb14kLkXLSgAhrt8nW 7s+7oa2nCRcbJxuTd7l/C32e2c67ObOw7tJAWoxstiB9ktHZe/hl+JbcW0XRHc+Qe/kK7RcmSVa RDgYUqfKNe2qjpFtGQVAoLqNF4G13XyAcjpdiNkgeFObokH+CBKecqtaIfXticSltDIYGaNER3c mY9a0fo5tfNnJupo1cRz0twDGk2V0utJpW3dZhVIiPmzQLkSVW3VmpUUexlGvDjoWm6SALcMEIu 8wDdzeIp7IowpBNRHIWC1sH78P9o1zrj/2127I6ueTVdyIYQuF+A2bTELSdsHb95qIrMFaCdZZq xfk826HFnR0zc6KsyLxuQAL08sfKLlRSGQ5TCCIbXIBJeg65ScA1RJsj4lGIlGWSMKIchs9dO00 CjFBkcVx/ZOVOORAMsngm1mJu7pIAY1/jvPlSsstDt X-Received: by 2002:a17:903:2412:b0:2a9:5e25:46f6 with SMTP id d9443c01a7336-2a95e255c83mr57329225ad.17.1770518973927; Sat, 07 Feb 2026 18:49:33 -0800 (PST) Received: from localhost.localdomain ([113.218.252.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a9521b9f5esm67194715ad.51.2026.02.07.18.49.23 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 07 Feb 2026 18:49:33 -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, Kaitao Cheng Subject: [PATCH v6 3/5] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Sun, 8 Feb 2026 10:48:44 +0800 Message-ID: <20260208024846.18653-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260208024846.18653-1-pilgrimtao@gmail.com> References: <20260208024846.18653-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: Kaitao Cheng 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: Kaitao Cheng 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) From nobody Sun Feb 8 10:49:59 2026 Received: from mail-pg1-f169.google.com (mail-pg1-f169.google.com [209.85.215.169]) (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 87821288530 for ; Sun, 8 Feb 2026 02:49:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518984; cv=none; b=euGV0OL1pOouEhaPg/n7vSzO+oosSZVJZCLjxbl7YZnzqFCBEat+pt4qW1MxFaehAtVx+M+whT69ETWLFbkrTk4FFMfDR8liGVdwDBUfLJI58XmgCjLBIjZU8cKqe/J7U7z8W0CUitxHl8Pm1cg3Cmwft2jZfNy49IjI91Jenk8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518984; c=relaxed/simple; bh=4TgoVZ4LlN4Q5YxWLL35dOLSFW+6qRdJJNSbmiAoSSo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sJOM81Is67RkEU2Z7VVvVmzPVLLJu810fjbd5VvAZfuzONMMYY3IBPp95fd/hbI9zoYcsur1SvnffG4ucUx5iksUMcuem9wNFK+lhbdCBErbkh7SC/1hlXmYmS6tIFRlm184/OypDEzSl+WEl6fOwx2fgstSAGUaWK2D0+tAnxU= 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=R+yrrnV1; arc=none smtp.client-ip=209.85.215.169 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="R+yrrnV1" Received: by mail-pg1-f169.google.com with SMTP id 41be03b00d2f7-c6dd5b01e14so664363a12.0 for ; Sat, 07 Feb 2026 18:49:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770518984; x=1771123784; 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=JEwKgEcJoSX88Rslg66p6kDbLyhXBoZdC1+Ki+lttc8=; b=R+yrrnV1x7iOqaaxD8aoxIuTYtUGP4N8hyrpnbpTiUQk4vF2MInckSAl+t97yiLZKr uijHfJqtqR4621yJUVF7dZoHHNNWaBTra9R1erjFobCGwHf72j6rsEQckRkWnnRRIUVg Npft07jXokisX79lYohws3i28jWR5+SJGR9232Q/ha+zIlc/sD3rptZzpr72uc50UfTu ucbJfkk8XxUo+fVIWJEokVZYqACMHtj/hpbvu4PQGiZ6hMM+5mJ0hWBlPQsvW1RbTDO1 +j9ru0x9UaI9cb3EcUo+BecqQpwdPMDofRgUwcOFtQSXy6LGb8K52gmlOvVmrad5TZjV u11A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770518984; x=1771123784; 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=JEwKgEcJoSX88Rslg66p6kDbLyhXBoZdC1+Ki+lttc8=; b=JNWgCPA9ya4hn6dg+AtTRFcWvNqgmHSx2ZpXtV+0DrZzep+lh+BQkmMtxr1PuEhzgc kYFF7I7q0PRmVWiUUED2Nmg/stejiVgjKS3ldHfB8vvIj+OCdR3nG7EAC2Ifbfovm+jm ugz0aKITXYvWja9xJEUKqA+j7r/hAfJwf1i1r31bVRigoshvza+wI22pajGon+qb2Xhv oa8GL2oNtLVl6ofqTfuzHAI1418jyWPC9XheJmc8guoqSUCXYL3B1aVPT3Oy+vr7YkIN +2EwbY9hEZrgLAfSfsQumK/qDLhgZpUAX/DFZ4RihnlEl2WTnwHRcnWKqVNtawzH0KQx eu9w== X-Gm-Message-State: AOJu0Yz5bisGqoX4eXGXymvMuIDvOo6W9jPsQbWKGIV3w1htP3AlupNU 73rD53n0WyyEVVrN8JTjgKSJkGkSh1lluNIDPNBwGQVYfDaLa2ZVO37N X-Gm-Gg: AZuq6aIOxZ43CU0W3tArKw5kfSj5CotU+JPgRpFJYP6cSUC46JZdnurgM5dpZKhd9ab OciIXuc0RjsgkMQuiPXp3Mz057UTPlvMSpwZeGyaaEQKWsi0cyO2+sRGm4/AngZDSb0C2pKbbhv QkZ42cEo7c05b4beW1+hMMhy5faWMksw8ALzA72VrtTEuJWNfZ7BV2RyjGDIAPfcyrdg55ZyHMJ MvOrs19i4H73Eo+kdUx406AFg7D8isSAsvpo/CUSiYRpyzxTQ7ubSmcy48QQKrZQeqpsXOENtGn 4Lv2BaXG2BpqAnzi8xlT8UQDWTB4T912X1BUuaJGRv+MQXWKZwk+t1cZyY/c+TjUwo6SB521rDc RNLN5HNubEZlWHxBjlSDvoSIdkabV8we+mOgpBXXOZN88SOUYWFIknfcklKF/LuO3OAm030XPjB fw26/ngIB9zqztguVqI4gNPqiLwbFRnQ7C2CB0mogntT00Cyom5jA= X-Received: by 2002:a17:902:ea0f:b0:2a9:450b:104 with SMTP id d9443c01a7336-2a951969dedmr65714265ad.55.1770518983811; Sat, 07 Feb 2026 18:49:43 -0800 (PST) Received: from localhost.localdomain ([113.218.252.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a9521b9f5esm67194715ad.51.2026.02.07.18.49.34 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 07 Feb 2026 18:49: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, Kaitao Cheng Subject: [PATCH v6 4/5] bpf/verifier: allow using bpf_kptr_xchg even if the MEM_RCU flag is set Date: Sun, 8 Feb 2026 10:48:45 +0800 Message-ID: <20260208024846.18653-5-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260208024846.18653-1-pilgrimtao@gmail.com> References: <20260208024846.18653-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: Kaitao Cheng For the following scenario: struct tree_node { struct bpf_refcount ref; struct bpf_rb_node node; struct node_data __kptr * node_data; u64 key; }; This means node_data would have the type PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF | MEM_RCU. When traversing an rbtree using bpf_rbtree_left/right, if we need to use bpf_kptr_xchg to read the __kptr pointer, we still need to follow the remove-read-add sequence. This patch allows us to use bpf_kptr_xchg to directly read the __kptr pointer without any prior operations. Signed-off-by: Kaitao Cheng 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 bb3ff4bbb3a2..50cb4956e5bb 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -9261,7 +9261,8 @@ static const struct bpf_reg_types kptr_xchg_dest_type= s =3D { .types =3D { PTR_TO_MAP_VALUE, PTR_TO_BTF_ID | MEM_ALLOC, - PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF + PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF, + PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF | MEM_RCU } }; static const struct bpf_reg_types dynptr_types =3D { @@ -9422,6 +9423,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: + case PTR_TO_BTF_ID | MEM_ALLOC | NON_OWN_REF | MEM_RCU: 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 Sun Feb 8 10:49:59 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 76A0A289811 for ; Sun, 8 Feb 2026 02:49:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518995; cv=none; b=Ct2cQaeIzIYh3v1yG3CM0o7cDFlOFvNI3pgbwjqG0A4+R4tYuMmVnLsLmEpkY0A9ncfsmEvjdrlBLNGJJ03Pz6IrkCmYqhMUMeeTpy2TffrzbQqJqQULLO2xsLc2rDsUe/s2Uvb0Gy9Rb+zo11TDXnD4JCnFuwqcD/KgmvUeZL0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770518995; c=relaxed/simple; bh=bA50R0bu4pcFiczphQwo0OOSupIpSY/EOYDo7M0jk+U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AnJfUYtHVTjwaM5GBSRg/JoxTi7edZSJ5FOYD7ugpu+34wTokvPGn5+8hAKVT8ReCIj/KxjlbKLdODSsrDBJnVdyhy+MVwq2K9/fGzRe1axGDLS1aBfc+qSxG7f9g3wX3Riq5eCNLs0oO3sVrjMUZ7EneJsF7VUU8MR3OAaymsA= 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=B5/S/5Tp; arc=none smtp.client-ip=209.85.214.173 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="B5/S/5Tp" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2aae4816912so309145ad.2 for ; Sat, 07 Feb 2026 18:49:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770518995; x=1771123795; 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=eWhBTVQRjsnIct/t3J+DD3t989mrabDRUagk4xQvzMQ=; b=B5/S/5TpBr4/41WsnOGYvFcKBYAJ2yGoTd0eKYEz1D7ag+vtQ4Evt8crh8WSgMEhyc MzHuRDlciJkKAfpOPqcAEKREsk0Vl8o8Cti0SUL305yfRSnfN0w7+Mnx6xlgkUYwRCNv Ul3OHhlwtbiW0aj3H9uwT7x/RXGEAh0uvBWzsApgeNtY3gqEs0MS4eDI6pFndq+OCV1V hAOQ0xaGROjK7AxcxY8zB/7Aeqv+21ko/ogRNBe7YCS1kuYeMqfvXEHsgXuVFvZrseg2 ruWMZdLQQ2ZRqVLQszev1Fo/dwsz5ozykdtZWgWlp7d3oh36a4XJ2antlL6Nd1kbJ4CW yhMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770518995; x=1771123795; 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=eWhBTVQRjsnIct/t3J+DD3t989mrabDRUagk4xQvzMQ=; b=k3VXbn391dTHbVfb6d6nXZfrj1nVet8mIHjs+6HuinBaEVFO9V2pm5L4BVgSwkT7H5 JlAF14cPpXVLv54q2ToSW9JloOT3y55CN3Z77f9oBu/7akj3miZ0RiXgrUnNBnSR+3Id FxJGbCiNo8KM0UbTYsQXYXDKZRTw1Q31F3c9X1VaVwwHzaFn2K/1N6V+t3BoToGjKhy6 EqHhjVVVoqO27amMmwCFUaFsvfzX69VvjzWFBez9OOaYYbdXtT51P51OItiRoBqmNvpF cZ49cfhO0c8N4o8pyQu5deCpR9jnG0RBpNIMY/nsQTdXezCKxIdRvJzMTe3Fakrs37Rg MN6g== X-Gm-Message-State: AOJu0YzJoaUf6EljbZoGJQ5Sj1K/sTm2UM2RYLsk5lF8VzpFAx1EdZmv 4pDtR3oWzfH6DKJou/qsg9/ofkEKzdMXutQq/lz1BB0xKtd5CyUCHZX1 X-Gm-Gg: AZuq6aLgSuhhxsNJGIT48HNeM1eKvwbRvMzOcQhXJMqkCLMbrRYpr/UEXgNHmv/pRQH ouVkB2uEJb4Nd4NGvvPcAPnxXCU51nG3zr4FZr18mCqT7NrJhJHurc644P1v9MLo1hxlEYmX6+5 wN2H0H6WNDyK19NmdoAhPtkYhJ3yC7C+ZwATiipY7r3mILfmV38BZVZcM0QRVxRylPAQQhzS+Tj efnD14IJrYVSThZT3WdC1Ld0hTaUSRXs+tJq/w7E9oCb2/O2ObfCCM9k/9OwlT/KN87mRYv9ObG 1VMrKhVBBeTVKgJlOj/ibVhqXaKFK+9DPVInSPaB5vwiySMpYYe6w7JEgNpzAZw3STMzr75XrPi 2hd3R8K+U9OYWTIdNGFFnznR/zKa9b+OciSEYqfZL856T72aL92rDfvyzGV36e3BR5InGi9iuxv lj64coEGwQBBP8L05pkRFL7nyujreAVb+mAFUPT6AM X-Received: by 2002:a17:903:8c7:b0:2a9:6414:719c with SMTP id d9443c01a7336-2a964148176mr34608145ad.16.1770518994826; Sat, 07 Feb 2026 18:49:54 -0800 (PST) Received: from localhost.localdomain ([113.218.252.53]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a9521b9f5esm67194715ad.51.2026.02.07.18.49.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 07 Feb 2026 18:49:54 -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, Kaitao Cheng Subject: [PATCH v6 5/5] selftests/bpf: Add test case for rbtree nodes that contain both bpf_refcount and kptr fields. Date: Sun, 8 Feb 2026 10:48:46 +0800 Message-ID: <20260208024846.18653-6-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260208024846.18653-1-pilgrimtao@gmail.com> References: <20260208024846.18653-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: Kaitao Cheng Allow bpf_kptr_xchg to directly operate on pointers marked with NON_OWN_REF | MEM_RCU. In the example demonstrated in this patch, as long as "struct bpf_refcount ref" exists, the __kptr pointer is guaranteed to carry the MEM_RCU flag. The ref member itself does not need to be explicitly used. Signed-off-by: Kaitao Cheng --- .../selftests/bpf/progs/rbtree_search_kptr.c | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c b/tools= /testing/selftests/bpf/progs/rbtree_search_kptr.c index 069fc64b0167..610aae45e2dc 100644 --- a/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c +++ b/tools/testing/selftests/bpf/progs/rbtree_search_kptr.c @@ -18,11 +18,21 @@ struct tree_node { struct node_data __kptr * node_data; }; =20 +struct tree_node_ref { + struct bpf_refcount ref; + struct bpf_rb_node node; + u64 key; + struct node_data __kptr * node_data; +}; + #define private(name) SEC(".data." #name) __hidden __aligned(8) =20 private(A) struct bpf_rb_root root __contains(tree_node, node); private(A) struct bpf_spin_lock lock; =20 +private(B) struct bpf_rb_root root_r __contains(tree_node_ref, node); +private(B) struct bpf_spin_lock lock_r; + static bool less(struct bpf_rb_node *a, const struct bpf_rb_node *b) { struct tree_node *node_a, *node_b; @@ -130,6 +140,119 @@ long rbtree_search_kptr(void *ctx) return ret; } =20 +static bool less_r(struct bpf_rb_node *a, const struct bpf_rb_node *b) +{ + struct tree_node_ref *node_a, *node_b; + + node_a =3D container_of(a, struct tree_node_ref, node); + node_b =3D container_of(b, struct tree_node_ref, node); + + return node_a->key < node_b->key; +} + +SEC("syscall") +__retval(0) +long rbtree_search_kptr_ref(void *ctx) +{ + struct tree_node_ref *tnode_r, *tnode_m; + 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_r =3D bpf_obj_new(typeof(*tnode_r)); + if (!tnode_r) + return __LINE__; + + node_data =3D bpf_obj_new(typeof(*node_data)); + if (!node_data) { + bpf_obj_drop(tnode_r); + return __LINE__; + } + + tnode_r->key =3D i; + node_data->data =3D i; + + node_data =3D bpf_kptr_xchg(&tnode_r->node_data, node_data); + if (node_data) + bpf_obj_drop(node_data); + + /* Unused reference */ + tnode_m =3D bpf_refcount_acquire(tnode_r); + if (!tnode_m) + return __LINE__; + + bpf_spin_lock(&lock_r); + bpf_rbtree_add(&root_r, &tnode_r->node, less_r); + bpf_spin_unlock(&lock_r); + + bpf_obj_drop(tnode_m); + } + + bpf_spin_lock(&lock_r); + rb_n =3D bpf_rbtree_root(&root_r); + while (rb_n && can_loop) { + tnode_r =3D container_of(rb_n, struct tree_node_ref, node); + node_data =3D bpf_kptr_xchg(&tnode_r->node_data, NULL); + if (!node_data) { + ret =3D __LINE__; + goto fail; + } + + data =3D node_data->data; + node_data =3D bpf_kptr_xchg(&tnode_r->node_data, node_data); + if (node_data) { + bpf_spin_unlock(&lock_r); + bpf_obj_drop(node_data); + return __LINE__; + } + + if (lookup_key =3D=3D tnode_r->key) { + if (data =3D=3D lookup_data) + break; + + ret =3D __LINE__; + goto fail; + } + + if (lookup_key < tnode_r->key) + rb_n =3D bpf_rbtree_left(&root_r, rb_n); + else + rb_n =3D bpf_rbtree_right(&root_r, rb_n); + } + bpf_spin_unlock(&lock_r); + + while (can_loop) { + bpf_spin_lock(&lock_r); + rb_n =3D bpf_rbtree_first(&root_r); + if (!rb_n) { + bpf_spin_unlock(&lock_r); + return 0; + } + + rb_n =3D bpf_rbtree_remove(&root_r, rb_n); + if (!rb_n) { + ret =3D __LINE__; + goto fail; + } + bpf_spin_unlock(&lock_r); + + tnode_r =3D container_of(rb_n, struct tree_node_ref, node); + + node_data =3D bpf_kptr_xchg(&tnode_r->node_data, NULL); + if (node_data) + bpf_obj_drop(node_data); + + bpf_obj_drop(tnode_r); + } + + return 0; +fail: + bpf_spin_unlock(&lock_r); + return ret; +} =20 SEC("syscall") __failure __msg("R1 type=3Dscalar expected=3Dmap_value, ptr_, ptr_") --=20 2.50.1 (Apple Git-155)