All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL
@ 2017-01-20 22:42 John Ogness
  2017-01-21 14:19 ` Peter Zijlstra
  0 siblings, 1 reply; 5+ messages in thread
From: John Ogness @ 2017-01-20 22:42 UTC (permalink / raw)
  To: linux-rt-users; +Cc: Peter Zijlstra, Sebastian Andrzej Siewior

Although wbinvd() is faster than flushing many individual pages, it
blocks the memory bus for "long" periods of time (>100us), thus
directly causing unusually large latencies for PREEMPT_RT_FULL. For
1024 pages, flushing those pages individually can take up to 2200us,
but the task remains fully preemptible during that time.

Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
 arch/x86/mm/pageattr.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index e3353c9..a182477 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -214,7 +214,12 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
 			    int in_flags, struct page **pages)
 {
 	unsigned int i, level;
+#ifdef CONFIG_PREEMPT_RT_FULL
+	/* wbinvd() causes ugly latencies, avoid it */
+	unsigned long do_wbinvd = 0;
+#else
 	unsigned long do_wbinvd = cache && numpages >= 1024; /* 4M threshold */
+#endif
 
 	BUG_ON(irqs_disabled());
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL
  2017-01-20 22:42 [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL John Ogness
@ 2017-01-21 14:19 ` Peter Zijlstra
  2017-01-25 16:12   ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 5+ messages in thread
From: Peter Zijlstra @ 2017-01-21 14:19 UTC (permalink / raw)
  To: John Ogness; +Cc: linux-rt-users, Sebastian Andrzej Siewior, Thomas Gleixner


Patches really should go to lkml, if you want to bug a user list with
them I won't stop you, but please don't hide actual useful content.

