From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] x86: don't write_tsc() non-zero values on CPUs updating only the lower 32 bits Date: Thu, 14 Apr 2011 17:05:11 +0100 Message-ID: References: <4DA6BBD1020000780003B865@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="B_3385645522_99774540" Return-path: In-Reply-To: <4DA6BBD1020000780003B865@vpn.id2.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Jan Beulich , "xen-devel@lists.xensource.com" Cc: "winston.l.wang" List-Id: xen-devel@lists.xenproject.org > This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --B_3385645522_99774540 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit On 14/04/2011 08:18, "Jan Beulich" wrote: > This means suppressing the uses in time_calibration_tsc_rendezvous(), > cstate_restore_tsc(), and synchronize_tsc_slave(), and fixes a boot > hang of Linux Dom0 when loading processor.ko on such systems that > have support for C states above C1. I've attached a version which would avoid doing the writability test on TSC_RELIABLE systems. See what you think. I also simplified the actual writability check itself. I couldn't figure out what the benefit of your more complex approach would be. In fact it looked like it wouldn't work if bit 32 was set already in the TSC counter, as then you would write back an unmodified TSC (and in fact you would detect the wrong way round, as you'd see a big delta if the write silently cleared bit 32 (and bits 33-63)). And the final write of tsc+4*delta, wasn't sure what that was about either! But if you can explain why your test is better I'd be happy to use it as you originally wrote it. -- Keir > Signed-off-by: Jan Beulich > > --- a/xen/arch/x86/acpi/cpu_idle.c > +++ b/xen/arch/x86/acpi/cpu_idle.c > @@ -1098,3 +1098,7 @@ void cpuidle_disable_deep_cstate(void) > hpet_disable_legacy_broadcast(); > } > > +bool_t cpuidle_using_deep_cstate(void) > +{ > + return xen_cpuidle && max_cstate > (local_apic_timer_c2_ok ? 2 : 1); > +} > --- a/xen/arch/x86/smpboot.c > +++ b/xen/arch/x86/smpboot.c > @@ -41,6 +41,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -124,6 +125,12 @@ static void smp_store_cpu_info(int id) > ; > } > > +/* > + * TSC's upper 32 bits can't be written in earlier CPUs (before > + * Prescott), there is no way to resync one AP against BP. > + */ > +bool_t disable_tsc_sync; > + > static atomic_t tsc_count; > static uint64_t tsc_value; > static cpumask_t tsc_sync_cpu_mask; > @@ -132,6 +139,9 @@ static void synchronize_tsc_master(unsig > { > unsigned int i; > > + if ( disable_tsc_sync ) > + return; > + > if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) && > !cpu_isset(slave, tsc_sync_cpu_mask) ) > return; > @@ -153,6 +163,9 @@ static void synchronize_tsc_slave(unsign > { > unsigned int i; > > + if ( disable_tsc_sync ) > + return; > + > if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) && > !cpu_isset(slave, tsc_sync_cpu_mask) ) > return; > --- a/xen/arch/x86/time.c > +++ b/xen/arch/x86/time.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -1385,6 +1386,9 @@ void init_percpu_time(void) > /* Late init function (after all CPUs are booted). */ > int __init init_xen_time(void) > { > + u64 tsc, tmp; > + const char *what = NULL; > + > if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) ) > { > /* > @@ -1398,6 +1402,45 @@ int __init init_xen_time(void) > setup_clear_cpu_cap(X86_FEATURE_TSC_RELIABLE); > } > > + /* > + * On certain older Intel CPUs writing the TSC MSR clears the upper > + * 32 bits. Obviously we must not use write_tsc() on such CPUs. > + * > + * Additionally, AMD specifies that being able to write the TSC MSR > + * is not an architectural feature (but, other than their manual says, > + * also cannot be determined from CPUID bits). > + */ > + rdtscll(tsc); > + if ( wrmsr_safe(MSR_IA32_TSC, (u32)tsc) == 0 ) > + { > + u64 tmp2; > + > + rdtscll(tmp2); > + write_tsc(tsc | (1ULL << 32)); > + rdtscll(tmp); > + if ( ABS((s64)tmp - (s64)tmp2) < (1LL << 31) ) > + what = "only partially"; > + } > + else > + what = "not"; > + if ( what ) > + { > + printk(XENLOG_WARNING "TSC %s writable\n", what); > + > + /* time_calibration_tsc_rendezvous() must not be used */ > + if ( !boot_cpu_has(X86_FEATURE_TSC_RELIABLE) ) > + setup_clear_cpu_cap(X86_FEATURE_CONSTANT_TSC); > + > + /* cstate_restore_tsc() must not be used (or do nothing) */ > + if ( !boot_cpu_has(X86_FEATURE_NONSTOP_TSC) ) > + cpuidle_disable_deep_cstate(); > + > + /* synchronize_tsc_slave() must do nothing */ > + disable_tsc_sync = 1; > + } > + else > + write_tsc(tsc + 4 * (s32)(tmp - tsc)); > + > /* If we have constant-rate TSCs then scale factor can be shared. */ > if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) > { > @@ -1451,7 +1494,7 @@ static int _disable_pit_irq(void(*hpet_b > * XXX dom0 may rely on RTC interrupt delivery, so only enable > * hpet_broadcast if FSB mode available or if force_hpet_broadcast. > */ > - if ( xen_cpuidle && !boot_cpu_has(X86_FEATURE_ARAT) ) > + if ( cpuidle_using_deep_cstate() && !boot_cpu_has(X86_FEATURE_ARAT) ) > { > hpet_broadcast_setup(); > if ( !hpet_broadcast_is_available() ) > --- a/xen/include/asm-x86/setup.h > +++ b/xen/include/asm-x86/setup.h > @@ -4,7 +4,6 @@ > #include > > extern bool_t early_boot; > -extern s8 xen_cpuidle; > extern unsigned long xenheap_initial_phys_start; > > void init_done(void); > --- a/xen/include/asm-x86/time.h > +++ b/xen/include/asm-x86/time.h > @@ -24,6 +24,8 @@ > > typedef u64 cycles_t; > > +extern bool_t disable_tsc_sync; > + > static inline cycles_t get_cycles(void) > { > cycles_t c; > --- a/xen/include/xen/cpuidle.h > +++ b/xen/include/xen/cpuidle.h > @@ -85,7 +85,10 @@ struct cpuidle_governor > void (*reflect) (struct acpi_processor_power *dev); > }; > > +extern s8 xen_cpuidle; > extern struct cpuidle_governor *cpuidle_current_governor; > + > +bool_t cpuidle_using_deep_cstate(void); > void cpuidle_disable_deep_cstate(void); > > extern void cpuidle_wakeup_mwait(cpumask_t *mask); > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel --B_3385645522_99774540 Content-type: application/octet-stream; name="00-tsc-check" Content-disposition: attachment; filename="00-tsc-check" Content-transfer-encoding: base64 ZGlmZiAtciBiNTE2NWZiNjZiNTYgeGVuL2FyY2gveDg2L2FjcGkvY3B1X2lkbGUuYwotLS0g YS94ZW4vYXJjaC94ODYvYWNwaS9jcHVfaWRsZS5jCVRodSBBcHIgMTQgMTQ6NTc6MjQgMjAx MSArMDEwMAorKysgYi94ZW4vYXJjaC94ODYvYWNwaS9jcHVfaWRsZS5jCVRodSBBcHIgMTQg MTY6NTg6NDEgMjAxMSArMDEwMApAQCAtMTA5OCwzICsxMDk4LDcgQEAKICAgICBocGV0X2Rp c2FibGVfbGVnYWN5X2Jyb2FkY2FzdCgpOwogfQogCitib29sX3QgY3B1aWRsZV91c2luZ19k ZWVwX2NzdGF0ZSh2b2lkKQoreworICAgIHJldHVybiB4ZW5fY3B1aWRsZSAmJiBtYXhfY3N0 YXRlID4gKGxvY2FsX2FwaWNfdGltZXJfYzJfb2sgPyAyIDogMSk7Cit9CmRpZmYgLXIgYjUx NjVmYjY2YjU2IHhlbi9hcmNoL3g4Ni9zbXBib290LmMKLS0tIGEveGVuL2FyY2gveDg2L3Nt cGJvb3QuYwlUaHUgQXByIDE0IDE0OjU3OjI0IDIwMTEgKzAxMDAKKysrIGIveGVuL2FyY2gv eDg2L3NtcGJvb3QuYwlUaHUgQXByIDE0IDE2OjU4OjQxIDIwMTEgKzAxMDAKQEAgLTQxLDYg KzQxLDcgQEAKICNpbmNsdWRlIDxhc20vZmx1c2h0bGIuaD4KICNpbmNsdWRlIDxhc20vbXNy Lmg+CiAjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgogI2lu Y2x1ZGUgPG1hY2hfYXBpYy5oPgogI2luY2x1ZGUgPG1hY2hfd2FrZWNwdS5oPgogI2luY2x1 ZGUgPHNtcGJvb3RfaG9va3MuaD4KQEAgLTEyNCw2ICsxMjUsMTIgQEAKICAgICA7CiB9CiAK Ky8qCisgKiBUU0MncyB1cHBlciAzMiBiaXRzIGNhbid0IGJlIHdyaXR0ZW4gaW4gZWFybGll ciBDUFVzIChiZWZvcmUKKyAqIFByZXNjb3R0KSwgdGhlcmUgaXMgbm8gd2F5IHRvIHJlc3lu YyBvbmUgQVAgYWdhaW5zdCBCUC4KKyAqLworYm9vbF90IGRpc2FibGVfdHNjX3N5bmM7CisK IHN0YXRpYyBhdG9taWNfdCB0c2NfY291bnQ7CiBzdGF0aWMgdWludDY0X3QgdHNjX3ZhbHVl Owogc3RhdGljIGNwdW1hc2tfdCB0c2Nfc3luY19jcHVfbWFzazsKQEAgLTEzMiw2ICsxMzks OSBAQAogewogICAgIHVuc2lnbmVkIGludCBpOwogCisgICAgaWYgKCBkaXNhYmxlX3RzY19z eW5jICkKKyAgICAgICAgcmV0dXJuOworCiAgICAgaWYgKCBib290X2NwdV9oYXMoWDg2X0ZF QVRVUkVfVFNDX1JFTElBQkxFKSAmJgogICAgICAgICAgIWNwdV9pc3NldChzbGF2ZSwgdHNj X3N5bmNfY3B1X21hc2spICkKICAgICAgICAgcmV0dXJuOwpAQCAtMTUzLDYgKzE2Myw5IEBA CiB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAKKyAgICBpZiAoIGRpc2FibGVfdHNjX3N5bmMg KQorICAgICAgICByZXR1cm47CisKICAgICBpZiAoIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVS RV9UU0NfUkVMSUFCTEUpICYmCiAgICAgICAgICAhY3B1X2lzc2V0KHNsYXZlLCB0c2Nfc3lu Y19jcHVfbWFzaykgKQogICAgICAgICByZXR1cm47CmRpZmYgLXIgYjUxNjVmYjY2YjU2IHhl bi9hcmNoL3g4Ni90aW1lLmMKLS0tIGEveGVuL2FyY2gveDg2L3RpbWUuYwlUaHUgQXByIDE0 IDE0OjU3OjI0IDIwMTEgKzAxMDAKKysrIGIveGVuL2FyY2gveDg2L3RpbWUuYwlUaHUgQXBy IDE0IDE2OjU4OjQxIDIwMTEgKzAxMDAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDx4 ZW4vc21wLmg+CiAjaW5jbHVkZSA8eGVuL2lycS5oPgogI2luY2x1ZGUgPHhlbi9zb2Z0aXJx Lmg+CisjaW5jbHVkZSA8eGVuL2NwdWlkbGUuaD4KICNpbmNsdWRlIDx4ZW4vc3ltYm9scy5o PgogI2luY2x1ZGUgPHhlbi9rZXloYW5kbGVyLmg+CiAjaW5jbHVkZSA8eGVuL2d1ZXN0X2Fj Y2Vzcy5oPgpAQCAtNjgwLDYgKzY4MSw4IEBACiAgICAgaWYgKCBib290X2NwdV9oYXMoWDg2 X0ZFQVRVUkVfTk9OU1RPUF9UU0MpICkKICAgICAgICAgcmV0dXJuOwogCisgICAgQVNTRVJU KGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9UU0NfUkVMSUFCTEUpKTsKKwogICAgIHdyaXRl X3RzYyhzdGltZTJ0c2MocmVhZF9wbGF0Zm9ybV9zdGltZSgpKSk7CiB9CiAKQEAgLTEzODIs NiArMTM4NSw1NiBAQAogICAgIH0KIH0KIAorLyoKKyAqIE9uIGNlcnRhaW4gb2xkZXIgSW50 ZWwgQ1BVcyB3cml0aW5nIHRoZSBUU0MgTVNSIGNsZWFycyB0aGUgdXBwZXIgMzIgYml0cy4g CisgKiBPYnZpb3VzbHkgd2UgbXVzdCBub3QgdXNlIHdyaXRlX3RzYygpIG9uIHN1Y2ggQ1BV cy4KKyAqCisgKiBBZGRpdGlvbmFsbHksIEFNRCBzcGVjaWZpZXMgdGhhdCBiZWluZyBhYmxl IHRvIHdyaXRlIHRoZSBUU0MgTVNSIGlzIG5vdCBhbiAKKyAqIGFyY2hpdGVjdHVyYWwgZmVh dHVyZSAoYnV0LCBvdGhlciB0aGFuIHRoZWlyIG1hbnVhbCBzYXlzLCBhbHNvIGNhbm5vdCBi ZSAKKyAqIGRldGVybWluZWQgZnJvbSBDUFVJRCBiaXRzKS4KKyAqLworc3RhdGljIHZvaWQg X19pbml0IHRzY19jaGVja193cml0YWJpbGl0eSh2b2lkKQoreworICAgIGNvbnN0IGNoYXIg KndoYXQgPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBJZiBhbGwgQ1BVcyBhcmUgcmVwb3J0 ZWQgYXMgc3luY2hyb25pc2VkIGFuZCBpbiBzeW5jLCB3ZSBuZXZlciB3cml0ZQorICAgICAq IHRoZSBUU0NzIChleGNlcHQgdW5hdm9pZGFibHksIHdoZW4gYSBDUFUgaXMgcGh5c2ljYWxs eSBob3QtcGx1Z2dlZCkuCisgICAgICogSGVuY2UgdGVzdGluZyBmb3Igd3JpdGFiaWxpdHkg aXMgcG9pbnRsZXNzIGFuZCBldmVuIGhhcm1mdWwuCisgICAgICovCisgICAgaWYgKCBib290 X2NwdV9oYXMoWDg2X0ZFQVRVUkVfVFNDX1JFTElBQkxFKSApCisgICAgICAgIHJldHVybjsK KworICAgIGlmICggd3Jtc3Jfc2FmZShNU1JfSUEzMl9UU0MsIDApID09IDAgKQorICAgIHsK KyAgICAgICAgdWludDY0X3QgdG1wLCB0bXAyOworCisgICAgICAgIHJkdHNjbGwodG1wMik7 CisgICAgICAgIHdyaXRlX3RzYygxVUxMIDw8IDMyKTsKKyAgICAgICAgcmR0c2NsbCh0bXAp OworICAgICAgICBpZiAoIEFCUygoczY0KXRtcCAtIChzNjQpdG1wMikgPCAoMVVMTCA8PCAz MSkgKQorICAgICAgICAgICAgd2hhdCA9ICJvbmx5IHBhcnRpYWxseSI7CisgICAgfQorICAg IGVsc2UKKyAgICAgICAgd2hhdCA9ICJub3QiOworCisgICAgLyogTm90aGluZyB0byBkbyBp ZiB0aGUgVFNDIGlzIGZ1bGx5IHdyaXRhYmxlLiAqLworICAgIGlmICggIXdoYXQgKQorICAg ICAgICByZXR1cm47CisKKyAgICBwcmludGsoWEVOTE9HX1dBUk5JTkcgIlRTQyAlcyB3cml0 YWJsZVxuIiwgd2hhdCk7CisKKyAgICAvKiB0aW1lX2NhbGlicmF0aW9uX3RzY19yZW5kZXp2 b3VzKCkgbXVzdCBub3QgYmUgdXNlZCAqLworICAgIHNldHVwX2NsZWFyX2NwdV9jYXAoWDg2 X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKTsKKworICAgIC8qIGNzdGF0ZV9yZXN0b3JlX3RzYygp IG11c3Qgbm90IGJlIHVzZWQgKG9yIGRvIG5vdGhpbmcpICovCisgICAgaWYgKCAhYm9vdF9j cHVfaGFzKFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDKSApCisgICAgICAgIGNwdWlkbGVfZGlz YWJsZV9kZWVwX2NzdGF0ZSgpOworCisgICAgLyogc3luY2hyb25pemVfdHNjX3NsYXZlKCkg bXVzdCBkbyBub3RoaW5nICovCisgICAgZGlzYWJsZV90c2Nfc3luYyA9IDE7Cit9CisKIC8q IExhdGUgaW5pdCBmdW5jdGlvbiAoYWZ0ZXIgYWxsIENQVXMgYXJlIGJvb3RlZCkuICovCiBp bnQgX19pbml0IGluaXRfeGVuX3RpbWUodm9pZCkKIHsKQEAgLTEzOTgsNiArMTQ1MSw4IEBA CiAgICAgICAgICAgICBzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1RTQ19SRUxJ QUJMRSk7CiAgICAgfQogCisgICAgdHNjX2NoZWNrX3dyaXRhYmlsaXR5KCk7CisKICAgICAv KiBJZiB3ZSBoYXZlIGNvbnN0YW50LXJhdGUgVFNDcyB0aGVuIHNjYWxlIGZhY3RvciBjYW4g YmUgc2hhcmVkLiAqLwogICAgIGlmICggYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0NPTlNU QU5UX1RTQykgKQogICAgIHsKQEAgLTE0NTEsNyArMTUwNiw3IEBACiAgICAgICogWFhYIGRv bTAgbWF5IHJlbHkgb24gUlRDIGludGVycnVwdCBkZWxpdmVyeSwgc28gb25seSBlbmFibGUK ICAgICAgKiBocGV0X2Jyb2FkY2FzdCBpZiBGU0IgbW9kZSBhdmFpbGFibGUgb3IgaWYgZm9y Y2VfaHBldF9icm9hZGNhc3QuCiAgICAgICovCi0gICAgaWYgKCB4ZW5fY3B1aWRsZSAmJiAh Ym9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSQVQpICkKKyAgICBpZiAoIGNwdWlkbGVfdXNp bmdfZGVlcF9jc3RhdGUoKSAmJiAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSQVQpICkK ICAgICB7CiAgICAgICAgIGhwZXRfYnJvYWRjYXN0X3NldHVwKCk7CiAgICAgICAgIGlmICgg IWhwZXRfYnJvYWRjYXN0X2lzX2F2YWlsYWJsZSgpICkKZGlmZiAtciBiNTE2NWZiNjZiNTYg eGVuL2luY2x1ZGUvYXNtLXg4Ni9zZXR1cC5oCi0tLSBhL3hlbi9pbmNsdWRlL2FzbS14ODYv c2V0dXAuaAlUaHUgQXByIDE0IDE0OjU3OjI0IDIwMTEgKzAxMDAKKysrIGIveGVuL2luY2x1 ZGUvYXNtLXg4Ni9zZXR1cC5oCVRodSBBcHIgMTQgMTY6NTg6NDEgMjAxMSArMDEwMApAQCAt NCw3ICs0LDYgQEAKICNpbmNsdWRlIDx4ZW4vbXVsdGlib290Lmg+CiAKIGV4dGVybiBib29s X3QgZWFybHlfYm9vdDsKLWV4dGVybiBzOCB4ZW5fY3B1aWRsZTsKIGV4dGVybiB1bnNpZ25l ZCBsb25nIHhlbmhlYXBfaW5pdGlhbF9waHlzX3N0YXJ0OwogCiB2b2lkIGluaXRfZG9uZSh2 b2lkKTsKZGlmZiAtciBiNTE2NWZiNjZiNTYgeGVuL2luY2x1ZGUvYXNtLXg4Ni90aW1lLmgK LS0tIGEveGVuL2luY2x1ZGUvYXNtLXg4Ni90aW1lLmgJVGh1IEFwciAxNCAxNDo1NzoyNCAy MDExICswMTAwCisrKyBiL3hlbi9pbmNsdWRlL2FzbS14ODYvdGltZS5oCVRodSBBcHIgMTQg MTY6NTg6NDEgMjAxMSArMDEwMApAQCAtMjQsNiArMjQsOCBAQAogCiB0eXBlZGVmIHU2NCBj eWNsZXNfdDsKIAorZXh0ZXJuIGJvb2xfdCBkaXNhYmxlX3RzY19zeW5jOworCiBzdGF0aWMg aW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKIHsKICAgICBjeWNsZXNfdCBjOwpk aWZmIC1yIGI1MTY1ZmI2NmI1NiB4ZW4vaW5jbHVkZS94ZW4vY3B1aWRsZS5oCi0tLSBhL3hl bi9pbmNsdWRlL3hlbi9jcHVpZGxlLmgJVGh1IEFwciAxNCAxNDo1NzoyNCAyMDExICswMTAw CisrKyBiL3hlbi9pbmNsdWRlL3hlbi9jcHVpZGxlLmgJVGh1IEFwciAxNCAxNjo1ODo0MSAy MDExICswMTAwCkBAIC04NSw3ICs4NSwxMCBAQAogICAgIHZvaWQgKCpyZWZsZWN0KSAgICAg ICAgIChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKmRldik7CiB9OwogCitleHRlcm4g czggeGVuX2NwdWlkbGU7CiBleHRlcm4gc3RydWN0IGNwdWlkbGVfZ292ZXJub3IgKmNwdWlk bGVfY3VycmVudF9nb3Zlcm5vcjsKKworYm9vbF90IGNwdWlkbGVfdXNpbmdfZGVlcF9jc3Rh dGUodm9pZCk7CiB2b2lkIGNwdWlkbGVfZGlzYWJsZV9kZWVwX2NzdGF0ZSh2b2lkKTsKIAog ZXh0ZXJuIHZvaWQgY3B1aWRsZV93YWtldXBfbXdhaXQoY3B1bWFza190ICptYXNrKTsK --B_3385645522_99774540 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --B_3385645522_99774540--