[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/xstate: reset cached register values on resume
On 26/08/2021 08:40, Jan Beulich wrote: > On 25.08.2021 18:49, Andrew Cooper wrote: >> On 25/08/2021 16:02, Jan Beulich wrote: >>> On 24.08.2021 23:11, Andrew Cooper wrote: >>> If >>> the register started out non-zero (the default on AMD iirc, as it's >>> not really masks there) but the first value to be written was zero, >>> we'd skip the write. >> There is cpuidmask_defaults which does get filled from the MSRs on boot. >> >> AMD are real CPUID settings, while Intel is an and-mask. i.e. they're >> both non-zero (unless someone does something silly with the command line >> arguments, and I don't expect Xen to be happy booting if the leaves all >> read 0). > Surely not all of them together, but I don't think it's completely > unreasonable for one (say the XSAVE one, if e.g. XSAVE is to be turned > off altogether for guests) to be all zero. > >> Each early_init_*() has an explicit ctxt_switch_levelling(NULL) call >> which, given non-zero content in cpuidmask_defaults should latch each >> one appropriately in the the per-cpu variable. > Well, as you say - provided the individual fields are all non-zero. The MSRs only exist on CPUs which have non-zero features in the relevant leaves. The XSAVE and Therm registers could plausibly be 0. Dom0 is first to boot and won't expect to have XSAVE hidden, but we do zero all of leaf 6 in recalculate_misc() There are certainly corner cases here to improve, but I think all registers will latch on the first early_init_*(), except for Therm on AMD which will latch on the first context switch from a PV guest back to idle. >>>> cpu/common.c:120:static DEFINE_PER_CPU(uint64_t, msr_misc_features); >>> Almost the same here - we only initialize the variable on the BSP >>> afaics. >> No - way way way worse, I think. >> >> For all APs, we write 0 or MSR_MISC_FEATURES_CPUID_FAULTING into >> MSR_INTEL_MISC_FEATURES_ENABLES, which amongst other things turns off >> Fast String Enable. > Urgh, indeed. Prior to 6e2fdc0f8902 there was a read-modify-write > operation. With the introduction of the cache variable this went > away, while the cache gets filled for BSP only. Yeah - I really screwed up on that one... It was also part of the PV Shim work done in a hurry in the lead up to Spectre/Meltdown. MSR_INTEL_MISC_FEATURES_ENABLES is a lot like MSR_{TSX_FORCE_ABORT,TSX_CTRL,MCU_OPT_CTRL} and the MTRRs. Most of the content wants to be identical on all cores, so we do want to fix up AP values with the BSP value if they differ, but we also want a software cache covering at least the CPUID_FAULTING bit so we don't have a unnecessary MSR read on the context switch path. I'll try to do something better. ~Andrew
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |