Received: by 2002:ab2:7988:0:b0:1f4:b336:87c4 with SMTP id g8csp90142lqj; Thu, 11 Apr 2024 10:36:12 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCW64SEgI8TNkv5SRhxpV7NIPzyh1wQ6BEizMIHBoKJ9moBs3RFJvZhVlLGAT/7RUk4+uJl/3Ce0wGHSmwmi0jivvuAPq4XbsW/XSz0J4A== X-Google-Smtp-Source: AGHT+IH8ab7oQN1dcWnaevZSF0ZbbXHz4lMdjEUJAuZqt64jL6jIMxG9Xq3BVUPtJNcugaM52jQf X-Received: by 2002:ac8:5d46:0:b0:434:e3e4:7eee with SMTP id g6-20020ac85d46000000b00434e3e47eeemr496696qtx.18.1712856972006; Thu, 11 Apr 2024 10:36:12 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712856971; cv=pass; d=google.com; s=arc-20160816; b=OwwbXLyzy4GP7jSZSdEoXKjT6pGb+GjfvfoSGILoQXhpx+ON8b9NZrJqKW0K5hwli5 YH9l5M3gov9sDyhxh+et4G3V8l+hqhsb4a9uKWd6jPyvM0w9fE2fQAs4fLA3TlwghN+j EQce+6QCR6XslulunUepZbKchKHbqyE3yTz5ypHikknsU9wIcJ2gyMdBxDBgwyCo6/Wu xuCqOpLNwH8CNLScrwLcle3JxZWN9qcQHGZnpXSQPwSAoz2MsV2DehNEmNetpBfpkGOp 7l9fJ9sR4TlQgiHtw2lR+vpif0AuzNT0yq+yjsbJyTp34WnR86ZY4BMuNrXEwtv70bFA hH2Q== 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:message-id:date:subject:cc:to :from:dkim-signature; bh=FOv8sFpN1l1aG5Cz5ttusdbxwZKN2VFsPm1+5tEpgoI=; fh=gMFRjFG9KasUYvwr0WK5/KYxde7tueU8fZSQFYWo6W4=; b=JS6B0OxA2yNStKlGBYmG+sATWak2FBhRdwIATKWWjdUL5JAJ316dOCwOvLJxntrS22 xNpRVOYJarl+MZny+2nXo04an6YnWGs0fubBnYbwedvPCEJ2x3XDqyNwmdkirY1nF8V8 ZnP8U6TnDK66+LZS/KPWRCil+Jwh/rfdreskbeNg/UtPzj8y9LU8VvaZjlxnh5dBRkOD uM4ynP75ZfNYUGp+cvWvVXE/X7kSWB8JRkHlJWSDr/XJ80HD8CaaOGaKBkWP+HIhtNcy Kho84ixkYNt2ozouiGADkR9cgUD1xCT4oMhjhGKZ2VAZEsKTTDUKZlBBrk92CqL80/JI sB5Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nUquO4a1; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-141270-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-141270-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id 7-20020ac85907000000b004346100ebe8si1951292qty.538.2024.04.11.10.36.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Apr 2024 10:36:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-141270-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nUquO4a1; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-141270-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-141270-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 ny.mirrors.kernel.org (Postfix) with ESMTPS id A435E1C222C3 for ; Thu, 11 Apr 2024 17:36:11 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 59B9113A3E3; Thu, 11 Apr 2024 16:05:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nUquO4a1" 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 1D65F13A24D; Thu, 11 Apr 2024 16:05:44 +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=1712851545; cv=none; b=idQUIKsHgRfCI9ZLz4wqUc1++gXhb4U/73FmIpIs4KZRHnzEE9CbRkQJmkUdht6NAzyppwyUI9gC0B6ZZTcB8Ef314A1To5iqaK6RpJ51Ep/8TV5RCMMKHOoVslcKjm+Vat2ve5wyZTIIdd/Z188MSB+46Yc8YrHxDdfkE2/R8U= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712851545; c=relaxed/simple; bh=B2UPTwvZ8YRZSWkmTYRU/Sp3RonIqh19BHZ95160r7o=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=utQI8CnPyPIt9ujRO4uwK8rtpPnIDsT3OaZzIJI+ir5jS4bniyeivsVl17yoPR32LyaoO0ux8Yb4jVue5qI51w8gu5OqN5a21O0R+Xw1LjuvFDK+AYBo4BgdjYlFKwH7PhfGk3osTXXcg67lKuekssIzBBu5Fz9vvOVWQhFPbvw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nUquO4a1; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id E6739C113CE; Thu, 11 Apr 2024 16:05:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1712851544; bh=B2UPTwvZ8YRZSWkmTYRU/Sp3RonIqh19BHZ95160r7o=; h=From:To:Cc:Subject:Date:From; b=nUquO4a1/6ZTCNZbRLuv4NNQcqijBDkbIKlsZevPGl461/ZAm/d/negh5wrvgBCEY R1teI17GnUQ8WHezjocLnqxNY/YMCaQzL6Atj23S2xvmsKGYIJpQN2PbQLQvmn3ZpL fXgFWWrrB1dxwNQnNpbdq+kT/DxZA0kF5nLY58SYRgrOrT5+pwun09BfqFJZQ4nrSU lBV8GXmV0rOpfqCddCsAahKorRytLs4uqJ0ZtXVAw0IqI62FLkfq3S8CI4TwHztRUU JnFs5quLmmnkCSs0ER4U9IQFddPY6ug8EGp9CfxVibDAZWQYbaUOr4gCPUVMw+WuAe c6XnkSextJR5g== From: Mike Rapoport To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Andy Lutomirski , Arnd Bergmann , Catalin Marinas , Christoph Hellwig , Helge Deller , Lorenzo Stoakes , Luis Chamberlain , Mark Rutland , Masami Hiramatsu , Mathieu Desnoyers , Michael Ellerman , Mike Rapoport , Palmer Dabbelt , Peter Zijlstra , Russell King , Song Liu , Steven Rostedt , Thomas Gleixner , Uladzislau Rezki , Will Deacon , bpf@vger.kernel.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-modules@vger.kernel.org, linux-parisc@vger.kernel.org, linux-riscv@lists.infradead.org, linux-trace-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, x86@kernel.org Subject: [RFC PATCH 0/7] x86/module: use large ROX pages for text allocations Date: Thu, 11 Apr 2024 19:05:19 +0300 Message-ID: <20240411160526.2093408-1-rppt@kernel.org> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: "Mike Rapoport (IBM)" Hi, These patches add support for using large ROX pages for allocations of executable memory on x86. They address Andy's comments [1] about having executable mappings for code that was not completely formed. The approach taken is to allocate ROX memory along with writable but not executable memory and use the writable copy to perform relocations and alternatives patching. After the module text gets into its final shape, the contents of the writable memory is copied into the actual ROX location using text poking. The allocations of the ROX memory use vmalloc(VMAP_ALLOW_HUGE_MAP) to allocate PMD aligned memory, fill that memory with invalid instructions and in the end remap it as ROX. Portions of these large pages are handed out to execmem_alloc() callers without any changes to the permissions. When the memory is freed with execmem_free() it is invalidated again so that it won't contain stale instructions. The module memory allocation, x86 code dealing with relocations and alternatives patching takes into account the existence of the two copies, the writable memory and the ROX memory at the actual allocated virtual address. This is an early RFC, it is not well tested and there is a lot of room for improvement. For example, the locking of execmem_cache can be made more fine grained, freeing of PMD-sized pages from execmem_cache can be implemented with a shrinker, the large pages can be removed from the direct map when they are added to the cache and restored there when they are free from the cache. Still, I'd like to hear feedback on the approach in general before moving forward with polishing the details. The series applies on top of v4 of "jit/text allocator" [2] and also available at git: https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v4%2bx86-rox [1] https://lore.kernel.org/all/a17c65c6-863f-4026-9c6f-a04b659e9ab4@app.fastmail.com [2] https://lore.kernel.org/linux-mm/20240411160051.2093261-1-rppt@kernel.org Mike Rapoport (IBM) (6): asm-generic: introduce text-patching.h mm: vmalloc: don't account for number of nodes for HUGE_VMAP allocations module: prepare to handle ROX allocations for text x86/module: perpare module loading for ROX allocations of text execmem: add support for cache of large ROX pages x86/module: enable ROX caches for module text Song Liu (1): ftrace: Add swap_func to ftrace_process_locs() arch/alpha/include/asm/Kbuild | 1 + arch/arc/include/asm/Kbuild | 1 + .../include/asm/{patch.h => text-patching.h} | 0 arch/arm/kernel/ftrace.c | 2 +- arch/arm/kernel/jump_label.c | 2 +- arch/arm/kernel/kgdb.c | 2 +- arch/arm/kernel/patch.c | 2 +- arch/arm/probes/kprobes/core.c | 2 +- arch/arm/probes/kprobes/opt-arm.c | 2 +- .../asm/{patching.h => text-patching.h} | 0 arch/arm64/kernel/ftrace.c | 2 +- arch/arm64/kernel/jump_label.c | 2 +- arch/arm64/kernel/kgdb.c | 2 +- arch/arm64/kernel/patching.c | 2 +- arch/arm64/kernel/probes/kprobes.c | 2 +- arch/arm64/kernel/traps.c | 2 +- arch/arm64/net/bpf_jit_comp.c | 2 +- arch/csky/include/asm/Kbuild | 1 + arch/hexagon/include/asm/Kbuild | 1 + arch/loongarch/include/asm/Kbuild | 1 + arch/m68k/include/asm/Kbuild | 1 + arch/microblaze/include/asm/Kbuild | 1 + arch/mips/include/asm/Kbuild | 1 + arch/nios2/include/asm/Kbuild | 1 + arch/openrisc/include/asm/Kbuild | 1 + .../include/asm/{patch.h => text-patching.h} | 0 arch/parisc/kernel/ftrace.c | 2 +- arch/parisc/kernel/jump_label.c | 2 +- arch/parisc/kernel/kgdb.c | 2 +- arch/parisc/kernel/kprobes.c | 2 +- arch/parisc/kernel/patch.c | 2 +- arch/powerpc/include/asm/kprobes.h | 2 +- .../asm/{code-patching.h => text-patching.h} | 0 arch/powerpc/kernel/crash_dump.c | 2 +- arch/powerpc/kernel/epapr_paravirt.c | 2 +- arch/powerpc/kernel/jump_label.c | 2 +- arch/powerpc/kernel/kgdb.c | 2 +- arch/powerpc/kernel/kprobes.c | 2 +- arch/powerpc/kernel/module_32.c | 2 +- arch/powerpc/kernel/module_64.c | 2 +- arch/powerpc/kernel/optprobes.c | 2 +- arch/powerpc/kernel/process.c | 2 +- arch/powerpc/kernel/security.c | 2 +- arch/powerpc/kernel/setup_32.c | 2 +- arch/powerpc/kernel/setup_64.c | 2 +- arch/powerpc/kernel/static_call.c | 2 +- arch/powerpc/kernel/trace/ftrace.c | 2 +- arch/powerpc/kernel/trace/ftrace_64_pg.c | 2 +- arch/powerpc/lib/code-patching.c | 2 +- arch/powerpc/lib/feature-fixups.c | 2 +- arch/powerpc/lib/test-code-patching.c | 2 +- arch/powerpc/lib/test_emulate_step.c | 2 +- arch/powerpc/mm/book3s32/mmu.c | 2 +- arch/powerpc/mm/book3s64/hash_utils.c | 2 +- arch/powerpc/mm/book3s64/slb.c | 2 +- arch/powerpc/mm/kasan/init_32.c | 2 +- arch/powerpc/mm/mem.c | 2 +- arch/powerpc/mm/nohash/44x.c | 2 +- arch/powerpc/mm/nohash/book3e_pgtable.c | 2 +- arch/powerpc/mm/nohash/tlb.c | 2 +- arch/powerpc/net/bpf_jit_comp.c | 2 +- arch/powerpc/perf/8xx-pmu.c | 2 +- arch/powerpc/perf/core-book3s.c | 2 +- arch/powerpc/platforms/85xx/smp.c | 2 +- arch/powerpc/platforms/86xx/mpc86xx_smp.c | 2 +- arch/powerpc/platforms/cell/smp.c | 2 +- arch/powerpc/platforms/powermac/smp.c | 2 +- arch/powerpc/platforms/powernv/idle.c | 2 +- arch/powerpc/platforms/powernv/smp.c | 2 +- arch/powerpc/platforms/pseries/smp.c | 2 +- arch/powerpc/xmon/xmon.c | 2 +- arch/riscv/errata/andes/errata.c | 2 +- arch/riscv/errata/sifive/errata.c | 2 +- arch/riscv/errata/thead/errata.c | 2 +- .../include/asm/{patch.h => text-patching.h} | 0 arch/riscv/include/asm/uprobes.h | 2 +- arch/riscv/kernel/alternative.c | 2 +- arch/riscv/kernel/cpufeature.c | 3 +- arch/riscv/kernel/ftrace.c | 2 +- arch/riscv/kernel/jump_label.c | 2 +- arch/riscv/kernel/patch.c | 2 +- arch/riscv/kernel/probes/kprobes.c | 2 +- arch/riscv/net/bpf_jit_comp64.c | 2 +- arch/riscv/net/bpf_jit_core.c | 2 +- arch/sh/include/asm/Kbuild | 1 + arch/sparc/include/asm/Kbuild | 1 + arch/um/kernel/um_arch.c | 16 +- arch/x86/entry/vdso/vma.c | 3 +- arch/x86/include/asm/alternative.h | 14 +- arch/x86/include/asm/text-patching.h | 1 + arch/x86/kernel/alternative.c | 152 ++++++---- arch/x86/kernel/ftrace.c | 41 ++- arch/x86/kernel/module.c | 17 +- arch/x86/mm/init.c | 29 +- arch/xtensa/include/asm/Kbuild | 1 + include/asm-generic/text-patching.h | 5 + include/linux/execmem.h | 25 ++ include/linux/ftrace.h | 2 + include/linux/module.h | 11 + include/linux/text-patching.h | 15 + kernel/module/main.c | 70 ++++- kernel/module/strict_rwx.c | 3 + kernel/trace/ftrace.c | 13 +- mm/execmem.c | 278 +++++++++++++++++- mm/vmalloc.c | 9 +- 105 files changed, 663 insertions(+), 193 deletions(-) rename arch/arm/include/asm/{patch.h => text-patching.h} (100%) rename arch/arm64/include/asm/{patching.h => text-patching.h} (100%) rename arch/parisc/include/asm/{patch.h => text-patching.h} (100%) rename arch/powerpc/include/asm/{code-patching.h => text-patching.h} (100%) rename arch/riscv/include/asm/{patch.h => text-patching.h} (100%) create mode 100644 include/asm-generic/text-patching.h create mode 100644 include/linux/text-patching.h -- 2.43.0