On Fri, Jan 20, 2017 at 11:42:57PM +0100, John Ogness wrote:
> Although wbinvd() is faster than flushing many individual pages, it
> blocks the memory bus for "long" periods of time (>100us), thus
> directly causing unusually large latencies for PREEMPT_RT_FULL. For
> 1024 pages, flushing those pages individually can take up to 2200us,
> but the task remains fully preemptible during that time.
> 
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> ---
>  arch/x86/mm/pageattr.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> index e3353c9..a182477 100644
> --- a/arch/x86/mm/pageattr.c
> +++ b/arch/x86/mm/pageattr.c
> @@ -214,7 +214,12 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
>  			    int in_flags, struct page **pages)
>  {
>  	unsigned int i, level;
> +#ifdef CONFIG_PREEMPT_RT_FULL
> +	/* wbinvd() causes ugly latencies, avoid it */
> +	unsigned long do_wbinvd = 0;

Arguably we should do the same for CONFIG_PREEMPT and possibly even
always, esp. when considering CAT.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL
  2017-01-21 14:19 ` Peter Zijlstra
@ 2017-01-25 16:12   ` Sebastian Andrzej Siewior
  2017-01-25 16:24     ` Peter Zijlstra
  0 siblings, 1 reply; 5+ messages in thread
From: Sebastian Andrzej Siewior @ 2017-01-25 16:12 UTC (permalink / raw)
  To: Peter Zijlstra, x86
  Cc: John Ogness, linux-rt-users, linux-kernel, Thomas Gleixner

On 2017-01-21 15:19:15 [+0100], Peter Zijlstra wrote:
> On Fri, Jan 20, 2017 at 11:42:57PM +0100, John Ogness wrote:
> > Although wbinvd() is faster than flushing many individual pages, it
> > blocks the memory bus for "long" periods of time (>100us), thus
> > directly causing unusually large latencies for PREEMPT_RT_FULL. For
> > 1024 pages, flushing those pages individually can take up to 2200us,
> > but the task remains fully preemptible during that time.
> > 
> > Cc: Peter Zijlstra <peterz@infradead.org>
> > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > Signed-off-by: John Ogness <john.ogness@linutronix.de>
> > ---
> >  arch/x86/mm/pageattr.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> > 
> > diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> > index e3353c9..a182477 100644
> > --- a/arch/x86/mm/pageattr.c
> > +++ b/arch/x86/mm/pageattr.c
> > @@ -214,7 +214,12 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
> >  			    int in_flags, struct page **pages)
> >  {
> >  	unsigned int i, level;
> > +#ifdef CONFIG_PREEMPT_RT_FULL
> > +	/* wbinvd() causes ugly latencies, avoid it */
> > +	unsigned long do_wbinvd = 0;
> 
> Arguably we should do the same for CONFIG_PREEMPT and possibly even
> always, esp. when considering CAT.

So you want to see this patch again with CONFIG_PREEMPT instead of
CONFIG_PREEMPT_RT_FULL and also targeting lkml?
I don't get quite the link between wbindv and CAT (assuming it stands
for Intel's Cache Allocation support). But if you want unconditionally
want to drop that wbinvd because it is bad for another !RT usecase, fine
by me :)
Any preferences from the x86 folks?

Sebastian

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL
  2017-01-25 16:12   ` Sebastian Andrzej Siewior
@ 2017-01-25 16:24     ` Peter Zijlstra
  2017-01-25 17:07       ` Sebastian Andrzej Siewior
  0 siblings, 1 reply; 5+ messages in thread
From: Peter Zijlstra @ 2017-01-25 16:24 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: x86, John Ogness, linux-rt-users, linux-kernel, Thomas Gleixner,
	fenghua.yu, h.peter.anvin, vikas.shivappa, tony.luck, davidcc,
	dave.hansen, eranian

On Wed, Jan 25, 2017 at 05:12:17PM +0100, Sebastian Andrzej Siewior wrote:
> On 2017-01-21 15:19:15 [+0100], Peter Zijlstra wrote:
> > On Fri, Jan 20, 2017 at 11:42:57PM +0100, John Ogness wrote:
> > > Although wbinvd() is faster than flushing many individual pages, it
> > > blocks the memory bus for "long" periods of time (>100us), thus
> > > directly causing unusually large latencies for PREEMPT_RT_FULL. For
> > > 1024 pages, flushing those pages individually can take up to 2200us,
> > > but the task remains fully preemptible during that time.
> > > 
> > > Cc: Peter Zijlstra <peterz@infradead.org>
> > > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > > Signed-off-by: John Ogness <john.ogness@linutronix.de>
> > > ---
> > >  arch/x86/mm/pageattr.c | 5 +++++
> > >  1 file changed, 5 insertions(+)
> > > 
> > > diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> > > index e3353c9..a182477 100644
> > > --- a/arch/x86/mm/pageattr.c
> > > +++ b/arch/x86/mm/pageattr.c
> > > @@ -214,7 +214,12 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
> > >  			    int in_flags, struct page **pages)
> > >  {
> > >  	unsigned int i, level;
> > > +#ifdef CONFIG_PREEMPT_RT_FULL
> > > +	/* wbinvd() causes ugly latencies, avoid it */
> > > +	unsigned long do_wbinvd = 0;
> > 
> > Arguably we should do the same for CONFIG_PREEMPT and possibly even
> > always, esp. when considering CAT.
> 
> So you want to see this patch again with CONFIG_PREEMPT instead of
> CONFIG_PREEMPT_RT_FULL and also targeting lkml?

Patches should go to LKML irrespective of PREEMPT_RT_FULL or not.

But yes, I think it makes sense for PREEMPT as well.

> I don't get quite the link between wbindv and CAT (assuming it stands
> for Intel's Cache Allocation support). But if you want unconditionally
> want to drop that wbinvd because it is bad for another !RT usecase, fine
> by me :)

Yes, that CAT.

I suspect; but I couldn't find the SDM making any statement what so ever
on this; that when you do wbinvd you kill the _entire_ cache,
irrespective of our CAT mask.

This means that a random task doing wbinvd(), even if it is 'isolated'
with a CAT mask, will affect the performance of all other tasks on that
cache domain.

