On Fri, Sep 24, 2021 at 03:37:22PM +0200, Peter Zijlstra wrote: > On Thu, Sep 23, 2021 at 10:14:42AM -0700, Luck, Tony wrote: > > On Wed, Sep 22, 2021 at 11:07:22PM +0200, Peter Zijlstra wrote: > > > On Mon, Sep 20, 2021 at 07:23:45PM +0000, Fenghua Yu wrote: > > > > @@ -538,6 +547,9 @@ DEFINE_IDTENTRY_ERRORCODE(exc_general_protection) > > > > > > > > cond_local_irq_enable(regs); > > > > > > > > + if (user_mode(regs) && fixup_pasid_exception()) > > > > + goto exit; > > > > + > > > > > So you're eating any random #GP that might or might not be PASID > > > related. And all that witout a comment... Enlighten? > > > > This is moderately well commented inside the fixup_pasid_exception() > > function. Another copy of the comments here at the call-site seems > > overkill. > > +static bool fixup_pasid_exception(void) > +{ > + if (!cpu_feature_enabled(X86_FEATURE_ENQCMD)) > + return false; > + > + return __fixup_pasid_exception(); > +} > > /me goes looking for comments in that function, lemme get out the > electron microscope, because I can't seem to spot them with the naked > eye.
If you have ctags installed then a ctrl-] on that __fixup_pasid_exception() will take you to the function with the comments. No electron microscope needed. + +/* + * Try to figure out if there is a PASID MSR value to propagate to the + * thread taking the #GP. + */ +bool __fixup_pasid_exception(void) +{ + u32 pasid; + + /* + * This function is called only when this #GP was triggered from user + * space. So the mm cannot be NULL. + */ + pasid = current->mm->pasid; + + /* If no PASID is allocated, there is nothing to propagate. */ + if (pasid == PASID_DISABLED) + return false; + + /* + * If the current task already has a valid PASID MSR, then the #GP + * fault must be for some non-ENQCMD related reason. + */ + if (current->has_valid_pasid) + return false; + + /* Fix up the MSR by the PASID in the mm. */ + fpu__pasid_write(pasid); + current->has_valid_pasid = 1; + + return true; +} -Tony _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu