From nobody Thu Apr 2 22:28:59 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.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 25F0A285050 for ; Sat, 14 Feb 2026 12:40:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072859; cv=none; b=TbVxkZGbQVFuUsIKz9ZyZvRQyJjdk7Woh1Vof2WIUnaHZegZt64kyZAbeyhAO9ztBSUI+tQm2VpCLwEbOLRHG3CLjSg6v2rr6pwpVQKjqTfyMDuDpoWvRiii1SH1PkT5pNxZysbiT6NQ/nHV1Uhniq+O2AEIOn9OxyWlq2V51W0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072859; c=relaxed/simple; bh=0Ut/Yd2xFzBBknyWQqwazN3LxjtJIbDOmzRkADmWq9U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cUiFH865NslaU71A+OB9h6PIPWQZCyo0QSPOKq0NgRi7x7M2SG+BiAUnarpcG53Gj2t/rUM7S3Ibi2rFA30RqANJx6K54rvNGkl6m5+VWyV1a5Jh9mm4hIg73RQlUWRwfekwD/nODQc+cjZZLsgPrWDvk1mlmA4+F76+hF3hnGc= 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=YGS6ldIa; arc=none smtp.client-ip=209.85.210.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="YGS6ldIa" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-824a3509a12so1072324b3a.2 for ; Sat, 14 Feb 2026 04:40:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771072857; x=1771677657; 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=nxayVJFfRrkf5xz/bcJOQ8q9k4PoLRBwxedlXN2B8nI=; b=YGS6ldIaH3HUgjfUbozVr+n1fSt367nLyfwEJ6KQx3MTNAU2T5CQiTGyM9RdrC/g9t EEv2YcTTB13whz1OSIE0S4bcjhNxfqbhyNB8yUuxfSQhd1/fmPDVaI1MGhFZJ9mADfrT 2qhohANm/hMyMQp5Mo3xkM8crTj5cSZBMBKlfuuz3RHZYF2It1g3c1cBwimYThj4+T92 0lE8tRvrWqP1Ewe3T/H9Qa1p2b8kj3pibac6CUSzpPKFg8jQZnRclotn2c8OKeiPreQF 0jSjfFN4gdM2CbiWFafazZYnZ8No39eFIXJ1Jd4DQgU/cq2Q4Yy6r+FRWv74iR4D7grX pNVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771072857; x=1771677657; 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=nxayVJFfRrkf5xz/bcJOQ8q9k4PoLRBwxedlXN2B8nI=; b=GdwEnPJpiDRtMGnUkSE+r7kHpw6n1XEFxpAAPmYEcn4q8IwZLzqX5AVqSkpsc6Y2ox ZRcXikRV5JZnkljadLzawb8MfrdmafChmFarTRNzwi7jvcswWPd5EDXMCfaS+OyFcYSf RVhFzFL2Ui3ZEe4tTgXckzjgHFU0+UTabylnAB4Fe+DvQuQar6G7e8KJzJVH8GjNNDnD tQqsUugWRfWbhNfHA5+LKgfcfXWrwxVeigSt+7ZjinQW/JRUimslV5eI3iAoRSLJUOTb X+cEW1fKn+tYT9+Vwrj7dbD+9/ooh5tRgWbWpAX9i1lrPBjXXCQc3zjF5sDPjv6F7ivt Ajwg== X-Gm-Message-State: AOJu0YywLo+T2/wQQbEhLkQFksrueccq/LpgzU/Wyj+xPzA8SKOpCGFz 815qyd2Tld6MO9EmX6edUOEaQ48GWdvlUV8QaB5uGXyvlXAYxkngZ8tm X-Gm-Gg: AZuq6aLUfz/VL/sN2R1hD67psuP+yHINl4txUztUov/ET4GE1HnbpGW2cYr2PHDaYyW N6/IXFVUNYohDfGzHXXA4lzLgQrwpcCFMj84dq+gTA5sbNSAGsB57ygAf/2BXBWINVpxIqH4EI9 AFhFqgUQQDXdTAai9Hmd/EtKkk5YBzATXXm2diE4csM2eU+pSqTSbGUELPU3gtd9DaPLWs8kZcw I+vkuKgvJOo4cHoEYXVISwhPNYYQWwIO1jxtfMh7JiRpRRQxNgtAogiqmya6gFGF5qzajXm9Dho o72Cwu6AWbZCI9SkB+H3QBpKtVn2j5RE+8f6ijT0DzW1YuY2LtIGHS0wele5HpAtB/XKLKqzqVL yxW22Mu7cZKvHhrDHZTM+/UQelxHFSFlATgtMlQrZnU3L78IKb84lC5Y9bZL+4SNjJbAXtU4Nrz FGA4PkXEGTC6b8PtwdnTsXbTYED5vl4ImYnr+bw/7IE0iqV+t0Yb1M X-Received: by 2002:a05:6a21:7014:b0:387:5daf:b312 with SMTP id adf61e73a8af0-3946c797422mr4752317637.35.1771072857350; Sat, 14 Feb 2026 04:40:57 -0800 (PST) Received: from localhost.localdomain ([113.218.252.61]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824c6a2e40bsm7064497b3a.11.2026.02.14.04.40.52 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 14 Feb 2026 04:40:57 -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 RESEND v7 1/5] bpf: allow calling bpf_kptr_xchg while holding a lock Date: Sat, 14 Feb 2026 20:40:38 +0800 Message-ID: <20260214124042.62229-2-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260214124042.62229-1-pilgrimtao@gmail.com> References: <20260214124042.62229-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 edf5342b982f..2927a4622ff8 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -21044,7 +21044,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 Thu Apr 2 22:28:59 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.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 321BE2E03F1 for ; Sat, 14 Feb 2026 12:41:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072864; cv=none; b=Jjdxb3uuSubEbU7Cd1mz6Ra+EY0yCfl+04NBlQHkz1o08ESUJepL8Af5KmDvvje5pjQC0UJhrkvdNboIMDBeqtLVGxSy7Ee+lDidcBofcp2UtkJ4NyFWbRmhCEWeIhvgrP96iWW5SkO6wvOddcX/ATCOdx7Zz9/V+x+PUPVn0Q0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072864; c=relaxed/simple; bh=aJnFa1Hsewgi8H7YxpRPpFYJuripGJ/a5ZfAUhM+lFc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BKf14EcrmVh+s3rvDb9pQWe0DbTGxs8bsoGdmaz57HTsIw/biCCvfWLW8HHvOic2UAjREwVyhZdPsIL0TooSxcOB7E9obuO4g/KM7kX8ga8igYT+fQ0XjRUz0dLKbOFOk3qugJQtX0gWRzeAs1tMRPpFnsHILh4KnI/9hkQVMNo= 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=jE0XANPn; arc=none smtp.client-ip=209.85.210.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="jE0XANPn" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-8217f2ad01eso1442849b3a.2 for ; Sat, 14 Feb 2026 04:41:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771072862; x=1771677662; 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=L6tCm1dSlSN76Pq+BKvxzLO0K4J3qy/k2J9RReSkTgE=; b=jE0XANPntZmPjg79xXv/G+pctvHqQFQ8q/XrZzkUxCt1aF6b/a7JExzVye3EThvBl+ OiIdpJo02UrycuDQzMicMABlptaWql/+qp5IOe6UDhGfyLb6ftYC8f5OamH3cQ4p7ZNd LkH2Rzp0jPcm3S+WSPLHUzk28ytM3/nhHOEsuLnnKdxRC/tJWYdGH/pCTs1U4JDF2FO0 GPIo2jF4Q9+B+qBbYGjUDKTfbmC0JHEg27f46GXpAdpF//Mmg3hgzc/AK3ZfwLvw6qUt 71DgdcuhgLqiqqakjE2//acKxwWy7jmoUT2bfvpD9/Z00vx3gl42Svs+kV59seFmbkjp kM9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771072862; x=1771677662; 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=L6tCm1dSlSN76Pq+BKvxzLO0K4J3qy/k2J9RReSkTgE=; b=ZT74hmtgYhniCJLKHE/WDNgDCa9qEP2s/LTfZkUsOgdo1H/JFZxzAjmyWZu9ltttCr V29/eHaf96a+c0ZF6PoZHcdIx1ZhyoKyyVUSAz+u2c2bveU+FyoQIZ28gmXed1/sYxxY c5d9YR/LGytTqlvnecAo/Uxjit/tPM3mYsG3Jjf7O0rZq/FrgAibumh7+7s8kl6lG6/y gu10PzdMbnnkYyzCEiblnCQa5DqadT3x1oYhwhwV74EpC6vtY/B/FEA7K4et/joZNKBn oEosoh5E5FbXBjN9cF+nafFd1c8bwCLuUSzeIOVcV5oOav7HRWVa1DSSl63oECvwwnyu 6hxg== X-Gm-Message-State: AOJu0Yz0vDk0BZfnS+Whl2zyF+vkSqeiz/a14nx/ZY92oWSVVZWbaePS Rk0WsiRh67WAj7ZRY1A1qewnfxPtgeQFA4ChukbF+3gJe8+dDp2VRVKz X-Gm-Gg: AZuq6aJ+VHp0PO12sXZr3i6/aWsJtjXWKJXM2LOwwzNbejgtBrKyRt41oYMMxM4fprX aXhSZAv39m9d034yIgE1mydTnTlX6++DLY1GXV03Dn4H3eNPbvFj5OUNJr3OAUjqlBqzWTSnBZ7 dopgNzrAjYhyEI5N+498hhqdaD5Z5B0N+Vt232A8ZeKKu5SIImT4CkypY5hs8J79VvmQuzsX8sG q4IDVGyvozBLgDZk1R8GYdTKQJ53gPE0e4p9c4SMqlyQGeJt0YMvHo8DvWpDZT+Fz4y62k+E1wP tS45afs7r0pNwprDHbjNGaSDOb9lhlWaavU0MiZjXj8P6/lTbpQLmBIZdhil/BuClsK1ogq7yOS hpFln4iJEMw6cikEk20IoWpOaf9QmmGiqD3dgGawwaHbs0Rz18+OSF2F+ZQgbTRWhSEMTBD3ljf 98cAbNgf1a6+oAeWuw5ggasFnf/fIHYwLtsyUJLDrc9LUsbhOM1+2H X-Received: by 2002:a05:6a00:3c8b:b0:81f:b3ce:17a3 with SMTP id d2e1a72fcca58-824c613364dmr5989012b3a.48.1771072862533; Sat, 14 Feb 2026 04:41:02 -0800 (PST) Received: from localhost.localdomain ([113.218.252.61]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824c6a2e40bsm7064497b3a.11.2026.02.14.04.40.57 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 14 Feb 2026 04:41:02 -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 RESEND v7 2/5] bpf: allow using bpf_kptr_xchg even if the NON_OWN_REF flag is set Date: Sat, 14 Feb 2026 20:40:39 +0800 Message-ID: <20260214124042.62229-3-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260214124042.62229-1-pilgrimtao@gmail.com> References: <20260214124042.62229-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 2927a4622ff8..3536a91ff8c7 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -9329,7 +9329,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 { @@ -9489,6 +9490,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 Thu Apr 2 22:28:59 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 C768C2D9ECD for ; Sat, 14 Feb 2026 12:41:08 +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=1771072870; cv=none; b=llSp2XWqkJnI10F2+ah3DrT85qnkEom2RVl9M/cznYZJaRTCen4Hr46xXbeegCE8AA1oRmuF92jHL7oK9P0EuDhj7lXGpVqdRRnnharsHApGBUtPi2xMQk0JloVRMzLgMHdEC32kGoNvXQnPMhuiNSz27/o0psuCDNlLhWVUSCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072870; c=relaxed/simple; bh=HyK27wmWpvNXYaxDWFYLGlawGlu1xGVw5LGjGH+YMNc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BEmNDiJolEdmyQn+6XOl40fUGgpt8v6ga3550DaSMBwMlLEfVSk0gLZbdhlU2tALnEsi00W37yYnXzLACmz73jAf4I8YuOR/vK4w5W71efZ+v4W1nuRLuC/eReHtv+4JlWqbqSOGYJnF60TY4rC26o6RD99A6B9Je7Ja8d3SQl8= 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=TRUpbzD+; 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="TRUpbzD+" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-823210d1d8eso955892b3a.1 for ; Sat, 14 Feb 2026 04:41:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771072868; x=1771677668; 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=TRUpbzD+FQdjsgG6KHfPdkvg9QPyOqvStmMo+2MHcsOOcaba7ShBJf6YqacwMpczO4 JgdkaG7lz9B+Q0eXg4bj6ywtG0oimlFBEp5YppsClol3iF+2x/EIRmL1nfsX+yZSldnA V1xqhQ0eDRT83H7EJHGoAnFv1K3XuUiUxMZoEkWt75N4OpZ/+R5pCTHyxS+RzRinEAms SX4tVgCmaPLDRsZMh8O3M98OlGO8BUnGDBJRblps36uSXDmcngY2WN5boJOUV8eEuzKI XoUQuLJpfhHC3KSNGQa/+3wGuxTIaGOHNdCdyKKUoYWLfOR5ByysjHnbSkmmKTWHuFrB pE6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771072868; x=1771677668; 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=tLnGq9QwxEWuat21ZHWPyMeEbfY1BOwMjyRwCIruvkri8vt3DY5MBn5gMYn5jwa1sf 42sUGidWpajsGa2Ve4YY/7ZVQgHd9uTAVAsy5T2JRhh6OBkH8nx7uyFPBKpMIfNVynIO GofLiU17yWVaKMrQBVSSGLWdCbVH/gwDKH1Qlh3plTLsuvkF5qt6MKhdrv+o8/PwvlMs +ycawmZQTR3lBYZl41ImBFILF8Qa9po1EPtGQgGFZaSbzWmcqmv1RyMAVTRZnqfcRxgN ZwC3HWsmOIsfLU71BkTXZogDCKemYZd9oLPwEc0OsfZYDxbSkUDuDvNCKIm7wtBEnzPh 6EMA== X-Gm-Message-State: AOJu0Yw6pTddRkKS+GehmClz8ZWN4jF7y3nuQAxYn4i37YPWAbwOXo/9 bcV17q82ZYhMu5+8CCU6eXRGVSteFhwrwYio1/uQUPjcOBoWrIlCqW3y X-Gm-Gg: AZuq6aJ/tOIPcRV6+u2CcKLm3u0O9JURk+Po9mwIdHRnAI9yt5f+bLYN5jjAllgYVbh pQmJrK7ok+g/QjJa0Rx/srQCYFLC82XQ1sOeXaLXAVCIPwuN2nvE0t1AhIlofV24bcmEBQhWeCt Z12RjzFwZzE3OLUU0dTje8uGpadH9GwTid2pyRsCBzaYjKCFyZpftRvXMpSIZQ8sewUCB07057A xw0fL/UtBxSPIkqzVJe0Wa6ctdppcQFW/eZZvMv8hZzPemhvFO8cnpjwqDJEnHMr9sbBiIjmLSy rvK3JKQZ+BMQglSmVYXD4/sagFmF6tsSWFI6YXfSJ/sXD2j3VBZ4DsTlLfS2Obk6rnuuSyQDxVL uWThBYh1IfbV8Pom71L5lr83jVqFWKgw02FDEQlgQOYKIxZv1cRQEBBNf7jXLnq6Q5V1DaxK+OH GIKyTR9VNpIr6oZqbNc13GFP5v9ZIb+vWq8UvycWnjF2h4vW4B6ADn X-Received: by 2002:a05:6a00:178c:b0:81f:4999:ae46 with SMTP id d2e1a72fcca58-824d961c463mr2060599b3a.48.1771072868105; Sat, 14 Feb 2026 04:41:08 -0800 (PST) Received: from localhost.localdomain ([113.218.252.61]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824c6a2e40bsm7064497b3a.11.2026.02.14.04.41.02 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 14 Feb 2026 04:41:07 -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 RESEND v7 3/5] selftests/bpf: Add supplementary tests for bpf_kptr_xchg Date: Sat, 14 Feb 2026 20:40:40 +0800 Message-ID: <20260214124042.62229-4-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260214124042.62229-1-pilgrimtao@gmail.com> References: <20260214124042.62229-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 Thu Apr 2 22:28:59 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.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 F18B630C614 for ; Sat, 14 Feb 2026 12:41:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072875; cv=none; b=k9/RWu++HxnejyPo+m5EjpsoD0GcUnbK0/ktLLcTUEFN+Ysdop1Arr6PZ4Cb8eb+m3NE/VnWSpgaj7KE318awT5gKpI2NWb5u2HAlxeMEKlAbjSlzMsAchxPwjuzUMIGl0AdslGCZW2QWFhOkxmrm6vsdpYyJrFbLtaQ1heqpvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072875; c=relaxed/simple; bh=Ye+oWlYE72o2jiv4nukJNQWUydaCpWaI5XFqBC4XqUY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oIc9JC4/fcgl6CNNNb+i7IUpRMVb1Dn6Nnztez6145U8GqccPAerXdbDmbox5odG93lff3Heym/ga6MvKOfDt/ITSwbvR9k2TnFArXiHMrbf7gSvqSlc2enJlCzCnPT9S/UlzkWtMBuV4LPHnEa7dLn8D4yhwvvGz29p7e4fid0= 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=kQAk/LAW; arc=none smtp.client-ip=209.85.210.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="kQAk/LAW" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-824b5f015bcso2132076b3a.1 for ; Sat, 14 Feb 2026 04:41:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771072873; x=1771677673; 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=fbPLRwzzn4WS3fd519NwtSlQa9Kkj67LEXJEwwxQVcI=; b=kQAk/LAW9bgNkx12z+KU68iAKh+j4YeD38XOunQfVY0cCkWyap8sozLKzC6GQ6d47+ KfOhx9Z9fTMshg+Lu8NFrm/Gd9N7yh7oZ6vEmJaWAxJEOjGqzllhkZ/Wy5rLiAK1v3NJ xJJznZ/ZXkczrgjo4ek/7luv/S0citc+i6GmfTfriNmyJjV66MytjpJIot6y4I35kgJl 9z3I6lEvQaPqFXqey7uHX6jAvchOP9fwAZOlT8S4AMqf4b2LScY6S0t0uE/PFRTeo7nS epm3x9OBZq6f8vZYDQTXUgMAQ3OyYw1Sx/tuwVFZ0KlCi1wRLQ5+0ve6CDXfU3rZDMFb QJfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771072873; x=1771677673; 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=fbPLRwzzn4WS3fd519NwtSlQa9Kkj67LEXJEwwxQVcI=; b=aoQeGT/mhaljGTwcxMjqLIj+99vIFwC1EFFj4KnkQbhVKN0H7grb1H0uJ1mbX8Ax9g Bq0xFJAoiEEgVCQdKG3icIxiJDaEhY/aaxNWRZzDcS0KVL+LhhbmVhpjGVuxF2cXKmkb f9mPDq0ehopfXC97MwQALUibunkO1L5+rTvCWFNrThQ52uSan5KdSFpZLs1FpkCxG72B /N79IFsiuKFdD2hHzDtxfZxV8HvUS47dQhfN2F7G2M3tlG2r/V7li+2hO/svQQzQsU40 c+p9WRIRkm6MtTUDv36/WFrtOfY3K+TcraSrxzU2meG2RJn7Oqoyo3VtIQk2snLe+jKb 5LbQ== X-Gm-Message-State: AOJu0Yy06uy5q91V6FgNgsWoxzD6T9l1XOCwjCeflt7Lbh79NvOJz7GT 0Ps6tG19gQ+ZSK0CFtuWxx52K2Zwyq1hXar17bDL1cdGphLk2rut7zBj X-Gm-Gg: AZuq6aI4EHcdMyyVdt7xyvuDGDXvZpEyFJXqqI0oxBSZgvlekGeli4Kp6Li1GzXlvTE YEWgk8ZiXGd6imoDpZkE64waNzPcLyKsHQ5JDOzqNX2Lax/fjfZmxUH7jcrLOM9El67OgjrxW3r +/qcMjDSxHVSGwneSWKALp3ypDHyi0gYHAoEAO5c2z2I+I8HcpcV2FXsZ9s4KNWXfs5TMNFA5/9 qleiz9Ty5faPxKgXyyi13HeaLMPO6Y0b/Eqyojr+DfgLLPZBooA73+UA3pNhf3DDjmo6V5DJTdx 7E1qh7XNSUDy57F58ddnAtt9/FREHV5r8+K/lHh42SLM8uHVLA3MYG1HkQQYA4btsgiwkyE/s6Q 5e2Bikjz7wOIdPrS54WzqcLr+fQ3xJpaGlAmXLMsEh7wT+W/0BNQaYAtoqJxjuAz+VJwkQVUIPp iepncheXvtY7jP6mVe1+gZv62EEW4Lqv4XfoHA1EZAQMDPsIG3ANkO X-Received: by 2002:a05:6a00:4205:b0:81b:8872:ae10 with SMTP id d2e1a72fcca58-824c5d0f68emr5058863b3a.0.1771072873255; Sat, 14 Feb 2026 04:41:13 -0800 (PST) Received: from localhost.localdomain ([113.218.252.61]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824c6a2e40bsm7064497b3a.11.2026.02.14.04.41.08 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 14 Feb 2026 04:41: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, Kaitao Cheng Subject: [PATCH RESEND v7 4/5] bpf: allow using bpf_kptr_xchg even if the MEM_RCU flag is set Date: Sat, 14 Feb 2026 20:40:41 +0800 Message-ID: <20260214124042.62229-5-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260214124042.62229-1-pilgrimtao@gmail.com> References: <20260214124042.62229-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 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 3536a91ff8c7..f673cdb55961 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -9331,6 +9331,7 @@ static const struct bpf_reg_types kptr_xchg_dest_type= s =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 | MEM_RCU, } }; static const struct bpf_reg_types dynptr_types =3D { @@ -9491,6 +9492,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 Thu Apr 2 22:28:59 2026 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 C83D81C84DE for ; Sat, 14 Feb 2026 12:41:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072881; cv=none; b=r2R0ofnqWpcRrn5b3eCMbCBuWdxkj1QOM3K9pjUPnOLliKYQaDmlOtN7q8LUTdg6zq10S+RGZGSB0nLZyKPdLzuG5T0S64mznhHTOOTQR+7Zb0B8jrk9W2aE2PEkboO8uRxTIuZFyGcOdzBsW1I1+EVXD/XH2MpHHU5lDtkHoXY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771072881; c=relaxed/simple; bh=bA50R0bu4pcFiczphQwo0OOSupIpSY/EOYDo7M0jk+U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Tl5sb3E3bTQUTUwRdaVwdrpeWQsxb0Wv99XN7V6xK1qT2SbYpQS/K599ZvmZ01Q/vPtwOSZzCzbhkRm22aHwHh+/zePYONptyH6EecSIzyV3+2i6J7CIHtPJuWZWwnN1Kgq8yixUH9XXtSvg6GQ7rm1zXgF3vP+SNMAt3oJyqVI= 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=bzi6/Mbd; arc=none smtp.client-ip=209.85.210.174 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="bzi6/Mbd" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-824a9348603so708074b3a.2 for ; Sat, 14 Feb 2026 04:41:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771072879; x=1771677679; 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=bzi6/MbdpHDsO0RkKkdNUZMPLI9o+/SLJ+uKnVlpRGNJDmdnlFLrlsdGrQdF3nLcl2 RGlnoh2CzD2FCdxUgkTpK9DszwI8b7J8JSvwvDFY7OSDwzHahHCuDBI/iaAzXERcBXaF cBAaF/9k3No4jMu21OV8Ev0xw48QP8pGXtV+vTNK8V4vGIW1MLWkwl685pmLDxctljC2 W6Tn2CtQaXlZiSYwzYsOYoNwJJxft2ZekO94nyHEbP4iZ5eTU2pHEqfspWeRYTRxJmwv cZvb6lwW4V3lCj7XuIvrplUS69afsbKYWxhRFGFM9Jlm6zNTzHevcsIajO0S5l9jdPq6 097A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771072879; x=1771677679; 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=AX+7E+ilb/qg2euR86KZrA50TVSGajgF+9vFOKBG5LDwxgrOidY8+Fwa06SqO6wd2a suLAcqQJ2iI9F1tOhwHYdOR8YBeacBBMG4WBWa2bFWrLPmQ2lcFEXRWuWEa4dC+30+nE N2f2g239oS/jjZyP0eoDztAFCa/+s1bULp2tHxQ0X+GUsWE/tYhHW3aP7EowbvIXKxoM 3Y4bjIktQIXmUPPadfHphcyrLR+6MQpwJNpL+Jl7lKHd0Ov89b7g189Y3mlCmdocc+fQ Qy/m1Oq7BxTeu4IoYuRcMTFeDpxI8Qv3hACxm9aUM05XMgYkmWKwUDjm0fkOLW5Ep7E0 mU2w== X-Gm-Message-State: AOJu0YxxikRIxJNQ07FlX3AobdSiWd3z8U8j35abl3ot96tDv/NSLgKu 4JV1lv/tmGphwTwKktyfBaPqOnmAOM1jktl0FbrIzHJlnnvwJPfa3Zym X-Gm-Gg: AZuq6aKmSsGI8mCYg/JuCqeOuJ7xsZT8blUJHnswneD8h4Cyq+xAYZbprzX5EdP8A+g JEZ+o/4tQeQC4/IdTa8MREoagaUmgeEpwErxvohNtTgeXL1iODs+ms7fcHQ1m4Bp3z8rZ7r6wTs P7jNoPzPUqFa+GB4n35TuVTHoSd25bJFnTOtCDP4n1wyOwEKd6jOGn3T/8/557rcjmc9GsLbVhl RDq103s35EjfSOoEzDQiT2ApcFZYZKgeYcczh7RrL7oHt+cp55EEGlbeDQPielRf5LLQLoeCZCh wWeJ5qVcmKJUZXd7Gdpiw8HKYqTNS3eBwvuik+9o8+jfQlHqvDD6bp6Tf3iIQDqDaZadc/oeUTX +uriY1m96y7tZJL3Q5n4n2rMFDayj++YhNV2fV4q1MOUia+U+ILxfEYoUGUAbmJlGiLSYSb6C9B vODIejCXo942hF2pMHXLNAZDc6914WN7kcVSMdmwBxlSc4omWvlpEw X-Received: by 2002:a05:6a00:b904:b0:821:81ef:5de8 with SMTP id d2e1a72fcca58-824c9444a20mr4983100b3a.12.1771072879198; Sat, 14 Feb 2026 04:41:19 -0800 (PST) Received: from localhost.localdomain ([113.218.252.61]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-824c6a2e40bsm7064497b3a.11.2026.02.14.04.41.13 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 14 Feb 2026 04:41:18 -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 RESEND v7 5/5] selftests/bpf: Add test case for rbtree nodes that contain both bpf_refcount and kptr fields. Date: Sat, 14 Feb 2026 20:40:42 +0800 Message-ID: <20260214124042.62229-6-pilgrimtao@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260214124042.62229-1-pilgrimtao@gmail.com> References: <20260214124042.62229-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)