| From foo@baz Mon Mar 19 09:58:12 CET 2018 |
| From: Anton Blanchard <anton@samba.org> |
| Date: Mon, 3 Apr 2017 16:41:02 +1000 |
| Subject: powerpc: Avoid taking a data miss on every userspace instruction miss |
| |
| From: Anton Blanchard <anton@samba.org> |
| |
| |
| [ Upstream commit a7a9dcd882a67b68568868b988289fce5ffd8419 ] |
| |
| Early on in do_page_fault() we call store_updates_sp(), regardless of |
| the type of exception. For an instruction miss this doesn't make |
| sense, because we only use this information to detect if a data miss |
| is the result of a stack expansion instruction or not. |
| |
| Worse still, it results in a data miss within every userspace |
| instruction miss handler, because we try and load the very instruction |
| we are about to install a pte for! |
| |
| A simple exec microbenchmark runs 6% faster on POWER8 with this fix: |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| unsigned long left = atol(argv[1]); |
| char leftstr[16]; |
| |
| if (left-- == 0) |
| return 0; |
| |
| sprintf(leftstr, "%ld", left); |
| execlp(argv[0], argv[0], leftstr, NULL); |
| perror("exec failed\n"); |
| |
| return 0; |
| } |
| |
| Pass the number of iterations on the command line (eg 10000) and time |
| how long it takes to execute. |
| |
| Signed-off-by: Anton Blanchard <anton@samba.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/powerpc/mm/fault.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/mm/fault.c |
| +++ b/arch/powerpc/mm/fault.c |
| @@ -294,7 +294,7 @@ int __kprobes do_page_fault(struct pt_re |
| * can result in fault, which will cause a deadlock when called with |
| * mmap_sem held |
| */ |
| - if (user_mode(regs)) |
| + if (!is_exec && user_mode(regs)) |
| store_update_sp = store_updates_sp(regs); |
| |
| if (user_mode(regs)) |