stable.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: Michael Ellerman <mpe@ellerman.id.au>,
	Paul Menzel <pmenzel@molgen.mpg.de>,
	Peter Zijlstra <peterz@infradead.org>,
	Christophe Leroy <christophe.leroy@csgroup.eu>,
	Sasha Levin <sashal@kernel.org>,
	linuxppc-dev@lists.ozlabs.org
Subject: [PATCH AUTOSEL 5.15 75/98] powerpc/code-patching: Pre-map patch area
Date: Fri,  1 Apr 2022 10:37:19 -0400	[thread overview]
Message-ID: <20220401143742.1952163-75-sashal@kernel.org> (raw)
In-Reply-To: <20220401143742.1952163-1-sashal@kernel.org>

From: Michael Ellerman <mpe@ellerman.id.au>

[ Upstream commit 591b4b268435f00d2f0b81f786c2c7bd5ef66416 ]

Paul reported a warning with DEBUG_ATOMIC_SLEEP=y:

  BUG: sleeping function called from invalid context at include/linux/sched/mm.h:256
  in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper/0
  preempt_count: 0, expected: 0
  ...
  Call Trace:
    dump_stack_lvl+0xa0/0xec (unreliable)
    __might_resched+0x2f4/0x310
    kmem_cache_alloc+0x220/0x4b0
    __pud_alloc+0x74/0x1d0
    hash__map_kernel_page+0x2cc/0x390
    do_patch_instruction+0x134/0x4a0
    arch_jump_label_transform+0x64/0x78
    __jump_label_update+0x148/0x180
    static_key_enable_cpuslocked+0xd0/0x120
    static_key_enable+0x30/0x50
    check_kvm_guest+0x60/0x88
    pSeries_smp_probe+0x54/0xb0
    smp_prepare_cpus+0x3e0/0x430
    kernel_init_freeable+0x20c/0x43c
    kernel_init+0x30/0x1a0
    ret_from_kernel_thread+0x5c/0x64

Peter pointed out that this is because do_patch_instruction() has
disabled interrupts, but then map_patch_area() calls map_kernel_page()
then hash__map_kernel_page() which does a sleeping memory allocation.

We only see the warning in KVM guests with SMT enabled, which is not
particularly common, or on other platforms if CONFIG_KPROBES is
disabled, also not common. The reason we don't see it in most
configurations is that another path that happens to have interrupts
enabled has allocated the required page tables for us, eg. there's a
path in kprobes init that does that. That's just pure luck though.

As Christophe suggested, the simplest solution is to do a dummy
map/unmap when we initialise the patching, so that any required page
table levels are pre-allocated before the first call to
do_patch_instruction(). This works because the unmap doesn't free any
page tables that were allocated by the map, it just clears the PTE,
leaving the page table levels there for the next map.

Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
Debugged-by: Peter Zijlstra <peterz@infradead.org>
Suggested-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220223015821.473097-1-mpe@ellerman.id.au
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/powerpc/lib/code-patching.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index c5ed98823835..b76b31196be1 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -47,9 +47,14 @@ int raw_patch_instruction(u32 *addr, struct ppc_inst instr)
 #ifdef CONFIG_STRICT_KERNEL_RWX
 static DEFINE_PER_CPU(struct vm_struct *, text_poke_area);
 
+static int map_patch_area(void *addr, unsigned long text_poke_addr);
+static void unmap_patch_area(unsigned long addr);
+
 static int text_area_cpu_up(unsigned int cpu)
 {
 	struct vm_struct *area;
+	unsigned long addr;
+	int err;
 
 	area = get_vm_area(PAGE_SIZE, VM_ALLOC);
 	if (!area) {
@@ -57,6 +62,15 @@ static int text_area_cpu_up(unsigned int cpu)
 			cpu);
 		return -1;
 	}
+
+	// Map/unmap the area to ensure all page tables are pre-allocated
+	addr = (unsigned long)area->addr;
+	err = map_patch_area(empty_zero_page, addr);
+	if (err)
+		return err;
+
+	unmap_patch_area(addr);
+
 	this_cpu_write(text_poke_area, area);
 
 	return 0;
