From: Ira Weiny <ira.weiny@intel.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Dave Hansen <dave.hansen@linux.intel.com>,
Fenghua Yu <fenghua.yu@intel.com>,
x86@kernel.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
linux-doc@vger.kernel.org, linux-nvdimm@lists.01.org,
linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
Dan Williams <dan.j.williams@intel.com>,
Greg KH <gregkh@linuxfoundation.org>
Subject: Re: [PATCH V3 04/10] x86/pks: Preserve the PKRS MSR on context switch
Date: Thu, 17 Dec 2020 20:05:13 -0800 [thread overview]
Message-ID: <20201218040513.GB2506510@iweiny-DESK2.sc.intel.com> (raw)
In-Reply-To: <871rfoscz4.fsf@nanos.tec.linutronix.de>
On Thu, Dec 17, 2020 at 03:50:55PM +0100, Thomas Gleixner wrote:
> On Fri, Nov 06 2020 at 15:29, ira weiny wrote:
> > --- a/arch/x86/kernel/process.c
> > +++ b/arch/x86/kernel/process.c
> > @@ -43,6 +43,7 @@
> > #include <asm/io_bitmap.h>
> > #include <asm/proto.h>
> > #include <asm/frame.h>
> > +#include <asm/pkeys_common.h>
> >
> > #include "process.h"
> >
> > @@ -187,6 +188,27 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg,
> > return ret;
> > }
> >
> > +#ifdef CONFIG_ARCH_HAS_SUPERVISOR_PKEYS
> > +DECLARE_PER_CPU(u32, pkrs_cache);
> > +static inline void pks_init_task(struct task_struct *tsk)
>
> First of all. I asked several times now not to glue stuff onto a
> function without a newline inbetween. It's unreadable.
Fixed.
>
> But what's worse is that the declaration of pkrs_cache which is global
> is in a C file and not in a header. And pkrs_cache is not even used in
> this file. So what?
OK, this was just a complete rebase/refactor mess up on my part. The
global'ness is not required until we need a global update of the pkrs which was
not part of this series.
I've removed it from this patch. And cleaned it up in patch 6/10 as well. And
cleaned it up in the global pkrs patch which you found in my git tree.
>
> > +{
> > + /* New tasks get the most restrictive PKRS value */
> > + tsk->thread.saved_pkrs = INIT_PKRS_VALUE;
> > +}
> > +static inline void pks_sched_in(void)
>
> Newline between functions. It's fine for stubs, but not for a real implementation.
Again my apologies.
Fixed.
>
> > diff --git a/arch/x86/mm/pkeys.c b/arch/x86/mm/pkeys.c
> > index d1dfe743e79f..76a62419c446 100644
> > --- a/arch/x86/mm/pkeys.c
> > +++ b/arch/x86/mm/pkeys.c
> > @@ -231,3 +231,34 @@ u32 update_pkey_val(u32 pk_reg, int pkey, unsigned int flags)
> >
> > return pk_reg;
> > }
> > +
> > +DEFINE_PER_CPU(u32, pkrs_cache);
>
> Again, why is this global?
In this patch it does not need to be. I've changed it to static.
>
> > +void write_pkrs(u32 new_pkrs)
> > +{
> > + u32 *pkrs;
> > +
> > + if (!static_cpu_has(X86_FEATURE_PKS))
> > + return;
> > +
> > + pkrs = get_cpu_ptr(&pkrs_cache);
>
> So this is called from various places including schedule and also from
> the low level entry/exit code. Why do we need to have an extra
> preempt_disable/enable() there via get/put_cpu_ptr()?
>
> Just because performance in those code paths does not matter?
Honestly I don't recall the full history at this point. The
preempt_disable/enable() is required when this is called from
pks_update_protection() AKA when a user is trying to update the protections of
their key. What I do remember is that this was originally not preempt safe and we
had a comment to that effect in the early patches.[1]
Somewhere along the line the preempt discussion lead us to make write_pkrs()
'self contained' with the preemption protection here. I just did not think
about any performance issues. It is safe to call preempt_disable() from a
preempt disabled region, correct? I seem to recall asking that and the answer
was 'yes'.
I will audit the calls again and adjust the preemption disable as needed.
[1] https://lore.kernel.org/lkml/20200717072056.73134-5-ira.weiny@intel.com/#t
>
> > + if (*pkrs != new_pkrs) {
> > + *pkrs = new_pkrs;
> > + wrmsrl(MSR_IA32_PKRS, new_pkrs);
> > + }
> > + put_cpu_ptr(pkrs);
>
> Now back to the context switch:
>
> > @@ -644,6 +668,8 @@ void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p)
> >
> > if ((tifp ^ tifn) & _TIF_SLD)
> > switch_to_sld(tifn);
> > +
> > + pks_sched_in();
> > }
>
> How is this supposed to work?
>
> switch_to() {
> ....
> switch_to_extra() {
> ....
> if (unlikely(next_tif & _TIF_WORK_CTXSW_NEXT ||
> prev_tif & _TIF_WORK_CTXSW_PREV))
> __switch_to_xtra(prev, next);
>
> I.e. __switch_to_xtra() is only invoked when the above condition is
> true, which is not guaranteed at all.
I did not know that. I completely missunderstood what __switch_to_xtra()
meant. I thought it was arch specific 'extra' stuff so it seemed reasonable to
me.
Also, our test seemed to work. I'm still investigating what may be wrong.
>
> While I have to admit that I dropped the ball on the update for the
> entry patch, I'm not too sorry about it anymore when looking at this.
>
> Are you still sure that this is ready for merging?
Nope...
Thanks for the review,
Ira
>
> Thanks,
>
> tglx
next prev parent reply other threads:[~2020-12-18 4:06 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-06 23:28 [PATCH V3 00/10] PKS: Add Protection Keys Supervisor (PKS) support V3 ira.weiny
2020-11-06 23:28 ` [PATCH V3 01/10] x86/pkeys: Create pkeys_common.h ira.weiny
2020-11-06 23:29 ` [PATCH V3 02/10] x86/fpu: Refactor arch_set_user_pkey_access() for PKS support ira.weiny
2020-11-06 23:29 ` [PATCH V3 03/10] x86/pks: Add PKS defines and Kconfig options ira.weiny
2020-11-06 23:29 ` [PATCH V3 04/10] x86/pks: Preserve the PKRS MSR on context switch ira.weiny
2020-12-17 14:50 ` Thomas Gleixner
2020-12-17 22:43 ` Thomas Gleixner
2020-12-18 13:57 ` Thomas Gleixner
2020-12-18 19:20 ` Dan Williams
2020-12-18 21:06 ` Thomas Gleixner
2020-12-18 21:58 ` Dan Williams
2020-12-18 22:44 ` Thomas Gleixner
2020-12-18 19:42 ` Ira Weiny
2020-12-18 20:10 ` Dave Hansen
2020-12-18 21:30 ` Thomas Gleixner
2020-12-18 4:05 ` Ira Weiny [this message]
2020-12-17 20:41 ` [NEEDS-REVIEW] " Dave Hansen
2020-12-18 4:10 ` Ira Weiny
2020-12-18 15:33 ` Dave Hansen
2020-11-06 23:29 ` [PATCH V3 05/10] x86/entry: Pass irqentry_state_t by reference ira.weiny
2020-11-15 18:58 ` Thomas Gleixner
2020-11-16 18:49 ` Ira Weiny
2020-11-16 20:36 ` Thomas Gleixner
2020-11-24 6:09 ` [PATCH V3.1] entry: " ira.weiny
2020-12-11 22:14 ` Andy Lutomirski
2020-12-16 1:32 ` Ira Weiny
2020-12-16 2:09 ` Andy Lutomirski
2020-12-17 0:38 ` Ira Weiny
2020-12-17 13:07 ` Thomas Gleixner
2020-12-17 13:19 ` Peter Zijlstra
2020-12-17 15:35 ` Andy Lutomirski
2020-12-17 16:58 ` Thomas Gleixner
2020-11-06 23:29 ` [PATCH V3 06/10] x86/entry: Preserve PKRS MSR across exceptions ira.weiny
2020-12-17 15:28 ` Thomas Gleixner
2020-11-06 23:29 ` [PATCH V3 07/10] x86/fault: Report the PKRS state on fault ira.weiny
2020-11-06 23:29 ` [PATCH V3 08/10] x86/pks: Add PKS kernel API ira.weiny
2020-12-23 20:39 ` Randy Dunlap
2020-11-06 23:29 ` [PATCH V3 09/10] x86/pks: Enable Protection Keys Supervisor (PKS) ira.weiny
2020-11-06 23:29 ` [PATCH V3 10/10] x86/pks: Add PKS test code ira.weiny
2020-12-17 20:55 ` Dave Hansen
2020-12-18 4:05 ` Ira Weiny
2020-12-18 16:59 ` Dan Williams
2020-12-07 22:14 ` [PATCH V3 00/10] PKS: Add Protection Keys Supervisor (PKS) support V3 Ira Weiny
2020-12-08 15:55 ` Thomas Gleixner
2020-12-08 17:22 ` Ira Weiny
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=20201218040513.GB2506510@iweiny-DESK2.sc.intel.com \
--to=ira.weiny@intel.com \
--cc=akpm@linux-foundation.org \
--cc=bp@alien8.de \
--cc=dan.j.williams@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=fenghua.yu@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nvdimm@lists.01.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@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;
as well as URLs for NNTP newsgroup(s).