Skip to content

fix invalid sleeping in detect_cache_attributes()

Wen Yang lkml stable 2 versions – New

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v2 Latest10 patches 0 repliesNew
  2. v16 patches 3 repliesSuperseded

Patches in v2 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/10cacheinfo: Use RISC-V's init_cache_level() as generic OF implementationarch/riscv/kernel/cacheinfo.c drivers/base/cacheinfo.c include/linux/cacheinfo.h+46 -380 replies
2/10cacheinfo: Return error code in init_of_cache_level()drivers/base/cacheinfo.c+7 -30 replies
3/10cacheinfo: Check 'cache-unified' property to count cache leavesdrivers/base/cacheinfo.c+26 -110 replies
4/10ACPI: PPTT: Remove acpi_find_cache_levels()drivers/acpi/pptt.c+6 -150 replies
5/10ACPI: PPTT: Update acpi_find_last_cache_level() to acpi_get_cache_info()arch/arm64/kernel/cacheinfo.c drivers/acpi/pptt.c include/linux/cacheinfo.h+63 -330 replies
6/10arch_topology: Build cacheinfo from primary CPUarch/riscv/kernel/cacheinfo.c drivers/base/arch_topology.c drivers/base/cacheinfo.c +1 more+65 -240 replies
7/10cacheinfo: Initialize variables in fetch_cache_info()drivers/base/cacheinfo.c+1 -10 replies
8/10cacheinfo: Fix LLC is not exported through sysfsdrivers/base/cacheinfo.c+11 -50 replies
9/10drivers: base: cacheinfo: Update cpu_map_populated during CPU Hotplugdrivers/base/cacheinfo.c+6 -00 replies
10/10arm64: tegra: Update cache propertiesarch/arm64/boot/dts/nvidia/tegra194.dtsi arch/arm64/boot/dts/nvidia/tegra210.dtsi arch/arm64/boot/dts/nvidia/tegra234.dtsi+49 -00 replies

Reviews trailers per patch

8 of 10 patches have a Reviewed-by or Acked-by.

PatchConor DooleyPalmer DabbeltKrzysztof KozlowskiJeremy LintonRafael J. WysockiSudeep HollaPierre GondoisYicong Yang
1/10R-b A-b
2/10A-b
3/10T-b
4/10A-b R-b A-b
5/10A-b R-b A-b
6/10A-b R-b
7/10R-b
8/10R-b R-b
9/10R-b R-b
10/10

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 8 reviewers.

Read the v2 thread

Cover letter [PATCH 6.1 v2 00/10] fix invalid sleeping in detect_cache_attributes()

commit 3fcbf1c77d08 ("arch_topology: Fix cache attributes detection in the CPU hotplug path")
adds a call to detect_cache_attributes() to populate the cacheinfo before updating the siblings mask. detect_cache_attributes() allocates memory and can take the PPTT mutex (on ACPI platforms). On PREEMPT_RT kernels, on secondary CPUs, this triggers a:
'BUG: sleeping function called from invalid context'
as the code is executed with preemption and interrupts disabled:

 | BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:46
 | in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 0, name: swapper/111
 | preempt_count: 1, expected: 0
 | RCU nest depth: 1, expected: 1
 | 3 locks held by swapper/111/0:
 |  #0:  (&pcp->lock){+.+.}-{3:3}, at: get_page_from_freelist+0x218/0x12c8
 |  #1:  (rcu_read_lock){....}-{1:3}, at: rt_spin_trylock+0x48/0xf0
 |  #2:  (&zone->lock){+.+.}-{3:3}, at: rmqueue_bulk+0x64/0xa80
 | irq event stamp: 0
 | hardirqs last  enabled at (0):  0x0
 | hardirqs last disabled at (0):  copy_process+0x5dc/0x1ab8
 | softirqs last  enabled at (0):  copy_process+0x5dc/0x1ab8
 | softirqs last disabled at (0):  0x0
 | Preemption disabled at:
 |  migrate_enable+0x30/0x130
 | CPU: 111 PID: 0 Comm: swapper/111 Tainted: G        W          6.0.0-rc4-rt6-[...]
 | Call trace:
 |  __kmalloc+0xbc/0x1e8
 |  detect_cache_attributes+0x2d4/0x5f0
 |  update_siblings_masks+0x30/0x368
 |  store_cpu_topology+0x78/0xb8
 |  secondary_start_kernel+0xd0/0x198
 |  __secondary_switched+0xb0/0xb4

Pierre fixed this issue in the upstream 6.3 and the original series is follows:
https://lore.kernel.org/all/[email protected]/

We also encountered the same issue on 6.1 stable branch, and need to backport this series:
cacheinfo: Use RISC-V's init_cache_level() as generic OF implementation
cacheinfo: Return error code in init_of_cache_level()
cacheinfo: Check 'cache-unified' property to count cache leaves
ACPI: PPTT: Remove acpi_find_cache_levels()
ACPI: PPTT: Update acpi_find_last_cache_level() to acpi_get_cache_info()
arch_topology: Build cacheinfo from primary CPU

And there was a non-trivial number of follow-on fixes for patches in this series, as pointed out by Greg in the 6.1.156-RC1 review:
cacheinfo: Initialize variables in fetch_cache_info()
cacheinfo: Fix LLC is not exported through sysfs
drivers: base: cacheinfo: Update cpu_map_populated during CPU Hotplug

Finally, Jon discovered an issue in the Tegra platform caused by these patches:
https://lore.kernel.org/all/[email protected]/
So we also need to backport the following patch:
arm64: tegra: Update cache properties

K Prateek Nayak (1):
drivers: base: cacheinfo: Update cpu_map_populated during CPU Hotplug

Pierre Gondois (8):
cacheinfo: Use RISC-V's init_cache_level() as generic OF
implementation
cacheinfo: Return error code in init_of_cache_level()
cacheinfo: Check 'cache-unified' property to count cache leaves
ACPI: PPTT: Remove acpi_find_cache_levels()
ACPI: PPTT: Update acpi_find_last_cache_level() to
acpi_get_cache_info()
arch_topology: Build cacheinfo from primary CPU
cacheinfo: Initialize variables in fetch_cache_info()
arm64: tegra: Update cache properties

Yicong Yang (1):
cacheinfo: Fix LLC is not exported through sysfs

 arch/arm64/boot/dts/nvidia/tegra194.dtsi |  15 +++
 arch/arm64/boot/dts/nvidia/tegra210.dtsi |   1 +
 arch/arm64/boot/dts/nvidia/tegra234.dtsi |  33 +++++
 arch/arm64/kernel/cacheinfo.c            |  11 +-
 arch/riscv/kernel/cacheinfo.c            |  42 ------
 drivers/acpi/pptt.c                      |  93 ++++++++------
 drivers/base/arch_topology.c             |  12 +-
 drivers/base/cacheinfo.c                 | 156 +++++++++++++++++++----
 include/linux/cacheinfo.h                |  11 +-
 9 files changed, 262 insertions(+), 112 deletions(-)
Signature · 1 line
2.25.1