Received: by 2002:ab2:60d1:0:b0:1f7:5705:b850 with SMTP id i17csp1217945lqm; Thu, 2 May 2024 08:20:26 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXrn+3Kg5p4FdvF+rz/bSAXjndUqhhWFo3ykdfQeOsM9+K2WlxvDFId3p6rpZze34wQTVPz6WpSuhdPn3i0D/8A+sD8A9OO1JSHYeFfNQ== X-Google-Smtp-Source: AGHT+IHMOxSHGyKzhQ+YrZGS2J/y8xaSU9yf8Ce8ygPz+sGtaEtqpguE04c6WaOiE5yEfT1mS1Hi X-Received: by 2002:a2e:9903:0:b0:2de:d4df:54b8 with SMTP id v3-20020a2e9903000000b002ded4df54b8mr39419lji.7.1714663226396; Thu, 02 May 2024 08:20:26 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1714663226; cv=pass; d=google.com; s=arc-20160816; b=Tkl1U+zyMk3o+zEavq2SnGm4M8bp0u30ELarm+YGNRE25MWNad2zkBgKbspdJtfcA1 fwzqTPY+7g45tz9PB6oPbT7CbFaWBb8fWkshBcOMxe1Lhl+M47JV+deG2gi9Li/pv6pY oKo+QVXSs6L7jpr4/T23C4sC9LO5Jgr6FcDUTXO4XQZIdkqX0Xglint3Max/AAYOzLCj nSmNDoj3XqXdOaK/xjLnCjIfy9SvmRgzoeEdV/q5vdiJT0LFusMbCW4ZJYtZYkORVJvk E4JEdvnkPYHoCYozYno/b7C8+NEe9ujiG4RpYX1NeyB+mA7l46BsCF2AmfaoPnJUOCj/ cOtw== 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=S55OrTCdJRjFTZGYxDgHKNKEtbOhvcBmTa2cAz207eA=; fh=xV1CrEmlUtk+0qtaNiplWI+H5X5pxdZYhnQ7gXeKWao=; b=e1VkwHy666u4/GsGfw62Tz8nw5xcfWA+WE/eUqzR+5sQKJBc39Jph69hDXaBHNTih/ JIwKMwozgHS2b794ul1DlKkyxBZVEssaxcf+FLe0y+b6Qk0t9ZyYYiD8QCkqt87+XccI 9MlgtnUnXKa3vpMiwcv2Re4NYbrASbdcav+njBtJpx9cCvkOFQtPTTU3Z9wVVUOJuLyP Z20l6v75TH4l66aEbBB9FzgAOSALbKReYIQqj5V+NRAPBfrijm/UP9QSwpPMm0AsjeuR he91zXaixHHlbIScn5+d30MpTLNy4y7orI13HHMzn1Qs2MBJEMH7cwuoyEvBm0wak3x7 aQvA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=mDuntxlV; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-166630-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-166630-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [2604:1380:4601:e00::3]) by mx.google.com with ESMTPS id cb26-20020a0564020b7a00b00572b86d6ce0si574580edb.399.2024.05.02.08.20.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 May 2024 08:20:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-166630-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) client-ip=2604:1380:4601:e00::3; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=mDuntxlV; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-166630-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:4601:e00::3 as permitted sender) smtp.mailfrom="linux-kernel+bounces-166630-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 am.mirrors.kernel.org (Postfix) with ESMTPS id EA20F1F21B6F for ; Thu, 2 May 2024 15:20:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 49D6215D5B7; Thu, 2 May 2024 15:19:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mDuntxlV" 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 52BA415DBA0; Thu, 2 May 2024 15:19:19 +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=1714663160; cv=none; b=cOWQW0NQbtIj623fiRqWZjaYlkDkM2G+jCxYmkYHMJ8bN6qGIZf5I3ykBdFTyNUWI6fcgupG0YC5TYLwvuND5W9w9TUjisTxUAsgopaGi3Y75ydaT2A4vQ0xUYr197Gmly8aFwzTEYM5t4DFUibryxFJwLkqusp7mE7QsLB4QJs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1714663160; c=relaxed/simple; bh=3sTB+izpFI5iJiest6J4aeeIECJ5BqcCyOojpodYKP8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version:Content-Type; b=ECoHNQSkvDrMYaYK31IzSk8f40g1+TOLalGIp09PACEoqAzc0miRUE40t7E3piZIh6ooe4OM2r24bkC4q9a41e1QmZQi71TOnT0XEeOFWY3LzQ8Ld+RZgSq/xWUjbpSZOvdXhJDpBUMz0iDtp6SPE6CBDMl4aODzhCjP7EOMYQ0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mDuntxlV; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7DD84C113CC; Thu, 2 May 2024 15:19:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1714663159; bh=3sTB+izpFI5iJiest6J4aeeIECJ5BqcCyOojpodYKP8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mDuntxlV0QB88mQIvth9jUj1MmieGx78fJXjtoMQkt0FOH+NdvqPl34x8S58PHEzo iRA0v/IUzcgjkmVLRA2uKn4cTqkInJ5aKZOYM2PywO1K8LXuWadnIcsffZjbQcjpZg D9JqQiEX/lpP8vbMerooj9BDKvXSsH5SCDvyVv68TC2khBGFG1hIu2dWQCHB4tj1AL /232E7AFaT1QkVimJ6YqlJwMmqyk3GR2i/auJAxMoPCcwnzO868kU3OMM9PNStJo5c 0AGIQY6amKlI7NL6js0J4rZW5wR5wGvXhFPyIk/G5AHsHEwVxEE2BObKuX66ygwJKX AaB9xPBNxHPmg== From: Puranjay Mohan To: Catalin Marinas , Will Deacon , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Zi Shen Lim , Xu Kuohai , Florent Revest , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Kumar Kartikeya Dwivedi , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= Cc: puranjay12@gmail.com Subject: [PATCH bpf-next v6 3/4] arm64, bpf: add internal-only MOV instruction to resolve per-CPU addrs Date: Thu, 2 May 2024 15:18:53 +0000 Message-Id: <20240502151854.9810-4-puranjay@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240502151854.9810-1-puranjay@kernel.org> References: <20240502151854.9810-1-puranjay@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Puranjay Mohan Support an instruction for resolving absolute addresses of per-CPU data from their per-CPU offsets. This instruction is internal-only and users are not allowed to use them directly. They will only be used for internal inlining optimizations for now between BPF verifier and BPF JITs. Since commit 7158627686f0 ("arm64: percpu: implement optimised pcpu access using tpidr_el1"), the per-cpu offset for the CPU is stored in the tpidr_el1/2 register of that CPU. To support this BPF instruction in the ARM64 JIT, the following ARM64 instructions are emitted: mov dst, src // Move src to dst, if src != dst mrs tmp, tpidr_el1/2 // Move per-cpu offset of the current cpu in tmp. add dst, dst, tmp // Add the per cpu offset to the dst. To measure the performance improvement provided by this change, the benchmark in [1] was used: Before: glob-arr-inc : 23.597 ± 0.012M/s arr-inc : 23.173 ± 0.019M/s hash-inc : 12.186 ± 0.028M/s After: glob-arr-inc : 23.819 ± 0.034M/s arr-inc : 23.285 ± 0.017M/s hash-inc : 12.419 ± 0.011M/s [1] https://github.com/anakryiko/linux/commit/8dec900975ef Signed-off-by: Puranjay Mohan Acked-by: Andrii Nakryiko --- arch/arm64/include/asm/insn.h | 7 +++++++ arch/arm64/lib/insn.c | 11 +++++++++++ arch/arm64/net/bpf_jit.h | 6 ++++++ arch/arm64/net/bpf_jit_comp.c | 14 ++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h index db1aeacd4cd9..8de0e39b29f3 100644 --- a/arch/arm64/include/asm/insn.h +++ b/arch/arm64/include/asm/insn.h @@ -135,6 +135,11 @@ enum aarch64_insn_special_register { AARCH64_INSN_SPCLREG_SP_EL2 = 0xF210 }; +enum aarch64_insn_system_register { + AARCH64_INSN_SYSREG_TPIDR_EL1 = 0x4684, + AARCH64_INSN_SYSREG_TPIDR_EL2 = 0x6682, +}; + enum aarch64_insn_variant { AARCH64_INSN_VARIANT_32BIT, AARCH64_INSN_VARIANT_64BIT @@ -686,6 +691,8 @@ u32 aarch64_insn_gen_cas(enum aarch64_insn_register result, } #endif u32 aarch64_insn_gen_dmb(enum aarch64_insn_mb_type type); +u32 aarch64_insn_gen_mrs(enum aarch64_insn_register result, + enum aarch64_insn_system_register sysreg); s32 aarch64_get_branch_offset(u32 insn); u32 aarch64_set_branch_offset(u32 insn, s32 offset); diff --git a/arch/arm64/lib/insn.c b/arch/arm64/lib/insn.c index a635ab83fee3..b008a9b46a7f 100644 --- a/arch/arm64/lib/insn.c +++ b/arch/arm64/lib/insn.c @@ -1515,3 +1515,14 @@ u32 aarch64_insn_gen_dmb(enum aarch64_insn_mb_type type) return insn; } + +u32 aarch64_insn_gen_mrs(enum aarch64_insn_register result, + enum aarch64_insn_system_register sysreg) +{ + u32 insn = aarch64_insn_get_mrs_value(); + + insn &= ~GENMASK(19, 0); + insn |= sysreg << 5; + return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, + insn, result); +} diff --git a/arch/arm64/net/bpf_jit.h b/arch/arm64/net/bpf_jit.h index 23b1b34db088..b627ef7188c7 100644 --- a/arch/arm64/net/bpf_jit.h +++ b/arch/arm64/net/bpf_jit.h @@ -297,4 +297,10 @@ #define A64_ADR(Rd, offset) \ aarch64_insn_gen_adr(0, offset, Rd, AARCH64_INSN_ADR_TYPE_ADR) +/* MRS */ +#define A64_MRS_TPIDR_EL1(Rt) \ + aarch64_insn_gen_mrs(Rt, AARCH64_INSN_SYSREG_TPIDR_EL1) +#define A64_MRS_TPIDR_EL2(Rt) \ + aarch64_insn_gen_mrs(Rt, AARCH64_INSN_SYSREG_TPIDR_EL2) + #endif /* _BPF_JIT_H */ diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index 76b91f36c729..ed8f9716d9d5 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c @@ -877,6 +877,15 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, emit(A64_ORR(1, tmp, dst, tmp), ctx); emit(A64_MOV(1, dst, tmp), ctx); break; + } else if (insn_is_mov_percpu_addr(insn)) { + if (dst != src) + emit(A64_MOV(1, dst, src), ctx); + if (cpus_have_cap(ARM64_HAS_VIRT_HOST_EXTN)) + emit(A64_MRS_TPIDR_EL2(tmp), ctx); + else + emit(A64_MRS_TPIDR_EL1(tmp), ctx); + emit(A64_ADD(1, dst, dst, tmp), ctx); + break; } switch (insn->off) { case 0: @@ -2527,6 +2536,11 @@ bool bpf_jit_supports_arena(void) return true; } +bool bpf_jit_supports_percpu_insn(void) +{ + return true; +} + void bpf_jit_free(struct bpf_prog *prog) { if (prog->jited) { -- 2.40.1