Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2656580lqp; Mon, 25 Mar 2024 05:56:45 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCWovrB9oL+7S3UVcj9z1UNlm3KwIYX3O3Vj119aZ8YZGprKkXMqQymtCLFH+kQhH6uoPpYUnuna70YIq2zlro5o+MVS59M2vbVeRo80lQ== X-Google-Smtp-Source: AGHT+IFBqYJjCf3ju14D2+sDNXXr1RCC+dFk5+R3pIp3Iv/nJyKR1haMiCQgJeKIf+i1LAIs/84j X-Received: by 2002:a17:902:e884:b0:1e0:afa0:d512 with SMTP id w4-20020a170902e88400b001e0afa0d512mr4832807plg.46.1711371405074; Mon, 25 Mar 2024 05:56:45 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711371405; cv=pass; d=google.com; s=arc-20160816; b=G6cDaPcxp5wmWuWpPLbg2/ayxiHdd88oUfjY9J6p7gj/HgPEdT6770hJ9SPN87USWc 5ViQ/VYDnp0/Z40yaRdK7uYUxt8f5Aj6KurAduZAb19CTuKHBmxjwT4On893qAU9Q3Wj Z4vQ7WcAxLOkhsMy1Y1jXoAqjbS7ylD8ogToqrSHk6EwMml6EJU/IxySqqHwYQX1MhQq oaGDw1Nje7oDuKoXagUoz0foufRwr3zxOkr54MfYWcEm47H904t35nKTicB20RFnK5lJ okh3FMDreZLBwKs5YrC2yfEG2pUsb4SSjOpMlPi4f50d67be0q1spRCmcNGbWDpcx1Hr XrwQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=upHzqHbkh5XKamVcmo8xBSrK/agTjNO6mbEYhQYxDHI=; fh=KI8lcTG8vb34AD2IamQ72oHFFdOGEQ7hEAfSh6gHHEE=; b=DTlHlwK1REXZnY1d7zVy8qwaEkAeXOe9uVdl3w6jB+rwNM/+R0a/N5PWQEkSFBVEPd Hp4UpFBmQcGHEM2ALrKCIpJLP7t+HO7t+y3a/3IRQ2DdlUu5PiGmT80f+xrb1cCIcFfi gg5WacV7Xd1D+U7MGkqNuaJ3a+snjUYGLmCMfwhI4d/PfHIxg6HpN2qF0ecgSPgPeSZM UQJFIOiuKr+wy0kaKr5Eh7XUugXzHoM0nlVg7P4X8DnmlXnlfDXbZRp4nDhG3t9REziO rIr2w9UWWwUsksO9HCI/vQ0bvWW4dTty2T1ruVbacI8EEDWsVlD8cHqm5tAr541R8BFR 3w6A==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=LjcP1BYa; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115638-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115638-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id q3-20020a170902e30300b001dda34e84c2si4773498plc.649.2024.03.25.05.56.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 05:56:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-115638-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=LjcP1BYa; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-115638-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-115638-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id E5394B66C9C for ; Mon, 25 Mar 2024 11:33:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B4E3134E9C2; Mon, 25 Mar 2024 02:51:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LjcP1BYa" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7A7D12057F2; Sun, 24 Mar 2024 23:04:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321492; cv=none; b=rho28Lte3SlQewigBzqoYY2ILFK4pI2NLbY9YQtLyFKZlZCsOZPaz01fkx/VZE2k/O9RUz5J2Wv/q21WHC34QzWd6cyLQZCHJb4q2Xto/HDb1dDRPPNb4CiL41B6MXinDUqxl8dF5GzhDDWjeyK1tinhw3VOVIHbUaROBc+ksxw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711321492; c=relaxed/simple; bh=GuTjzVxswbVIyU4Pi1b/se2mxXzB3D3HzgGznfAvHCM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=T+Dobbjf5VCWGeSH7pQBXig85B8A4IdzAMLbr0rOMYGvtiuCVSYYntsRjFEjBZSS9vrvJNJTVyoYzc5D/HA9PbyjviMSgUcxzM+hu3gNn5ITZUNc4bISqx6WzqCgA3iIP3PiXu4OKWUHL1+352TacXZKvAZGTd7DOtOc4ckyozE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LjcP1BYa; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5AE7C43399; Sun, 24 Mar 2024 23:04:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711321492; bh=GuTjzVxswbVIyU4Pi1b/se2mxXzB3D3HzgGznfAvHCM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LjcP1BYaLReZIDjnHhJbhqV735xgLRayrI6ylHUOwSvDJNk3q2YoBLnkocE6ZjHLx O4lP0akVNwot3BBK7bpOp3yvdgfeOaxaS9h0U9xzeth/OyyPgY65ZVIVi9c1i53EDF dQoMatdycsmLSnmOHkJ4j2cV9tZeA1was+OoGMypqSnnV29LumG21DE3giXXedDyD0 qbvhftH0XMrkCWwOlJTDIye+IJNB7gbO/g0Jja7eS5ymqSD4ZO0l0f3B7NfZtPFVVT oMyPpyM9AmdtwWOJXmFaULMz4L3igDGSBlZavn/YSO7d0/6TLaQ2O8yFZ445sJLNBG 8o1+IcCkNQ02w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Yonghong Song , Andrii Nakryiko , Jiri Olsa , Sasha Levin Subject: [PATCH 6.6 217/638] bpf: Mark bpf_spin_{lock,unlock}() helpers with notrace correctly Date: Sun, 24 Mar 2024 18:54:14 -0400 Message-ID: <20240324230116.1348576-218-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324230116.1348576-1-sashal@kernel.org> References: <20240324230116.1348576-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Yonghong Song [ Upstream commit 178c54666f9c4d2f49f2ea661d0c11b52f0ed190 ] Currently tracing is supposed not to allow for bpf_spin_{lock,unlock}() helper calls. This is to prevent deadlock for the following cases: - there is a prog (prog-A) calling bpf_spin_{lock,unlock}(). - there is a tracing program (prog-B), e.g., fentry, attached to bpf_spin_lock() and/or bpf_spin_unlock(). - prog-B calls bpf_spin_{lock,unlock}(). For such a case, when prog-A calls bpf_spin_{lock,unlock}(), a deadlock will happen. The related source codes are below in kernel/bpf/helpers.c: notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) notrace is supposed to prevent fentry prog from attaching to bpf_spin_{lock,unlock}(). But actually this is not the case and fentry prog can successfully attached to bpf_spin_lock(). Siddharth Chintamaneni reported the issue in [1]. The following is the macro definition for above BPF_CALL_1: #define BPF_CALL_x(x, name, ...) \ static __always_inline \ u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ typedef u64 (*btf_##name)(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ { \ return ((btf_##name)____##name)(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ } \ static __always_inline \ u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)) #define BPF_CALL_1(name, ...) BPF_CALL_x(1, name, __VA_ARGS__) The notrace attribute is actually applied to the static always_inline function ____bpf_spin_{lock,unlock}(). The actual callback function bpf_spin_{lock,unlock}() is not marked with notrace, hence allowing fentry prog to attach to two helpers, and this may cause the above mentioned deadlock. Siddharth Chintamaneni actually has a reproducer in [2]. To fix the issue, a new macro NOTRACE_BPF_CALL_1 is introduced which will add notrace attribute to the original function instead of the hidden always_inline function and this fixed the problem. [1] https://lore.kernel.org/bpf/CAE5sdEigPnoGrzN8WU7Tx-h-iFuMZgW06qp0KHWtpvoXxf1OAQ@mail.gmail.com/ [2] https://lore.kernel.org/bpf/CAE5sdEg6yUc_Jz50AnUXEEUh6O73yQ1Z6NV2srJnef0ZrQkZew@mail.gmail.com/ Fixes: d83525ca62cf ("bpf: introduce bpf_spin_lock") Signed-off-by: Yonghong Song Signed-off-by: Andrii Nakryiko Acked-by: Jiri Olsa Link: https://lore.kernel.org/bpf/20240207070102.335167-1-yonghong.song@linux.dev Signed-off-by: Sasha Levin --- include/linux/filter.h | 21 ++++++++++++--------- kernel/bpf/helpers.c | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/linux/filter.h b/include/linux/filter.h index 77db4263d68d7..5090e940ba3e4 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -505,24 +505,27 @@ static inline bool insn_is_zext(const struct bpf_insn *insn) __BPF_MAP(n, __BPF_DECL_ARGS, __BPF_N, u64, __ur_1, u64, __ur_2, \ u64, __ur_3, u64, __ur_4, u64, __ur_5) -#define BPF_CALL_x(x, name, ...) \ +#define BPF_CALL_x(x, attr, name, ...) \ static __always_inline \ u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ typedef u64 (*btf_##name)(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)); \ - u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ - u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ + attr u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)); \ + attr u64 name(__BPF_REG(x, __BPF_DECL_REGS, __BPF_N, __VA_ARGS__)) \ { \ return ((btf_##name)____##name)(__BPF_MAP(x,__BPF_CAST,__BPF_N,__VA_ARGS__));\ } \ static __always_inline \ u64 ____##name(__BPF_MAP(x, __BPF_DECL_ARGS, __BPF_V, __VA_ARGS__)) -#define BPF_CALL_0(name, ...) BPF_CALL_x(0, name, __VA_ARGS__) -#define BPF_CALL_1(name, ...) BPF_CALL_x(1, name, __VA_ARGS__) -#define BPF_CALL_2(name, ...) BPF_CALL_x(2, name, __VA_ARGS__) -#define BPF_CALL_3(name, ...) BPF_CALL_x(3, name, __VA_ARGS__) -#define BPF_CALL_4(name, ...) BPF_CALL_x(4, name, __VA_ARGS__) -#define BPF_CALL_5(name, ...) BPF_CALL_x(5, name, __VA_ARGS__) +#define __NOATTR +#define BPF_CALL_0(name, ...) BPF_CALL_x(0, __NOATTR, name, __VA_ARGS__) +#define BPF_CALL_1(name, ...) BPF_CALL_x(1, __NOATTR, name, __VA_ARGS__) +#define BPF_CALL_2(name, ...) BPF_CALL_x(2, __NOATTR, name, __VA_ARGS__) +#define BPF_CALL_3(name, ...) BPF_CALL_x(3, __NOATTR, name, __VA_ARGS__) +#define BPF_CALL_4(name, ...) BPF_CALL_x(4, __NOATTR, name, __VA_ARGS__) +#define BPF_CALL_5(name, ...) BPF_CALL_x(5, __NOATTR, name, __VA_ARGS__) + +#define NOTRACE_BPF_CALL_1(name, ...) BPF_CALL_x(1, notrace, name, __VA_ARGS__) #define bpf_ctx_range(TYPE, MEMBER) \ offsetof(TYPE, MEMBER) ... offsetofend(TYPE, MEMBER) - 1 diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index a5ce840f4fbef..31da67703307b 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -333,7 +333,7 @@ static inline void __bpf_spin_lock_irqsave(struct bpf_spin_lock *lock) __this_cpu_write(irqsave_flags, flags); } -notrace BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) +NOTRACE_BPF_CALL_1(bpf_spin_lock, struct bpf_spin_lock *, lock) { __bpf_spin_lock_irqsave(lock); return 0; @@ -356,7 +356,7 @@ static inline void __bpf_spin_unlock_irqrestore(struct bpf_spin_lock *lock) local_irq_restore(flags); } -notrace BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) +NOTRACE_BPF_CALL_1(bpf_spin_unlock, struct bpf_spin_lock *, lock) { __bpf_spin_unlock_irqrestore(lock); return 0; -- 2.43.0