Received: by 2002:a05:6358:e9c4:b0:b2:91dc:71ab with SMTP id hc4csp2191721rwb; Fri, 5 Aug 2022 15:21:18 -0700 (PDT) X-Google-Smtp-Source: AA6agR4G5FZ0hfPtmo7xk0fdAT+RJPB7/2DWKcUtKxhKyxrP+FXD+OYCDrO+VYLVlGZKWCHGfc3q X-Received: by 2002:a17:907:7d86:b0:730:cd48:e2bc with SMTP id oz6-20020a1709077d8600b00730cd48e2bcmr6624682ejc.167.1659738078412; Fri, 05 Aug 2022 15:21:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659738078; cv=none; d=google.com; s=arc-20160816; b=AtUxB4xXt1i7YqT6uSFYBf1JvQDlTdEw1SFhChHvRlbE/V59IhtOfSyjQBwGJc5vOg 3n/cZKTy41qcXGp7EqVBHnGuM5DGuuRxvhAKsZAGPfLjA4YW7VCxpciU6FHBEsgsLMY6 4WFms8gfHLkYYuCXCMIEVK9kMB9rgHdGcKqhn4vukKNPXNTwiLjJ1jrXPGHHAjpNg9yd 1PWpnsLFOlFFPpQrR7FO4ed+SIAsgvzQJ9uxQ9KfN5McryvDoilNfE5iGDcK/tT6rYlt Ddiv9M0JAepsJFUYzaJnON2dj2uXEMH6LnrDOeNV3lfe9HzXrIsPAZtbDaHh85P4Br1b VIMA== 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=v1NXB6wxRFohvXJoX8NOegBlamHwcU9rtOLwkpAdV8E=; b=nHlzqzyxUKs/HSTxeogQUzUFgI3D+wncOe1mKv+wpC1tsoOq3ZIISWgYKya4syQUnM EEwAsNX7pFmbW6Zb+obcHf5ZZwTMK22VeHiLwrGPlOcAAQ832dQvmjgeH31hzshz9FSG lC/MJfgV+GBLJmWixP6y+e3xucuhNyoGewP6Df/Qp6IaSYz772FJhtNZ3N0RvZ4NmZgG 10gKsUXz8y3WaLeXQTEdVd/ybgo6c08fz2EOP3zJtMm1edCQnYDIGYxY8LMDgPhmi30i g968yyUBCTAvBVE7zRUkfwSq+C33ZxVY9mZXCf2LOP/FsCYGJuLlmG2xfF63RITqmK7G nduQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=Xi5iNcCG; 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 ft29-20020a170907801d00b00730d12fc3a3si3825669ejc.852.2022.08.05.15.20.53; Fri, 05 Aug 2022 15:21:18 -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=Xi5iNcCG; 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 S241476AbiHEVtP (ORCPT + 99 others); Fri, 5 Aug 2022 17:49:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241332AbiHEVsz (ORCPT ); Fri, 5 Aug 2022 17:48:55 -0400 Received: from mail-pl1-x649.google.com (mail-pl1-x649.google.com [IPv6:2607:f8b0:4864:20::649]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7655576965 for ; Fri, 5 Aug 2022 14:48:54 -0700 (PDT) Received: by mail-pl1-x649.google.com with SMTP id n8-20020a170902d2c800b0016edca79984so2239172plc.8 for ; Fri, 05 Aug 2022 14:48:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=v1NXB6wxRFohvXJoX8NOegBlamHwcU9rtOLwkpAdV8E=; b=Xi5iNcCGRKvjjsmKAwMoxe2RN0Shtls178GUOGYmKJg9FShcL+7UsiocCYRAMR2Pxf urteg3Kcvf2BVtedqJXvbj0xav+qEORWImui5J64jwmgMXMjnNZ3q/vvp+dfLyxeAlh2 otVYBS3oHXzz7vnUNWnVoSfsKL2WZoShCCXuYPDoAyfqU4HEki+CXcqbxH0FEkGUNgmt i6AAIhX4RjnAGDixu5tph7tPiPTc3nMRYBS5HxhuSbhIOjvCZJrecDCD1IEUhFSXuor0 BJ+Y2CaD0/K8kY/OL4DzpwX7tL5baRyraZhqHXhpuueVFepFUYPHJ/g4u5HxhlZcCOUH 5rbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=v1NXB6wxRFohvXJoX8NOegBlamHwcU9rtOLwkpAdV8E=; b=eq2o415W+QaQADcab3DDqxzrPVOH7xmeeASQKRX7TJaquxBtT+MoAFJsgz6UniR6dA oOfUy2IZMnbORNtqsRMgMjyjAV6Vi0fpK2/Q1MVQ7olhA6sAL49BVV/kaedNc0ggIgQV q9QbJxNSPXSEy8imJ3MU3sSZ0jS/+1J8r8yx8iMbC6g3fPbIRmi0gWxvx5cKq7cUNi23 2dvx6nRile8lJ51JD9o1he4yBNG5VXw+W0rIcGjC7i7EsWr7+QuIejk5A/6FBJLjlndd 6+LCfOlyTrRj1e9pG/G+HQdV8Fhwx3skuePGNyv5aFnkpOfUPg42x1cW4+jSn5j0YCaZ fEsQ== X-Gm-Message-State: ACgBeo2ko9T25X0o2M1vxpFZ9KdnMJfzFNBt92wTVv+J/llMoYMzYj4x va3dWfHxtcQkPjvOL4CTqf4Yfx5toqP7PCPzV6pQwceO/h7wshAeZbnCFtRm4O1ztsHqS8w39NA j6GOmwk+Jhaj6CT+ZNdzm5wicE1ps6YHuMP0W/fsvT6iOq0nXpcUwtqkKZnhxe9QqeGmYzg== X-Received: from haoluo.svl.corp.google.com ([2620:15c:2d4:203:4f27:97db:8644:dc82]) (user=haoluo job=sendgmr) by 2002:a17:902:ef47:b0:16c:60df:3a7c with SMTP id e7-20020a170902ef4700b0016c60df3a7cmr8587705plx.9.1659736133709; Fri, 05 Aug 2022 14:48:53 -0700 (PDT) Date: Fri, 5 Aug 2022 14:48:14 -0700 In-Reply-To: <20220805214821.1058337-1-haoluo@google.com> Message-Id: <20220805214821.1058337-2-haoluo@google.com> Mime-Version: 1.0 References: <20220805214821.1058337-1-haoluo@google.com> X-Mailer: git-send-email 2.37.1.559.g78731f0fdb-goog Subject: [PATCH bpf-next v7 1/8] btf: Add a new kfunc flag which allows to mark a function to be sleepable From: Hao Luo To: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, cgroups@vger.kernel.org, netdev@vger.kernel.org Cc: Alexei Starovoitov , Andrii Nakryiko , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Tejun Heo , Zefan Li , KP Singh , Johannes Weiner , Michal Hocko , Benjamin Tissoires , John Fastabend , Michal Koutny , Roman Gushchin , David Rientjes , Stanislav Fomichev , Shakeel Butt , Yosry Ahmed , Hao Luo 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,T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL autolearn=unavailable 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 Signed-off-by: Hao Luo --- 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..976cbdd2981f 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 7e64447659f3..d3e4c86b8fcd 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.559.g78731f0fdb-goog