From patchwork Fri Jul 22 17:48:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yosry Ahmed X-Patchwork-Id: 12926687 X-Patchwork-Delegate: bpf@iogearbox.net 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 C16EFC43334 for ; Fri, 22 Jul 2022 17:49:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236214AbiGVRtB (ORCPT ); Fri, 22 Jul 2022 13:49:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236056AbiGVRs7 (ORCPT ); Fri, 22 Jul 2022 13:48:59 -0400 Received: from mail-pg1-x54a.google.com (mail-pg1-x54a.google.com [IPv6:2607:f8b0:4864:20::54a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BE0A9A6B3 for ; Fri, 22 Jul 2022 10:48:48 -0700 (PDT) Received: by mail-pg1-x54a.google.com with SMTP id s129-20020a632c87000000b00411564fe1feso2625383pgs.7 for ; Fri, 22 Jul 2022 10:48:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=tP9zyImv+ry8FNBxQIa8g2nDvi+pmzcTYg12pdkvHPI=; b=YK3c3yeup+bH6kPfzgxKhijxptXaWxV4qnHhmTbBev1QmNGCXbtmVnFrlr4Z2CCjh3 HvBBuufaM4IFIrJryHJI9BgoamRPqPvn2+5X1sWfuYaWVAysrHkSIUz5N8sGq7tsbkoW YDBxVrPPJkP9jHs79x06TQDGnbFlXoP4PUIaxqAAQVyV8PfDqY1nQdMd9Bo9MBR+UJFp xi7nhqpVnWAkUWpxeTExeGAMnuc6+5Hrqfc9Btb7pxCTbWntL4JVKp6ddWTnh51udH4p USSZCRwdYJFGCvi5d7pIxm7oQ3VePLxozAKnOcgqPZd49THtGn8wbKoKbycbDPZekUKV akCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=tP9zyImv+ry8FNBxQIa8g2nDvi+pmzcTYg12pdkvHPI=; b=Krq9YTxUDh7uSDJbWEadYDmBCxiUFifDWvRu3H3LtVdxgTKHtg+suMJygIx0fmSAoV VTYHDoRwBTGuI552xqEOGhXsKOGL5Z9r15tPRhP+cOh4SU5K65/DT+Jq8GHvKeYiC28s 5QbVr8nEtvzYudSbkguWh15AAuudB/NnVSimbAUCNwwdNxxJqkBt9wCw6FrKAqh60pPB pS31yod+7P6TtofseaDedh3nnwrVbTmGGYTF/Q51X3eGRZWkSULCnwWaavMI7ssRZeMD eQte/N4kDgZd3uW5N6yuus6rf8IXqXbLdK1qr2o2uRMfu14l7UCT2LFSDtLXsXcuEkdR IRfg== X-Gm-Message-State: AJIora/kwfNd+EY7ui2LJ4FG/lj+q1p9WImAL22T7nJekboEa8TJ2kte +FfuR0EjkV1xM5j9RzjOrDZWTtzVCB08j5IX X-Google-Smtp-Source: AGRyM1utezdElhFNaxM65Cd5ZfNsr61xASzYbMLcKPzK5Hu46BawowFE8c2JKufHgDWosH3xJTu8VxgRgjVOXblo X-Received: from yosry.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:2327]) (user=yosryahmed job=sendgmr) by 2002:a17:90a:6b45:b0:1e3:3cfa:3104 with SMTP id x5-20020a17090a6b4500b001e33cfa3104mr18792988pjl.113.1658512127370; Fri, 22 Jul 2022 10:48:47 -0700 (PDT) Date: Fri, 22 Jul 2022 17:48:22 +0000 In-Reply-To: <20220722174829.3422466-1-yosryahmed@google.com> Message-Id: <20220722174829.3422466-2-yosryahmed@google.com> Mime-Version: 1.0 References: <20220722174829.3422466-1-yosryahmed@google.com> X-Mailer: git-send-email 2.37.1.359.gd136c6c3e2-goog Subject: [PATCH bpf-next v5 1/8] btf: Add a new kfunc flag which allows to mark a function to be sleepable From: Yosry Ahmed To: Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , Hao Luo , Tejun Heo , Zefan Li Cc: Johannes Weiner , Shuah Khan , Michal Hocko , KP Singh , Benjamin Tissoires , John Fastabend , " =?utf-8?q?Michal_Koutn=C3=BD?= " , Roman Gushchin , David Rientjes , Stanislav Fomichev , Greg Thelen , Shakeel Butt , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, cgroups@vger.kernel.org, Yosry Ahmed Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: bpf@iogearbox.net From: Benjamin Tissoires This allows to declare a kfunc as sleepable and prevents its use in a non sleepable program. Signed-off-by: Benjamin Tissoires Co-developed-by: Yosry Ahmed Signed-off-by: Yosry Ahmed --- Documentation/bpf/kfuncs.rst | 6 ++++++ include/linux/btf.h | 1 + kernel/bpf/btf.c | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/Documentation/bpf/kfuncs.rst b/Documentation/bpf/kfuncs.rst index c0b7dae6dbf5..c8b21de1c772 100644 --- a/Documentation/bpf/kfuncs.rst +++ b/Documentation/bpf/kfuncs.rst @@ -146,6 +146,12 @@ that operate (change some property, perform some operation) on an object that was obtained using an acquire kfunc. Such kfuncs need an unchanged pointer to ensure the integrity of the operation being performed on the expected object. +2.4.6 KF_SLEEPABLE flag +----------------------- + +The KF_SLEEPABLE flag is used for kfuncs that may sleep. Such kfuncs can only +be called by sleepable BPF programs (BPF_F_SLEEPABLE). + 2.5 Registering the kfuncs -------------------------- diff --git a/include/linux/btf.h b/include/linux/btf.h index cdb376d53238..761bfd8c31b6 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -49,6 +49,7 @@ * for this case. */ #define KF_TRUSTED_ARGS (1 << 4) /* kfunc only takes trusted pointer arguments */ +#define KF_SLEEPABLE (1 << 5) /* kfunc may sleep */ struct btf; struct btf_member; diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 7ac971ea98d1..be5788797789 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -6175,6 +6175,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, { enum bpf_prog_type prog_type = resolve_prog_type(env->prog); bool rel = false, kptr_get = false, trusted_arg = false; + bool sleepable = false; struct bpf_verifier_log *log = &env->log; u32 i, nargs, ref_id, ref_obj_id = 0; bool is_kfunc = btf_is_kernel(btf); @@ -6212,6 +6213,7 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, rel = kfunc_flags & KF_RELEASE; kptr_get = kfunc_flags & KF_KPTR_GET; trusted_arg = kfunc_flags & KF_TRUSTED_ARGS; + sleepable = kfunc_flags & KF_SLEEPABLE; } /* check that BTF function arguments match actual types that the @@ -6419,6 +6421,13 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, func_name); return -EINVAL; } + + if (sleepable && !env->prog->aux->sleepable) { + bpf_log(log, "kernel function %s is sleepable but the program is not\n", + func_name); + return -EINVAL; + } + /* returns argument register number > 0 in case of reference release kfunc */ return rel ? ref_regno : 0; }