On Thursday, February 23, 2017 11:04:58 PM Jia-Shiun Li wrote:
> On Thu, Feb 23, 2017 at 6:08 PM, Konstantin Belousov <kostik...@gmail.com>
> wrote:
> 
> >
> > This is a useful analysis.
> >
> > Yes, I think that there is an init ordering issue. Note that
> > cpu_disable_c2_sleep is only changed in tc_windup() when timecounter
> > is changed. If existing and already engadged timecounter suddenly gets
> > TC_FLAG_C2STOP set, tc_windup() ignores the flag.  And with the early
> > AP startup, tsc seems to be set as timecounter too early.
> >
> > Just moving order of init_TSC_tc() would not help, since tsc checks smp
> > consistency, which requires started APs.  Try this for now, but might
> > be John has better idea how to handle the issue.  You might need to add
> > some extern declarations for the patch to compile.
> >
> > diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c
> > index 3f36fbd9f8a..f8e33069c70 100644
> > --- a/sys/x86/x86/tsc.c
> > +++ b/sys/x86/x86/tsc.c
> > @@ -545,6 +545,8 @@ init_TSC_tc(void)
> >         if (cpu_deepest_sleep >= 2 && cpu_vendor_id == CPU_VENDOR_INTEL &&
> >             (amd_pminfo & AMDPM_TSC_INVARIANT) == 0) {
> >                 tsc_timecounter.tc_flags |= TC_FLAGS_C2STOP;
> > +               if (timecounter == &tsc_timecounter)
> > +                       cpu_disable_c2_sleep++;
> >                 if (bootverbose)
> >                         printf("TSC timecounter disables C2 and C3.\n");
> >         }
> >
> 
> 
> This does not work.
> 
> I added a printf before the outer if clause, and it says
> 
> init_TSC_tc:546: deepest 00000000 vendor 00008086 amd_pminfo 00000000
> 
> full boot dmesg attached. Looks init_TSC_tc() is called too early before
> acpi_cpu_attach() initializing cpu_deepest_sleep. Maybe it should be put
> after
> driver initialization, since it depends on probed ACPI C states?

We don't actually need cpu_deepest_sleep.  We could just set C2STOP always.
It doesn't hurt to have the flag set if the system only supports C1 except
that you get the printf in a verbose boot.

Try this slight variation of Konstantin's patch.  If this works we can remove
cpu_deepest_sleep entirely as a followup since it will no longer be used:

Index: tsc.c
===================================================================
--- tsc.c       (revision 314113)
+++ tsc.c       (working copy)
@@ -542,9 +542,11 @@ init_TSC_tc(void)
         * result incorrect runtimes for kernel idle threads (but not
         * for any non-idle threads).
         */
-       if (cpu_deepest_sleep >= 2 && cpu_vendor_id == CPU_VENDOR_INTEL &&
+       if (cpu_vendor_id == CPU_VENDOR_INTEL &&
            (amd_pminfo & AMDPM_TSC_INVARIANT) == 0) {
                tsc_timecounter.tc_flags |= TC_FLAGS_C2STOP;
+               if (timecounter == &tsc_timecounter)
+                       cpu_disable_c2_sleep++;
                if (bootverbose)
                        printf("TSC timecounter disables C2 and C3.\n");
        }



-- 
John Baldwin
_______________________________________________
freebsd-current@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to