-- 
2.34.1


  parent reply	other threads:[~2022-04-01 15:02 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-01 14:36 [PATCH AUTOSEL 5.15 01/98] drm: Add orientation quirk for GPD Win Max Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 02/98] ath5k: fix OOB in ath5k_eeprom_read_pcal_info_5111 Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 03/98] drm/amd/display: Add signal type check when verify stream backends same Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 04/98] drm/amd/amdgpu/amdgpu_cs: fix refcount leak of a dma_fence obj Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 05/98] drm/amd/display: Fix memory leak Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 06/98] drm/amd/display: Use PSR version selected during set_psr_caps Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 07/98] usb: gadget: tegra-xudc: Do not program SPARAM Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 08/98] usb: gadget: tegra-xudc: Fix control endpoint's definitions Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 09/98] usb: cdnsp: fix cdnsp_decode_trb function to properly handle ret value Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 10/98] ptp: replace snprintf with sysfs_emit Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 11/98] drm/amdkfd: Don't take process mutex for svm ioctls Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 12/98] powerpc: dts: t104xrdb: fix phy type for FMAN 4/5 Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 13/98] ath11k: fix kernel panic during unload/load ath11k modules Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 14/98] ath11k: pci: fix crash on suspend if board file is not found Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 15/98] ath11k: mhi: use mhi_sync_power_up() Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 16/98] net/smc: Send directly when TCP_CORK is cleared Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 17/98] drm/bridge: Add missing pm_runtime_put_sync Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 18/98] bpf: Make dst_port field in struct bpf_sock 16-bit wide Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 19/98] scsi: mvsas: Replace snprintf() with sysfs_emit() Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 20/98] scsi: bfa: " Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 21/98] drm/v3d: fix missing unlock Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 22/98] power: supply: axp20x_battery: properly report current when discharging Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 23/98] mt76: mt7921: fix crash when startup fails Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 24/98] mt76: dma: initialize skip_unmap in mt76_dma_rx_fill Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 25/98] cfg80211: don't add non transmitted BSS to 6GHz scanned channels Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 26/98] libbpf: Fix build issue with llvm-readelf Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 27/98] ipv6: make mc_forwarding atomic Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 28/98] net: initialize init_net earlier Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 29/98] powerpc: Set crashkernel offset to mid of RMA region Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 30/98] drm/amdgpu: Fix recursive locking warning Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 31/98] scsi: smartpqi: Fix kdump issue when controller is locked up Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 32/98] PCI: aardvark: Fix support for MSI interrupts Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 33/98] iommu/arm-smmu-v3: fix event handling soft lockup Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 34/98] usb: ehci: add pci device support for Aspeed platforms Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 35/98] PCI: endpoint: Fix alignment fault error in copy tests Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 36/98] tcp: Don't acquire inet_listen_hashbucket::lock with disabled BH Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 37/98] PCI: pciehp: Add Qualcomm quirk for Command Completed erratum Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 38/98] scsi: mpi3mr: Fix reporting of actual data transfer size Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 39/98] scsi: mpi3mr: Fix memory leaks Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 40/98] powerpc/set_memory: Avoid spinlock recursion in change_page_attr() Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 41/98] power: supply: axp288-charger: Set Vhold to 4.4V Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 42/98] net/mlx5e: Disable TX queues before registering the netdev Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 43/98] usb: dwc3: pci: Set the swnode from inside dwc3_pci_quirks() Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 44/98] iwlwifi: mvm: Correctly set fragmented EBS Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 45/98] iwlwifi: mvm: Passively scan non PSC channels only when requested so Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 46/98] iwlwifi: mvm: move only to an enabled channel Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 47/98] drm/msm/dsi: Remove spurious IRQF_ONESHOT flag Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 48/98] ipv4: Invalidate neighbour for broadcast address upon address addition Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 49/98] dm ioctl: prevent potential spectre v1 gadget Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 50/98] dm: requeue IO if mapping table not yet available Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 51/98] drm/amdkfd: make CRAT table missing message informational only Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 52/98] vfio/pci: Stub vfio_pci_vga_rw when !CONFIG_VFIO_PCI_VGA Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 53/98] scsi: pm8001: Fix pm80xx_pci_mem_copy() interface Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 54/98] scsi: pm8001: Fix pm8001_mpi_task_abort_resp() Sasha Levin
