From: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
To: Mathieu Desnoyers
<mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
Cc: Paul Turner <pjt-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
Andrew Hunter <ahh-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
Peter Zijlstra <peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Andy Lutomirski <luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org>,
Andi Kleen <andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org>,
Dave Watson <davejwatson-b10kYP2dOMg@public.gmane.org>,
Chris Lameter <cl-vYTEC60ixJUAvxtiuMwx3w@public.gmane.org>,
Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Ben Maurer <bmaurer-b10kYP2dOMg@public.gmane.org>,
Steven Rostedt <rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org>,
"Paul E. McKenney"
<paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>,
Josh Triplett <josh-iaAMLnmF4UmaiuxdJuQwMA@public.gmane.org>,
Linus Torvalds
<torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Andrew Morton
<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org>,
Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>,
Michael Kerrisk
<mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Subject: Re: [RFC PATCH v3 1/5] getcpu_cache system call: cache CPU number of running thread
Date: Thu, 28 Jan 2016 22:52:13 +0100 (CET) [thread overview]
Message-ID: <alpine.DEB.2.11.1601282205290.3886@nanos> (raw)
In-Reply-To: <1454014885-29012-2-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
On Thu, 28 Jan 2016, Mathieu Desnoyers wrote:
> +static int __get_cpu_cache_ptr(int32_t __user **cpu_cache,
cpu_cache is __user ????
> + int32_t __user * __user *cpu_cachep)
> +{
> +#ifdef CONFIG_COMPAT
> + if (is_compat_task()) {
> + compat_uptr_t *compat_cachep = (compat_uptr_t *) cpu_cachep;
> + compat_uptr_t compat_cache;
> +
> + if (get_user(compat_cache, compat_cachep))
> + return -EFAULT;
> + *cpu_cache = compat_ptr(compat_cache);
sparse should have told you that :)
> + return 0;
> + }
> +#endif
> + return get_user(*cpu_cache, cpu_cachep);
> +}
> +
> +#define get_cpu_cache_ptr(cpu_cache, cpu_cachep) \
> + __get_cpu_cache_ptr(&(cpu_cache), cpu_cachep)
> +
> +static int put_cpu_cache_ptr(int32_t __user *cpu_cache,
Ditto
> + int32_t __user * __user *cpu_cachep)
> +{
> +#ifdef CONFIG_COMPAT
> + if (is_compat_task()) {
> + compat_uptr_t compat_cache = ptr_to_compat(cpu_cache);
> + compat_uptr_t *compat_cachep = (compat_uptr_t *) cpu_cachep;
> +
> + return put_user(compat_cache, compat_cachep);
> + }
> +#endif
> + return put_user(cpu_cache, cpu_cachep);
> +}
> + current->cpu_cache = cpu_cache;
> + /*
> + * Migration checks the getcpu cache to see whether the
> + * notify_resume flag should be set.
> + * Therefore, we need to ensure that the scheduler sees
> + * the getcpu cache pointer update before we update the getcpu
> + * cache content with the current CPU number.
> + */
> + barrier();
And how does that barrier ensure this? Not at all. And why would the scheduler
care? All the scheduler cares about is tsk->cpu_cache.
> + /*
> + * Do an initial cpu cache update to ensure we won't hit
> + * SIGSEGV if put_user() fails in the resume notifier.
> + */
If you get migrated before that call, then you SIGSEGV nevertheless.
You need that call here for the case you are NOT migrated before returning to
user space because otherwise the variable is not updated.
If you want to verify that user address without a potential SIGSEGV, then you
need to do this before setting current->cpu_cache. You still need the update
after setting current->cpu_cache.
> + if (getcpu_cache_update(cpu_cache)) {
> + current->cpu_cache = NULL;
> + return -EFAULT;
> + }
> + return 0;
Thanks,
tglx
next prev parent reply other threads:[~2016-01-28 21:52 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-28 21:01 [RFC PATCH v3 0/5] getcpu_cache system call Mathieu Desnoyers
2016-01-28 21:01 ` [RFC PATCH v3 1/5] getcpu_cache system call: cache CPU number of running thread Mathieu Desnoyers
[not found] ` <1454014885-29012-2-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-01-28 21:52 ` Thomas Gleixner [this message]
2016-01-28 22:44 ` Mathieu Desnoyers
2016-01-29 8:39 ` Thomas Gleixner
2016-01-29 16:28 ` Mathieu Desnoyers
[not found] ` <1454014885-29012-1-git-send-email-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
2016-01-28 21:01 ` [RFC PATCH v3 2/5] getcpu_cache: ARM resume notifier Mathieu Desnoyers
2016-01-28 21:01 ` [RFC PATCH v3 3/5] getcpu_cache: wire up ARM system call Mathieu Desnoyers
2016-01-28 21:01 ` [RFC PATCH v3 4/5] getcpu_cache: x86 32/64 resume notifier Mathieu Desnoyers
2016-01-28 21:01 ` [RFC PATCH v3 5/5] getcpu_cache: wire up x86 32/64 system call 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=alpine.DEB.2.11.1601282205290.3886@nanos \
--to=tglx-hfztesqfncyowbw4kg4ksq@public.gmane.org \
--cc=ahh-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org \
--cc=bmaurer-b10kYP2dOMg@public.gmane.org \
--cc=catalin.marinas-5wv7dgnIgG8@public.gmane.org \
--cc=cl-vYTEC60ixJUAvxtiuMwx3w@public.gmane.org \
--cc=davejwatson-b10kYP2dOMg@public.gmane.org \
--cc=josh-iaAMLnmF4UmaiuxdJuQwMA@public.gmane.org \
--cc=linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org \
--cc=mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org \
--cc=mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=mtk.manpages-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
--cc=peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=pjt-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org \
--cc=torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.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