All of lore.kernel.org
 help / color / mirror / Atom feed
* [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
@ 2018-08-28 23:28 Grygorii Strashko
  2018-08-29 14:08 ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-28 23:28 UTC (permalink / raw)
  To: linux-rt-users, Mike Galbraith; +Cc: Sebastian Andrzej Siewior, LKML

Hi

I can see below back traces during secondary CPUs initialization (boot) on TI's AM6 SoC (ARM64 4 CPUs)
with debug options enabled it happens without CONFIG_NUMA=n (log 1) and with CONFIG_NUMA=y.
This is TI branch, there are no RT specific changes.

I've also found the similar issue was reported by Mike Galbraith [1]

[1] https://www.spinics.net/lists/linux-rt-users/msg19058.html

===== Log 1 =====
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.66-rt40-02415-g6a801ed-dirty (a0226610local@uda0226610) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)) #5 SMP PREEMPT RT Mon Aug 27 21:04:26 CDT 2018
[    0.000000] Boot CPU: AArch64 Processor [410fd034]
[    0.000000] Machine model: Texas Instruments AM654 Base Board
[    0.000000] earlycon: ns16550a0 at MMIO32 0x0000000002800000 (options '')
[    0.000000] bootconsole [ns16550a0] enabled
[    0.000000] cma: Reserved 512 MiB at 0x00000000c0000000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: Trusted OS migration not required
[    0.000000] psci: SMC Calling Convention v1.1
[    0.000000] percpu: Embedded 2 pages/cpu @ffff80087feb0000 s55504 r8192 d67376 u131072
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: enabling workaround for ARM erratum 845719
[    0.000000] Speculative Store Bypass Disable mitigation not required
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 65088
[    0.000000] Kernel command line: console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 mtdparts=47040000.ospi.0:512k(ospi.tiboot3),2m(ospi.tispl),5m(ospi.u-boot),128k(ospi.env),-@8m(ospi.rootfs) root=PARTUUID=f2c6fe8e-0t
[    0.000000] PID hash table entries: 4096 (order: -1, 32768 bytes)
[    0.000000] Dentry cache hash table entries: 524288 (order: 9, 33554432 bytes)
[    0.000000] Inode-cache hash table entries: 262144 (order: 5, 2097152 bytes)
[    0.000000] software IO TLB [mem 0xf9dd0000-0xfddd0000] (64MB) mapped at [ffff800079dd0000-ffff80007ddcffff]
[    0.000000] Memory: 3511168K/4169728K available (7806K kernel code, 1000K rwdata, 3008K rodata, 512K init, 14066K bss, 134272K reserved, 524288K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     modules : 0xffff000000000000 - 0xffff000008000000   (   128 MB)
[    0.000000]     vmalloc : 0xffff000008000000 - 0xffff7bdfffff0000   (126847 GB)
[    0.000000]       .text : 0xffff000008080000 - 0xffff000008820000   (  7808 KB)
[    0.000000]     .rodata : 0xffff000008820000 - 0xffff000008b20000   (  3072 KB)
[    0.000000]       .init : 0xffff000008b20000 - 0xffff000008ba0000   (   512 KB)
[    0.000000]       .data : 0xffff000008ba0000 - 0xffff000008c9a008   (  1001 KB)
[    0.000000]        .bss : 0xffff000008c9a008 - 0xffff000009a56af0   ( 14067 KB)
[    0.000000]     fixed   : 0xffff7fdffe7b0000 - 0xffff7fdffec00000   (  4416 KB)
[    0.000000]     PCI I/O : 0xffff7fdffee00000 - 0xffff7fdfffe00000   (    16 MB)
[    0.000000]     vmemmap : 0xffff7fe000000000 - 0xffff800000000000   (   128 GB maximum)
[    0.000000]               0xffff7fe000000000 - 0xffff7fe002200000   (    34 MB actual)
[    0.000000]     memory  : 0xffff800000000000 - 0xffff800880000000   ( 34816 MB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] Running RCU self tests
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000]  RCU event tracing is enabled.
[    0.000000]  RCU lockdep checking is enabled.
[    0.000000]  RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=4.
[    0.000000]  RCU priority boosting: priority 1 delay 500 ms.
[    0.000000]  RCU callback double-/use-after-free debug enabled.
[    0.000000]  No expedited grace period (rcu_normal_after_boot).
[    0.000000]  Tasks RCU enabled.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[    0.000000] GICv3: no VLPI support, no direct LPI support
[    0.000000] ITS [mem 0x01820000-0x0182ffff]
[    0.000000] GIC: enabling workaround for ITS: Socionext Synquacer pre-ITS
[    0.000000] ITS@0x0000000001820000: allocated 1048576 Devices @8fc000000 (flat, esz 8, psz 64K, shr 0)
[    0.000000] ITS: using cache flushing for cmd queue
[    0.000000] GIC: using LPI property table @0x00000008fd730000
[    0.000000] ITS: Allocated 1792 chunks for LPIs
[    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x0000000001880000
[    0.000000] CPU0: using LPI pending table @0x00000008ffd80000
[    0.000000] GIC: using cache flushing for LPI property table
[    0.000000] arch_timer: cp15 timer(s) running at 200.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x2e2049d3e8, max_idle_ns: 440795210634 ns
[    0.000007] sched_clock: 56 bits at 200MHz, resolution 5ns, wraps every 4398046511102ns
[    0.000811] Console: colour dummy device 80x25
[    0.392008] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[    0.392013] ... MAX_LOCKDEP_SUBCLASSES:  8
[    0.392016] ... MAX_LOCK_DEPTH:          48
[    0.392020] ... MAX_LOCKDEP_KEYS:        8191
[    0.392024] ... CLASSHASH_SIZE:          4096
[    0.392027] ... MAX_LOCKDEP_ENTRIES:     32768
[    0.392031] ... MAX_LOCKDEP_CHAINS:      65536
[    0.392034] ... CHAINHASH_SIZE:          32768
[    0.392038]  memory used by lock dependency info: 7391 kB
[    0.392041]  per task-struct memory footprint: 1920 bytes
[    0.393633] Calibrating delay loop (skipped), value calculated using timer frequency.. 400.00 BogoMIPS (lpj=800000)
[    0.393652] pid_max: default: 32768 minimum: 301
[    0.394444] Security Framework initialized
[    0.394724] Mount-cache hash table entries: 8192 (order: 0, 65536 bytes)
[    0.394770] Mountpoint-cache hash table entries: 8192 (order: 0, 65536 bytes)
[    0.418449] ASID allocator initialised with 32768 entries
[    0.522829] Hierarchical SRCU implementation.
[    0.553963] PCI/MSI: /soc0/interrupt-controller@1800000/gic-its@1000000 domain created
[    0.562559] Platform MSI: /soc0/interrupt-controller@1800000/gic-its@1000000 domain created
[    0.579342] smp: Bringing up secondary CPUs ...
[    0.625109] Detected VIPT I-cache on CPU1
[    0.625149] GICv3: CPU1: found redistributor 1 region 0:0x00000000018a0000
[    0.625176] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
[    0.625182] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/1
[    0.625189] 1 lock held by swapper/1/0:
[    0.625193]  #0:  ((pa_lock).lock){+.+.}, at: [<ffff0000081a73e8>] get_page_from_freelist+0x160/0xd20
[    0.625228] irq event stamp: 0
[    0.625233] hardirqs last  enabled at (0): [<          (null)>]           (null)
[    0.625246] hardirqs last disabled at (0): [<ffff0000080c2f50>] copy_process.isra.5.part.6+0x2c0/0x18a8
[    0.625255] softirqs last  enabled at (0): [<ffff0000080c2f50>] copy_process.isra.5.part.6+0x2c0/0x18a8
[    0.625260] softirqs last disabled at (0): [<          (null)>]           (null)
[    0.625263] Preemption disabled at:
[    0.625274] [<ffff0000080909b8>] secondary_start_kernel+0x80/0x118
[    0.625286] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.14.66-rt40-02415-g6a801ed-dirty #5
[    0.625290] Hardware name: Texas Instruments AM654 Base Board (DT)
[    0.625295] Call trace:
[    0.625306] [<ffff000008089d60>] dump_backtrace+0x0/0x400
[    0.625313] [<ffff00000808a174>] show_stack+0x14/0x20
[    0.625324] [<ffff0000087db658>] dump_stack+0xac/0xe4
[    0.625333] [<ffff0000080f26b4>] ___might_sleep+0x154/0x228
[    0.625342] [<ffff0000087f291c>] rt_spin_lock+0x5c/0x70
[    0.625350] [<ffff0000081a73e8>] get_page_from_freelist+0x160/0xd20
[    0.625359] [<ffff0000081a8804>] __alloc_pages_nodemask+0xe4/0xc68
[    0.625368] [<ffff00000845bb10>] its_allocate_pending_table+0x68/0xa8
[    0.625375] [<ffff00000845e5b4>] its_cpu_init+0x294/0x374
[    0.625382] [<ffff00000845b4a4>] gic_cpu_init.part.6+0x15c/0x170
[    0.625388] [<ffff00000845b4cc>] gic_starting_cpu+0x14/0x20
[    0.625396] [<ffff0000080c5ad4>] cpuhp_invoke_callback+0x9c/0x260
[    0.625404] [<ffff0000080c7c38>] notify_cpu_starting+0x70/0xa8
[    0.625412] [<ffff0000080909e4>] secondary_start_kernel+0xac/0x118

===== Log 2 =====
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.66-rt40-02415-g6a801ed-dirty (a0226610local@uda0226610) (gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11)) #4 SMP PREEMPT RT Mon Aug 27 20:44:32 CDT 2018
[    0.000000] Boot CPU: AArch64 Processor [410fd034]
[    0.000000] Machine model: Texas Instruments AM654 Base Board
[    0.000000] earlycon: ns16550a0 at MMIO32 0x0000000002800000 (options '')
[    0.000000] bootconsole [ns16550a0] enabled
[    0.000000] cma: Reserved 512 MiB at 0x00000000c0000000
[    0.000000] NUMA: No NUMA configuration found
[    0.000000] NUMA: Faking a node at [mem 0x0000000000000000-0x00000008ffffffff]
[    0.000000] NUMA: NODE_DATA [mem 0x8ffffdc80-0x8fffffc7f]
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000080000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x00000008ffffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080000000-0x000000009e7fffff]
[    0.000000]   node   0: [mem 0x00000000a0000000-0x00000000ffffffff]
[    0.000000]   node   0: [mem 0x0000000880000000-0x00000008ffffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000008ffffffff]
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: Trusted OS migration not required
[    0.000000] psci: SMC Calling Convention v1.1
[    0.000000] percpu: Embedded 2 pages/cpu @ffff80087feb0000 s55760 r8192 d67120 u131072
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: enabling workaround for ARM erratum 845719
[    0.000000] Speculative Store Bypass Disable mitigation not required
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 65088
[    0.000000] Policy zone: Normal
[    0.000000] Kernel command line: console=ttyS2,115200n8 earlycon=ns16550a,mmio32,0x02800000 mtdparts=47040000.ospi.0:512k(ospi.tiboot3),2m(ospi.tispl),5m(ospi.u-boot),128k(ospi.env),-@8m(ospi.rootfs) root=PARTUUID=f2c6fe8e-0t
[    0.000000] PID hash table entries: 4096 (order: -1, 32768 bytes)
[    0.000000] software IO TLB [mem 0xf9dd0000-0xfddd0000] (64MB) mapped at [ffff800079dd0000-ffff80007ddcffff]
[    0.000000] Memory: 3545856K/4169728K available (7870K kernel code, 1062K rwdata, 3008K rodata, 512K init, 14071K bss, 99584K reserved, 524288K cma-reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     modules : 0xffff000000000000 - 0xffff000008000000   (   128 MB)
[    0.000000]     vmalloc : 0xffff000008000000 - 0xffff7bdfffff0000   (126847 GB)
[    0.000000]       .text : 0xffff000008080000 - 0xffff000008830000   (  7872 KB)
[    0.000000]     .rodata : 0xffff000008830000 - 0xffff000008b30000   (  3072 KB)
[    0.000000]       .init : 0xffff000008b30000 - 0xffff000008bb0000   (   512 KB)
[    0.000000]       .data : 0xffff000008bb0000 - 0xffff000008cb9808   (  1063 KB)
[    0.000000]        .bss : 0xffff000008cb9808 - 0xffff000009a775f0   ( 14072 KB)
[    0.000000]     fixed   : 0xffff7fdffe7b0000 - 0xffff7fdffec00000   (  4416 KB)
[    0.000000]     PCI I/O : 0xffff7fdffee00000 - 0xffff7fdfffe00000   (    16 MB)
[    0.000000]     vmemmap : 0xffff7fe000000000 - 0xffff800000000000   (   128 GB maximum)
[    0.000000]               0xffff7fe000000000 - 0xffff7fe002200000   (    34 MB actual)
[    0.000000]     memory  : 0xffff800000000000 - 0xffff800880000000   ( 34816 MB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] Running RCU self tests
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000]  RCU event tracing is enabled.
[    0.000000]  RCU lockdep checking is enabled.
[    0.000000]  RCU restricting CPUs from NR_CPUS=64 to nr_cpu_ids=4.
[    0.000000]  RCU priority boosting: priority 1 delay 500 ms.
[    0.000000]  RCU callback double-/use-after-free debug enabled.
[    0.000000]  No expedited grace period (rcu_normal_after_boot).
[    0.000000]  Tasks RCU enabled.
[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[    0.000000] GICv3: no VLPI support, no direct LPI support
[    0.000000] ITS [mem 0x01820000-0x0182ffff]
[    0.000000] GIC: enabling workaround for ITS: Socionext Synquacer pre-ITS
[    0.000000] ITS@0x0000000001820000: allocated 1048576 Devices @8ff000000 (flat, esz 8, psz 64K, shr 0)
[    0.000000] ITS: using cache flushing for cmd queue
[    0.000000] GIC: using LPI property table @0x00000008ff930000
[    0.000000] ITS: Allocated 1792 chunks for LPIs
[    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x0000000001880000
[    0.000000] CPU0: using LPI pending table @0x00000008ffd80000
[    0.000000] GIC: using cache flushing for LPI property table
[    0.000000] arch_timer: cp15 timer(s) running at 200.00MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x2e2049d3e8, max_idle_ns: 440795210634 ns
[    0.000006] sched_clock: 56 bits at 200MHz, resolution 5ns, wraps every 4398046511102ns
[    0.000803] Console: colour dummy device 80x25
[    0.447578] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[    0.447582] ... MAX_LOCKDEP_SUBCLASSES:  8
[    0.447586] ... MAX_LOCK_DEPTH:          48
[    0.447589] ... MAX_LOCKDEP_KEYS:        8191
[    0.447592] ... CLASSHASH_SIZE:          4096
[    0.447596] ... MAX_LOCKDEP_ENTRIES:     32768
[    0.447600] ... MAX_LOCKDEP_CHAINS:      65536
[    0.447603] ... CHAINHASH_SIZE:          32768
[    0.447606]  memory used by lock dependency info: 7391 kB
[    0.447610]  per task-struct memory footprint: 1920 bytes
[    0.449497] Calibrating delay loop (skipped), value calculated using timer frequency.. 400.00 BogoMIPS (lpj=800000)
[    0.449521] pid_max: default: 32768 minimum: 301
[    0.450213] Security Framework initialized
[    0.465026] Dentry cache hash table entries: 524288 (order: 9, 33554432 bytes)
[    0.665565] Inode-cache hash table entries: 262144 (order: 5, 2097152 bytes)
[    0.665800] Mount-cache hash table entries: 8192 (order: 0, 65536 bytes)
[    0.665855] Mountpoint-cache hash table entries: 8192 (order: 0, 65536 bytes)
[    0.689219] ASID allocator initialised with 32768 entries
[    0.809703] Hierarchical SRCU implementation.
[    0.840914] PCI/MSI: /soc0/interrupt-controller@1800000/gic-its@1000000 domain created
[    0.849549] Platform MSI: /soc0/interrupt-controller@1800000/gic-its@1000000 domain created
[    0.866228] smp: Bringing up secondary CPUs ...
[    0.912009] Detected VIPT I-cache on CPU1
[    0.912050] GICv3: CPU1: found redistributor 1 region 0:0x00000000018a0000
[    0.912081] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
[    0.912087] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/1
[    0.912092] 1 lock held by swapper/1/0:
[    0.912096]  #0:  ((pa_lock).lock){+.+.}, at: [<ffff0000081ad194>] get_page_from_freelist+0x154/0xeb0
[    0.912130] irq event stamp: 0
[    0.912135] hardirqs last  enabled at (0): [<          (null)>]           (null)
[    0.912147] hardirqs last disabled at (0): [<ffff0000080c31c0>] copy_process.isra.5.part.6+0x438/0x1920
[    0.912156] softirqs last  enabled at (0): [<ffff0000080c31c0>] copy_process.isra.5.part.6+0x438/0x1920
[    0.912160] softirqs last disabled at (0): [<          (null)>]           (null)
[    0.912164] Preemption disabled at:
[    0.912175] [<ffff0000080909b8>] secondary_start_kernel+0x80/0x118
[    0.912188] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.14.66-rt40-02415-g6a801ed-dirty #4
[    0.912192] Hardware name: Texas Instruments AM654 Base Board (DT)
[    0.912197] Call trace:
[    0.912207] [<ffff000008089d60>] dump_backtrace+0x0/0x400
[    0.912215] [<ffff00000808a174>] show_stack+0x14/0x20
[    0.912225] [<ffff0000087ecc78>] dump_stack+0xac/0xe4
[    0.912234] [<ffff0000080f3014>] ___might_sleep+0x154/0x228
[    0.912245] [<ffff00000880400c>] rt_spin_lock+0x5c/0x70
[    0.912251] [<ffff0000081ad194>] get_page_from_freelist+0x154/0xeb0
[    0.912258] [<ffff0000081ae530>] __alloc_pages_nodemask+0x108/0xc88
[    0.912268] [<ffff000008201d20>] alloc_page_interleave+0x18/0xa0
[    0.912275] [<ffff0000082023cc>] alloc_pages_current+0xcc/0xe0
[    0.912287] [<ffff00000846bb00>] its_allocate_pending_table+0x60/0xa0
[    0.912295] [<ffff00000846e5d8>] its_cpu_init+0x2a0/0x380
[    0.912303] [<ffff00000846b484>] gic_cpu_init.part.6+0x15c/0x170
[    0.912311] [<ffff00000846b4ac>] gic_starting_cpu+0x14/0x20
[    0.912319] [<ffff0000080c5c5c>] cpuhp_invoke_callback+0x9c/0x260
[    0.912327] [<ffff0000080c7dc0>] notify_cpu_starting+0x70/0xa8
[    0.912335] [<ffff0000080909e4>] secondary_start_kernel+0xac/0x118
[    0.912396] CPU1: using LPI pending table @0x00000008fd460000
[    0.912486] CPU1: Booted secondary processor [410fd034]
[    0.985563] Detected VIPT I-cache on CPU2
[    0.985607] GICv3: CPU2: found redistributor 100 region 0:0x00000000018c0000
[    0.985695] CPU2: using LPI pending table @0x00000008fd4f0000


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-28 23:28 [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974 Grygorii Strashko
@ 2018-08-29 14:08 ` Sebastian Andrzej Siewior
  2018-08-29 21:28   ` Grygorii Strashko
  0 siblings, 1 reply; 12+ messages in thread
From: Sebastian Andrzej Siewior @ 2018-08-29 14:08 UTC (permalink / raw)
  To: Grygorii Strashko; +Cc: linux-rt-users, Mike Galbraith, LKML

On 2018-08-28 18:28:42 [-0500], Grygorii Strashko wrote:
> Hi
Hi,

…
> ===== Log 1 =====
> [    0.625149] GICv3: CPU1: found redistributor 1 region 0:0x00000000018a0000
> [    0.625176] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
> [    0.625182] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/1
> [    0.625189] 1 lock held by swapper/1/0:
> [    0.625193]  #0:  ((pa_lock).lock){+.+.}, at: [<ffff0000081a73e8>] get_page_from_freelist+0x160/0xd20
> [    0.625228] irq event stamp: 0
> [    0.625233] hardirqs last  enabled at (0): [<          (null)>]           (null)
> [    0.625246] hardirqs last disabled at (0): [<ffff0000080c2f50>] copy_process.isra.5.part.6+0x2c0/0x18a8
> [    0.625255] softirqs last  enabled at (0): [<ffff0000080c2f50>] copy_process.isra.5.part.6+0x2c0/0x18a8
> [    0.625260] softirqs last disabled at (0): [<          (null)>]           (null)
> [    0.625263] Preemption disabled at:
> [    0.625274] [<ffff0000080909b8>] secondary_start_kernel+0x80/0x118
> [    0.625286] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.14.66-rt40-02415-g6a801ed-dirty #5
> [    0.625290] Hardware name: Texas Instruments AM654 Base Board (DT)
> [    0.625295] Call trace:
> [    0.625306] [<ffff000008089d60>] dump_backtrace+0x0/0x400
> [    0.625313] [<ffff00000808a174>] show_stack+0x14/0x20
> [    0.625324] [<ffff0000087db658>] dump_stack+0xac/0xe4
> [    0.625333] [<ffff0000080f26b4>] ___might_sleep+0x154/0x228
> [    0.625342] [<ffff0000087f291c>] rt_spin_lock+0x5c/0x70
> [    0.625350] [<ffff0000081a73e8>] get_page_from_freelist+0x160/0xd20
> [    0.625359] [<ffff0000081a8804>] __alloc_pages_nodemask+0xe4/0xc68
> [    0.625368] [<ffff00000845bb10>] its_allocate_pending_table+0x68/0xa8
> [    0.625375] [<ffff00000845e5b4>] its_cpu_init+0x294/0x374
> [    0.625382] [<ffff00000845b4a4>] gic_cpu_init.part.6+0x15c/0x170
> [    0.625388] [<ffff00000845b4cc>] gic_starting_cpu+0x14/0x20
> [    0.625396] [<ffff0000080c5ad4>] cpuhp_invoke_callback+0x9c/0x260
> [    0.625404] [<ffff0000080c7c38>] notify_cpu_starting+0x70/0xa8
> [    0.625412] [<ffff0000080909e4>] secondary_start_kernel+0xac/0x118
> 
> ===== Log 2 =====
> [    0.912050] GICv3: CPU1: found redistributor 1 region 0:0x00000000018a0000
> [    0.912081] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
> [    0.912087] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/1
> [    0.912092] 1 lock held by swapper/1/0:
> [    0.912096]  #0:  ((pa_lock).lock){+.+.}, at: [<ffff0000081ad194>] get_page_from_freelist+0x154/0xeb0
> [    0.912130] irq event stamp: 0
> [    0.912135] hardirqs last  enabled at (0): [<          (null)>]           (null)
> [    0.912147] hardirqs last disabled at (0): [<ffff0000080c31c0>] copy_process.isra.5.part.6+0x438/0x1920
> [    0.912156] softirqs last  enabled at (0): [<ffff0000080c31c0>] copy_process.isra.5.part.6+0x438/0x1920
> [    0.912160] softirqs last disabled at (0): [<          (null)>]           (null)
> [    0.912164] Preemption disabled at:
> [    0.912175] [<ffff0000080909b8>] secondary_start_kernel+0x80/0x118
> [    0.912188] CPU: 1 PID: 0 Comm: swapper/1 Not tainted 4.14.66-rt40-02415-g6a801ed-dirty #4
> [    0.912192] Hardware name: Texas Instruments AM654 Base Board (DT)
> [    0.912197] Call trace:
> [    0.912207] [<ffff000008089d60>] dump_backtrace+0x0/0x400
> [    0.912215] [<ffff00000808a174>] show_stack+0x14/0x20
> [    0.912225] [<ffff0000087ecc78>] dump_stack+0xac/0xe4
> [    0.912234] [<ffff0000080f3014>] ___might_sleep+0x154/0x228
> [    0.912245] [<ffff00000880400c>] rt_spin_lock+0x5c/0x70
> [    0.912251] [<ffff0000081ad194>] get_page_from_freelist+0x154/0xeb0
> [    0.912258] [<ffff0000081ae530>] __alloc_pages_nodemask+0x108/0xc88
> [    0.912268] [<ffff000008201d20>] alloc_page_interleave+0x18/0xa0
> [    0.912275] [<ffff0000082023cc>] alloc_pages_current+0xcc/0xe0
> [    0.912287] [<ffff00000846bb00>] its_allocate_pending_table+0x60/0xa0
> [    0.912295] [<ffff00000846e5d8>] its_cpu_init+0x2a0/0x380
> [    0.912303] [<ffff00000846b484>] gic_cpu_init.part.6+0x15c/0x170
> [    0.912311] [<ffff00000846b4ac>] gic_starting_cpu+0x14/0x20

This is fixed by
  https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Make-its_lock-a-raw_spin_lock_t.patch?h=linux-4.18.y-rt-patches
  https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Move-ITS-pend_page-allocation-int.patch?h=linux-4.18.y-rt-patches

in the v4.18 tree. The first patch was merged upstream. The second will
be replaced by the patches Marc Zyngier proposed in 
  https://lkml.kernel.org/r/3302f069-8f4e-8d97-5166-0dec01b43c4c@arm.com

I plan to test + replace those for the next v4.18 release.

Sebastian

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-29 14:08 ` Sebastian Andrzej Siewior
@ 2018-08-29 21:28   ` Grygorii Strashko
  2018-08-30  1:57     ` Steven Rostedt
  2018-08-30  9:14     ` Sebastian Andrzej Siewior
  0 siblings, 2 replies; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-29 21:28 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior, Steven Rostedt
  Cc: linux-rt-users, Mike Galbraith, LKML



On 08/29/2018 09:08 AM, Sebastian Andrzej Siewior wrote:
> On 2018-08-28 18:28:42 [-0500], Grygorii Strashko wrote:

[...]

>> [    0.912275] [<ffff0000082023cc>] alloc_pages_current+0xcc/0xe0
>> [    0.912287] [<ffff00000846bb00>] its_allocate_pending_table+0x60/0xa0
>> [    0.912295] [<ffff00000846e5d8>] its_cpu_init+0x2a0/0x380
>> [    0.912303] [<ffff00000846b484>] gic_cpu_init.part.6+0x15c/0x170
>> [    0.912311] [<ffff00000846b4ac>] gic_starting_cpu+0x14/0x20
> 
> This is fixed by
>    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Make-its_lock-a-raw_spin_lock_t.patch?h=linux-4.18.y-rt-patches
[1]
>    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Move-ITS-pend_page-allocation-int.patch?h=linux-4.18.y-rt-patches
[2]
> 
> in the v4.18 tree. The first patch was merged upstream. The second will
> be replaced by the patches Marc Zyngier proposed in
>    https://lkml.kernel.org/r/3302f069-8f4e-8d97-5166-0dec01b43c4c@arm.com
> 
> I plan to test + replace those for the next v4.18 release.

Thank you. Are there any plans to back port them for 4.14-rt?
Patch [1] need to be reworked a bit, [2] - I was able to cherry-pick from 4.18-rt.

-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-29 21:28   ` Grygorii Strashko
@ 2018-08-30  1:57     ` Steven Rostedt
  2018-08-30  9:14     ` Sebastian Andrzej Siewior
  1 sibling, 0 replies; 12+ messages in thread
From: Steven Rostedt @ 2018-08-30  1:57 UTC (permalink / raw)
  To: Grygorii Strashko
  Cc: Sebastian Andrzej Siewior, linux-rt-users, Mike Galbraith, LKML

On Wed, 29 Aug 2018 16:28:50 -0500
Grygorii Strashko <grygorii.strashko@ti.com> wrote:

> On 08/29/2018 09:08 AM, Sebastian Andrzej Siewior wrote:
> > On 2018-08-28 18:28:42 [-0500], Grygorii Strashko wrote:  
> 
> [...]
> 
> >> [    0.912275] [<ffff0000082023cc>] alloc_pages_current+0xcc/0xe0
> >> [    0.912287] [<ffff00000846bb00>] its_allocate_pending_table+0x60/0xa0
> >> [    0.912295] [<ffff00000846e5d8>] its_cpu_init+0x2a0/0x380
> >> [    0.912303] [<ffff00000846b484>] gic_cpu_init.part.6+0x15c/0x170
> >> [    0.912311] [<ffff00000846b4ac>] gic_starting_cpu+0x14/0x20  
> > 
> > This is fixed by
> >    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Make-its_lock-a-raw_spin_lock_t.patch?h=linux-4.18.y-rt-patches  
> [1]
> >    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/tree/patches/irqchip-gic-v3-its-Move-ITS-pend_page-allocation-int.patch?h=linux-4.18.y-rt-patches  
> [2]
> > 
> > in the v4.18 tree. The first patch was merged upstream. The second will
> > be replaced by the patches Marc Zyngier proposed in
> >    https://lkml.kernel.org/r/3302f069-8f4e-8d97-5166-0dec01b43c4c@arm.com
> > 
> > I plan to test + replace those for the next v4.18 release.  
> 
> Thank you. Are there any plans to back port them for 4.14-rt?
> Patch [1] need to be reworked a bit, [2] - I was able to cherry-pick from 4.18-rt.
> 

Next week I plan on looking into the patches that need to be
backported. There's quite a lot of them.

-- Steve

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-29 21:28   ` Grygorii Strashko
  2018-08-30  1:57     ` Steven Rostedt
@ 2018-08-30  9:14     ` Sebastian Andrzej Siewior
  2018-08-31 19:19       ` Grygorii Strashko
  2018-08-31 19:20       ` [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Grygorii Strashko
  1 sibling, 2 replies; 12+ messages in thread
From: Sebastian Andrzej Siewior @ 2018-08-30  9:14 UTC (permalink / raw)
  To: Grygorii Strashko; +Cc: Steven Rostedt, linux-rt-users, Mike Galbraith, LKML

On 2018-08-29 16:28:50 [-0500], Grygorii Strashko wrote:
> 
> Thank you. Are there any plans to back port them for 4.14-rt?
> Patch [1] need to be reworked a bit, [2] - I was able to cherry-pick from 4.18-rt.

Grygorii, could you please replace the second patch with

  https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/plain/patches/irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch?h=linux-4.18.y-rt-patches

(incremental patch  
  https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/patch/?id=4a0819bb25d12d39c0390636122eefba232596c1
)

and check if it works? It should work but I can't test it myself because
my box with GICv3 died recently…

Sebastian

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-30  9:14     ` Sebastian Andrzej Siewior
@ 2018-08-31 19:19       ` Grygorii Strashko
  2018-08-31 19:30         ` Sebastian Andrzej Siewior
  2018-08-31 19:20       ` [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Grygorii Strashko
  1 sibling, 1 reply; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-31 19:19 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Steven Rostedt, linux-rt-users, Mike Galbraith, LKML



On 08/30/2018 04:14 AM, Sebastian Andrzej Siewior wrote:
> On 2018-08-29 16:28:50 [-0500], Grygorii Strashko wrote:
>>
>> Thank you. Are there any plans to back port them for 4.14-rt?
>> Patch [1] need to be reworked a bit, [2] - I was able to cherry-pick from 4.18-rt.
> 
> Grygorii, could you please replace the second patch with
> 
>    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/plain/patches/irqchip-gic-v3-its-Move-pending-table-allocation-to-.patch?h=linux-4.18.y-rt-patches
> 
> (incremental patch
>    https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/patch/?id=4a0819bb25d12d39c0390636122eefba232596c1
> )
> 
> and check if it works? It should work but I can't test it myself because
> my box with GICv3 died recently…

I've tried this and do not see warnings. I'm sending 4.14-rt patches i have as
I could miss smth while cherry-picking.

-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t
  2018-08-30  9:14     ` Sebastian Andrzej Siewior
  2018-08-31 19:19       ` Grygorii Strashko
@ 2018-08-31 19:20       ` Grygorii Strashko
  2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 2/3] irqchip/gic-v3-its: Move ITS' ->pend_page allocation into an early CPU up hook Grygorii Strashko
  2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 3/3] irqchip/gic-v3-its: Move pending table allocation to init time Grygorii Strashko
  1 sibling, 2 replies; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-31 19:20 UTC (permalink / raw)
  To: bigeasy, linux-rt-users
  Cc: Sekhar Nori, Steven Rostedt, LKML, Grygorii Strashko

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 drivers/irqchip/irq-gic-v3-its.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index c564443..0b691d1 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -154,7 +154,7 @@ static struct {
 } vpe_proxy;
 
 static LIST_HEAD(its_nodes);
-static DEFINE_SPINLOCK(its_lock);
+static DEFINE_RAW_SPINLOCK(its_lock);
 static struct rdists *gic_rdists;
 static struct irq_domain *its_parent;
 
@@ -1854,7 +1854,7 @@ static void its_cpu_init_collection(void)
 	struct its_node *its;
 	int cpu;
 
-	spin_lock(&its_lock);
+	raw_spin_lock(&its_lock);
 	cpu = smp_processor_id();
 
 	list_for_each_entry(its, &its_nodes, entry) {
@@ -1896,7 +1896,7 @@ static void its_cpu_init_collection(void)
 		its_send_invall(its, &its->collections[cpu]);
 	}
 
-	spin_unlock(&its_lock);
+	raw_spin_unlock(&its_lock);
 }
 
 static struct its_device *its_find_device(struct its_node *its, u32 dev_id)
@@ -3109,9 +3109,9 @@ static int __init its_probe_one(struct resource *res,
 	if (err)
 		goto out_free_tables;
 
-	spin_lock(&its_lock);
+	raw_spin_lock(&its_lock);
 	list_add(&its->entry, &its_nodes);
-	spin_unlock(&its_lock);
+	raw_spin_unlock(&its_lock);
 
 	return 0;
 
-- 
2.10.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [4.14.66-rt TEST PATCH 2/3] irqchip/gic-v3-its: Move ITS' ->pend_page allocation into an early CPU up hook
  2018-08-31 19:20       ` [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Grygorii Strashko
@ 2018-08-31 19:20         ` Grygorii Strashko
  2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 3/3] irqchip/gic-v3-its: Move pending table allocation to init time Grygorii Strashko
  1 sibling, 0 replies; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-31 19:20 UTC (permalink / raw)
  To: bigeasy, linux-rt-users; +Cc: Sekhar Nori, Steven Rostedt, LKML

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

The AP-GIC-starting hook allocates memory for the ->pend_page while the
CPU is started during boot-up. This callback is invoked on the target
CPU with disabled interrupts.
This does not work on -RT beacuse memory allocations are not possible
with disabled interrupts.
Move the memory allocation to an earlier hotplug step which invoked with
enabled interrupts on the boot CPU.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 drivers/irqchip/irq-gic-v3-its.c | 60 +++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 19 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 0b691d1..23c5818 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -171,6 +171,7 @@ static DEFINE_RAW_SPINLOCK(vmovp_lock);
 static DEFINE_IDA(its_vpeid_ida);
 
 #define gic_data_rdist()		(raw_cpu_ptr(gic_rdists->rdist))
+#define gic_data_rdist_cpu(cpu)		(per_cpu_ptr(gic_rdists->rdist, cpu))
 #define gic_data_rdist_rd_base()	(gic_data_rdist()->rd_base)
 #define gic_data_rdist_vlpi_base()	(gic_data_rdist_rd_base() + SZ_128K)
 
@@ -1738,15 +1739,17 @@ static int its_alloc_collections(struct its_node *its)
 	return 0;
 }
 
-static struct page *its_allocate_pending_table(gfp_t gfp_flags)
+static struct page *its_allocate_pending_table(unsigned int cpu)
 {
 	struct page *pend_page;
+	unsigned int order;
 	/*
 	 * The pending pages have to be at least 64kB aligned,
 	 * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below.
 	 */
-	pend_page = alloc_pages(gfp_flags | __GFP_ZERO,
-				get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
+	order = get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K));
+	pend_page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL | __GFP_ZERO,
+				     order);
 	if (!pend_page)
 		return NULL;
 
@@ -1762,6 +1765,28 @@ static void its_free_pending_table(struct page *pt)
 		   get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
 }
 
+static int its_alloc_pend_page(unsigned int cpu)
+{
+	struct page *pend_page;
+	phys_addr_t paddr;
+
+	pend_page = gic_data_rdist_cpu(cpu)->pend_page;
+	if (pend_page)
+		return 0;
+
+	pend_page = its_allocate_pending_table(cpu);
+	if (!pend_page) {
+		pr_err("Failed to allocate PENDBASE for CPU%d\n",
+		       smp_processor_id());
+		return -ENOMEM;
+	}
+
+	paddr = page_to_phys(pend_page);
+	pr_info("CPU%d: using LPI pending table @%pa\n", cpu, &paddr);
+	gic_data_rdist_cpu(cpu)->pend_page = pend_page;
+	return 0;
+}
+
 static void its_cpu_init_lpis(void)
 {
 	void __iomem *rbase = gic_data_rdist_rd_base();
@@ -1770,21 +1795,8 @@ static void its_cpu_init_lpis(void)
 
 	/* If we didn't allocate the pending table yet, do it now */
 	pend_page = gic_data_rdist()->pend_page;
-	if (!pend_page) {
-		phys_addr_t paddr;
-
-		pend_page = its_allocate_pending_table(GFP_NOWAIT);
-		if (!pend_page) {
-			pr_err("Failed to allocate PENDBASE for CPU%d\n",
-			       smp_processor_id());
-			return;
-		}
-
-		paddr = page_to_phys(pend_page);
-		pr_info("CPU%d: using LPI pending table @%pa\n",
-			smp_processor_id(), &paddr);
-		gic_data_rdist()->pend_page = pend_page;
-	}
+	if (!pend_page)
+		return;
 
 	/* Disable LPIs */
 	val = readl_relaxed(rbase + GICR_CTLR);
@@ -2603,7 +2615,7 @@ static int its_vpe_init(struct its_vpe *vpe)
 		return vpe_id;
 
 	/* Allocate VPT */
-	vpt_page = its_allocate_pending_table(GFP_KERNEL);
+	vpt_page = its_allocate_pending_table(raw_smp_processor_id());
 	if (!vpt_page) {
 		its_vpe_id_free(vpe_id);
 		return -ENOMEM;
@@ -3350,6 +3362,16 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
 	if (err)
 		return err;
 
+	err = cpuhp_setup_state(CPUHP_BP_PREPARE_DYN, "irqchip/arm/gicv3:prepare",
+				its_alloc_pend_page, NULL);
+	if (err < 0) {
+		pr_warn("ITS: Can't register CPU-hoplug callback.\n");
+		return err;
+	}
+	err = its_alloc_pend_page(smp_processor_id());
+	if (err < 0)
+		return err;
+
 	list_for_each_entry(its, &its_nodes, entry)
 		has_v4 |= its->is_v4;
 
-- 
2.10.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [4.14.66-rt TEST PATCH 3/3] irqchip/gic-v3-its: Move pending table allocation to init time
  2018-08-31 19:20       ` [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Grygorii Strashko
  2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 2/3] irqchip/gic-v3-its: Move ITS' ->pend_page allocation into an early CPU up hook Grygorii Strashko
@ 2018-08-31 19:20         ` Grygorii Strashko
  1 sibling, 0 replies; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-31 19:20 UTC (permalink / raw)
  To: bigeasy, linux-rt-users; +Cc: Sekhar Nori, Steven Rostedt, LKML, Marc Zyngier

From: Marc Zyngier <marc.zyngier@arm.com>

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
[bigeasy: backport commit effe377d415 ("irqchip/gic-v3-its: Move pending
          table allocation to init time")]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 drivers/irqchip/irq-gic-v3-its.c   | 79 +++++++++++++++++---------------------
 include/linux/irqchip/arm-gic-v3.h |  1 +
 2 files changed, 36 insertions(+), 44 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 23c5818..1aaa757 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -1446,7 +1446,7 @@ static void its_free_prop_table(struct page *prop_page)
 		   get_order(LPI_PROPBASE_SZ));
 }
 
-static int __init its_alloc_lpi_tables(void)
+static int __init its_alloc_lpi_prop_table(void)
 {
 	phys_addr_t paddr;
 
@@ -1739,17 +1739,15 @@ static int its_alloc_collections(struct its_node *its)
 	return 0;
 }
 
-static struct page *its_allocate_pending_table(unsigned int cpu)
+static struct page *its_allocate_pending_table(gfp_t gfp_flags)
 {
 	struct page *pend_page;
-	unsigned int order;
 	/*
 	 * The pending pages have to be at least 64kB aligned,
 	 * hence the 'max(LPI_PENDBASE_SZ, SZ_64K)' below.
 	 */
-	order = get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K));
-	pend_page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL | __GFP_ZERO,
-				     order);
+	pend_page = alloc_pages(gfp_flags | __GFP_ZERO,
+				get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
 	if (!pend_page)
 		return NULL;
 
@@ -1765,25 +1763,31 @@ static void its_free_pending_table(struct page *pt)
 		   get_order(max_t(u32, LPI_PENDBASE_SZ, SZ_64K)));
 }
 
-static int its_alloc_pend_page(unsigned int cpu)
+static int __init allocate_lpi_tables(void)
 {
-	struct page *pend_page;
-	phys_addr_t paddr;
+	int err, cpu;
 
-	pend_page = gic_data_rdist_cpu(cpu)->pend_page;
-	if (pend_page)
-		return 0;
+	err = its_alloc_lpi_prop_table();
+	if (err)
+		return err;
 
-	pend_page = its_allocate_pending_table(cpu);
-	if (!pend_page) {
-		pr_err("Failed to allocate PENDBASE for CPU%d\n",
-		       smp_processor_id());
-		return -ENOMEM;
+	/*
+	 * We allocate all the pending tables anyway, as we may have a
+	 * mix of RDs that have had LPIs enabled, and some that
+	 * don't. We'll free the unused ones as each CPU comes online.
+	 */
+	for_each_possible_cpu(cpu) {
+		struct page *pend_page;
+
+		pend_page = its_allocate_pending_table(GFP_NOWAIT);
+		if (!pend_page) {
+			pr_err("Failed to allocate PENDBASE for CPU%d\n", cpu);
+			return -ENOMEM;
+		}
+
+		gic_data_rdist_cpu(cpu)->pend_page = pend_page;
 	}
 
-	paddr = page_to_phys(pend_page);
-	pr_info("CPU%d: using LPI pending table @%pa\n", cpu, &paddr);
-	gic_data_rdist_cpu(cpu)->pend_page = pend_page;
 	return 0;
 }
 
@@ -1791,22 +1795,14 @@ static void its_cpu_init_lpis(void)
 {
 	void __iomem *rbase = gic_data_rdist_rd_base();
 	struct page *pend_page;
+	phys_addr_t paddr;
 	u64 val, tmp;
 
-	/* If we didn't allocate the pending table yet, do it now */
-	pend_page = gic_data_rdist()->pend_page;
-	if (!pend_page)
+	if (gic_data_rdist()->lpi_enabled)
 		return;
 
-	/* Disable LPIs */
-	val = readl_relaxed(rbase + GICR_CTLR);
-	val &= ~GICR_CTLR_ENABLE_LPIS;
-	writel_relaxed(val, rbase + GICR_CTLR);
-
-	/*
-	 * Make sure any change to the table is observable by the GIC.
-	 */
-	dsb(sy);
+	pend_page = gic_data_rdist()->pend_page;
+	paddr = page_to_phys(pend_page);
 
 	/* set PROPBASE */
 	val = (page_to_phys(gic_rdists->prop_page) |
@@ -1859,6 +1855,10 @@ static void its_cpu_init_lpis(void)
 
 	/* Make sure the GIC has seen the above */
 	dsb(sy);
+	gic_data_rdist()->lpi_enabled = true;
+	pr_info("GICv3: CPU%d: using LPI pending table @%pa\n",
+		smp_processor_id(),
+		&paddr);
 }
 
 static void its_cpu_init_collection(void)
@@ -2615,7 +2615,7 @@ static int its_vpe_init(struct its_vpe *vpe)
 		return vpe_id;
 
 	/* Allocate VPT */
-	vpt_page = its_allocate_pending_table(raw_smp_processor_id());
+	vpt_page = its_allocate_pending_table(GFP_KERNEL);
 	if (!vpt_page) {
 		its_vpe_id_free(vpe_id);
 		return -ENOMEM;
@@ -3358,18 +3358,9 @@ int __init its_init(struct fwnode_handle *handle, struct rdists *rdists,
 	}
 
 	gic_rdists = rdists;
-	err = its_alloc_lpi_tables();
-	if (err)
-		return err;
 
-	err = cpuhp_setup_state(CPUHP_BP_PREPARE_DYN, "irqchip/arm/gicv3:prepare",
-				its_alloc_pend_page, NULL);
-	if (err < 0) {
-		pr_warn("ITS: Can't register CPU-hoplug callback.\n");
-		return err;
-	}
-	err = its_alloc_pend_page(smp_processor_id());
-	if (err < 0)
+	err = allocate_lpi_tables();
+	if (err)
 		return err;
 
 	list_for_each_entry(its, &its_nodes, entry)
diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h
index bacb499..688f256 100644
--- a/include/linux/irqchip/arm-gic-v3.h
+++ b/include/linux/irqchip/arm-gic-v3.h
@@ -568,6 +568,7 @@ struct rdists {
 		void __iomem	*rd_base;
 		struct page	*pend_page;
 		phys_addr_t	phys_base;
+		bool		lpi_enabled;
 	} __percpu		*rdist;
 	struct page		*prop_page;
 	int			id_bits;
-- 
2.10.5


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-31 19:19       ` Grygorii Strashko
@ 2018-08-31 19:30         ` Sebastian Andrzej Siewior
  2018-08-31 19:42           ` Grygorii Strashko
  0 siblings, 1 reply; 12+ messages in thread
From: Sebastian Andrzej Siewior @ 2018-08-31 19:30 UTC (permalink / raw)
  To: Grygorii Strashko; +Cc: Steven Rostedt, linux-rt-users, Mike Galbraith, LKML

On 2018-08-31 14:19:53 [-0500], Grygorii Strashko wrote:
> 
> I've tried this and do not see warnings. I'm sending 4.14-rt patches i have as
> I could miss smth while cherry-picking.

perfect. Thanks for the confirmation.
I saw your three patches. Could you please instead just backport the two
patches I have in v4.16 so that it applies on v4.14?

Sebastian

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-31 19:30         ` Sebastian Andrzej Siewior
@ 2018-08-31 19:42           ` Grygorii Strashko
  2018-09-06  7:39             ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 12+ messages in thread
From: Grygorii Strashko @ 2018-08-31 19:42 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Steven Rostedt, linux-rt-users, Mike Galbraith, LKML



On 08/31/2018 02:30 PM, Sebastian Andrzej Siewior wrote:
> On 2018-08-31 14:19:53 [-0500], Grygorii Strashko wrote:
>>
>> I've tried this and do not see warnings. I'm sending 4.14-rt patches i have as
>> I could miss smth while cherry-picking.
> 
> perfect. Thanks for the confirmation.
> I saw your three patches. Could you please instead just backport the two
> patches I have in v4.16 so that it applies on v4.14?
> 

Do you mean these two:
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-4.16.y-rt&id=c7a3334c762a9b1dd2e39cb2ded00ce66e8a06d1

https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-4.16.y-rt&id=e083f14dc2e98ced872bf077b4d1cccf95b7e4f8


-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974
  2018-08-31 19:42           ` Grygorii Strashko
@ 2018-09-06  7:39             ` Sebastian Andrzej Siewior
  0 siblings, 0 replies; 12+ messages in thread
From: Sebastian Andrzej Siewior @ 2018-09-06  7:39 UTC (permalink / raw)
  To: Grygorii Strashko; +Cc: Steven Rostedt, linux-rt-users, Mike Galbraith, LKML

On 2018-08-31 14:42:25 [-0500], Grygorii Strashko wrote:
> 
> 
> On 08/31/2018 02:30 PM, Sebastian Andrzej Siewior wrote:
> > On 2018-08-31 14:19:53 [-0500], Grygorii Strashko wrote:
> >>
> >> I've tried this and do not see warnings. I'm sending 4.14-rt patches i have as
> >> I could miss smth while cherry-picking.
> > 
> > perfect. Thanks for the confirmation.
> > I saw your three patches. Could you please instead just backport the two
> > patches I have in v4.16 so that it applies on v4.14?
> > 
> 
> Do you mean these two:
> https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-4.16.y-rt&id=c7a3334c762a9b1dd2e39cb2ded00ce66e8a06d1
Yes,

> https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-4.16.y-rt&id=e083f14dc2e98ced872bf077b4d1cccf95b7e4f8
no, just 
	https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-4.16.y-rt-rebase&id=d6914631a84f47eaf5647da3bb09d58eca156b3f

Sebastian

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-09-06  7:39 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-28 23:28 [4.14.66-rt40] [report][cpuhotplug] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:974 Grygorii Strashko
2018-08-29 14:08 ` Sebastian Andrzej Siewior
2018-08-29 21:28   ` Grygorii Strashko
2018-08-30  1:57     ` Steven Rostedt
2018-08-30  9:14     ` Sebastian Andrzej Siewior
2018-08-31 19:19       ` Grygorii Strashko
2018-08-31 19:30         ` Sebastian Andrzej Siewior
2018-08-31 19:42           ` Grygorii Strashko
2018-09-06  7:39             ` Sebastian Andrzej Siewior
2018-08-31 19:20       ` [4.14.66-rt TEST PATCH 1/3] irqchip/gic-v3-its: Make its_lock a raw_spin_lock_t Grygorii Strashko
2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 2/3] irqchip/gic-v3-its: Move ITS' ->pend_page allocation into an early CPU up hook Grygorii Strashko
2018-08-31 19:20         ` [4.14.66-rt TEST PATCH 3/3] irqchip/gic-v3-its: Move pending table allocation to init time Grygorii Strashko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.