Messages in this thread | | | Date | Thu, 16 Jun 2022 00:48:55 +0200 | Subject | Re: [PATCH 7/7] mm/page_alloc: Replace local_lock with normal spinlock | From | Marek Szyprowski <> |
| |
Hi Mel,
On 13.06.2022 14:56, Mel Gorman wrote: > struct per_cpu_pages is no longer strictly local as PCP lists can be > drained remotely using a lock for protection. While the use of local_lock > works, it goes against the intent of local_lock which is for "pure > CPU local concurrency control mechanisms and not suited for inter-CPU > concurrency control" (Documentation/locking/locktypes.rst) > > local_lock protects against migration between when the percpu pointer is > accessed and the pcp->lock acquired. The lock acquisition is a preemption > point so in the worst case, a task could migrate to another NUMA node > and accidentally allocate remote memory. The main requirement is to pin > the task to a CPU that is suitable for PREEMPT_RT and !PREEMPT_RT. > > Replace local_lock with helpers that pin a task to a CPU, lookup the > per-cpu structure and acquire the embedded lock. It's similar to local_lock > without breaking the intent behind the API. It is not a complete API > as only the parts needed for PCP-alloc are implemented but in theory, > the generic helpers could be promoted to a general API if there was > demand for an embedded lock within a per-cpu struct with a guarantee > that the per-cpu structure locked matches the running CPU and cannot use > get_cpu_var due to RT concerns. PCP requires these semantics to avoid > accidentally allocating remote memory. > > Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
This patch landed in linux next-20220614 as commit 54bcdc6744e3 ("mm/page_alloc: replace local_lock with normal spinlock"). Unfortunately it causes some serious issues when some kernel debugging options (CONFIG_PROVE_LOCKING and CONFIG_DEBUG_ATOMIC_SLEEP) are enabled. I've observed this on various ARM 64bit and 32bit boards.
In the logs I see lots of errors like:
BUG: sleeping function called from invalid context at ./include/linux/sched/mm.h:274
BUG: scheduling while atomic: systemd-udevd/288/0x00000002
BUG: sleeping function called from invalid context at mm/filemap.c:2647
however there are also a fatal ones like:
Unable to handle kernel paging request at virtual address 00000000017a87b4
The issues seems to be a bit random. Looks like memory trashing. Reverting $subject on top of current linux-next fixes all those issues.
Let me know if how I can help debugging this.
Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland
| |