IOW, your X11 running in some 'system' group will affect your RT
workload on the isolated CPU by killing its cache.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL
  2017-01-25 16:24     ` Peter Zijlstra
@ 2017-01-25 17:07       ` Sebastian Andrzej Siewior
  0 siblings, 0 replies; 5+ messages in thread
From: Sebastian Andrzej Siewior @ 2017-01-25 17:07 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: x86, John Ogness, linux-rt-users, linux-kernel, Thomas Gleixner,
	fenghua.yu, h.peter.anvin, vikas.shivappa, tony.luck, davidcc,
	dave.hansen, eranian

On 2017-01-25 17:24:31 [+0100], Peter Zijlstra wrote:
> On Wed, Jan 25, 2017 at 05:12:17PM +0100, Sebastian Andrzej Siewior wrote:
> > On 2017-01-21 15:19:15 [+0100], Peter Zijlstra wrote:
> > > On Fri, Jan 20, 2017 at 11:42:57PM +0100, John Ogness wrote:
> > > > Although wbinvd() is faster than flushing many individual pages, it
> > > > blocks the memory bus for "long" periods of time (>100us), thus
> > > > directly causing unusually large latencies for PREEMPT_RT_FULL. For
> > > > 1024 pages, flushing those pages individually can take up to 2200us,
> > > > but the task remains fully preemptible during that time.
> > > > 
> > > > Cc: Peter Zijlstra <peterz@infradead.org>
> > > > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> > > > Signed-off-by: John Ogness <john.ogness@linutronix.de>
> > > > ---
> > > >  arch/x86/mm/pageattr.c | 5 +++++
> > > >  1 file changed, 5 insertions(+)
> > > > 
> > > > diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> > > > index e3353c9..a182477 100644
> > > > --- a/arch/x86/mm/pageattr.c
> > > > +++ b/arch/x86/mm/pageattr.c
> > > > @@ -214,7 +214,12 @@ static void cpa_flush_array(unsigned long *start, int numpages, int cache,
> > > >  			    int in_flags, struct page **pages)
> > > >  {
> > > >  	unsigned int i, level;
> > > > +#ifdef CONFIG_PREEMPT_RT_FULL
> > > > +	/* wbinvd() causes ugly latencies, avoid it */
> > > > +	unsigned long do_wbinvd = 0;
> > > 
> > > Arguably we should do the same for CONFIG_PREEMPT and possibly even
> > > always, esp. when considering CAT.
> > 
> > So you want to see this patch again with CONFIG_PREEMPT instead of
> > CONFIG_PREEMPT_RT_FULL and also targeting lkml?
> 
> Patches should go to LKML irrespective of PREEMPT_RT_FULL or not.
> 
> But yes, I think it makes sense for PREEMPT as well.
> 
> > I don't get quite the link between wbindv and CAT (assuming it stands
> > for Intel's Cache Allocation support). But if you want unconditionally
> > want to drop that wbinvd because it is bad for another !RT usecase, fine
> > by me :)
> 
> Yes, that CAT.
> 
> I suspect; but I couldn't find the SDM making any statement what so ever
> on this; that when you do wbinvd you kill the _entire_ cache,
> irrespective of our CAT mask.
> 
> This means that a random task doing wbinvd(), even if it is 'isolated'
> with a CAT mask, will affect the performance of all other tasks on that
> cache domain.
> 
> IOW, your X11 running in some 'system' group will affect your RT
> workload on the isolated CPU by killing its cache.

Based on this I would say it makes sense to get rid of wbinvd. If wbinvd
would respect the CAT mask then it would be noted in the SDM.

Sebastian

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-01-25 17:07 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-20 22:42 [PATCH] x86/mm/cpa: avoid wbinvd() for PREEMPT_RT_FULL John Ogness
2017-01-21 14:19 ` Peter Zijlstra
2017-01-25 16:12   ` Sebastian Andrzej Siewior
2017-01-25 16:24     ` Peter Zijlstra
2017-01-25 17:07       ` Sebastian Andrzej Siewior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.