2022-04-01 14:36 ` [PATCH AUTOSEL 5.15 55/98] scsi: pm8001: Fix task leak in pm8001_send_abort_all() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 56/98] scsi: pm8001: Fix tag leaks on error Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 57/98] scsi: pm8001: Fix memory leak in pm8001_chip_fw_flash_update_req() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 58/98] mt76: mt7915: fix injected MPDU transmission to not use HW A-MSDU Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 59/98] drm/simpledrm: Add "panel orientation" property on non-upright mounted LCD panels Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 60/98] powerpc/64s/hash: Make hash faults work in NMI context Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 61/98] mt76: mt7615: Fix assigning negative values to unsigned variable Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 62/98] scsi: aha152x: Fix aha152x_setup() __setup handler return value Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 63/98] scsi: hisi_sas: Free irq vectors in order for v3 HW Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 64/98] scsi: hisi_sas: Limit users changing debugfs BIST count value Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 65/98] net/smc: correct settings of RMB window update limit Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 66/98] mips: ralink: fix a refcount leak in ill_acc_of_setup() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 67/98] macvtap: advertise link netns via netlink Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 68/98] tuntap: add sanity checks about msg_controllen in sendmsg Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 69/98] iommu/iova: Improve 32-bit free space estimate Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 70/98] Bluetooth: Fix not checking for valid hdev on bt_dev_{info,warn,err,dbg} Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 71/98] Bluetooth: use memset avoid memory leaks Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 72/98] bnxt_en: Eliminate unintended link toggle during FW reset Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 73/98] PCI: endpoint: Fix misused goto label Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 74/98] MIPS: fix fortify panic when copying asm exception handlers Sasha Levin
2022-04-01 14:37 ` Sasha Levin [this message]
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 76/98] powerpc/64e: Tie PPC_BOOK3E_64 to PPC_FSL_BOOK3E Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 77/98] powerpc/secvar: fix refcount leak in format_show() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 78/98] scsi: libfc: Fix use after free in fc_exch_abts_resp() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 79/98] can: isotp: set default value for N_As to 50 micro seconds Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 80/98] can: etas_es58x: es58x_fd_rx_event_msg(): initialize rx_event_msg before calling es58x_check_msg_len() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 81/98] riscv: Fixed misaligned memory access. Fixed pointer comparison Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 82/98] net: account alternate interface name memory Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 83/98] net: limit altnames to 64k total Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 84/98] net/mlx5e: Remove overzealous validations in netlink EEPROM query Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 85/98] platform/x86: hp-wmi: Fix SW_TABLET_MODE detection method Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 86/98] net: sfp: add 2500base-X quirk for Lantech SFP module Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 87/98] usb: dwc3: omap: fix "unbalanced disables for smps10_out1" on omap5evm Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 88/98] mt76: fix monitor mode crash with sdio driver Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 89/98] xtensa: fix DTC warning unit_address_format Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 90/98] MIPS: ingenic: correct unit node address Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 91/98] Bluetooth: Fix use after free in hci_send_acl Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 92/98] netfilter: conntrack: revisit gc autotuning Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 93/98] netlabel: fix out-of-bounds memory accesses Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 94/98] ceph: fix inode reference leakage in ceph_get_snapdir() Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 95/98] ceph: fix memory leak in ceph_readdir when note_last_dentry returns error Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 96/98] lib/Kconfig.debug: add ARCH dependency for FUNCTION_ALIGN option Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 97/98] init/main.c: return 1 from handled __setup() functions Sasha Levin
2022-04-01 14:37 ` [PATCH AUTOSEL 5.15 98/98] minix: fix bug when opening a file with O_DIRECT 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=20220401143742.1952163-75-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=christophe.leroy@csgroup.eu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=peterz@infradead.org \
    --cc=pmenzel@molgen.mpg.de \
    --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).