From a3582de6186edcc88e022af2b9f9c1cef90e44ed Mon Sep 17 00:00:00 2001 From: gVisor bot Date: Tue, 18 Feb 2020 13:49:17 -0800 Subject: cpuid: cache the maximum size of xsave state perf shows that ExtendedStateSize cosumes more than 20% of cpu: 23.61% 23.61% [.] pkg/cpuid/cpuid.HostID PiperOrigin-RevId: 295813263 --- pkg/cpuid/cpuid_x86.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'pkg') diff --git a/pkg/cpuid/cpuid_x86.go b/pkg/cpuid/cpuid_x86.go index 333ca0a04..a0bc55ea1 100644 --- a/pkg/cpuid/cpuid_x86.go +++ b/pkg/cpuid/cpuid_x86.go @@ -725,6 +725,18 @@ func vendorIDFromRegs(bx, cx, dx uint32) string { return string(bytes) } +var maxXsaveSize = func() uint32 { + // Leaf 0 of xsaveinfo function returns the size for currently + // enabled xsave features in ebx, the maximum size if all valid + // features are saved with xsave in ecx, and valid XCR0 bits in + // edx:eax. + // + // If xSaveInfo isn't supported, cpuid will not fault but will + // return bogus values. + _, _, maxXsaveSize, _ := HostID(uint32(xSaveInfo), 0) + return maxXsaveSize +}() + // ExtendedStateSize returns the number of bytes needed to save the "extended // state" for this processor and the boundary it must be aligned to. Extended // state includes floating point registers, and other cpu state that's not @@ -736,12 +748,7 @@ func vendorIDFromRegs(bx, cx, dx uint32) string { // about 2.5K worst case, with avx512). func (fs *FeatureSet) ExtendedStateSize() (size, align uint) { if fs.UseXsave() { - // Leaf 0 of xsaveinfo function returns the size for currently - // enabled xsave features in ebx, the maximum size if all valid - // features are saved with xsave in ecx, and valid XCR0 bits in - // edx:eax. - _, _, maxSize, _ := HostID(uint32(xSaveInfo), 0) - return uint(maxSize), 64 + return uint(maxXsaveSize), 64 } // If we don't support xsave, we fall back to fxsave, which requires -- cgit v1.2.3