On Mon, Jul 13, 2020 at 4:48 PM Fenghua Yu <fenghua.yu@xxxxxxxxx> wrote: > > The PASID state has to be cleared on forks, since the child has a > different address space. The PASID is also cleared for thread clone. While > it would be correct to inherit the PASID in this case, it is unknown > whether the new task will use ENQCMD. Giving it the PASID "just in case" > would have the downside of increased context switch overhead to setting > the PASID MSR. > > Since #GP faults have to be handled on any threads that were created before > the PASID was assigned to the mm of the process, newly created threads > might as well be treated in a consistent way. Just how much context switch overhead are we talking about here? Unless the CPU works differently than I expect, I would guess you are saving exactly zero cycles. What am I missing? --Andy > > Suggested-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Signed-off-by: Fenghua Yu <fenghua.yu@xxxxxxxxx> > Reviewed-by: Tony Luck <tony.luck@xxxxxxxxx> > --- > v2: > - Modify init_task_pasid(). > > arch/x86/kernel/process.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c > index f362ce0d5ac0..1b1492e337a6 100644 > --- a/arch/x86/kernel/process.c > +++ b/arch/x86/kernel/process.c > @@ -121,6 +121,21 @@ static int set_new_tls(struct task_struct *p, unsigned long tls) > return do_set_thread_area_64(p, ARCH_SET_FS, tls); > } > > +/* Initialize the PASID state for the forked/cloned thread. */ > +static void init_task_pasid(struct task_struct *task) > +{ > + struct ia32_pasid_state *ppasid; > + > + /* > + * Initialize the PASID state so that the PASID MSR will be > + * initialized to its initial state (0) by XRSTORS when the task is > + * scheduled for the first time. > + */ > + ppasid = get_xsave_addr(&task->thread.fpu.state.xsave, XFEATURE_PASID); > + if (ppasid) > + ppasid->pasid = INIT_PASID; > +} > + > int copy_thread_tls(unsigned long clone_flags, unsigned long sp, > unsigned long arg, struct task_struct *p, unsigned long tls) > { > @@ -174,6 +189,9 @@ int copy_thread_tls(unsigned long clone_flags, unsigned long sp, > task_user_gs(p) = get_user_gs(current_pt_regs()); > #endif > > + if (static_cpu_has(X86_FEATURE_ENQCMD)) > + init_task_pasid(p); > + > /* Set a new TLS for the child thread? */ > if (clone_flags & CLONE_SETTLS) > ret = set_new_tls(p, tls); > -- > 2.19.1 > _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx