All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	Russell King <linux@arm.linux.org.uk>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	linux-kernel@vger.kernel.org,
	linux-api <linux-api@vger.kernel.org>,
	Paul Turner <pjt@google.com>, Andrew Hunter <ahh@google.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Andy Lutomirski <luto@amacapital.net>,
	Andi Kleen <andi@firstfloor.org>,
	Dave Watson <davejwatson@fb.com>, Chris Lameter <cl@linux.com>,
	Ben Maurer <bmaurer@fb.com>, rostedt <rostedt@goodmis.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Josh Triplett <josh@joshtriplett.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Michael Kerrisk <mtk.manpages@gmail.com>
Subject: Re: [PATCH v4 1/5] getcpu_cache system call: cache CPU number of running thread
Date: Fri, 26 Feb 2016 17:47:05 +0000 (UTC)	[thread overview]
Message-ID: <668290565.8970.1456508825358.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <87egc0l62k.fsf@rasmusvillemoes.dk>

----- On Feb 25, 2016, at 6:32 PM, Rasmus Villemoes linux@rasmusvillemoes.dk wrote:

> On Wed, Feb 24 2016, Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote:
> 
>>
>>        Typically, a library or application will keep the cpu  number
>>        cache  in  a  thread-local  storage variable, or other memory
>>        areas belonging to each thread. It is recommended to  perform
>>        a  volatile  read of the cpu number cache to prevent the com‐
>>        piler from doing load tearing. An alternative approach is  to
>>        read  the  cpu  number cache from inline assembly in a single
>>        instruction.
>>
>>        Each thread is responsible for registering its own cpu number
>>        cache.   Only  one  cpu  cache  address can be registered per
>>        thread.
>>
>>        The symbol  __getcpu_cache_tls  is  recommended  to  be  used
>>        across  libraries  and  applications  wishing  to  register a
>>        thread-local getcpu_cache. The  attribute  "weak"  is  recom‐
>>        mended  when  declaring this variable in libraries.  Applica‐
>>        tions can choose to define their own version of  this  symbol
>>        without the weak attribute as a performance improvement.
>>
>>        In  a  typical usage scenario, the thread registering the cpu
>>        number cache will be performing reads from that cache. It  is
>>        however  also allowed to read the cpu number cache from other
>>        threads. The cpu number cache updates performed by the kernel
>>        provide single-copy atomicity semantics, which guarantee that
>>        other threads performing single-copy atomic reads of the  cpu
>>        number cache will always observe a consistent value.
>>
>>        Memory registered as cpu number cache should never be deallo‐
>>        cated before the thread which registered it  exits:  specifi‐
>>        cally, it should not be freed, and the library containing the
>>        registered thread-local storage should not be dlclose'd.
> 
> Maybe spell out the consequence if this is violated - since the SIGSEGV
> only happens on migration, it may take a while to strike.

Good point.

> 
> Random thoughts: The current implementation ensures that getcpu_cache is
> "idempotent" from within a single thread - once set, it can never get
> unset nor set to some other pointer. I think that can be useful, since
> it means a library can reliably use the TLS variable itself (initialized
> with some negative number) as an indicator of whether
> getcpu_cache(GETCPU_CACHE_SET) has been called. So if a single test on a
> fast path where the library would need to load __getcpu_cache_tls anyway
> is acceptable, it can avoid requiring some library init function to be
> called in each thread - which can sometimes be hard to arrange. Is this
> something we want to guarantee - that is, will we never implement
> GETCPU_CACHE_UNSET or a "force" flag to _SET? Either way, I think we
> should spend a few words on it to avoid the current behaviour becoming
> accidental ABI.

Yes, I would be tempted to state that once set, the address is idempotent
for a thread.

> 
> In another thread:
> 
>> However, there are other use-cases for having a fast mechanism for
>> reading the current CPU number, besides restartable sequences.  For
>> instance, it can be used by glibc to implement a faster sched_getcpu.
> 
> Will glibc do that? It may be a little contentious for glibc to claim a
> unique resource such as task_struct::cpu_cache for itself, even if
> everybody is supposed to use the same symbol. Hm, maybe one could say
> that if an application does define the symbol __getcpu_cache_tls (which
> is techically in the implementation namespace), that gives glibc (and
> any other library) license to do getcpu_cache(SET, &&__getcpu_cache_tls)
> (pseudo-code, of course). If a library initializes its own weak version
> with -2 it can check whether the application defined
> __getcpu_cache_tls. Ok, I'm probably overthinking this...

I've had the exact same thoughts a few days ago then thinking about
how lttng-ust could do a "lazy binding" of the getcpu_cache without
requiring an explicit initialization at thread start. We're reaching
very similar conclusions. We could recommend/require that userspace
does this whenever it defines a __getcpu_cache_tls:

Declare as

__thread __attribute__((weak)) volatile int32_t __getcpu_cache_tls = -1;

Then whenever it loads it, "-1" would mean "uninitialized", and "-2"
could mean "this thread tried to initialize it, but fail, so you
should directly go to a fallback". ">= 0" would mean initialized and
working.

