From nobody Sun Feb 8 01:33:53 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 15F24335555 for ; Mon, 2 Feb 2026 09:01:13 +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=1770022875; cv=none; b=r+1nG5n9Jc+goBj1FeKhVK0Hc0M8ZzUYs5MOBc4edM+bbEkJnZqu8IncNN0i2KcD6VYpKpK/Md/GZ3tD1Rp0OBPOTrAzc4QNNaacleoDgtnkIwPeMM4ANsPKh2DaALo+3bp8bIwjSABtdQ7cR1EL96efhgqyos/GMKfs21EWCfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770022875; c=relaxed/simple; bh=uUL3+hIqzzN4FF56+RZlxBho1NEz93n03uZmaBVx188=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Yh68JVQX5DpE5QH05S5xD/r5soS230rPOAxhD8C/1mU8qic48RO+dKTf3KGgmpsIhOVAQJqA3lDmvz3CHtax2opoR5huMZ0JHKpU6+eJoc6e5NIwLi/UBCWFeDPgb1TBF+VZa70bd1gRiWK6QtSiotEFTlcY+63qX6OcXoFzpL0= 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=RGcnQ+CV; 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="RGcnQ+CV" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2a8ff2ca490so6152345ad.2 for ; Mon, 02 Feb 2026 01:01:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770022873; x=1770627673; 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=RGcnQ+CVutx+QZWU96DSzT7lgWeiAhn+WbSBXYeHLNvrKrHfMphkQCFyU/+bg/AJcd kHB1M8QnrlgPFpYo2vMcYNyJWAHokuaWhlMa53ayWoMORQcDIUQUKmk/46pJIFnARZQw tTlrX8HtW0RbNzkGkvtkmaC0NO88epNkJBzBTRnMI1oVkugN5PCtluzU7WDF1NISHnc6 7pyPxvSYQWjAACp13DUvt6jXbk9x3FniVfHsIRzkuYe++kAxyiNGPajfSkRjLyrpO6Cp 4ysk7R1NpUyERQcD6VDSiJV5z04SQdJebhN9b5+3766rclKAOfcy0tPmmZtIjY/jgj9b qEsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770022873; x=1770627673; 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=nurEgZnoEKYKsKchB96bbNYFyOz3RPNi8WuPFg+DqL91lcAJbESHcX8U/hkR0xIHrO A5Ekjmxulp/bbftLpuYEpPydD3MjWgBaoPck90oStNwxtfol4KD+Pf0wV5UKd6ZNF9vI 7JMCRCLaviF9AyF4MxdvpLkZ57O861Hj95Z+R//vsS8TG8aTSnrPT7viFTeqKxo72jjq LQ3Y+Gx05A2D0hbZOvEbBPTfdnydNOB7Hutb/ChqJZhEzQOpCKUIVc7PlJDTRWf1mSnh JeE1g9l5gOKumHYEz7FLylwFV0Sx1veddyu7o+fbVEDW8EkYDqrQhIto/ny+8ku+eTbp j5Ww== X-Gm-Message-State: AOJu0YzqGo0seb/Md7PJQXDwknV+fIL3foaV9+am17VN4gCFXpNouJMV MRJ1h/IuMJ413DV7M+vZ6OgniYEmlfCISTGImFQqTHnzs2Y6GHGKOpKx X-Gm-Gg: AZuq6aICMpCoQedm1YhwZpe5KPny162orimDvPYf06HgOHQP34uJ1hhy+WzhXZcVFF0 Gdbqk7CvIFWJ8ljacOXT6LjxC0/bQU+ZvkYqXs+xSUbXFCbICsdT+Lhbpxn+zU3WYbJ9K4yB2R0 uOsxymnzjTp3O5orkHajB407mlJLX78nTmkThVJZOs7FWBLmC4Vz7EvKTqiTh2yPysEZYUPrr5b 69cqCCtvGGnutFzYGyhoPeFXg/occmiFMBPwIhNQqBQjpDkLmN5vXojyJyJbNm8cJWz5Rt7NHNq oRj+SSjAW+eqKknNiXFbNW8/7aTZubJSsE2tjNO/9vwfiLhp+HvGktKjhs3qh3XMbjYidIgNPiU Jm5NcAvmnfa8WoRwuq3IY/eWKgwvvFCpHNn9d6uicT7GxFZQkVwlWqb3yJEyuhTKJPzveZsOMN/ pvO5XkISAe8K8nLQ1Gtnomjgi3zo8FRRsk+UE0PX4wnw== X-Received: by 2002:a17:903:2b04:b0:2a7:62d6:d049 with SMTP id d9443c01a7336-2a8d7eb55c4mr94604105ad.8.1770022873338; Mon, 02 Feb 2026 01:01:13 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b414f1esm139167635ad.24.2026.02.02.01.01.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 01:01:12 -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 v4 1/3] bpf/verifier: allow calling bpf_kptr_xchg while holding a lock Date: Mon, 2 Feb 2026 17:00:49 +0800 Message-ID: <20260202090051.87802-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202090051.87802-1-pilgrimtao@gmail.com> References: <20260202090051.87802-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 Sun Feb 8 01:33:53 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.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 291E52F60CC for ; Mon, 2 Feb 2026 09:01:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770022884; cv=none; b=HS6UvhU07z+EWRVvMcuuMwDiIShoerjpFBd0FFMDXRUl+DTxTXXQe+QAUpYIxIZ4QNQaBy2+8yFjvW0IkyHyXCkaNpTcOEv6QvIwAHo4SBOInALxfLD9aOa/QHCGtaePQO3mtyyXBI+ZTpC6imCPHJCkf6yeJ9wZhq3EETLi5Kc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770022884; c=relaxed/simple; bh=sWh4qRJW5wuJPUJ9xDpga/kqSm/hNDUxwTBOVpO7yLY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s9oSFOcpJnLhYvRzjIfpVR3Wl6Rscg8uNGQNG0MvPVyMNthf2EhVQ0w5xbGdQ8lTs3qMzcMqxlk7nb68noXvytk6J9ALXdDNwPCBw7z/VTI71Vxt162zgr+qdXmhzETJU0k1RK7mg/aSvePp1UHTWGVgaQSNBt/rNIr9USSsucY= 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=K5DyN+K/; arc=none smtp.client-ip=209.85.214.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="K5DyN+K/" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2a79998d35aso27595155ad.0 for ; Mon, 02 Feb 2026 01:01:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770022882; x=1770627682; 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=K5DyN+K/ykuG0nMpJdIqx3TXUKG1DU0NSoItf7Lh0wuFTUOnAQY7yfVrD76ZzZg8yc n0A/SwYqISxuNCNMJ1/A5ru+OQUdjWCxrBijUodkr79r9+/4mZnrWmGIs6kJttOrhjM7 71qhhu9z0RR9HExXV3K70oDlZ45sbldnimrPgtHMCEUuB522QresnBeG2kFI4DzTGqji NRm4KsYSQ24sMPIULrTDofKTBzKY3wgFLz9X4kjPaIiFiDScvG3PbwKuaHlMRc4YjUF7 nA2w6tnSrpuX/vXVK2MiXfaRaJJUH42dYIrIu8gCkNpGjTVA2N24s0pHECtVG3btuR0R WIPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770022882; x=1770627682; 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=kjl7UEaM9KAGL43uEoiEtvB+G8X98JHrcXy2RtYlz+QyhT/rLI9Jt2ALuPiprBetvn Cb3TLTrG7aASwbPgZ8RNuLwfaeD0veyT3uwsCWtT0z2ZEllYRqApG6/vRhDw8CgwX/Tq o3KkI+OUrNykxi2stRmlYC6ezdPTZ1jHpzWo9T8xr6lSeOrSnDG2ERZYSWQu4UGtCYU8 1yGLI1ZMPNPi0Mf1sxKq8VQWV5IwCGG5a9STFqpv1E8gMdnWTSPBYLma2PHl2MpWnY7P G/dy8VVm8BEQRI+zF3sxg470douMHgZPfI5HZx4YAaOAyUcjEXUNyT5utgtkCa7zRiZ8 Pxww== X-Gm-Message-State: AOJu0YwKahjVkqVopgvjz4V6a/vdRw7pclLaufCFdx1LmwwUf1hNgPEz +HDbJNXjyZfnFtTM5fmuroxGu170piFbxOpMpTYKjGT/G96twDaAz+W1 X-Gm-Gg: AZuq6aJ0ks38ve4N4JUHqcGM5hd6/BtDrqzow7pvWbjzrktPetGUpw9ud6IFSwC/+ko ioHpH65/ltlSAC2QjGBs5R63t0/bJUL+2cRqoe67vsfY2xKm0I5NURnFcn1X+mkbTtL1HGHoyZf RCpmVzK+Ve2mYCOZUcBF3Y/4JL10zbCOIjYEMMPx+YDlabcQJm/pb83bn/L6OFjzVnBfrcN7DoM tOQhDRzHGGZwDAJzo739Xk7XN8XbJTQGrRhRVeVm/B3eZZ6phV98GrWGhBdlf52C6/VQkJGGOEn ZM8zsyKgJHkrO26ryPXJ/lLPWe2qbR4m8EaugmsbQW3FEyJ3B+KaCFVV05YSBtkRHmh8jhlMrn4 QhmyQoh8Oem1z5imXhOt0aZIgbhLRWI8JeiyvSsr31KIXGNvsZJXnAawWkWnKZaAVPmIHlOExuO Yg2O9UeR+Bbia7ZHOAA/BSrwQiDDYWBfofkMgQrIoYfHKehJfk/bbQ X-Received: by 2002:a17:903:f85:b0:2a7:77ce:d75d with SMTP id d9443c01a7336-2a8d9a7b20emr99363765ad.61.1770022882405; Mon, 02 Feb 2026 01:01:22 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b414f1esm139167635ad.24.2026.02.02.01.01.13 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 01:01:22 -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 v4 2/3] bpf/verifier: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Mon, 2 Feb 2026 17:00:50 +0800 Message-ID: <20260202090051.87802-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202090051.87802-1-pilgrimtao@gmail.com> References: <20260202090051.87802-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 Sun Feb 8 01:33:53 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (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 BF6173502B3 for ; Mon, 2 Feb 2026 09:01:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770022894; cv=none; b=dRgkUGq7HuhVIJgiM/Wj2AiAQkSS5dsUZW/A08bZjvy7yNfrXIXkCrjjq5vWKrBYHfF9X/65riqKwcjs7PxnnzzdH9Ds6O53QwkMJLgGUEQIqYZ6BW4QeKn/0CjP3qwTJ8YKbffCQYOcNdF0692AoXLuzxDVudI4189nbabSfLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770022894; c=relaxed/simple; bh=+gczyR9CP00JLJHZOZfd22Ict0LA0ac5NBdsHkCGEUk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u0eZ8NwDxZ6Q8uH1G0nTdeI9JMNNILCI9FX29zWYxdR2hj1+T+SCWUiIk0yEmhL1VFhzWkUjq6ZhbXPeOHolZgsyOrLsrvh7U7A0IBoYl9mkNGjCO7vZz04zqfkTtQe0bIYExH0YKwS5mT5OlOUX8yqbsHH4bDQKkwuxBtWBzRc= 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=iYS50si6; arc=none smtp.client-ip=209.85.214.172 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="iYS50si6" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2a0d67f1877so27552595ad.2 for ; Mon, 02 Feb 2026 01:01:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770022891; x=1770627691; 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=GyX2GBNUQDzc1Pn+HCEXjUKCgBxSdTOB7LysO+AztGk=; b=iYS50si6Jt8mD0WHF/eMR9dpkCXBNLp3gunQdFSiPjsNjL24bMiL0/GtHd8ioXQTDr jeNbQNrrWxDfru+gf19UeT/+S1QZMLZN+6ac48N+ay56Gi/VX5d3ATTo9ZoMxAyrQnX3 v7jD5Xw9Fm/+uap1gmtXR64dwwM+P66szHZmP7AF8VYzYIRs5CiqwLr5xxTFcxzmIvaD Fv7C+GpCT7BGtTG0HvTL8iQHJPPBIKYW2rY00Mq59KuWz5fg5k5ehaK/YaO9Yvw7+KD9 v1kf8cBRR5tso3ToxAAVngKbaJL+4dEW7Fag2Ehn9ivwns8N1w0t9jFb/MpLRaglwTLD r+dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770022891; x=1770627691; 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=GyX2GBNUQDzc1Pn+HCEXjUKCgBxSdTOB7LysO+AztGk=; b=ghF7Sr8TJl+m0TgeBbYhN1htvex86Pmm9UeSlCLIn7JeQTibEJ6lpI3ZWYTXQnzhM8 nTOIJGfci4KRIetcDtTM/7+Y4l68ZbvWfGRsqMmMZsW+TuulWQuNntHW11rVDolQMDF4 9HlyZDXTq6k/f5Ua7LnFn6PiseiCjhUU7uMKoXkDWCG9M2uwrMD/o+zl4mBWPRaFyEUZ eZdgaTVIEFguwQB9ifr0/lTPtUk41sM4SyI4N+I8dGE6MTOsPMeE/wmsMG6gMOmQShYA jhvKF8ZcePiEcl2334VuY+7xXmCV6irpd1WlkVpfzrWTSTLD0aoMDDqvu0k+SvTrC/XB t/Dg== X-Gm-Message-State: AOJu0YxqPdmocP5z2D5ZtadFJcbueRM9mdD1PoQQEpFG1v/Y6eV5iH/A oGo8uAGgiPPkW8qqQobzXDenboCiDnBafLdSsrOdEoQF0C3Px2DxIPum X-Gm-Gg: AZuq6aIbdAwWFXEcpmr5UPJSdfO1bDIpjs33fg02v4Hgtvi82U5FHPzq8SdGw9Hhlap cj+mBhhoysg+x/1xBmjmylTQ2UFdy7D5MldGPqKaleIUZrZhxBhGKMag+b38DnSS3RnEw2APlke V/VWoGeQHio2XZ2bRlCD/Avp4rMKq3lKsZ3kG6ZcS0LI0soxKNcQmkRRoNkybotoDd4UlXi/KTl aCMhJV+l9igb63/GIKjKD0Xyy8t4rCjqp1U490DTA3kZAibOdpAka3t/fk/oqvBJjSf7KSxbA5m ASp5RIEfqd0SRPph75GZu7/Wr/J9CuXMfdmiWZxtD+yY5sZkj0nKp1/nPuaZ91XFiK8JOssmj34 5QbhvoZEkjtUB/LXT5bP0O0OOD6PD2i6QWWRMS56uGcqhJc4coN+EWZ9GReZe1ZU/CT7KNGj+au r562FUhgbwJrDNzOfbg/lMWexonUzw0w90yPjFFX9nfw== X-Received: by 2002:a17:902:e78c:b0:2a0:8ca7:69de with SMTP id d9443c01a7336-2a8d81667d5mr94464875ad.41.1770022890731; Mon, 02 Feb 2026 01:01:30 -0800 (PST) Received: from localhost.localdomain ([116.128.244.171]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a88b414f1esm139167635ad.24.2026.02.02.01.01.22 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 02 Feb 2026 01:01:30 -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 v4 3/3] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Mon, 2 Feb 2026 17:00:51 +0800 Message-ID: <20260202090051.87802-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260202090051.87802-1-pilgrimtao@gmail.com> References: <20260202090051.87802-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 | 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)