LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4.4 24/91] mm, slub: prevent kmalloc_node crashes and memory leaks
From: Greg Kroah-Hartman @ 2020-04-01 16:17 UTC (permalink / raw)
  To: linux-kernel
  Cc: Sachin Sant, Nathan Lynch, Srikar Dronamraju,
	PUVICHAKRAVARTHY RAMACHANDRAN, Greg Kroah-Hartman, David Rientjes,
	linuxppc-dev, stable, Bharata B Rao, Pekka Enberg, Linus Torvalds,
	Kirill Tkhai, Joonsoo Kim, Andrew Morton, Michal Hocko,
	Mel Gorman, Christopher Lameter, Vlastimil Babka
In-Reply-To: <20200401161512.917494101@linuxfoundation.org>

From: Vlastimil Babka <vbabka@suse.cz>

commit 0715e6c516f106ed553828a671d30ad9a3431536 upstream.

Sachin reports [1] a crash in SLUB __slab_alloc():

  BUG: Kernel NULL pointer dereference on read at 0x000073b0
  Faulting instruction address: 0xc0000000003d55f4
  Oops: Kernel access of bad area, sig: 11 [#1]
  LE PAGE_SIZE=64K MMU=Hash SMP NR_CPUS=2048 NUMA pSeries
  Modules linked in:
  CPU: 19 PID: 1 Comm: systemd Not tainted 5.6.0-rc2-next-20200218-autotest #1
  NIP:  c0000000003d55f4 LR: c0000000003d5b94 CTR: 0000000000000000
  REGS: c0000008b37836d0 TRAP: 0300   Not tainted  (5.6.0-rc2-next-20200218-autotest)
  MSR:  8000000000009033 <SF,EE,ME,IR,DR,RI,LE>  CR: 24004844  XER: 00000000
  CFAR: c00000000000dec4 DAR: 00000000000073b0 DSISR: 40000000 IRQMASK: 1
  GPR00: c0000000003d5b94 c0000008b3783960 c00000000155d400 c0000008b301f500
  GPR04: 0000000000000dc0 0000000000000002 c0000000003443d8 c0000008bb398620
  GPR08: 00000008ba2f0000 0000000000000001 0000000000000000 0000000000000000
  GPR12: 0000000024004844 c00000001ec52a00 0000000000000000 0000000000000000
  GPR16: c0000008a1b20048 c000000001595898 c000000001750c18 0000000000000002
  GPR20: c000000001750c28 c000000001624470 0000000fffffffe0 5deadbeef0000122
  GPR24: 0000000000000001 0000000000000dc0 0000000000000002 c0000000003443d8
  GPR28: c0000008b301f500 c0000008bb398620 0000000000000000 c00c000002287180
  NIP ___slab_alloc+0x1f4/0x760
  LR __slab_alloc+0x34/0x60
  Call Trace:
    ___slab_alloc+0x334/0x760 (unreliable)
    __slab_alloc+0x34/0x60
    __kmalloc_node+0x110/0x490
    kvmalloc_node+0x58/0x110
    mem_cgroup_css_online+0x108/0x270
    online_css+0x48/0xd0
    cgroup_apply_control_enable+0x2ec/0x4d0
    cgroup_mkdir+0x228/0x5f0
    kernfs_iop_mkdir+0x90/0xf0
    vfs_mkdir+0x110/0x230
    do_mkdirat+0xb0/0x1a0
    system_call+0x5c/0x68

This is a PowerPC platform with following NUMA topology:

  available: 2 nodes (0-1)
  node 0 cpus:
  node 0 size: 0 MB
  node 0 free: 0 MB
  node 1 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
  node 1 size: 35247 MB
  node 1 free: 30907 MB
  node distances:
  node   0   1
    0:  10  40
    1:  40  10

  possible numa nodes: 0-31

This only happens with a mmotm patch "mm/memcontrol.c: allocate
shrinker_map on appropriate NUMA node" [2] which effectively calls
kmalloc_node for each possible node.  SLUB however only allocates
kmem_cache_node on online N_NORMAL_MEMORY nodes, and relies on
node_to_mem_node to return such valid node for other nodes since commit
a561ce00b09e ("slub: fall back to node_to_mem_node() node if allocating
on memoryless node").  This is however not true in this configuration
where the _node_numa_mem_ array is not initialized for nodes 0 and 2-31,
thus it contains zeroes and get_partial() ends up accessing
non-allocated kmem_cache_node.

A related issue was reported by Bharata (originally by Ramachandran) [3]
where a similar PowerPC configuration, but with mainline kernel without
patch [2] ends up allocating large amounts of pages by kmalloc-1k
kmalloc-512.  This seems to have the same underlying issue with
node_to_mem_node() not behaving as expected, and might probably also
lead to an infinite loop with CONFIG_SLUB_CPU_PARTIAL [4].

This patch should fix both issues by not relying on node_to_mem_node()
anymore and instead simply falling back to NUMA_NO_NODE, when
kmalloc_node(node) is attempted for a node that's not online, or has no
usable memory.  The "usable memory" condition is also changed from
node_present_pages() to N_NORMAL_MEMORY node state, as that is exactly
the condition that SLUB uses to allocate kmem_cache_node structures.
The check in get_partial() is removed completely, as the checks in
___slab_alloc() are now sufficient to prevent get_partial() being
reached with an invalid node.

[1] https://lore.kernel.org/linux-next/3381CD91-AB3D-4773-BA04-E7A072A63968@linux.vnet.ibm.com/
[2] https://lore.kernel.org/linux-mm/fff0e636-4c36-ed10-281c-8cdb0687c839@virtuozzo.com/
[3] https://lore.kernel.org/linux-mm/20200317092624.GB22538@in.ibm.com/
[4] https://lore.kernel.org/linux-mm/088b5996-faae-8a56-ef9c-5b567125ae54@suse.cz/

Fixes: a561ce00b09e ("slub: fall back to node_to_mem_node() node if allocating on memoryless node")
Reported-by: Sachin Sant <sachinp@linux.vnet.ibm.com>
Reported-by: PUVICHAKRAVARTHY RAMACHANDRAN <puvichakravarthy@in.ibm.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Tested-by: Sachin Sant <sachinp@linux.vnet.ibm.com>
Tested-by: Bharata B Rao <bharata@linux.ibm.com>
Reviewed-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Christopher Lameter <cl@linux.com>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Kirill Tkhai <ktkhai@virtuozzo.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Nathan Lynch <nathanl@linux.ibm.com>
Cc: <stable@vger.kernel.org>
Link: http://lkml.kernel.org/r/20200320115533.9604-1-vbabka@suse.cz
Debugged-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 mm/slub.c |   26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1777,8 +1777,6 @@ static void *get_partial(struct kmem_cac
 
 	if (node == NUMA_NO_NODE)
 		searchnode = numa_mem_id();
-	else if (!node_present_pages(node))
-		searchnode = node_to_mem_node(node);
 
 	object = get_partial_node(s, get_node(s, searchnode), c, flags);
 	if (object || node != NUMA_NO_NODE)
@@ -2355,17 +2353,27 @@ static void *___slab_alloc(struct kmem_c
 	struct page *page;
 
 	page = c->page;
-	if (!page)
+	if (!page) {
+		/*
+		 * if the node is not online or has no normal memory, just
+		 * ignore the node constraint
+		 */
+		if (unlikely(node != NUMA_NO_NODE &&
+			     !node_state(node, N_NORMAL_MEMORY)))
+			node = NUMA_NO_NODE;
 		goto new_slab;
+	}
 redo:
 
 	if (unlikely(!node_match(page, node))) {
-		int searchnode = node;
-
-		if (node != NUMA_NO_NODE && !node_present_pages(node))
-			searchnode = node_to_mem_node(node);
-
-		if (unlikely(!node_match(page, searchnode))) {
+		/*
+		 * same as above but node_match() being false already
+		 * implies node != NUMA_NO_NODE
+		 */
+		if (!node_state(node, N_NORMAL_MEMORY)) {
+			node = NUMA_NO_NODE;
+			goto redo;
+		} else {
 			stat(s, ALLOC_NODE_MISMATCH);
 			deactivate_slab(s, page, c->freelist);
 			c->page = NULL;



^ permalink raw reply

* Re: [RFC PATCH v2 1/1] powerpc/kernel: Enables memory hot-remove after reboot on pseries guests
From: Leonardo Bras @ 2020-04-01 15:07 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman,
	Allison Randal, Greg Kroah-Hartman, Nathan Fontenot,
	Thomas Gleixner, Michael Anderson, Mike Rapoport,
	Claudio Carvalho, Hari Bathini, Christophe Leroy, bharata.rao
  Cc: linuxppc-dev, linux-kernel
In-Reply-To: <20200305233231.174082-1-leonardo@linux.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 349 bytes --]

On Thu, 2020-03-05 at 20:32 -0300, Leonardo Bras wrote:
> ---
> The new flag was already proposed on Power Architecture documentation,
> and it's waiting for approval.
> 
> I would like to get your comments on this change, but it's still not
> ready for being merged.

New flag got approved on the documentation.
Please review this patch.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* [PATCHv4] powerpc/crashkernel: take "mem=" option into account
From: Pingfan Liu @ 2020-04-01 14:00 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: kexec, Hari Bathini, Pingfan Liu
In-Reply-To: <48c1b852-28e0-9c46-cafa-7c5992f966a7@linux.ibm.com>

'mem=" option is an easy way to put high pressure on memory during some
test. Hence after applying the memory limit, instead of total mem, the
actual usable memory should be considered when reserving mem for
crashkernel. Otherwise the boot up may experience OOM issue.

E.g. it would reserve 4G prior to the change and 512M afterward, if passing
crashkernel="2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G", and
mem=5G on a 256G machine.

This issue is powerpc specific because it puts higher priority on fadump
and kdump reservation than on "mem=". Referring the following code:
    if (fadump_reserve_mem() == 0)
            reserve_crashkernel();
    ...
    /* Ensure that total memory size is page-aligned. */
    limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
    memblock_enforce_memory_limit(limit);

While on other arches, the effect of "mem=" takes a higher priority and pass
through memblock_phys_mem_size() before calling reserve_crashkernel().

Signed-off-by: Pingfan Liu <kernelfans@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Hari Bathini <hbathini@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: kexec@lists.infradead.org
---
v3 -> v4: fix total_mem_sz based on adjusted memory_limit

 arch/powerpc/kexec/core.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kexec/core.c b/arch/powerpc/kexec/core.c
index 078fe3d..56da5eb 100644
--- a/arch/powerpc/kexec/core.c
+++ b/arch/powerpc/kexec/core.c
@@ -115,11 +115,12 @@ void machine_kexec(struct kimage *image)

 void __init reserve_crashkernel(void)
 {
-	unsigned long long crash_size, crash_base;
+	unsigned long long crash_size, crash_base, total_mem_sz;
 	int ret;

+	total_mem_sz = memory_limit ? memory_limit : memblock_phys_mem_size();
 	/* use common parsing */
-	ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
+	ret = parse_crashkernel(boot_command_line, total_mem_sz,
 			&crash_size, &crash_base);
 	if (ret == 0 && crash_size > 0) {
 		crashk_res.start = crash_base;
@@ -178,6 +179,7 @@ void __init reserve_crashkernel(void)
 	/* Crash kernel trumps memory limit */
 	if (memory_limit && memory_limit <= crashk_res.end) {
 		memory_limit = crashk_res.end + 1;
+		total_mem_sz = memory_limit;
 		printk("Adjusted memory limit for crashkernel, now 0x%llx\n",
 		       memory_limit);
 	}
@@ -186,7 +188,7 @@ void __init reserve_crashkernel(void)
 			"for crashkernel (System RAM: %ldMB)\n",
 			(unsigned long)(crash_size >> 20),
 			(unsigned long)(crashk_res.start >> 20),
-			(unsigned long)(memblock_phys_mem_size() >> 20));
+			(unsigned long)(total_mem_sz >> 20));

 	if (!memblock_is_region_memory(crashk_res.start, crash_size) ||
 	    memblock_reserve(crashk_res.start, crash_size)) {
--
2.7.5


^ permalink raw reply related

* Re: [PATCH 10/16] powerpc: prefer __section and __printf from compiler_attributes.h
From: Miguel Ojeda @ 2020-04-01 13:18 UTC (permalink / raw)
  To: Michael Ellerman
  Cc: Rob Herring, Song Liu, Martin KaFai Lau, bpf, Daniel Borkmann,
	Geoff Levand, Greg Kroah-Hartman, Nick Desaulniers,
	Alexei Starovoitov, linux-kernel, clang-built-linux,
	Network Development, Paul Mackerras, Josh Poimboeuf, Sedat Dilek,
	Yonghong Song, Andrew Morton, linuxppc-dev, Thomas Gleixner,
	Allison Randal
In-Reply-To: <48smMS2jDxz9sT6@ozlabs.org>

Hi Michael,

On Wed, Apr 1, 2020 at 2:53 PM Michael Ellerman
<patch-notifications@ellerman.id.au> wrote:
>
> On Mon, 2019-08-12 at 21:50:43 UTC, Nick Desaulniers wrote:
> > Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
> > Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com>
> > Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
>
> Applied to powerpc next, thanks.

Missed this one from August, thanks Nick for this cleanup!

Michael, you already picked it up, but you may have my:

Acked-by: Miguel Ojeda <miguel.ojeda.sandonis@gmail.com>

Cheers,
Miguel

^ permalink raw reply

* [PATCH -next] KVM: PPC: Book3S HV: remove redundant NULL check
From: Chen Zhou @ 2020-04-01 13:09 UTC (permalink / raw)
  To: paulus, benh, mpe; +Cc: chenzhou10, linuxppc-dev, linux-kernel, kvm-ppc

Free function kfree() already does NULL check, so the additional
check is unnecessary, just remove it.

Signed-off-by: Chen Zhou <chenzhou10@huawei.com>
---
 arch/powerpc/kvm/book3s_hv_nested.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
index dc97e5b..cad3243 100644
--- a/arch/powerpc/kvm/book3s_hv_nested.c
+++ b/arch/powerpc/kvm/book3s_hv_nested.c
@@ -1416,8 +1416,7 @@ static long int __kvmhv_nested_page_fault(struct kvm_run *run,
 	rmapp = &memslot->arch.rmap[gfn - memslot->base_gfn];
 	ret = kvmppc_create_pte(kvm, gp->shadow_pgtable, pte, n_gpa, level,
 				mmu_seq, gp->shadow_lpid, rmapp, &n_rmap);
-	if (n_rmap)
-		kfree(n_rmap);
+	kfree(n_rmap);
 	if (ret == -EAGAIN)
 		ret = RESUME_GUEST;	/* Let the guest try again */
 
-- 
2.7.4


^ permalink raw reply related

* Re: [PATCH] powerpc/64/tm: Don't let userspace set regs->trap via sigreturn
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev; +Cc: mikey, npiggin, gromero
In-Reply-To: <20200401023836.3286664-1-mpe@ellerman.id.au>

On Wed, 2020-04-01 at 02:38:36 UTC, Michael Ellerman wrote:
> In restore_tm_sigcontexts() we take the trap value directly from the
> user sigcontext with no checking:
> 
> 	err |= __get_user(regs->trap, &sc->gp_regs[PT_TRAP]);
> 
> This means we can be in the kernel with an arbitrary regs->trap value.
> 
> Although that's not immediately problematic, there is a risk we could
> trigger one of the uses of CHECK_FULL_REGS():
> 
> 	#define CHECK_FULL_REGS(regs)	BUG_ON(regs->trap & 1)
> 
> It can also cause us to unnecessarily save non-volatile GPRs again in
> save_nvgprs(), which shouldn't be problematic but is still wrong.
> 
> It's also possible it could trick the syscall restart machinery, which
> relies on regs->trap not being == 0xc00 (see 9a81c16b5275 ("powerpc:
> fix double syscall restarts")), though I haven't been able to make
> that happen.
> 
> Finally it doesn't match the behaviour of the non-TM case, in
> restore_sigcontext() which zeroes regs->trap.
> 
> So change restore_tm_sigcontexts() to zero regs->trap.
> 
> This was discovered while testing Nick's upcoming rewrite of the
> syscall entry path. In that series the call to save_nvgprs() prior to
> signal handling (do_notify_resume()) is removed, which leaves the
> low-bit of regs->trap uncleared which can then trigger the FULL_REGS()
> WARNs in setup_tm_sigcontexts().
> 
> Fixes: 2b0a576d15e0 ("powerpc: Add new transactional memory state to the signal context")
> Cc: stable@vger.kernel.org # v3.9+
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

Applied to powerpc next.

https://git.kernel.org/powerpc/c/c7def7fbdeaa25feaa19caf4a27c5d10bd8789e4

cheers

^ permalink raw reply

* Re: [PATCH] selftests/powerpc: Fix try-run when source tree is not writable
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev; +Cc: harish
In-Reply-To: <20200327095319.2347641-1-mpe@ellerman.id.au>

On Fri, 2020-03-27 at 09:53:19 UTC, Michael Ellerman wrote:
> We added a usage of try-run to pmu/ebb/Makefile to detect if the
> toolchain supported the -no-pie option.
> 
> This fails if we build out-of-tree and the source tree is not
> writable, as try-run tries to write its temporary files to the current
> directory. That leads to the -no-pie option being silently dropped,
> which leads to broken executables with some toolchains.
> 
> If we remove the redirect to /dev/null in try-run, we see the error:
> 
>   make[3]: Entering directory '/linux/tools/testing/selftests/powerpc/pmu/ebb'
>   /usr/bin/ld: cannot open output file .54.tmp: Read-only file system
>   collect2: error: ld returned 1 exit status
>   make[3]: Nothing to be done for 'all'.
> 
> And looking with strace we see it's trying to use a file that's in the
> source tree:
> 
>   lstat("/linux/tools/testing/selftests/powerpc/pmu/ebb/.54.tmp", 0x7ffffc0f83c8)
> 
> We can fix it by setting TMPOUT to point to the $(OUTPUT) directory,
> and we can verify with strace it's now trying to write to the output
> directory:
> 
>   lstat("/output/kselftest/powerpc/pmu/ebb/.54.tmp", 0x7fffd1bf6bf8)
> 
> And also see that the -no-pie option is now correctly detected.
> 
> Fixes: 0695f8bca93e ("selftests/powerpc: Handle Makefile for unrecognized option")
> Cc: stable@vger.kernel.org # v5.5+
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

Applied to powerpc next.

https://git.kernel.org/powerpc/c/9686813f6e9d5568bc045de0be853411e44958c8

cheers

^ permalink raw reply

* Re: [PATCH v3] powerpc: Make setjmp/longjmp signature standard
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Clement Courbet
  Cc: Greg Kroah-Hartman, Nick Desaulniers, linux-kernel, stable,
	clang-built-linux, Paul Mackerras, Clement Courbet,
	Nathan Chancellor, linuxppc-dev, Thomas Gleixner
In-Reply-To: <20200330080400.124803-1-courbet@google.com>

On Mon, 2020-03-30 at 08:03:56 UTC, Clement Courbet wrote:
> Declaring setjmp()/longjmp() as taking longs makes the signature
> non-standard, and makes clang complain. In the past, this has been
> worked around by adding -ffreestanding to the compile flags.
> 
> The implementation looks like it only ever propagates the value
> (in longjmp) or sets it to 1 (in setjmp), and we only call longjmp
> with integer parameters.
> 
> This allows removing -ffreestanding from the compilation flags.
> 
> Context:
> https://lore.kernel.org/patchwork/patch/1214060
> https://lore.kernel.org/patchwork/patch/1216174
> 
> Signed-off-by: Clement Courbet <courbet@google.com>
> Reviewed-by: Nathan Chancellor <natechancellor@gmail.com>
> Tested-by: Nathan Chancellor <natechancellor@gmail.com>
> Cc: stable@vger.kernel.org # v4.14+
> Fixes: c9029ef9c957 ("powerpc: Avoid clang warnings around setjmp and longjmp")

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/c17eb4dca5a353a9dbbb8ad6934fe57af7165e91

cheers

^ permalink raw reply

* Re: [PATCH v4] powerpc/pseries: Handle UE event for memcpy_mcsafe
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Ganesh Goudar, linuxppc-dev; +Cc: mahesh, santosh, Ganesh Goudar
In-Reply-To: <20200326184916.31172-1-ganeshgr@linux.ibm.com>

On Thu, 2020-03-26 at 18:49:16 UTC, Ganesh Goudar wrote:
> memcpy_mcsafe has been implemented for power machines which is used
> by pmem infrastructure, so that an UE encountered during memcpy from
> pmem devices would not result in panic instead a right error code
> is returned. The implementation expects machine check handler to ignore
> the event and set nip to continue the execution from fixup code.
> 
> Appropriate changes are already made to powernv machine check handler,
> make similar changes to pseries machine check handler to ignore the
> the event and set nip to continue execution at the fixup entry if we
> hit UE at an instruction with a fixup entry.
> 
> while we are at it, have a common function which searches the exception
> table entry and updates nip with fixup address, and any future common
> changes can be made in this function that are valid for both architectures.
> 
> powernv changes are made by
> commit 895e3dceeb97 ("powerpc/mce: Handle UE event for memcpy_mcsafe")
> 
> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
> Reviewed-by: Santosh S <santosh@fossix.org>
> Signed-off-by: Ganesh Goudar <ganeshgr@linux.ibm.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/efbc4303b255bb80ab1283794b36dd5fe1fb0ec3

cheers

^ permalink raw reply

* Re: [PATCH v2] powerpc/boot: Delete unneeded .globl _zimage_start
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Fangrui Song, linuxppc-dev
  Cc: clang-built-linux, Nick Desaulniers, Joel Stanley, Fangrui Song,
	Alan Modra
In-Reply-To: <20200325164257.170229-1-maskray@google.com>

On Wed, 2020-03-25 at 16:42:57 UTC, Fangrui Song wrote:
> .globl sets the symbol binding to STB_GLOBAL while .weak sets the
> binding to STB_WEAK. GNU as let .weak override .globl since binutils-gdb
> 5ca547dc2399a0a5d9f20626d4bf5547c3ccfddd (1996). Clang integrated
> assembler let the last win but it may error in the future.
> 
> Since it is a convention that only one binding directive is used, just
> delete .globl.
> 
> Fixes: cd197ffcf10b "[POWERPC] zImage: Cleanup and improve zImage entry point"
> Fixes: ee9d21b3b358 "powerpc/boot: Ensure _zimage_start is a weak symbol"
> Link: https://github.com/ClangBuiltLinux/linux/issues/937
> Signed-off-by: Fangrui Song <maskray@google.com>
> Cc: Alan Modra <amodra@gmail.com>
> Cc: Joel Stanley <joel@jms.id.au>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Nick Desaulniers <ndesaulniers@google.com>
> Cc: Segher Boessenkool <segher@kernel.crashing.org>
> Cc: clang-built-linux@googlegroups.com

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/968339fad422a58312f67718691b717dac45c399

cheers

^ permalink raw reply

* Re: [PATCH v2] powerpc/64: mark emergency stacks valid to unwind
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Nicholas Piggin, linuxppc-dev; +Cc: Nicholas Piggin
In-Reply-To: <20200325104144.158362-1-npiggin@gmail.com>

On Wed, 2020-03-25 at 10:41:44 UTC, Nicholas Piggin wrote:
> Before:
> 
>   WARNING: CPU: 0 PID: 494 at arch/powerpc/kernel/irq.c:343
>   CPU: 0 PID: 494 Comm: a Tainted: G        W
>   NIP:  c00000000001ed2c LR: c000000000d13190 CTR: c00000000003f910
>   REGS: c0000001fffd3870 TRAP: 0700   Tainted: G        W
>   MSR:  8000000000021003 <SF,ME,RI,LE>  CR: 28000488  XER: 00000000
>   CFAR: c00000000001ec90 IRQMASK: 0
>   GPR00: c000000000aeb12c c0000001fffd3b00 c0000000012ba300 0000000000000000
>   GPR04: 0000000000000000 0000000000000000 000000010bd207c8 6b00696e74657272
>   GPR08: 0000000000000000 0000000000000000 0000000000000000 efbeadde00000000
>   GPR12: 0000000000000000 c0000000014a0000 0000000000000000 0000000000000000
>   GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
>   GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
>   GPR24: 0000000000000000 0000000000000000 0000000000000000 000000010bd207bc
>   GPR28: 0000000000000000 c00000000148a898 0000000000000000 c0000001ffff3f50
>   NIP [c00000000001ed2c] arch_local_irq_restore.part.0+0xac/0x100
>   LR [c000000000d13190] _raw_spin_unlock_irqrestore+0x50/0xc0
>   Call Trace:
>   Instruction dump:
>   60000000 7d2000a6 71298000 41820068 39200002 7d210164 4bffff9c 60000000
>   60000000 7d2000a6 71298000 4c820020 <0fe00000> 4e800020 60000000 60000000
> 
> After:
> 
>   WARNING: CPU: 0 PID: 499 at arch/powerpc/kernel/irq.c:343
>   CPU: 0 PID: 499 Comm: a Not tainted
>   NIP:  c00000000001ed2c LR: c000000000d13210 CTR: c00000000003f980
>   REGS: c0000001fffd3870 TRAP: 0700   Not tainted
>   MSR:  8000000000021003 <SF,ME,RI,LE>  CR: 28000488  XER: 00000000
>   CFAR: c00000000001ec90 IRQMASK: 0
>   GPR00: c000000000aeb1ac c0000001fffd3b00 c0000000012ba300 0000000000000000
>   GPR04: 0000000000000000 0000000000000000 00000001347607c8 6b00696e74657272
>   GPR08: 0000000000000000 0000000000000000 0000000000000000 efbeadde00000000
>   GPR12: 0000000000000000 c0000000014a0000 0000000000000000 0000000000000000
>   GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
>   GPR20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
>   GPR24: 0000000000000000 0000000000000000 0000000000000000 00000001347607bc
>   GPR28: 0000000000000000 c00000000148a898 0000000000000000 c0000001ffff3f50
>   NIP [c00000000001ed2c] arch_local_irq_restore.part.0+0xac/0x100
>   LR [c000000000d13210] _raw_spin_unlock_irqrestore+0x50/0xc0
>   Call Trace:
>   [c0000001fffd3b20] [c000000000aeb1ac] of_find_property+0x6c/0x90
>   [c0000001fffd3b70] [c000000000aeb1f0] of_get_property+0x20/0x40
>   [c0000001fffd3b90] [c000000000042cdc] rtas_token+0x3c/0x70
>   [c0000001fffd3bb0] [c0000000000dc318] fwnmi_release_errinfo+0x28/0x70
>   [c0000001fffd3c10] [c0000000000dcd8c] pseries_machine_check_realmode+0x1dc/0x540
>   [c0000001fffd3cd0] [c00000000003fe04] machine_check_early+0x54/0x70
>   [c0000001fffd3d00] [c000000000008384] machine_check_early_common+0x134/0x1f0
>   --- interrupt: 200 at 0x1347607c8
>       LR = 0x7fffafbd8328
>   Instruction dump:
>   60000000 7d2000a6 71298000 41820068 39200002 7d210164 4bffff9c 60000000
>   60000000 7d2000a6 71298000 4c820020 <0fe00000> 4e800020 60000000 60000000
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/a2e366832f3f4d5e1b47b7c7f7c41977bd5100f4

cheers

^ permalink raw reply

* Re: [PATCH] arch/powerpc/64: Avoid isync in flush_dcache_range
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Aneesh Kumar K.V, linuxppc-dev, paulus; +Cc: Aneesh Kumar K.V
In-Reply-To: <20200320103242.229223-1-aneesh.kumar@linux.ibm.com>

On Fri, 2020-03-20 at 10:32:42 UTC, "Aneesh Kumar K.V" wrote:
> As per ISA and isync is only needed on instruction cache
> block invalidate. Remove the same from dcache invalidate.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/233ba5461838a56c19600216f0919e7cd3aec40e

cheers

^ permalink raw reply

* Re: [PATCH 1/2] powerpc/smp: Drop superfluous NULL check
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev; +Cc: srikar
In-Reply-To: <20200313112020.28235-1-mpe@ellerman.id.au>

On Fri, 2020-03-13 at 11:20:19 UTC, Michael Ellerman wrote:
> We don't need the NULL check of np, the result is the same because the
> OF helpers cope with NULL, of_node_to_nid(NULL) == NUMA_NO_NODE (-1).
> 
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

Series applied to powerpc next.

https://git.kernel.org/powerpc/c/4b4d181d63518334070a877ba789211bde77da9e

cheers

^ permalink raw reply

* Re: [PATCH 1/4] powerpc/xive: Use XIVE_BAD_IRQ instead of zero to catch non configured IPIs
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: Cédric Le Goater, linuxppc-dev, Greg Kurz, stable,
	David Gibson
In-Reply-To: <20200306150143.5551-2-clg@kaod.org>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1118 bytes --]

On Fri, 2020-03-06 at 15:01:40 UTC, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= wrote:
> When a CPU is brought up, an IPI number is allocated and recorded
> under the XIVE CPU structure. Invalid IPI numbers are tracked with
> interrupt number 0x0.
> 
> On the PowerNV platform, the interrupt number space starts at 0x10 and
> this works fine. However, on the sPAPR platform, it is possible to
> allocate the interrupt number 0x0 and this raises an issue when CPU 0
> is unplugged. The XIVE spapr driver tracks allocated interrupt numbers
> in a bitmask and it is not correctly updated when interrupt number 0x0
> is freed. It stays allocated and it is then impossible to reallocate.
> 
> Fix by using the XIVE_BAD_IRQ value instead of zero on both platforms.
> 
> Reported-by: David Gibson <david@gibson.dropbear.id.au>
> Fixes: eac1e731b59e ("powerpc/xive: guest exploitation of the XIVE interrupt controller")
> Cc: stable@vger.kernel.org # v4.14+
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Series applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/b1a504a6500df50e83b701b7946b34fce27ad8a3

cheers

^ permalink raw reply

* Re: [PATCH 1/2] powerpc: Drop -fno-dwarf2-cfi-asm
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Naveen N. Rao, linuxppc-dev; +Cc: Rasmus Villemoes
In-Reply-To: <9b22a064de6eb1301d92177eb3a38559df7005d3.1583415544.git.naveen.n.rao@linux.vnet.ibm.com>

On Thu, 2020-03-05 at 14:35:29 UTC, "Naveen N. Rao" wrote:
> The original commit/discussion adding -fno-dwarf2-cfi-asm refers to
> R_PPC64_REL32 relocations not being handled by our module loader:
> http://lkml.kernel.org/r/20090224065112.GA6690@bombadil.infradead.org
> 
> However, that is now handled thanks to commit 9f751b82b491d
> ("powerpc/module: Add support for R_PPC64_REL32 relocations").
> 
> So, drop this flag from our Makefile.
> 
> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>

Series applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/c04868df38d8d6239ef0f36f45dbba2624e6a9cb

cheers

^ permalink raw reply

* Re: [PATCH v5 01/13] powerpc: move ptrace into a subdirectory.
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Christophe Leroy, Benjamin Herrenschmidt, Paul Mackerras, mikey
  Cc: linuxppc-dev, linux-kernel
In-Reply-To: <9ebcbe37834e9d447dd97f4381084795a673260c.1582848567.git.christophe.leroy@c-s.fr>

On Fri, 2020-02-28 at 00:14:37 UTC, Christophe Leroy wrote:
> In order to allow splitting of ptrace depending on the
> different CONFIG_ options, create a subdirectory dedicated to
> ptrace and move ptrace.c and ptrace32.c into it.
> 
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>

Series applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/da9a1c10e2c7311e923210b6ccd9fbd1ac9132df

cheers

^ permalink raw reply

* Re: [PATCH 1/2] powerpc/vmlinux.lds: Explicitly retain .gnu.hash
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev; +Cc: joel, amodra
In-Reply-To: <20200227045933.22967-1-mpe@ellerman.id.au>

On Thu, 2020-02-27 at 04:59:32 UTC, Michael Ellerman wrote:
> Relocatable kernel builds produce a warning about .gnu.hash being an
> orphan section:
> 
>   ld: warning: orphan section `.gnu.hash' from `linker stubs' being placed in section `.gnu.hash'
> 
> If we try to discard it the build fails:
> 
>   ld -EL -m elf64lppc -pie --orphan-handling=warn --build-id -o
>     .tmp_vmlinux1 -T ./arch/powerpc/kernel/vmlinux.lds --whole-archive
>     arch/powerpc/kernel/head_64.o arch/powerpc/kernel/entry_64.o
>     ...
>     sound/built-in.a net/built-in.a virt/built-in.a --no-whole-archive
>     --start-group lib/lib.a --end-group
>   ld: could not find section .gnu.hash
> 
> So add an entry to explicitly retain it, as we do for .hash.
> 
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

Applied to powerpc next.

https://git.kernel.org/powerpc/c/ead983604c5a390f1e3ce085945b60e82f08dbbe

cheers

^ permalink raw reply

* Re: [PATCH v3 01/32] powerpc/64s/exception: Introduce INT_DEFINE parameter block for code generation
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Nicholas Piggin, linuxppc-dev; +Cc: Michal Suchanek, Nicholas Piggin
In-Reply-To: <20200225173541.1549955-2-npiggin@gmail.com>

On Tue, 2020-02-25 at 17:35:10 UTC, Nicholas Piggin wrote:
> The code generation macro arguments are difficult to read, and
> defaults can't easily be used.
> 
> This introduces a block where parameters can be set for interrupt
> handler code generation by the subsequent macros, and adds the first
> generation macro for interrupt entry.
> 
> One interrupt handler is converted to the new macros to demonstrate
> the change, the rest will be coverted all at once.
> 
> No generated code change.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Patches 1-30 applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/a42a239db3262b8185cb1a07a9350392ef1439ca

cheers

^ permalink raw reply

* Re: [PATCH 1/8] powerpc: Update MAINTAINERS
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Michael Ellerman, linuxppc-dev; +Cc: Paul Mackerras, linux-kernel
In-Reply-To: <20200224233146.23734-1-mpe@ellerman.id.au>

On Mon, 2020-02-24 at 23:31:39 UTC, Michael Ellerman wrote:
> A while back Paul pointed out I'd been maintaining the tree more or
> less solo for over five years, so perhaps it's time to update the
> MAINTAINERS entry.
> 
> Ben & Paul still wrote most of the code, so keep them as Reviewers so
> they still get Cc'ed on things. But if you're wondering why your patch
> hasn't been merged that's my fault.
> 
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: Paul Mackerras <paulus@samba.org>
> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

Series applied to powerpc next.

https://git.kernel.org/powerpc/c/7703889e8ee1b318f632be7ba4d58d9962ecf34f

cheers

^ permalink raw reply

* Re: [PATCH] powernv/opal-sensor-groups: Add documentation for the sysfs interfaces
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Gautham R. Shenoy, Vaidyanathan Srinivasan, Shilpasri G Bhat
  Cc: Gautham R. Shenoy, linuxppc-dev, linux-kernel, Shilpasri G Bhat
In-Reply-To: <1574776274-22355-1-git-send-email-ego@linux.vnet.ibm.com>

On Tue, 2019-11-26 at 13:51:14 UTC, "Gautham R. Shenoy" wrote:
> From: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
> 
> Commit bf9571550f52 ("powerpc/powernv: Add support to clear sensor
> groups data") added a mechanism to clear sensor-group data via a sysfs
> interface. However, the ABI for that interface has not been
> documented.
> 
> This patch documents the ABI for the sysfs interface for sensor-groups
> and clearing the sensor-groups.
> 
> This patch was originally sent by Shilpasri G Bhat on the mailing list:
> https://lkml.org/lkml/2018/8/1/85
> 
> Signed-off-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.ibm.com>
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/32377bd2cbb62e23ac0a1aaaf0048957c5fd9f02

cheers

^ permalink raw reply

* Re: [PATCH 1/1] powerpc/cputable: Remove unnecessary copy of cpu_spec->oprofile_type
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Leonardo Bras, Benjamin Herrenschmidt, Paul Mackerras,
	Christophe Leroy, Greg Kroah-Hartman, Leonardo Bras,
	Thomas Gleixner, desnesn
  Cc: linuxppc-dev, linux-kernel
In-Reply-To: <20200215053637.280880-1-leonardo@linux.ibm.com>

On Sat, 2020-02-15 at 05:36:37 UTC, Leonardo Bras wrote:
> Before checking for cpu_type == NULL, this same copy happens, so doing
> it here will just write the same value to the t->oprofile_type
> again.
> 
> Remove the repeated copy, as it is unnecessary.
> 
> Signed-off-by: Leonardo Bras <leonardo@linux.ibm.com>

Series applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/41b8426fdb59218f56a6e3b3facd43a82816e3eb

cheers

^ permalink raw reply

* Re: [PATCH] powerpc/32: drop unused ISA_DMA_THRESHOLD
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: linux-kernel, Mike Rapoport, Paul Mackerras, linuxppc-dev,
	Christoph Hellwig, Mike Rapoport
In-Reply-To: <20191125092033.20014-1-rppt@kernel.org>

On Mon, 2019-11-25 at 09:20:33 UTC, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> The ISA_DMA_THRESHOLD variable is set by several platforms but never
> referenced.
> Remove it.
> 
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/b77afad84e1eedca03658ae1478ce5b8ed5aa18c

cheers

^ permalink raw reply

* Re: [PATCH 10/16] powerpc: prefer __section and __printf from compiler_attributes.h
From: Michael Ellerman @ 2020-04-01 12:53 UTC (permalink / raw)
  To: Nick Desaulniers, akpm
  Cc: Rob Herring, Song Liu, Martin KaFai Lau, Daniel Borkmann,
	miguel.ojeda.sandonis, Geoff Levand, Greg Kroah-Hartman,
	Nick Desaulniers, Alexei Starovoitov, linux-kernel,
	clang-built-linux, netdev, Paul Mackerras, jpoimboe, sedat.dilek,
	yhs, Thomas Gleixner, linuxppc-dev, bpf, Allison Randal
In-Reply-To: <20190812215052.71840-10-ndesaulniers@google.com>

On Mon, 2019-08-12 at 21:50:43 UTC, Nick Desaulniers wrote:
> Reported-by: Sedat Dilek <sedat.dilek@gmail.com>
> Suggested-by: Josh Poimboeuf <jpoimboe@redhat.com>
> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/a7032637b54186e5649917679727d7feaec932b1

cheers

^ permalink raw reply

* Re: [PATCH v4 6/6] pseries/sysfs: Minimise IPI noise while reading [idle_][s]purr
From: Gautham R Shenoy @ 2020-04-01 12:01 UTC (permalink / raw)
  To: Naveen N. Rao, Michael Ellerman
  Cc: Tyrel Datwyler, Gautham R. Shenoy, linux-kernel, Kamalesh Babulal,
	Vaidyanathan Srinivasan, linuxppc-dev
In-Reply-To: <1585734367.oqwn7dzljo.naveen@linux.ibm.com>

Hello Naveen,


On Wed, Apr 01, 2020 at 03:28:48PM +0530, Naveen N. Rao wrote:
> Gautham R. Shenoy wrote:
> >From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
> >
 [..snip..]

> >-static DEVICE_ATTR(spurr, 0400, show_spurr, NULL);
> >-static DEVICE_ATTR(purr, 0400, show_purr, store_purr);
> > static DEVICE_ATTR(pir, 0400, show_pir, NULL);
> > static DEVICE_ATTR(tscr, 0600, show_tscr, store_tscr);
> > #endif /* CONFIG_PPC64 */
> >@@ -761,22 +757,110 @@ static void create_svm_file(void)
> > }
> > #endif /* CONFIG_PPC_SVM */
> >
> >+#ifdef CONFIG_PPC64
> >+/*
> >+ * The duration (in ms) from the last IPI to the target CPU until
> >+ * which a cached value of purr, spurr, idle_purr, idle_spurr can be
> >+ * reported to the user on a corresponding sysfs file read. Beyond
> >+ * this duration, fresh values need to be obtained by sending IPIs to
> >+ * the target CPU when the sysfs files are read.
> >+ */
> >+static unsigned long util_stats_staleness_tolerance_ms = 10;
> 
> This is a nice optimization for our use in lparstat, though I have a concern
> below.
> 
> >+struct util_acct_stats {
> >+	u64 latest_purr;
> >+	u64 latest_spurr;
> >+#ifdef CONFIG_PPC_PSERIES
> >+	u64 latest_idle_purr;
> >+	u64 latest_idle_spurr;
> >+#endif
> 
> You can probably drop the 'latest_' prefix.


Sure.

> 
> >+	unsigned long last_update_jiffies;
> >+};
> >+
> >+DEFINE_PER_CPU(struct util_acct_stats, util_acct_stats);
> 
> Per snowpatch, this should be static, and so should get_util_stats_ptr()
> below:
> https://openpower.xyz/job/snowpatch/job/snowpatch-linux-sparse/16601//artifact/linux/report.txt

Ok, will fix this in v5.

> 
> >+
> >+static void update_util_acct_stats(void *ptr)
> >+{
> >+	struct util_acct_stats *stats = ptr;
> >+
> >+	stats->latest_purr = mfspr(SPRN_PURR);
> >+	stats->latest_spurr = mfspr(SPRN_SPURR);
> > #ifdef CONFIG_PPC_PSERIES
> >-static void read_idle_purr(void *val)
> >+	stats->latest_idle_purr = read_this_idle_purr();
> >+	stats->latest_idle_spurr = read_this_idle_spurr();
> >+#endif
> >+	stats->last_update_jiffies = jiffies;
> >+}
> >+
> >+struct util_acct_stats *get_util_stats_ptr(int cpu)
> >+{
> >+	struct util_acct_stats *stats = per_cpu_ptr(&util_acct_stats, cpu);
> >+	unsigned long delta_jiffies;
> >+
> >+	delta_jiffies = jiffies - stats->last_update_jiffies;
> >+
> >+	/*
> >+	 * If we have a recent enough data, reuse that instead of
> >+	 * sending an IPI.
> >+	 */
> >+	if (jiffies_to_msecs(delta_jiffies) < util_stats_staleness_tolerance_ms)
> >+		return stats;
> >+
> >+	smp_call_function_single(cpu, update_util_acct_stats, stats, 1);
> >+	return stats;
> >+}
> >+
> >+static ssize_t show_purr(struct device *dev,
> >+			 struct device_attribute *attr, char *buf)
> > {
> >-	u64 *ret = val;
> >+	struct cpu *cpu = container_of(dev, struct cpu, dev);
> >+	struct util_acct_stats *stats;
> >
> >-	*ret = read_this_idle_purr();
> >+	stats = get_util_stats_ptr(cpu->dev.id);
> >+	return sprintf(buf, "%llx\n", stats->latest_purr);
> 
> This alters the behavior of the current sysfs purr file. I am not sure if it
> is reasonable to return the same PURR value across a 10ms window.


It does reduce it to 10ms window. I am not sure if anyone samples PURR
etc faster than that rate.

I measured how much time it takes to read the purr, spurr, idle_purr,
idle_spurr files back-to-back. It takes not more than 150us.  From
lparstat will these values be read back-to-back ? If so, we can reduce
the staleness_tolerance to something like 500us and still avoid extra
IPIs. If not, what is the maximum delay between the first sysfs file
read and the last sysfs file read ?

>
> I wonder if we should introduce a sysctl interface to control thresholding.
> It can default to 0, which disables thresholding so that the existing
> behavior continues. Applications (lparstat) can optionally set it to suit
> their use.

We would be introducing 3 new sysfs interfaces that way instead of
two.

/sys/devices/system/cpu/purr_spurr_staleness
/sys/devices/system/cpu/cpuX/idle_purr
/sys/devices/system/cpu/cpuX/idle_spurr

I don't have a problem with this. Nathan, Michael, thoughts on this?


The alternative is to have a procfs interface, something like
/proc/powerpc/resource_util_stats

which gives a listing similar to /proc/stat, i.e

      CPUX  <purr>  <idle_purr>  <spurr>  <idle_spurr>

Even in this case, the values can be obtained in one-shot with a
single IPI and be printed in the row corresponding to the CPU.

> 
> - Naveen
> 

--
Thanks and Regards
gautham.

^ permalink raw reply

* Re: [RFC WIP PATCH] powerpc/32: system call implement entry/exit logic in C
From: Christophe Leroy @ 2020-04-01 11:48 UTC (permalink / raw)
  To: Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman, npiggin,
	msuchanek
  Cc: linuxppc-dev, linux-kernel
In-Reply-To: <bbc0a09cfaf523bc00893253a7101362c98b31eb.1585667934.git.christophe.leroy@c-s.fr>



Le 31/03/2020 à 17:22, Christophe Leroy a écrit :
> That's first try to port PPC64 syscall entry/exit logic in C to PPC32.
> I've do the minimum to get it work. I have not reworked calls
> to sys_fork() and friends for instance.
> 
> For the time being, it seems to work more or less but:
> - ping reports EINVAL on recvfrom
> - strace shows NULL instead of strings in call like open() for instance.

For the two above problems, that's because system_call_exception() 
doesn't set orig_gpr3 whereas DoSycall() does in entry_32.S . Is that 
only done on PPC32 ?

With the following line at the begining of system_call_exception(), it 
works perfectly:

	regs->orig_gpr3 = r3;

I will now focus on performance to see if we can do something about it.

Christophe

> - the performance is definitively bad
> 
> On an 8xx, null_syscall test is about 30% slower after this patch:
> - Without the patch: 284 cycles
> - With the patch: 371 cycles
> 
> @nick and others, any suggestion to fix and improve ?
> 
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> ---
>   arch/powerpc/include/asm/book3s/32/kup.h      |  21 ++
>   .../powerpc/include/asm/book3s/64/kup-radix.h |  12 +-
>   arch/powerpc/include/asm/hw_irq.h             |  15 +
>   arch/powerpc/include/asm/kup.h                |   2 +
>   arch/powerpc/include/asm/nohash/32/kup-8xx.h  |  13 +
>   arch/powerpc/kernel/Makefile                  |   5 +-
>   arch/powerpc/kernel/entry_32.S                | 259 ++----------------
>   arch/powerpc/kernel/head_32.h                 |   3 +-
>   .../kernel/{syscall_64.c => syscall.c}        |  25 +-
>   9 files changed, 102 insertions(+), 253 deletions(-)
>   rename arch/powerpc/kernel/{syscall_64.c => syscall.c} (97%)
> 
> diff --git a/arch/powerpc/include/asm/book3s/32/kup.h b/arch/powerpc/include/asm/book3s/32/kup.h
> index 3c0ba22dc360..c85bc5b56366 100644
> --- a/arch/powerpc/include/asm/book3s/32/kup.h
> +++ b/arch/powerpc/include/asm/book3s/32/kup.h
> @@ -102,6 +102,27 @@ static inline void kuap_update_sr(u32 sr, u32 addr, u32 end)
>   	isync();	/* Context sync required after mtsrin() */
>   }
>   
> +static inline void kuap_restore(struct pt_regs *regs)
> +{
> +	u32 kuap = current->thread.kuap;
> +	u32 addr = kuap & 0xf0000000;
> +	u32 end = kuap << 28;
> +
> +	if (unlikely(!kuap))
> +		return;
> +
> +	current->thread.kuap = 0;
> +	kuap_update_sr(mfsrin(addr) & ~SR_KS, addr, end);	/* Clear Ks */
> +}
> +
> +static inline void kuap_check(void)
> +{
> +	if (!IS_ENABLED(CONFIG_PPC_KUAP_DEBUG))
> +		return;
> +
> +	WARN_ON_ONCE(current->thread.kuap != 0);
> +}
> +
>   static __always_inline void allow_user_access(void __user *to, const void __user *from,
>   					      u32 size, unsigned long dir)
>   {
> diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h b/arch/powerpc/include/asm/book3s/64/kup-radix.h
> index 3bcef989a35d..1f2716a0dcd8 100644
> --- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
> +++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
> @@ -60,13 +60,13 @@
>   #include <asm/mmu.h>
>   #include <asm/ptrace.h>
>   
> -static inline void kuap_restore_amr(struct pt_regs *regs)
> +static inline void kuap_restore(struct pt_regs *regs)
>   {
>   	if (mmu_has_feature(MMU_FTR_RADIX_KUAP))
>   		mtspr(SPRN_AMR, regs->kuap);
>   }
>   
> -static inline void kuap_check_amr(void)
> +static inline void kuap_check(void)
>   {
>   	if (IS_ENABLED(CONFIG_PPC_KUAP_DEBUG) && mmu_has_feature(MMU_FTR_RADIX_KUAP))
>   		WARN_ON_ONCE(mfspr(SPRN_AMR) != AMR_KUAP_BLOCKED);
> @@ -141,14 +141,6 @@ bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
>   		    (regs->kuap & (is_write ? AMR_KUAP_BLOCK_WRITE : AMR_KUAP_BLOCK_READ)),
>   		    "Bug: %s fault blocked by AMR!", is_write ? "Write" : "Read");
>   }
> -#else /* CONFIG_PPC_KUAP */
> -static inline void kuap_restore_amr(struct pt_regs *regs)
> -{
> -}
> -
> -static inline void kuap_check_amr(void)
> -{
> -}
>   #endif /* CONFIG_PPC_KUAP */
>   
>   #endif /* __ASSEMBLY__ */
> diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h
> index e0e71777961f..6ccf07de6665 100644
> --- a/arch/powerpc/include/asm/hw_irq.h
> +++ b/arch/powerpc/include/asm/hw_irq.h
> @@ -321,6 +321,16 @@ static inline void arch_local_irq_disable(void)
>   		mtmsr(mfmsr() & ~MSR_EE);
>   }
>   
> +static inline void arch_local_recovery_disable(void)
> +{
> +	if (IS_ENABLED(CONFIG_BOOKE))
> +		wrtee(0);
> +	else if (IS_ENABLED(CONFIG_PPC_8xx))
> +		wrtspr(SPRN_NRI);
> +	else
> +		mtmsr(mfmsr() & ~(MSR_EE | MSR_RI));
> +}
> +
>   static inline void arch_local_irq_enable(void)
>   {
>   	if (IS_ENABLED(CONFIG_BOOKE))
> @@ -343,6 +353,11 @@ static inline bool arch_irqs_disabled(void)
>   
>   #define hard_irq_disable()		arch_local_irq_disable()
>   
> +#define __hard_irq_enable()		arch_local_irq_enable()
> +#define __hard_irq_disable()		arch_local_irq_disable()
> +#define __hard_EE_RI_disable()		arch_local_recovery_disable()
> +#define __hard_RI_enable()		arch_local_irq_disable()
> +
>   static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
>   {
>   	return !(regs->msr & MSR_EE);
> diff --git a/arch/powerpc/include/asm/kup.h b/arch/powerpc/include/asm/kup.h
> index 92bcd1a26d73..1100c13b6d9e 100644
> --- a/arch/powerpc/include/asm/kup.h
> +++ b/arch/powerpc/include/asm/kup.h
> @@ -62,6 +62,8 @@ bad_kuap_fault(struct pt_regs *regs, unsigned long address, bool is_write)
>   {
>   	return false;
>   }
> +static inline void kuap_restore(struct pt_regs *regs) { }
> +static inline void kuap_check(void) { }
>   #endif /* CONFIG_PPC_KUAP */
>   
>   static inline void allow_read_from_user(const void __user *from, unsigned long size)
> diff --git a/arch/powerpc/include/asm/nohash/32/kup-8xx.h b/arch/powerpc/include/asm/nohash/32/kup-8xx.h
> index 85ed2390fb99..1918d2e55da3 100644
> --- a/arch/powerpc/include/asm/nohash/32/kup-8xx.h
> +++ b/arch/powerpc/include/asm/nohash/32/kup-8xx.h
> @@ -34,6 +34,19 @@
>   
>   #include <asm/reg.h>
>   
> +static inline void kuap_restore(struct pt_regs *regs)
> +{
> +	mtspr(SPRN_MD_AP, regs->kuap);
> +}
> +
> +static inline void kuap_check(void)
> +{
> +	if (!IS_ENABLED(CONFIG_PPC_KUAP_DEBUG))
> +		return;
> +
> +	WARN_ON_ONCE((mfspr(SPRN_MD_AP) & 0xffff0000) != (MD_APG_KUAP & 0xffff0000));
> +}
> +
>   static inline void allow_user_access(void __user *to, const void __user *from,
>   				     unsigned long size, unsigned long dir)
>   {
> diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
> index 570660efbb3d..e4be425b7718 100644
> --- a/arch/powerpc/kernel/Makefile
> +++ b/arch/powerpc/kernel/Makefile
> @@ -45,11 +45,10 @@ obj-y				:= cputable.o syscalls.o \
>   				   signal.o sysfs.o cacheinfo.o time.o \
>   				   prom.o traps.o setup-common.o \
>   				   udbg.o misc.o io.o misc_$(BITS).o \
> -				   of_platform.o prom_parse.o
> +				   of_platform.o prom_parse.o syscall.o
>   obj-y				+= ptrace/
>   obj-$(CONFIG_PPC64)		+= setup_64.o sys_ppc32.o signal_64.o \
> -				   paca.o nvram_64.o firmware.o note.o \
> -				   syscall_64.o
> +				   paca.o nvram_64.o firmware.o note.o
>   obj-$(CONFIG_VDSO32)		+= vdso32/
>   obj-$(CONFIG_PPC_WATCHDOG)	+= watchdog.o
>   obj-$(CONFIG_HAVE_HW_BREAKPOINT)	+= hw_breakpoint.o
> diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
> index a6371fb8f761..103f5158bc44 100644
> --- a/arch/powerpc/kernel/entry_32.S
> +++ b/arch/powerpc/kernel/entry_32.S
> @@ -315,162 +315,37 @@ stack_ovf:
>   	RFI
>   #endif
>   
> -#ifdef CONFIG_TRACE_IRQFLAGS
> -trace_syscall_entry_irq_off:
> -	/*
> -	 * Syscall shouldn't happen while interrupts are disabled,
> -	 * so let's do a warning here.
> -	 */
> -0:	trap
> -	EMIT_BUG_ENTRY 0b,__FILE__,__LINE__, BUGFLAG_WARNING
> -	bl	trace_hardirqs_on
> -
> -	/* Now enable for real */
> -	LOAD_REG_IMMEDIATE(r10, MSR_KERNEL | MSR_EE)
> -	mtmsr	r10
> -
> -	REST_GPR(0, r1)
> -	REST_4GPRS(3, r1)
> -	REST_2GPRS(7, r1)
> -	b	DoSyscall
> -#endif /* CONFIG_TRACE_IRQFLAGS */
> -
>   	.globl	transfer_to_syscall
>   transfer_to_syscall:
> -#ifdef CONFIG_TRACE_IRQFLAGS
> -	andi.	r12,r9,MSR_EE
> -	beq-	trace_syscall_entry_irq_off
> -#endif /* CONFIG_TRACE_IRQFLAGS */
> -
> -/*
> - * Handle a system call.
> - */
> -	.stabs	"arch/powerpc/kernel/",N_SO,0,0,0f
> -	.stabs	"entry_32.S",N_SO,0,0,0f
> -0:
> -
> -_GLOBAL(DoSyscall)
> -	stw	r3,ORIG_GPR3(r1)
> -	li	r12,0
> -	stw	r12,RESULT(r1)
> -#ifdef CONFIG_TRACE_IRQFLAGS
> -	/* Make sure interrupts are enabled */
> -	mfmsr	r11
> -	andi.	r12,r11,MSR_EE
> -	/* We came in with interrupts disabled, we WARN and mark them enabled
> -	 * for lockdep now */
> -0:	tweqi	r12, 0
> -	EMIT_BUG_ENTRY 0b,__FILE__,__LINE__, BUGFLAG_WARNING
> -#endif /* CONFIG_TRACE_IRQFLAGS */
> -	lwz	r11,TI_FLAGS(r2)
> -	andi.	r11,r11,_TIF_SYSCALL_DOTRACE
> -	bne-	syscall_dotrace
> -syscall_dotrace_cont:
> -	cmplwi	0,r0,NR_syscalls
> -	lis	r10,sys_call_table@h
> -	ori	r10,r10,sys_call_table@l
> -	slwi	r0,r0,2
> -	bge-	66f
> -
> -	barrier_nospec_asm
> -	/*
> -	 * Prevent the load of the handler below (based on the user-passed
> -	 * system call number) being speculatively executed until the test
> -	 * against NR_syscalls and branch to .66f above has
> -	 * committed.
> -	 */
> -
> -	lwzx	r10,r10,r0	/* Fetch system call handler [ptr] */
> -	mtlr	r10
> -	addi	r9,r1,STACK_FRAME_OVERHEAD
> -	PPC440EP_ERR42
> -	blrl			/* Call handler */
> -	.globl	ret_from_syscall
> +	mr	r9, r0
> +	addi	r10, r1, STACK_FRAME_OVERHEAD
> +	bl	system_call_exception
>   ret_from_syscall:
> -#ifdef CONFIG_DEBUG_RSEQ
> -	/* Check whether the syscall is issued inside a restartable sequence */
> -	stw	r3,GPR3(r1)
> -	addi    r3,r1,STACK_FRAME_OVERHEAD
> -	bl      rseq_syscall
> -	lwz	r3,GPR3(r1)
> -#endif
> -	mr	r6,r3
> -	/* disable interrupts so current_thread_info()->flags can't change */
> -	LOAD_REG_IMMEDIATE(r10,MSR_KERNEL)	/* doesn't include MSR_EE */
> -	/* Note: We don't bother telling lockdep about it */
> -	SYNC
> -	mtmsr	r10
> -	lwz	r9,TI_FLAGS(r2)
> -	li	r8,-MAX_ERRNO
> -	andi.	r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
> -	bne-	syscall_exit_work
> -	cmplw	0,r3,r8
> -	blt+	syscall_exit_cont
> -	lwz	r11,_CCR(r1)			/* Load CR */
> -	neg	r3,r3
> -	oris	r11,r11,0x1000	/* Set SO bit in CR */
> -	stw	r11,_CCR(r1)
> -syscall_exit_cont:
> -	lwz	r8,_MSR(r1)
> -#ifdef CONFIG_TRACE_IRQFLAGS
> -	/* If we are going to return from the syscall with interrupts
> -	 * off, we trace that here. It shouldn't normally happen.
> -	 */
> -	andi.	r10,r8,MSR_EE
> -	bne+	1f
> -	stw	r3,GPR3(r1)
> -	bl      trace_hardirqs_off
> -	lwz	r3,GPR3(r1)
> -1:
> -#endif /* CONFIG_TRACE_IRQFLAGS */
> -#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
> -	/* If the process has its own DBCR0 value, load it up.  The internal
> -	   debug mode bit tells us that dbcr0 should be loaded. */
> -	lwz	r0,THREAD+THREAD_DBCR0(r2)
> -	andis.	r10,r0,DBCR0_IDM@h
> -	bnel-	load_dbcr0
> -#endif
> -#ifdef CONFIG_44x
> -BEGIN_MMU_FTR_SECTION
> -	lis	r4,icache_44x_need_flush@ha
> -	lwz	r5,icache_44x_need_flush@l(r4)
> -	cmplwi	cr0,r5,0
> -	bne-	2f
> -1:
> -END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_47x)
> -#endif /* CONFIG_44x */
> -BEGIN_FTR_SECTION
> -	lwarx	r7,0,r1
> -END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
> -	stwcx.	r0,0,r1			/* to clear the reservation */
> -	ACCOUNT_CPU_USER_EXIT(r2, r5, r7)
> -#ifdef CONFIG_PPC_BOOK3S_32
> -	kuep_unlock r5, r7
> -#endif
> -	kuap_check r2, r4
> -	lwz	r4,_LINK(r1)
> -	lwz	r5,_CCR(r1)
> -	mtlr	r4
> -	mtcr	r5
> -	lwz	r7,_NIP(r1)
> -	lwz	r2,GPR2(r1)
> -	lwz	r1,GPR1(r1)
> -#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PERF_EVENTS)
> -	mtspr	SPRN_NRI, r0
> -#endif
> -	mtspr	SPRN_SRR0,r7
> -	mtspr	SPRN_SRR1,r8
> -	SYNC
> -	RFI
> -#ifdef CONFIG_44x
> -2:	li	r7,0
> -	iccci	r0,r0
> -	stw	r7,icache_44x_need_flush@l(r4)
> +	addi    r4, r1, STACK_FRAME_OVERHEAD
> +	bl	syscall_exit_prepare
> +	lwz	r2, _CCR(r1)
> +	lwz	r4, _NIP(r1)
> +	lwz	r5, _MSR(r1)
> +	lwz	r6, _LINK(r1)
> +	mtspr	SPRN_SRR0, r4
> +	mtspr	SPRN_SRR1, r5
> +	mtlr	r6
> +	cmpwi	r3, 0
> +	bne	2f
> +1:	mtcr	r2
> +	REST_GPR(2, r1)
> +	REST_GPR(3, r1)
> +	REST_GPR(1, r1)
> +	rfi
> +2:	lwz	r3, _CTR(r1)
> +	lwz	r4, _XER(r1)
> +	REST_NVGPRS(r1)
> +	mtctr	r3
> +	mtspr	SPRN_XER, r4
> +	REST_GPR(0, r1)
> +	REST_8GPRS(4, r1)
> +	REST_GPR(12, r1)
>   	b	1b
> -#endif  /* CONFIG_44x */
> -
> -66:	li	r3,-ENOSYS
> -	b	ret_from_syscall
>   
>   	.globl	ret_from_fork
>   ret_from_fork:
> @@ -490,86 +365,6 @@ ret_from_kernel_thread:
>   	li	r3,0
>   	b	ret_from_syscall
>   
> -/* Traced system call support */
> -syscall_dotrace:
> -	SAVE_NVGPRS(r1)
> -	li	r0,0xc00
> -	stw	r0,_TRAP(r1)
> -	addi	r3,r1,STACK_FRAME_OVERHEAD
> -	bl	do_syscall_trace_enter
> -	/*
> -	 * Restore argument registers possibly just changed.
> -	 * We use the return value of do_syscall_trace_enter
> -	 * for call number to look up in the table (r0).
> -	 */
> -	mr	r0,r3
> -	lwz	r3,GPR3(r1)
> -	lwz	r4,GPR4(r1)
> -	lwz	r5,GPR5(r1)
> -	lwz	r6,GPR6(r1)
> -	lwz	r7,GPR7(r1)
> -	lwz	r8,GPR8(r1)
> -	REST_NVGPRS(r1)
> -
> -	cmplwi	r0,NR_syscalls
> -	/* Return code is already in r3 thanks to do_syscall_trace_enter() */
> -	bge-	ret_from_syscall
> -	b	syscall_dotrace_cont
> -
> -syscall_exit_work:
> -	andi.	r0,r9,_TIF_RESTOREALL
> -	beq+	0f
> -	REST_NVGPRS(r1)
> -	b	2f
> -0:	cmplw	0,r3,r8
> -	blt+	1f
> -	andi.	r0,r9,_TIF_NOERROR
> -	bne-	1f
> -	lwz	r11,_CCR(r1)			/* Load CR */
> -	neg	r3,r3
> -	oris	r11,r11,0x1000	/* Set SO bit in CR */
> -	stw	r11,_CCR(r1)
> -
> -1:	stw	r6,RESULT(r1)	/* Save result */
> -	stw	r3,GPR3(r1)	/* Update return value */
> -2:	andi.	r0,r9,(_TIF_PERSYSCALL_MASK)
> -	beq	4f
> -
> -	/* Clear per-syscall TIF flags if any are set.  */
> -
> -	li	r11,_TIF_PERSYSCALL_MASK
> -	addi	r12,r2,TI_FLAGS
> -3:	lwarx	r8,0,r12
> -	andc	r8,r8,r11
> -#ifdef CONFIG_IBM405_ERR77
> -	dcbt	0,r12
> -#endif
> -	stwcx.	r8,0,r12
> -	bne-	3b
> -	
> -4:	/* Anything which requires enabling interrupts? */
> -	andi.	r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP)
> -	beq	ret_from_except
> -
> -	/* Re-enable interrupts. There is no need to trace that with
> -	 * lockdep as we are supposed to have IRQs on at this point
> -	 */
> -	ori	r10,r10,MSR_EE
> -	SYNC
> -	mtmsr	r10
> -
> -	/* Save NVGPRS if they're not saved already */
> -	lwz	r4,_TRAP(r1)
> -	andi.	r4,r4,1
> -	beq	5f
> -	SAVE_NVGPRS(r1)
> -	li	r4,0xc00
> -	stw	r4,_TRAP(r1)
> -5:
> -	addi	r3,r1,STACK_FRAME_OVERHEAD
> -	bl	do_syscall_trace_leave
> -	b	ret_from_except_full
> -
>   	/*
>   	 * System call was called from kernel. We get here with SRR1 in r9.
>   	 * Mark the exception as recoverable once we have retrieved SRR0,
> diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h
> index 9abec6cd099c..97691931a306 100644
> --- a/arch/powerpc/kernel/head_32.h
> +++ b/arch/powerpc/kernel/head_32.h
> @@ -174,12 +174,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
>   	stw	r2,GPR2(r11)
>   	addi	r10,r10,STACK_FRAME_REGS_MARKER@l
>   	stw	r9,_MSR(r11)
> -	li	r2, \trapno + 1
> +	li	r2, \trapno
>   	stw	r10,8(r11)
>   	stw	r2,_TRAP(r11)
>   	SAVE_GPR(0, r11)
>   	SAVE_4GPRS(3, r11)
>   	SAVE_2GPRS(7, r11)
> +	SAVE_NVGPRS(r11)
>   	addi	r11,r1,STACK_FRAME_OVERHEAD
>   	addi	r2,r12,-THREAD
>   	stw	r11,PT_REGS(r12)
> diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall.c
> similarity index 97%
> rename from arch/powerpc/kernel/syscall_64.c
> rename to arch/powerpc/kernel/syscall.c
> index cf06eb443a80..a07702a85f81 100644
> --- a/arch/powerpc/kernel/syscall_64.c
> +++ b/arch/powerpc/kernel/syscall.c
> @@ -1,8 +1,9 @@
>   // SPDX-License-Identifier: GPL-2.0-or-later
>   
>   #include <linux/err.h>
> +#include <linux/compat.h>
> +
>   #include <asm/asm-prototypes.h>
> -#include <asm/book3s/64/kup-radix.h>
>   #include <asm/cputime.h>
>   #include <asm/hw_irq.h>
>   #include <asm/kprobes.h>
> @@ -25,16 +26,20 @@ notrace long system_call_exception(long r3, long r4, long r5,
>   	unsigned long ti_flags;
>   	syscall_fn f;
>   
> +#ifdef CONFIG_PPC64
>   	if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
>   		BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED);
> +#endif
>   
>   	trace_hardirqs_off(); /* finish reconciling */
>   
> -	if (IS_ENABLED(CONFIG_PPC_BOOK3S))
> +	if (!IS_ENABLED(CONFIG_PPC_BOOK3E))
>   		BUG_ON(!(regs->msr & MSR_RI));
>   	BUG_ON(!(regs->msr & MSR_PR));
>   	BUG_ON(!FULL_REGS(regs));
> +#ifdef CONFIG_PPC64
>   	BUG_ON(regs->softe != IRQS_ENABLED);
> +#endif
>   
>   	account_cpu_user_entry();
>   
> @@ -48,7 +53,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
>   	}
>   #endif
>   
> -	kuap_check_amr();
> +	kuap_check();
>   
>   	/*
>   	 * This is not required for the syscall exit path, but makes the
> @@ -56,7 +61,9 @@ notrace long system_call_exception(long r3, long r4, long r5,
>   	 * frame, or if the unwinder was taught the first stack frame always
>   	 * returns to user with IRQS_ENABLED, this store could be avoided!
>   	 */
> +#ifdef CONFIG_PPC64
>   	regs->softe = IRQS_ENABLED;
> +#endif
>   
>   	local_irq_enable();
>   
> @@ -86,7 +93,7 @@ notrace long system_call_exception(long r3, long r4, long r5,
>   	/* May be faster to do array_index_nospec? */
>   	barrier_nospec();
>   
> -	if (unlikely(ti_flags & _TIF_32BIT)) {
> +	if (is_compat_task()) {
>   		f = (void *)compat_sys_call_table[r0];
>   
>   		r3 &= 0x00000000ffffffffULL;
> @@ -148,7 +155,9 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
>   		ret |= _TIF_RESTOREALL;
>   	}
>   
> +#ifdef CONFIG_PPC64
>   again:
> +#endif
>   	local_irq_disable();
>   	ti_flags = READ_ONCE(*ti_flagsp);
>   	while (unlikely(ti_flags & (_TIF_USER_WORK_MASK & ~_TIF_RESTORE_TM))) {
> @@ -191,6 +200,7 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
>   
>   	/* This pattern matches prep_irq_for_idle */
>   	__hard_EE_RI_disable();
> +#ifdef CONFIG_PPC64
>   	if (unlikely(lazy_irq_pending())) {
>   		__hard_RI_enable();
>   		trace_hardirqs_off();
> @@ -201,12 +211,13 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
>   	}
>   	local_paca->irq_happened = 0;
>   	irq_soft_mask_set(IRQS_ENABLED);
> +#endif
>   
>   #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
>   	local_paca->tm_scratch = regs->msr;
>   #endif
>   
> -	kuap_check_amr();
> +	kuap_check();
>   
>   	account_cpu_user_exit();
>   
> @@ -294,7 +305,7 @@ notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs, unsigned
>   	local_paca->tm_scratch = regs->msr;
>   #endif
>   
> -	kuap_check_amr();
> +	kuap_check();
>   
>   	account_cpu_user_exit();
>   
> @@ -372,7 +383,7 @@ notrace unsigned long interrupt_exit_kernel_prepare(struct pt_regs *regs, unsign
>   	 * We don't need to restore AMR on the way back to userspace for KUAP.
>   	 * The value of AMR only matters while we're in the kernel.
>   	 */
> -	kuap_restore_amr(regs);
> +	kuap_restore(regs);
>   
>   	return ret;
>   }
> 

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox