Message ID | 20180717112029.42378-8-kirill.shutemov@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 07/17/2018 04:20 AM, Kirill A. Shutemov wrote: > + } else { > + /* > + * Reset __PHYSICAL_MASK. > + * Maybe needed if there's inconsistent configuation > + * between CPUs. > + */ > + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; > + } This seems like an appropriate place for a WARN_ON(). Either that, or axe this code.
On Wed, Jul 18, 2018 at 04:13:20PM -0700, Dave Hansen wrote: > On 07/17/2018 04:20 AM, Kirill A. Shutemov wrote: > > + } else { > > + /* > > + * Reset __PHYSICAL_MASK. > > + * Maybe needed if there's inconsistent configuation > > + * between CPUs. > > + */ > > + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; > > + } > > This seems like an appropriate place for a WARN_ON(). Either that, or > axe this code. There's pr_err_once() above in the function.
On 07/19/2018 02:54 AM, Kirill A. Shutemov wrote: > On Wed, Jul 18, 2018 at 04:13:20PM -0700, Dave Hansen wrote: >> On 07/17/2018 04:20 AM, Kirill A. Shutemov wrote: >>> + } else { >>> + /* >>> + * Reset __PHYSICAL_MASK. >>> + * Maybe needed if there's inconsistent configuation >>> + * between CPUs. >>> + */ >>> + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; >>> + } >> This seems like an appropriate place for a WARN_ON(). Either that, or >> axe this code. > There's pr_err_once() above in the function. Do you mean for the (tme_activate != tme_activate_cpu0) check? But that's about double-activating this feature. This check is about an inconsistent configuration between two CPUs which seems totally different. Could you explain?
On Thu, Jul 19, 2018 at 07:19:01AM -0700, Dave Hansen wrote: > On 07/19/2018 02:54 AM, Kirill A. Shutemov wrote: > > On Wed, Jul 18, 2018 at 04:13:20PM -0700, Dave Hansen wrote: > >> On 07/17/2018 04:20 AM, Kirill A. Shutemov wrote: > >>> + } else { > >>> + /* > >>> + * Reset __PHYSICAL_MASK. > >>> + * Maybe needed if there's inconsistent configuation > >>> + * between CPUs. > >>> + */ > >>> + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; > >>> + } > >> This seems like an appropriate place for a WARN_ON(). Either that, or > >> axe this code. > > There's pr_err_once() above in the function. > > Do you mean for the (tme_activate != tme_activate_cpu0) check? > > But that's about double-activating this feature. This check is about an > inconsistent configuration between two CPUs which seems totally different. > > Could you explain? (tme_activate != tme_activate_cpu0) check is about inconsistent configuration. It checks if MSR's content on the given CPU matches MSR on CPU0.
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index eb75564f2d25..bf2caf9d52dd 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c @@ -571,6 +571,29 @@ static void detect_tme(struct cpuinfo_x86 *c) mktme_status = MKTME_ENABLED; } +#ifdef CONFIG_X86_INTEL_MKTME + if (mktme_status == MKTME_ENABLED && nr_keyids) { + /* + * Mask out bits claimed from KeyID from physical address mask. + * + * For instance, if a CPU enumerates 52 physical address bits + * and number of bits claimed for KeyID is 6, bits 51:46 of + * physical address is unusable. + */ + phys_addr_t keyid_mask; + + keyid_mask = GENMASK_ULL(c->x86_phys_bits - 1, c->x86_phys_bits - keyid_bits); + physical_mask &= ~keyid_mask; + } else { + /* + * Reset __PHYSICAL_MASK. + * Maybe needed if there's inconsistent configuation + * between CPUs. + */ + physical_mask = (1ULL << __PHYSICAL_MASK_SHIFT) - 1; + } +#endif + /* * KeyID bits effectively lower the number of physical address * bits. Update cpuinfo_x86::x86_phys_bits accordingly.
MKTME claims several upper bits of the physical address in a page table entry to encode KeyID. It effectively shrinks number of bits for physical address. We should exclude KeyID bits from physical addresses. For instance, if CPU enumerates 52 physical address bits and number of bits claimed for KeyID is 6, bits 51:46 must not be threated as part physical address. This patch adjusts __PHYSICAL_MASK during MKTME enumeration. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> --- arch/x86/kernel/cpu/intel.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)