From: Ingo Molnar <mingo@elte.hu>
To: "Chen, Kenneth W" <kenneth.w.chen@intel.com>
Cc: Keith Owens <kaos@ocs.com.au>,
David.Mosberger@acm.org, Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org, linux-ia64@vger.kernel.org
Subject: Re: Add prefetch switch stack hook in scheduler function
Date: Fri, 29 Jul 2005 10:28:26 +0200 [thread overview]
Message-ID: <20050729082826.GA6144@elte.hu> (raw)
In-Reply-To: <200507290722.j6T7Mig07477@unix-os.sc.intel.com>
* Chen, Kenneth W <kenneth.w.chen@intel.com> wrote:
> On ia64, we have two kernel stacks, one for outgoing task, and one for
> incoming task. for outgoing task, we haven't called switch_to() yet.
> So the switch stack structure for 'current' will be allocated
> immediately below current 'sp' pointer. For the incoming task, it was
> fully ctx'ed out previously, so switch stack structure is immediate
> above kernel_stack(next). It Would be beneficial to prefetch both
> stacks.
ok, could you apply the two patches below? The first one implements
prefetchw_range(), the second one makes use of it to prefetch the
outgoing stack for writes. We can actually do the current task
prefetching much earlier, because unlike the next task, we know its
stack pointer right away, so this patch could have some additional
benefits.
btw., i'm not totally convinced this is needed, because even in a
context-switch-intense workload (as DB workloads are), i'd expect the
outgoing task to still have a hot switch-stack, either due to having
context-switched recently, or due to having done some deeper kernel
function call recently. The next task will likely be cache-cold, but the
current task is usually cache-hot. Maybe not cache-hot to a depth of 528
bytes, but it needs to be measured: it would be nice to benchmark the
effects of this particular patch in isolation as well, so that we know
the breakdown.
Ingo
----
introduce prefetchw_range(addr, len).
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/prefetch.h | 39 +++++++++++++++++++++++++++++++++++++++
1 files changed, 39 insertions(+)
Index: linux-prefetch-task/include/linux/prefetch.h
===================================================================
--- linux-prefetch-task.orig/include/linux/prefetch.h
+++ linux-prefetch-task/include/linux/prefetch.h
@@ -93,4 +93,43 @@ static inline void prefetch_range(void *
#endif
}
+static inline void prefetchw_range(void *addr, size_t len)
+{
+#ifdef ARCH_HAS_PREFETCH
+ char *cp = addr;
+ char *end = addr + len;
+
+ /*
+ * Unroll agressively:
+ */
+ if (len <= PREFETCH_STRIDE)
+ prefetchw(cp);
+ else if (len <= 2*PREFETCH_STRIDE) {
+ prefetchw(cp);
+ prefetchw(cp + PREFETCH_STRIDE);
+ }
+ else if (len <= 3*PREFETCH_STRIDE) {
+ prefetchw(cp);
+ prefetchw(cp + PREFETCH_STRIDE);
+ prefetchw(cp + 2*PREFETCH_STRIDE);
+ }
+ else if (len <= 4*PREFETCH_STRIDE) {
+ prefetchw(cp);
+ prefetchw(cp + PREFETCH_STRIDE);
+ prefetchw(cp + 2*PREFETCH_STRIDE);
+ prefetchw(cp + 3*PREFETCH_STRIDE);
+ }
+ else if (len <= 5*PREFETCH_STRIDE) {
+ prefetchw(cp);
+ prefetchw(cp + PREFETCH_STRIDE);
+ prefetchw(cp + 2*PREFETCH_STRIDE);
+ prefetchw(cp + 3*PREFETCH_STRIDE);
+ prefetchw(cp + 4*PREFETCH_STRIDE);
+ } else
+ for (; cp < end; cp += PREFETCH_STRIDE)
+ prefetchw(cp);
+#endif
+}
+
+
#endif
-----
prefetch the current kernel stack for writing.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/sched.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
Index: linux-prefetch-task/kernel/sched.c
===================================================================
--- linux-prefetch-task.orig/kernel/sched.c
+++ linux-prefetch-task/kernel/sched.c
@@ -2754,6 +2754,12 @@ asmlinkage void __sched schedule(void)
int cpu, idx, new_prio;
/*
+ * Prefetch the current stack for writing (we use switch_count's
+ * address to get to the stack pointer):
+ */
+ prefetchw_range((void *)&switch_count - MIN_KERNEL_STACK_FOOTPRINT,
+ MIN_KERNEL_STACK_FOOTPRINT + L1_CACHE_BYTES);
+ /*
* Test if we are atomic. Since do_exit() needs to call into
* schedule() atomically, we ignore that path for now.
* Otherwise, whine if we are scheduling when we should not be.
@@ -2872,10 +2878,10 @@ go_idle:
/*
* Prefetch (at least) a cacheline below the current
* kernel stack (in expectation of any new task touching
- * the stack at least minimally), and a cacheline above
- * the stack:
+ * the stack at least minimally), and at least a cacheline
+ * above the stack:
*/
- prefetch_range(kernel_stack(next) - MIN_KERNEL_STACK_FOOTPRINT,
+ prefetch_range(kernel_stack(next) - L1_CACHE_BYTES,
MIN_KERNEL_STACK_FOOTPRINT + L1_CACHE_BYTES);
prefetch(next->mm);
next prev parent reply other threads:[~2005-07-29 8:29 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-27 22:07 Add prefetch switch stack hook in scheduler function Chen, Kenneth W
2005-07-27 23:13 ` Andrew Morton
2005-07-27 23:23 ` david mosberger
2005-07-28 7:41 ` Ingo Molnar
2005-07-28 8:09 ` Keith Owens
2005-07-28 8:16 ` Ingo Molnar
2005-07-28 9:09 ` Ingo Molnar
2005-07-28 19:14 ` Chen, Kenneth W
2005-07-29 7:04 ` Ingo Molnar
2005-07-29 7:07 ` Ingo Molnar
2005-07-29 8:30 ` Eric Dumazet
2005-07-29 8:44 ` Ingo Molnar
2005-07-31 16:27 ` hashed spinlocks Daniel Walker
2005-07-31 18:46 ` David S. Miller
2005-07-31 19:06 ` Daniel Walker
2005-07-31 19:11 ` David S. Miller
2005-07-31 19:16 ` Daniel Walker
2005-07-29 8:30 ` Add prefetch switch stack hook in scheduler function Chen, Kenneth W
2005-07-29 8:35 ` Ingo Molnar
2005-07-29 8:39 ` Chen, Kenneth W
2005-07-29 9:17 ` Peter Zijlstra
2005-07-29 10:52 ` Ingo Molnar
2005-07-29 7:22 ` Chen, Kenneth W
2005-07-29 7:45 ` Keith Owens
2005-07-29 8:02 ` Chen, Kenneth W
2005-07-29 8:28 ` Ingo Molnar [this message]
2005-07-29 9:02 ` Russell King
2005-07-29 9:45 ` Ingo Molnar
2005-07-29 7:38 ` Keith Owens
2005-07-29 8:08 ` Chen, Kenneth W
2005-07-28 8:31 ` Nick Piggin
2005-07-28 8:35 ` Ingo Molnar
2005-07-28 8:48 ` Nick Piggin
2005-07-28 9:16 ` Ingo Molnar
2005-07-28 9:19 ` Ingo Molnar
2005-07-28 9:34 ` Nick Piggin
2005-07-28 10:04 ` Ingo Molnar
2005-07-28 10:29 ` Nick Piggin
-- strict thread matches above, loose matches on Subject: below --
2005-07-29 15:18 linux
2005-07-29 15:49 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050729082826.GA6144@elte.hu \
--to=mingo@elte.hu \
--cc=David.Mosberger@acm.org \
--cc=akpm@osdl.org \
--cc=kaos@ocs.com.au \
--cc=kenneth.w.chen@intel.com \
--cc=linux-ia64@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox