From nobody Mon Feb 9 14:24:35 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10003C001B0 for ; Thu, 13 Jul 2023 05:09:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233827AbjGMFJO (ORCPT ); Thu, 13 Jul 2023 01:09:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233578AbjGMFJM (ORCPT ); Thu, 13 Jul 2023 01:09:12 -0400 Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4A7F52114; Wed, 12 Jul 2023 22:09:11 -0700 (PDT) Received: from mail02.huawei.com (unknown [172.30.67.153]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4R1jM62XMWz4f3m7l; Thu, 13 Jul 2023 13:09:06 +0800 (CST) Received: from ubuntu20.huawei.com (unknown [10.67.174.33]) by APP2 (Coremail) with SMTP id Syh0CgCHlufvhq9ktQcZNw--.45992S2; Thu, 13 Jul 2023 13:09:06 +0800 (CST) From: "GONG, Ruiqi" To: Yonghong Song , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko Cc: Martin KaFai Lau , Song Liu , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , bpf@vger.kernel.org, linux-kernel@vger.kernel.org, Wang Weiyang , Xiu Jianfeng , gongruiqi1@huawei.com Subject: [PATCH] bpf: Add support of skipping the current object for bpf_iter progs Date: Thu, 13 Jul 2023 13:13:23 +0800 Message-Id: <20230713051323.2867905-1-gongruiqi@huaweicloud.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: Syh0CgCHlufvhq9ktQcZNw--.45992S2 X-Coremail-Antispam: 1UD129KBjvJXoW7WryfCF45ZrWrXF4xAF4ktFb_yoW8Ar17pF s7KF9rCw40vw47uFZFyFs7CryrAwnaq3W7GFWqk3yrKr1UXws8Wrn8GF1aqFyrtryxKr1F vF4I9FWYv345uFJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkYb4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr0_Cr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxV AFwI0_GcCE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2 j2WlYx0E2Ix0cI8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7x kEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwACI402YVCY1x02628vn2kIc2xKxwCF04k20xvY 0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I 0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_GFv_WrylIxkGc2Ij64vIr41lIxAI cVC0I7IYx2IY67AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcV CF04k26cxKx2IYs7xG6rW3Jr0E3s1lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280 aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7IUbPEf5UUUUU== X-CM-SenderInfo: pjrqw2pxltxq5kxd4v5lfo033gof0z/ X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" bpf_seq_read() can accept three different types of seq_ops->show()'s return value: err > 0: skip the obj and reuse seq_num err < 0: abort the whole iter process err =3D=3D 0 (implicitly): continue but bpf_iter_run_prog() is limited to the last two cases. Extend the legal return value of bpf_iter progs so that they can skip certain objects and then proceed to the followings. Signed-off-by: GONG, Ruiqi --- kernel/bpf/bpf_iter.c | 9 +++++---- kernel/bpf/verifier.c | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/kernel/bpf/bpf_iter.c b/kernel/bpf/bpf_iter.c index 96856f130cbf..1c1d67ec466c 100644 --- a/kernel/bpf/bpf_iter.c +++ b/kernel/bpf/bpf_iter.c @@ -716,13 +716,14 @@ int bpf_iter_run_prog(struct bpf_prog *prog, void *ct= x) rcu_read_unlock(); } =20 - /* bpf program can only return 0 or 1: - * 0 : okay - * 1 : retry the same object + /* bpf program can return: + * 0 : has shown the object, go next + * 1 : has skipped the object, go next + * -1 : encountered error and should terminate * The bpf_iter_run_prog() return value * will be seq_ops->show() return value. */ - return ret =3D=3D 0 ? 0 : -EAGAIN; + return ret =3D=3D 0 ? 0 : (ret =3D=3D 1 ? 1 : -EAGAIN); } =20 BPF_CALL_4(bpf_for_each_map_elem, struct bpf_map *, map, void *, callback_= fn, diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 930b5555cfd3..cebd3a0b3172 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -14333,6 +14333,7 @@ static int check_return_code(struct bpf_verifier_en= v *env) case BPF_MODIFY_RETURN: return 0; case BPF_TRACE_ITER: + range =3D tnum_range(-1, 1); break; default: return -ENOTSUPP; --=20 2.25.1