netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Runqing Yang <rainkin1993@gmail.com>,
	Andrii Nakryiko <andrii@kernel.org>,
	Sasha Levin <sashal@kernel.org>,
	ast@kernel.org, daniel@iogearbox.net, netdev@vger.kernel.org,
	bpf@vger.kernel.org
Subject: [PATCH AUTOSEL 5.17 016/135] libbpf: Fix a bug with checking bpf_probe_read_kernel() support in old kernels
Date: Mon, 30 May 2022 09:29:34 -0400	[thread overview]
Message-ID: <20220530133133.1931716-16-sashal@kernel.org> (raw)
In-Reply-To: <20220530133133.1931716-1-sashal@kernel.org>

From: Runqing Yang <rainkin1993@gmail.com>

[ Upstream commit d252a4a499a07bec21c65873f605c3a1ef52ffed ]

Background:
Libbpf automatically replaces calls to BPF bpf_probe_read_{kernel,user}
[_str]() helpers with bpf_probe_read[_str](), if libbpf detects that
kernel doesn't support new APIs. Specifically, libbpf invokes the
probe_kern_probe_read_kernel function to load a small eBPF program into
the kernel in which bpf_probe_read_kernel API is invoked and lets the
kernel checks whether the new API is valid. If the loading fails, libbpf
considers the new API invalid and replaces it with the old API.

static int probe_kern_probe_read_kernel(void)
{
	struct bpf_insn insns[] = {
		BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),	/* r1 = r10 (fp) */
		BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),	/* r1 += -8 */
		BPF_MOV64_IMM(BPF_REG_2, 8),		/* r2 = 8 */
		BPF_MOV64_IMM(BPF_REG_3, 0),		/* r3 = 0 */
		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_probe_read_kernel),
		BPF_EXIT_INSN(),
	};
	int fd, insn_cnt = ARRAY_SIZE(insns);

	fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL,
                           "GPL", insns, insn_cnt, NULL);
	return probe_fd(fd);
}

Bug:
On older kernel versions [0], the kernel checks whether the version
number provided in the bpf syscall, matches the LINUX_VERSION_CODE.
If not matched, the bpf syscall fails. eBPF However, the
probe_kern_probe_read_kernel code does not set the kernel version
number provided to the bpf syscall, which causes the loading process
alwasys fails for old versions. It means that libbpf will replace the
new API with the old one even the kernel supports the new one.

Solution:
After a discussion in [1], the solution is using BPF_PROG_TYPE_TRACEPOINT
program type instead of BPF_PROG_TYPE_KPROBE because kernel does not
enfoce version check for tracepoint programs. I test the patch in old
kernels (4.18 and 4.19) and it works well.

  [0] https://elixir.bootlin.com/linux/v4.19/source/kernel/bpf/syscall.c#L1360
  [1] Closes: https://github.com/libbpf/libbpf/issues/473

Signed-off-by: Runqing Yang <rainkin1993@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220409144928.27499-1-rainkin1993@gmail.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 tools/lib/bpf/libbpf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 94a6a8543cbc..41515a770e3a 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -4564,7 +4564,7 @@ static int probe_kern_probe_read_kernel(void)
 	};
 	int fd, insn_cnt = ARRAY_SIZE(insns);
 
-	fd = bpf_prog_load(BPF_PROG_TYPE_KPROBE, NULL, "GPL", insns, insn_cnt, NULL);
+	fd = bpf_prog_load(BPF_PROG_TYPE_TRACEPOINT, NULL, "GPL", insns, insn_cnt, NULL);
 	return probe_fd(fd);
 }
 
-- 
2.35.1


  parent reply	other threads:[~2022-05-30 13:47 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20220530133133.1931716-1-sashal@kernel.org>
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 003/135] ath11k: fix the warning of dev_wake in mhi_pm_disable_transition() Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 005/135] selftests/bpf: Fix vfs_link kprobe definition Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 006/135] selftests/bpf: Fix parsing of prog types in UAPI hdr for bpftool sync Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 007/135] ath11k: Change max no of active probe SSID and BSSID to fw capability Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 008/135] mwifiex: add mutex lock for call in mwifiex_dfs_chan_sw_work_queue Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 009/135] b43legacy: Fix assigning negative value to unsigned variable Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 010/135] b43: " Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 011/135] ipw2x00: Fix potential NULL dereference in libipw_xmit() Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 012/135] ipv6: fix locking issues with loops over idev->addr_list Sasha Levin
2022-05-30 13:29 ` Sasha Levin [this message]
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 017/135] mac80211: minstrel_ht: fix where rate stats are stored (fixes debugfs output) Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 023/135] sfc: ef10: Fix assigning negative value to unsigned variable Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 025/135] rtw88: fix incorrect frequency reported Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 026/135] rtw88: 8821c: fix debugfs rssi value Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 029/135] tcp: consume incoming skb leading to a reset Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 033/135] net: sched: use queue_mapping to pick tx queue Sasha Levin
2022-05-30 13:29 ` [PATCH AUTOSEL 5.17 038/135] ath9k: fix QCA9561 PA bias level Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 052/135] ath11k: disable spectral scan during spectral deinit Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 056/135] ath10k: skip ath10k_halt during suspend for driver state RESTARTING Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 061/135] ath11k: fix warning of not found station for bssid in message Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 063/135] ipv6: Don't send rs packets to the interface of ARPHRD_TUNNEL Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 064/135] net/mlx5: fs, delete the FTE when there are no rules attached to it Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 066/135] mlxsw: spectrum_dcb: Do not warn about priority changes Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 067/135] mlxsw: Treat LLDP packets as control Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 075/135] net/mlx5: Increase FW pre-init timeout for health recovery Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 078/135] net: remove two BUG() from skb_checksum_help() Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 090/135] rtlwifi: Use pr_warn instead of WARN_ONCE Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 091/135] mt76: mt7921: accept rx frames with non-standard VHT MCS10-11 Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 092/135] mt76: fix encap offload ethernet type check Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 099/135] usbnet: Run unregister_netdev() before unbind() again Sasha Levin
2022-05-30 13:30 ` [PATCH AUTOSEL 5.17 100/135] Bluetooth: HCI: Add HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN quirk Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 112/135] net: phy: micrel: Allow probing without .driver_data Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 115/135] rtw89: cfo: check mac_id to avoid out-of-bounds Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 122/135] can: mcp251xfd: silence clang's -Wunaligned-access warning Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 124/135] net: ipa: ignore endianness if there is no header Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 126/135] selftests/bpf: Add missing trampoline program type to trampoline_count test Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 129/135] rxrpc: Return an error to sendmsg if call failed Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 130/135] rxrpc, afs: Fix selection of abort codes Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 131/135] afs: Adjust ACK interpretation to try and cope with NAT Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 132/135] eth: tg3: silence the GCC 12 array-bounds warning Sasha Levin
2022-05-30 13:31 ` [PATCH AUTOSEL 5.17 134/135] selftests/bpf: fix btf_dump/btf_dump due to recent clang change Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220530133133.1931716-16-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=rainkin1993@gmail.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).