Received: by 2002:a05:7412:37c9:b0:e2:908c:2ebd with SMTP id jz9csp2178663rdb; Thu, 21 Sep 2023 10:37:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEi4DAF1QaJgEbMASBQvT3K6ADsVEm545Y+/XIQXIogg59m6Vd0PvJnZLmOwngFQI+gL10l X-Received: by 2002:a05:6830:1098:b0:6bb:1629:ab44 with SMTP id y24-20020a056830109800b006bb1629ab44mr6634723oto.7.1695317832011; Thu, 21 Sep 2023 10:37:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695317831; cv=none; d=google.com; s=arc-20160816; b=p2pW+KhJESFBjF4CoHl2bKFCsfSDW3t/czEvh6sQXm7kvmAGCVgZM83cjO6tDnvl83 SpPITXAq0QuiL7GwxJsic6RX9ybBMXPa4Dj7EJLaDUR1tKMgkUa1MFKYqFFhD91VihDY /hyi+dLsSHjE3Gfmr2hBFXVjTdwIOSm4AOISeM+2wKYUdTtxlux1kT++heijzCLLIOVV uh+P+pUqmGqsJtYGiH35IM2pvJeRYX/TXuqNO2r7p9R4Jnts7rIqMemOYZgqIrsjnsOC ZLt2MHXgc2HzqTpzEaV5YzLQ5HXZs9n7Dz1QLfDL9qMAqxpdLyqf+p/Pw+6YcNYqxCqo EHXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:references :in-reply-to:subject:to:from:dkim-signature; bh=PT7BtDLW9rg1Fg+vRZKPaEJl+Jt/zEwGch4+5k14AJA=; fh=KXKRb5+lvl0krxQWwr5mARvvztFhmqr6C23/eEiG7ac=; b=SqfUrVGU6cKs7WC3zj9RsPKZm/CTp8FLJnrsfGHLoLXo5rCNY2/YYTYKN/d/7W+ZYg 9KeEEm2TSLOYQNqaPK1gz+Mb3zXaLj6ffw6rvvijDsdB9VJ241cpksjNQVgWS4ZHcgsj vDVwLfvVOhAMuOuPOpAMO5Q6BspSjLufRDh7Hh6QnntE+VY9umv9BYqp5qD2QPxuwikG 53eQCp3FBOgHC1fitKYrrNtTSgSeMd8rlmXJH8Nd1B8kXt7Ank0aYfM8TjTOCvYvj9qM kKQc52S7Nz215C/7M+4T3eZwDrrOiv6TEkgDuhvPxGH41sjoZSZGNVcIBlAgGQon8pS+ 8wTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=jbTXabZF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from groat.vger.email (groat.vger.email. [23.128.96.35]) by mx.google.com with ESMTPS id l62-20020a633e41000000b00569362d6cebsi1438224pga.2.2023.09.21.10.37.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Sep 2023 10:37:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) client-ip=23.128.96.35; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=jbTXabZF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.35 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 0FDF28080EF2; Thu, 21 Sep 2023 10:30:19 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230081AbjIURaC (ORCPT + 99 others); Thu, 21 Sep 2023 13:30:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43162 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230089AbjIUR3D (ORCPT ); Thu, 21 Sep 2023 13:29:03 -0400 Received: from mail-lj1-x236.google.com (mail-lj1-x236.google.com [IPv6:2a00:1450:4864:20::236]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 199394CB32; Thu, 21 Sep 2023 10:14:51 -0700 (PDT) Received: by mail-lj1-x236.google.com with SMTP id 38308e7fff4ca-2bffc55af02so21366791fa.2; Thu, 21 Sep 2023 10:14:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695316490; x=1695921290; darn=vger.kernel.org; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :from:to:cc:subject:date:message-id:reply-to; bh=PT7BtDLW9rg1Fg+vRZKPaEJl+Jt/zEwGch4+5k14AJA=; b=jbTXabZFaLasSJgCpvAUWon2To2ZzV3zfOiWkLo8Ex8+zHD2pWle9/dawKl+y5w+VG jDGWAUTp25OnC/oqhGoCix9eu/5vtieZytoAXW0Zance5sjmhWY8dQCa2TbMDyOUm1Mj QOFPjVEXWZYGceZJvj01yqMckvLHDWt4V60btBPzHsrtvc0dACSlOyAPvivJ9Xj2eQX8 Fj1nF8xK/FHSoABdTLtJrqy2SgQnVjKWhNSNIK58ejdWLab0bS1/1gaENvcZbJoGu2gA KEUFx4K2VuYnt/upx6fM4k9M9GhHCSJm1T6EiKZy2CoOQ/zTcxIZH/zHK1NwTzGqNWZM 017g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695316490; x=1695921290; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=PT7BtDLW9rg1Fg+vRZKPaEJl+Jt/zEwGch4+5k14AJA=; b=QXW6vtjPi2ZCND6KOwAq32eKGnpVKhQqlgGWmLr+wwfd35EPldFT/A30/0HwVZdbOB jbOuUkHBwNrMDtz2rMydCtfPSgyDHrIElovUnEabLBXE2xnn/sDNlIpz1bH2ON8E4ZxE 7FRl9AwpitFn5BYDwpie2VwEFnO3mul/zOx0+z9yrlsr9pXoE6SXMlaAagcZ5QPr/a77 S1OVaqkLM+vxjt8OjCO5qLjg0gxhDObWVbIgyakjU5I/0rztvpav3SuOyrsI15fqnscy 4SlZ45IhX+wVmxtH/B+LjtULfDq6kQ2THSrwXuJZk/BhCRC2e+odyvA2BDRUZNFceVfj 2ddw== X-Gm-Message-State: AOJu0YxUvPaQyBAP+9O6qlv5pea3U8gYx1FnQ6pRrubZcwUaum3tPCrH C90ishhVue3gntAYatqnDb83KQgqSzigYopAEhY= X-Received: by 2002:adf:e490:0:b0:319:735c:73e1 with SMTP id i16-20020adfe490000000b00319735c73e1mr4959090wrm.4.1695306820635; Thu, 21 Sep 2023 07:33:40 -0700 (PDT) Received: from localhost (54-240-197-231.amazon.com. [54.240.197.231]) by smtp.gmail.com with ESMTPSA id e24-20020a5d5958000000b00317ab75748bsm1916735wri.49.2023.09.21.07.33.39 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 21 Sep 2023 07:33:40 -0700 (PDT) From: Puranjay Mohan To: Xu Kuohai , ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, song@kernel.org, catalin.marinas@arm.com, mark.rutland@arm.com, bpf@vger.kernel.org, kpsingh@kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH bpf-next v5 1/3] arm64: patching: Add aarch64_insn_copy() In-Reply-To: <9084901f-730c-cf33-9337-f18a3c17283f@huaweicloud.com> References: <20230908144320.2474-1-puranjay12@gmail.com> <20230908144320.2474-2-puranjay12@gmail.com> <9084901f-730c-cf33-9337-f18a3c17283f@huaweicloud.com> Date: Thu, 21 Sep 2023 14:33:34 +0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Thu, 21 Sep 2023 10:30:19 -0700 (PDT) Xu Kuohai writes: > On 9/8/2023 10:43 PM, Puranjay Mohan wrote: >> This will be used by BPF JIT compiler to dump JITed binary to a RX huge >> page, and thus allow multiple BPF programs sharing the a huge (2MB) >> page. >> >> The bpf_prog_pack allocator that implements the above feature allocates >> a RX/RW buffer pair. The JITed code is written to the RW buffer and then >> this function will be used to copy the code from RW to RX buffer. >> >> Signed-off-by: Puranjay Mohan >> Acked-by: Song Liu >> --- >> arch/arm64/include/asm/patching.h | 1 + >> arch/arm64/kernel/patching.c | 41 +++++++++++++++++++++++++++++++ >> 2 files changed, 42 insertions(+) >> >> diff --git a/arch/arm64/include/asm/patching.h b/arch/arm64/include/asm/patching.h >> index 68908b82b168..f78a0409cbdb 100644 >> --- a/arch/arm64/include/asm/patching.h >> +++ b/arch/arm64/include/asm/patching.h >> @@ -8,6 +8,7 @@ int aarch64_insn_read(void *addr, u32 *insnp); >> int aarch64_insn_write(void *addr, u32 insn); >> >> int aarch64_insn_write_literal_u64(void *addr, u64 val); >> +void *aarch64_insn_copy(void *dst, const void *src, size_t len); >> >> int aarch64_insn_patch_text_nosync(void *addr, u32 insn); >> int aarch64_insn_patch_text(void *addrs[], u32 insns[], int cnt); >> diff --git a/arch/arm64/kernel/patching.c b/arch/arm64/kernel/patching.c >> index b4835f6d594b..243d6ae8d2d8 100644 >> --- a/arch/arm64/kernel/patching.c >> +++ b/arch/arm64/kernel/patching.c >> @@ -105,6 +105,47 @@ noinstr int aarch64_insn_write_literal_u64(void *addr, u64 val) >> return ret; >> } >> >> +/** >> + * aarch64_insn_copy - Copy instructions into (an unused part of) RX memory >> + * @dst: address to modify >> + * @src: source of the copy >> + * @len: length to copy >> + * >> + * Useful for JITs to dump new code blocks into unused regions of RX memory. >> + */ >> +noinstr void *aarch64_insn_copy(void *dst, const void *src, size_t len) >> +{ >> + unsigned long flags; >> + size_t patched = 0; >> + size_t size; >> + void *waddr; >> + void *ptr; >> + int ret; >> + > > check whether the input address and length are aligned to instruction size? Will add a check that dst is aligned to instruction size and len is a multiple of instruction size. > >> + raw_spin_lock_irqsave(&patch_lock, flags); >> + >> + while (patched < len) { >> + ptr = dst + patched; >> + size = min_t(size_t, PAGE_SIZE - offset_in_page(ptr), >> + len - patched); >> + >> + waddr = patch_map(ptr, FIX_TEXT_POKE0); >> + ret = copy_to_kernel_nofault(waddr, src + patched, size); >> + patch_unmap(FIX_TEXT_POKE0); >> + >> + if (ret < 0) { >> + raw_spin_unlock_irqrestore(&patch_lock, flags); >> + return NULL; >> + } >> + patched += size; >> + } >> + raw_spin_unlock_irqrestore(&patch_lock, flags); >> + >> + caches_clean_inval_pou((uintptr_t)dst, (uintptr_t)dst + len); >> + > > seems flush_icache_range() or something like should be called here to > ensure the other CPUs' pipelines are cleared, otherwise the old instructions > at the dst address might be executed on other CPUs after the copy is complete, > which is not expected. Sure, I will use flush_icache_range() in place of caches_clean_inval_pou() in the next version > >> + return dst; >> +} >> + >> int __kprobes aarch64_insn_patch_text_nosync(void *addr, u32 insn) >> { >> u32 *tp = addr;