Received: by 2002:ac0:da4c:0:0:0:0:0 with SMTP id a12csp884061imi; Fri, 22 Jul 2022 11:41:17 -0700 (PDT) X-Google-Smtp-Source: AGRyM1t6UYe23YWTlLpLkaKtTM+vF8agv/SjBMYVYTU0AZoAzIM73RlFDFOJ7A6y52yTjLhkcRJt X-Received: by 2002:a17:907:9813:b0:72f:2031:19b9 with SMTP id ji19-20020a170907981300b0072f203119b9mr930437ejc.473.1658515276814; Fri, 22 Jul 2022 11:41:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658515276; cv=none; d=google.com; s=arc-20160816; b=Q+8AOlSyc8BgGLJSlK4qsY5ESwb6Bfsi95XsEwVpUv9HkM16ckiaTpd9Pm9o0yiSB3 BYKzHPWZai8jnmTJT0yttFPThpP60lFBHgAyejPsYIwDtFfGd9ntg70tQsVIBybZeU+S n6E7Xvs3TD2EhJQqAY7ninCSfUC/Cn002wTBkll7V2UL3MwyHcugX6YksWM6ED85CFnR Qx2UqAGzfOvjb5Hx0eMSqrirJSp6T9ZoyESM/yA7RpCXWtZfvfWnglXRVHggS5UtdFOb iBEC4H65sDkm9IJOCR0Ji2oDDeAszD6AnEkWk2c+8J43FW8TZ6std1SbbPD1tXUX4Tks hlHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=tP9zyImv+ry8FNBxQIa8g2nDvi+pmzcTYg12pdkvHPI=; b=0wEDIUR1Bnyx2SDoFeSUonbWVKjgcxiMfjowqrOrtA8f5iGNMH0Rewv8satfzmEDrA IfaJyHtIi20K1sxa9KaMWWr0r6WbI+LvMAlTBKZTjmsrh5Ow9B36YasGCykB+WkaweII mrzio96wQhfwlaA4+2wbwVbDkSFNjpTCGmCZUXGZcRJagxBdqVtjdtUNisMVbb9MrpI/ LYWALcuPNGk3dU4jSs/x6FY1a7SuXlKKDJ2r6gPctpwRa+iulpcpU/aDZhbljd9QQ0QB t3fbRHf2rw1g6ExP4NRdmgb4cgZLENSEUIIZKWDLve7EH+XzDnCjOn7pe97E9swKSZNl la8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=YK3c3yeu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id qa44-20020a17090786ac00b007267675e19csi6661688ejc.691.2022.07.22.11.40.51; Fri, 22 Jul 2022 11:41:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=YK3c3yeu; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236251AbiGVRtC (ORCPT + 99 others); Fri, 22 Jul 2022 13:49:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39636 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236087AbiGVRs7 (ORCPT ); Fri, 22 Jul 2022 13:48:59 -0400 Received: from mail-pf1-x449.google.com (mail-pf1-x449.google.com [IPv6:2607:f8b0:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2895C9B1A5 for ; Fri, 22 Jul 2022 10:48:48 -0700 (PDT) Received: by mail-pf1-x449.google.com with SMTP id a19-20020aa780d3000000b0052bccd363f8so665116pfn.22 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=vuH8AECD2D9mz5lW0W6Fwo8ByQc4DZiMobfmabesoOzZ9h/mGIHbtORxypxWN75Fdw 2J6B4HzGRRjlSzHPeZJNtrohiun8Y8xC3uZTvqY5Wp3hioXQ7OHWU2xZbkgdoqB+i6/0 SWTpQDJDyrf1i8Gz3oUxytUgKcbmIi4gnBIhexDURR4B6ufWYZ+G8dF5NjsPqqMWXzjM ShYKSN3SFNqUy5IPOHFbiE854oYuZZHrh6xCGVZIHJWkeVkKlSLuqmiM/Gf00CNIVHCS +BEIoKUFNaI9unfHJHKvEAcdaTe7hBLK/RrVy7fAcV6fxKSODre1tQfXmHp0SZ1f1IIN iskw== X-Gm-Message-State: AJIora9va+V54jAbM1sBybWNcL6PN7AtNY9RNFduhxSunyaycCl+PzQj kdWG8sR42dY5uXq28qpq6gpuA6XEJSKBqp97 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=20Koutn=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 Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; } -- 2.37.1.359.gd136c6c3e2-goog