Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1341170 > unrolled thread
| Started by | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| First post | 2016-02-24 00:30 +0100 |
| Last post | 2016-02-24 23:40 +0100 |
| Articles | 8 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v4 0/5] getcpu_cache system call for 4.6 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 00:30 +0100
[PATCH v4 2/5] getcpu_cache: ARM resume notifier Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 00:40 +0100
[PATCH v4 5/5] getcpu_cache: wire up x86 32/64 system call Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 00:40 +0100
[PATCH v4 4/5] getcpu_cache: x86 32/64 resume notifier Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 00:40 +0100
Re: [PATCH v4 0/5] getcpu_cache system call for 4.6 "H. Peter Anvin" <hpa@zytor.com> - 2016-02-24 02:40 +0100
Re: [PATCH v4 0/5] getcpu_cache system call for 4.6 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 05:10 +0100
Re: [PATCH v4 0/5] getcpu_cache system call for 4.6 "H. Peter Anvin" <hpa@zytor.com> - 2016-02-24 21:30 +0100
Re: [PATCH v4 0/5] getcpu_cache system call for 4.6 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> - 2016-02-24 23:40 +0100
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 00:30 +0100 |
| Subject | [PATCH v4 0/5] getcpu_cache system call for 4.6 |
| Message-ID | <r5uyZ-4cb-5@gated-at.bofh.it> |
Hi, Here is a patchset implementing a cache for the CPU number of the currently running thread in user-space. Benchmarks comparing this approach to a getcpu based on system call on ARM show a 44x speedup. They show a 14x speedup on x86-64 compared to executing lsl from a vDSO through glibc. I'm added a man page in the changelog of patch 1/3, which shows an example usage of this new system call. This series is based on v4.5-rc5, submitted for Linux 4.6. Feedback is welcome, Thanks! Mathieu Mathieu Desnoyers (5): getcpu_cache system call: cache CPU number of running thread getcpu_cache: ARM resume notifier getcpu_cache: wire up ARM system call getcpu_cache: x86 32/64 resume notifier getcpu_cache: wire up x86 32/64 system call MAINTAINERS | 7 ++ arch/arm/include/uapi/asm/unistd.h | 1 + arch/arm/kernel/calls.S | 3 +- arch/arm/kernel/signal.c | 1 + arch/x86/entry/common.c | 1 + arch/x86/entry/syscalls/syscall_32.tbl | 1 + arch/x86/entry/syscalls/syscall_64.tbl | 1 + fs/exec.c | 1 + include/linux/sched.h | 36 ++++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/getcpu_cache.h | 42 +++++++++ init/Kconfig | 10 ++ kernel/Makefile | 1 + kernel/fork.c | 4 + kernel/getcpu_cache.c | 163 +++++++++++++++++++++++++++++++++ kernel/sched/sched.h | 1 + kernel/sys_ni.c | 3 + 17 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 include/uapi/linux/getcpu_cache.h create mode 100644 kernel/getcpu_cache.c -- 2.1.4
[toc] | [next] | [standalone]
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 00:40 +0100 |
| Subject | [PATCH v4 2/5] getcpu_cache: ARM resume notifier |
| Message-ID | <r5uIF-4hX-7@gated-at.bofh.it> |
| In reply to | #1341170 |
Call the getcpu_cache_handle_notify_resume() function on return to
userspace if TIF_NOTIFY_RESUME thread flag is set.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
CC: Russell King <linux@arm.linux.org.uk>
CC: Catalin Marinas <catalin.marinas@arm.com>
CC: Will Deacon <will.deacon@arm.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Paul Turner <pjt@google.com>
CC: Andrew Hunter <ahh@google.com>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Andy Lutomirski <luto@amacapital.net>
CC: Andi Kleen <andi@firstfloor.org>
CC: Dave Watson <davejwatson@fb.com>
CC: Chris Lameter <cl@linux.com>
CC: Ingo Molnar <mingo@redhat.com>
CC: Ben Maurer <bmaurer@fb.com>
CC: Steven Rostedt <rostedt@goodmis.org>
CC: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
CC: Josh Triplett <josh@joshtriplett.org>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: linux-api@vger.kernel.org
---
arch/arm/kernel/signal.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
index 7b8f214..ff5052c 100644
--- a/arch/arm/kernel/signal.c
+++ b/arch/arm/kernel/signal.c
@@ -594,6 +594,7 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
} else {
clear_thread_flag(TIF_NOTIFY_RESUME);
tracehook_notify_resume(regs);
+ getcpu_cache_handle_notify_resume(current);
}
}
local_irq_disable();
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 00:40 +0100 |
| Subject | [PATCH v4 5/5] getcpu_cache: wire up x86 32/64 system call |
| Message-ID | <r5uIF-4hX-9@gated-at.bofh.it> |
| In reply to | #1341170 |
Wire up the getcpu_cache system call on x86 32/64. This provides an ABI improving the speed of a getcpu operation on x86 by removing the need to perform a function call, "lsl" instruction, or system call on the fast path. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> CC: Thomas Gleixner <tglx@linutronix.de> CC: Paul Turner <pjt@google.com> CC: Andrew Hunter <ahh@google.com> CC: Peter Zijlstra <peterz@infradead.org> CC: Andy Lutomirski <luto@amacapital.net> CC: Andi Kleen <andi@firstfloor.org> CC: Dave Watson <davejwatson@fb.com> CC: Chris Lameter <cl@linux.com> CC: Ingo Molnar <mingo@redhat.com> CC: "H. Peter Anvin" <hpa@zytor.com> CC: Ben Maurer <bmaurer@fb.com> CC: Steven Rostedt <rostedt@goodmis.org> CC: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> CC: Josh Triplett <josh@joshtriplett.org> CC: Linus Torvalds <torvalds@linux-foundation.org> CC: Andrew Morton <akpm@linux-foundation.org> CC: linux-api@vger.kernel.org --- arch/x86/entry/syscalls/syscall_32.tbl | 1 + arch/x86/entry/syscalls/syscall_64.tbl | 1 + 2 files changed, 2 insertions(+) diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl index cb713df..c2372a7 100644 --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl @@ -384,3 +384,4 @@ 375 i386 membarrier sys_membarrier 376 i386 mlock2 sys_mlock2 377 i386 copy_file_range sys_copy_file_range +378 i386 getcpu_cache sys_getcpu_cache diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscalls/syscall_64.tbl index dc1040a..6b3ffa0 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -333,6 +333,7 @@ 324 common membarrier sys_membarrier 325 common mlock2 sys_mlock2 326 common copy_file_range sys_copy_file_range +326 common getcpu_cache sys_getcpu_cache # # x32-specific system call numbers start at 512 to avoid cache impact -- 2.1.4
[toc] | [prev] | [next] | [standalone]
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 00:40 +0100 |
| Subject | [PATCH v4 4/5] getcpu_cache: x86 32/64 resume notifier |
| Message-ID | <r5uIG-4hX-25@gated-at.bofh.it> |
| In reply to | #1341170 |
Call the getcpu_cache_handle_notify_resume() function on return to
userspace if TIF_NOTIFY_RESUME thread flag is set.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Paul Turner <pjt@google.com>
CC: Andrew Hunter <ahh@google.com>
CC: Peter Zijlstra <peterz@infradead.org>
CC: Andy Lutomirski <luto@amacapital.net>
CC: Andi Kleen <andi@firstfloor.org>
CC: Dave Watson <davejwatson@fb.com>
CC: Chris Lameter <cl@linux.com>
CC: Ingo Molnar <mingo@redhat.com>
CC: "H. Peter Anvin" <hpa@zytor.com>
CC: Ben Maurer <bmaurer@fb.com>
CC: Steven Rostedt <rostedt@goodmis.org>
CC: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
CC: Josh Triplett <josh@joshtriplett.org>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: linux-api@vger.kernel.org
---
arch/x86/entry/common.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index 0366374..eb6bcae 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -249,6 +249,7 @@ static void exit_to_usermode_loop(struct pt_regs *regs, u32 cached_flags)
if (cached_flags & _TIF_NOTIFY_RESUME) {
clear_thread_flag(TIF_NOTIFY_RESUME);
tracehook_notify_resume(regs);
+ getcpu_cache_handle_notify_resume(current);
}
if (cached_flags & _TIF_USER_RETURN_NOTIFY)
--
2.1.4
[toc] | [prev] | [next] | [standalone]
| From | "H. Peter Anvin" <hpa@zytor.com> |
|---|---|
| Date | 2016-02-24 02:40 +0100 |
| Message-ID | <r5wAN-5Cq-3@gated-at.bofh.it> |
| In reply to | #1341170 |
On 02/23/2016 03:28 PM, Mathieu Desnoyers wrote: > Hi, > > Here is a patchset implementing a cache for the CPU number of the > currently running thread in user-space. > > Benchmarks comparing this approach to a getcpu based on system call on > ARM show a 44x speedup. They show a 14x speedup on x86-64 compared to > executing lsl from a vDSO through glibc. > > I'm added a man page in the changelog of patch 1/3, which shows an > example usage of this new system call. > > This series is based on v4.5-rc5, submitted for Linux 4.6. > > Feedback is welcome, > What is the resulting context switch overhead? -hpa
[toc] | [prev] | [next] | [standalone]
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 05:10 +0100 |
| Message-ID | <r5yVY-7pJ-25@gated-at.bofh.it> |
| In reply to | #1341227 |
----- On Feb 23, 2016, at 8:36 PM, H. Peter Anvin hpa@zytor.com wrote: > On 02/23/2016 03:28 PM, Mathieu Desnoyers wrote: >> Hi, >> >> Here is a patchset implementing a cache for the CPU number of the >> currently running thread in user-space. >> >> Benchmarks comparing this approach to a getcpu based on system call on >> ARM show a 44x speedup. They show a 14x speedup on x86-64 compared to >> executing lsl from a vDSO through glibc. >> >> I'm added a man page in the changelog of patch 1/3, which shows an >> example usage of this new system call. >> >> This series is based on v4.5-rc5, submitted for Linux 4.6. >> >> Feedback is welcome, >> > > What is the resulting context switch overhead? The getcpu_cache only adds code to the thread migration path, and to the resume notifier. The context switch path per se is untouched. I would therefore expect the overhead on context switch to be within the noise, except if stuff like hackbench would be so sensitive to the size of struct task_struct that a single extra pointer added at the end of struct task_struct would throw off the benchmarks. Is that what you are concerned about ? Thanks, Mathieu -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com
[toc] | [prev] | [next] | [standalone]
| From | "H. Peter Anvin" <hpa@zytor.com> |
|---|---|
| Date | 2016-02-24 21:30 +0100 |
| Message-ID | <r5Oen-1hM-13@gated-at.bofh.it> |
| In reply to | #1341308 |
On February 23, 2016 8:09:23 PM PST, Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: >----- On Feb 23, 2016, at 8:36 PM, H. Peter Anvin hpa@zytor.com wrote: > >> On 02/23/2016 03:28 PM, Mathieu Desnoyers wrote: >>> Hi, >>> >>> Here is a patchset implementing a cache for the CPU number of the >>> currently running thread in user-space. >>> >>> Benchmarks comparing this approach to a getcpu based on system call >on >>> ARM show a 44x speedup. They show a 14x speedup on x86-64 compared >to >>> executing lsl from a vDSO through glibc. >>> >>> I'm added a man page in the changelog of patch 1/3, which shows an >>> example usage of this new system call. >>> >>> This series is based on v4.5-rc5, submitted for Linux 4.6. >>> >>> Feedback is welcome, >>> >> >> What is the resulting context switch overhead? > >The getcpu_cache only adds code to the thread migration path, >and to the resume notifier. The context switch path per se is >untouched. I would therefore expect the overhead on context >switch to be within the noise, except if stuff like hackbench >would be so sensitive to the size of struct task_struct that >a single extra pointer added at the end of struct task_struct >would throw off the benchmarks. > >Is that what you are concerned about ? > >Thanks, > >Mathieu Yes, I'd like to see numbers. It is way easy to handwave small changes away, but they add up over time. Without numbers it is a bit hard to quantify the pro vs con. -- Sent from my Android device with K-9 Mail. Please excuse brevity and formatting.
[toc] | [prev] | [next] | [standalone]
| From | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
|---|---|
| Date | 2016-02-24 23:40 +0100 |
| Message-ID | <r5Qg9-2LB-1@gated-at.bofh.it> |
| In reply to | #1342421 |
----- On Feb 24, 2016, at 3:07 PM, H. Peter Anvin hpa@zytor.com wrote: > On February 23, 2016 8:09:23 PM PST, Mathieu Desnoyers > <mathieu.desnoyers@efficios.com> wrote: >>----- On Feb 23, 2016, at 8:36 PM, H. Peter Anvin hpa@zytor.com wrote: >> >>> On 02/23/2016 03:28 PM, Mathieu Desnoyers wrote: >>>> Hi, >>>> >>>> Here is a patchset implementing a cache for the CPU number of the >>>> currently running thread in user-space. >>>> >>>> Benchmarks comparing this approach to a getcpu based on system call >>on >>>> ARM show a 44x speedup. They show a 14x speedup on x86-64 compared >>to >>>> executing lsl from a vDSO through glibc. >>>> >>>> I'm added a man page in the changelog of patch 1/3, which shows an >>>> example usage of this new system call. >>>> >>>> This series is based on v4.5-rc5, submitted for Linux 4.6. >>>> >>>> Feedback is welcome, >>>> >>> >>> What is the resulting context switch overhead? >> >>The getcpu_cache only adds code to the thread migration path, >>and to the resume notifier. The context switch path per se is >>untouched. I would therefore expect the overhead on context >>switch to be within the noise, except if stuff like hackbench >>would be so sensitive to the size of struct task_struct that >>a single extra pointer added at the end of struct task_struct >>would throw off the benchmarks. >> >>Is that what you are concerned about ? >> >>Thanks, >> >>Mathieu > > Yes, I'd like to see numbers. It is way easy to handwave small changes away, > but they add up over time. Without numbers it is a bit hard to quantify the > pro vs con. - Speed Running 10 runs of hackbench -l 100000 on a 2 sockets * 8-core Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz (directly on hardware, no virtualization), with hyperthreading, with a 4.5-rc5 defconfig+localyesconfig, getcpu_cache series applied, seems to indicate that the sched switch impact of this new configuration option is within the noise: * CONFIG_GETCPU_CACHE=n avg.: 26.63 s std.dev.: 0.38 s * CONFIG_GETCPU_CACHE=y avg.: 26.52 s std.dev.: 0.47 s - Size Between CONFIG_GETCPU_CACHE=n/y, the size delta added to the compressed kernel zImage is 704 bytes. The text size increase of vmlinux is 512 bytes, and the data size increase of vmlinux is also 512 bytes. * CONFIG_GETCPU_CACHE=n text data bss dec hex filename 16802349 2745968 1564672 21112989 142289d vmlinux * CONFIG_GETCPU_CACHE=y text data bss dec hex filename 16802861 2746480 1564672 21114013 1422c9d vmlinux Am I missing anything ? I plan to add this information to the changelog for my next round (v5). Thanks, Mathieu -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web