static inline int32_t getcpu_cache_read(void)
{
    int32_t cachev = __getcpu_cache_tls;

    if (likely(cachev >= 0))
        return cachev;

    if (cachev == -1) {
        volatile int32_t *cpu_cache = &__getcpu_cache_tls;

        if (!getcpu_cache(GETCPU_CACHE_SET, &cpu_cache, 0))
            return __getcpu_cache_tls;
        __getcpu_cache_tls = -2;
    }
    /* Fallback on sched_getcpu(). */
    return sched_getcpu();
}

This could be documented in the getcpu_cache system call man page.

Thoughts ?

Thanks,

Mathieu

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

  reply	other threads:[~2016-02-26 17:47 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-23 23:28 [PATCH v4 0/5] getcpu_cache system call for 4.6 Mathieu Desnoyers
2016-02-23 23:28 ` [PATCH v4 2/5] getcpu_cache: ARM resume notifier Mathieu Desnoyers
2016-02-23 23:28 ` [PATCH v4 3/5] getcpu_cache: wire up ARM system call Mathieu Desnoyers
     [not found]   ` <1456270120-7560-4-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-24  0:54     ` kbuild test robot
2016-02-24  0:54       ` kbuild test robot
2016-02-24  1:05     ` [PATCH v4 (updated)] " Mathieu Desnoyers
2016-02-24  1:05       ` Mathieu Desnoyers
     [not found]       ` <1456275925-12071-1-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-24  5:28         ` kbuild test robot
2016-02-24  5:28           ` kbuild test robot
2016-02-24  6:54         ` kbuild test robot
2016-02-24  6:54           ` kbuild test robot
2016-02-23 23:28 ` [PATCH v4 4/5] getcpu_cache: x86 32/64 resume notifier Mathieu Desnoyers
2016-02-23 23:28 ` [PATCH v4 5/5] getcpu_cache: wire up x86 32/64 system call Mathieu Desnoyers
     [not found] ` <1456270120-7560-1-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-23 23:28   ` [PATCH v4 1/5] getcpu_cache system call: cache CPU number of running thread Mathieu Desnoyers
2016-02-23 23:28     ` Mathieu Desnoyers
2016-02-24 11:11     ` Thomas Gleixner
2016-02-24 17:17       ` Mathieu Desnoyers
2016-02-25 23:32       ` Rasmus Villemoes
2016-02-25 23:32         ` Rasmus Villemoes
2016-02-26 17:47         ` Mathieu Desnoyers [this message]
     [not found]     ` <1456270120-7560-2-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-25  9:56       ` Peter Zijlstra
2016-02-25  9:56         ` Peter Zijlstra
     [not found]         ` <20160225095635.GO6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-02-25 16:55           ` Mathieu Desnoyers
2016-02-25 16:55             ` Mathieu Desnoyers
     [not found]             ` <390571988.7745.1456419326288.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-25 17:04               ` Peter Zijlstra
2016-02-25 17:04                 ` Peter Zijlstra
     [not found]                 ` <20160225170416.GV6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-02-25 17:17                   ` Mathieu Desnoyers
2016-02-25 17:17                     ` Mathieu Desnoyers
     [not found]                     ` <2135602720.7810.1456420671941.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-26 11:33                       ` Peter Zijlstra
2016-02-26 11:33                         ` Peter Zijlstra
     [not found]                         ` <20160226113304.GA6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-02-26 16:29                           ` Thomas Gleixner
2016-02-26 16:29                             ` Thomas Gleixner
2016-02-26 17:20                             ` Mathieu Desnoyers
     [not found]                               ` <967083634.8940.1456507201156.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-26 18:01                                 ` Thomas Gleixner
2016-02-26 18:01                                   ` Thomas Gleixner
2016-02-26 20:24                                   ` Mathieu Desnoyers
2016-02-26 20:24                                     ` Mathieu Desnoyers
2016-02-26 23:04                                     ` H. Peter Anvin
     [not found]                                       ` <7096DA23-3908-40DC-A46B-C4CF2252CEE8-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2016-02-27  0:40                                         ` Mathieu Desnoyers
2016-02-27  0:40                                           ` Mathieu Desnoyers
     [not found]                                           ` <1150363257.9781.1456533630895.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-27  6:24                                             ` H. Peter Anvin
2016-02-27  6:24                                               ` H. Peter Anvin
     [not found]                                               ` <56D14132.5050100-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2016-02-27 14:15                                                 ` Mathieu Desnoyers
2016-02-27 14:15                                                   ` Mathieu Desnoyers
     [not found]                                                   ` <2053850250.10158.1456582501604.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-27 14:58                                                     ` Peter Zijlstra
2016-02-27 14:58                                                       ` Peter Zijlstra
     [not found]                                                       ` <20160227145809.GD6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-02-27 18:35                                                         ` Linus Torvalds
2016-02-27 18:35                                                           ` Linus Torvalds
2016-02-27 23:53                                                           ` Mathieu Desnoyers
     [not found]                                                             ` <CA+55aFwcgwRxvVBz5kk_3O8dESXAGJ4KHBkf=pSXjiS7Xh4NwA@mail.gmail.com>
     [not found]                                                               ` <1082926946.10326.1456619994590.JavaMail.zimbra@efficios.com>
     [not found]                                                                 ` <1082926946.10326.1456619994590.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-28  0:57                                                                   ` Linus Torvalds
2016-02-28  0:57                                                                     ` Linus Torvalds
     [not found]                                                                     ` <CA+55aFwZY1BR5NdjAP-rytd29hE2EZEXgcaBKjepWFFj+oR1SA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-28 14:32                                                                       ` Mathieu Desnoyers
2016-02-28 14:32                                                                         ` Mathieu Desnoyers
     [not found]                                                                         ` <1538518747.10504.1456669948568.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-29 10:35                                                                           ` Peter Zijlstra
2016-02-29 10:35                                                                             ` Peter Zijlstra
     [not found]                                                                             ` <20160229103506.GJ6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-03-01 20:23                                                                               ` Mathieu Desnoyers
2016-03-01 20:23                                                                                 ` Mathieu Desnoyers
     [not found]                                                                                 ` <676569856.13488.1456863792603.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-03-01 21:32                                                                                   ` Peter Zijlstra
2016-03-01 21:32                                                                                     ` Peter Zijlstra
     [not found]                                                                                     ` <20160301213202.GY6357-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-03-01 21:36                                                                                       ` Peter Zijlstra
2016-03-01 21:36                                                                                         ` Peter Zijlstra
2016-03-01 21:47                                                                                     ` H. Peter Anvin
2016-03-02 10:34                                                                                       ` Peter Zijlstra
2016-02-29 10:32                                                                   ` Peter Zijlstra
2016-02-29 10:32                                                                     ` Peter Zijlstra
     [not found]                                                                     ` <20160229103221.GI6356-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2016-02-29 10:39                                                                       ` Arnd Bergmann
2016-02-29 10:39                                                                         ` Arnd Bergmann
2016-02-29 12:41                                                                         ` Mathieu Desnoyers
2016-02-29 12:41                                                                           ` Mathieu Desnoyers
     [not found]                                                                           ` <1811549980.11849.1456749709589.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-29 13:08                                                                             ` Arnd Bergmann
2016-02-29 13:08                                                                               ` Arnd Bergmann
2016-02-29 18:19                                                                             ` H. Peter Anvin
2016-02-29 18:19                                                                               ` H. Peter Anvin
2016-03-02 10:44                                                                             ` Geert Uytterhoeven
2016-03-02 10:44                                                                               ` Geert Uytterhoeven
2016-03-01 18:25                                                                   ` H. Peter Anvin
2016-03-01 18:25                                                                     ` H. Peter Anvin
     [not found]                                                                     ` <56D5DEA8.3040908-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2016-03-01 18:40                                                                       ` Mathieu Desnoyers
2016-03-01 18:40                                                                         ` Mathieu Desnoyers
     [not found]                                                           ` <CA+55aFysWipEagSdgeXbLx+Au4vomvyttdNFJtM+HffmBECQiA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-27 19:01                                                             ` H. Peter Anvin
2016-02-27 19:01                                                               ` H. Peter Anvin
2016-02-28 13:07                                                             ` Geert Uytterhoeven
2016-02-28 13:07                                                               ` Geert Uytterhoeven
     [not found]                                                               ` <CAMuHMdV2dHsJfchyHBnQEAVEMSQ+1N7X4-iqGZ7K7J=Lf8qs4A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-28 16:21                                                                 ` Linus Torvalds
2016-02-28 16:21                                                                   ` Linus Torvalds
2016-02-29 10:01                                                             ` Peter Zijlstra
2016-02-29 10:01                                                               ` Peter Zijlstra
2016-02-27 15:04                                                     ` H. Peter Anvin
2016-02-27 15:04                                                       ` H. Peter Anvin
2016-02-24  1:36   ` [PATCH v4 0/5] getcpu_cache system call for 4.6 H. Peter Anvin
2016-02-24  1:36     ` H. Peter Anvin
2016-02-24  4:09     ` Mathieu Desnoyers
     [not found]       ` <1452699925.6549.1456286963485.JavaMail.zimbra-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-02-24 20:07         ` H. Peter Anvin
2016-02-24 20:07           ` H. Peter Anvin
     [not found]           ` <F6BC367F-127F-4254-8E4E-E7BF60A027F3-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
2016-02-24 22:38             ` Mathieu Desnoyers
2016-02-24 22:38               ` Mathieu Desnoyers

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=668290565.8970.1456508825358.JavaMail.zimbra@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    --cc=ahh@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=bmaurer@fb.com \
    --cc=catalin.marinas@arm.com \
    --cc=cl@linux.com \
    --cc=davejwatson@fb.com \
    --cc=hpa@zytor.com \
    --cc=josh@joshtriplett.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=linux@rasmusvillemoes.dk \
    --cc=luto@amacapital.net \
    --cc=mingo@redhat.com \
    --cc=mtk.manpages@gmail.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=will.deacon@arm.com \
    /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 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.