Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Apr 2011 23:41:46 +0200
From:      Dimitry Andric <dim@FreeBSD.org>
To:        Jung-uk Kim <jkim@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r220584 - in head/sys: amd64/amd64 i386/i386
Message-ID:  <4DA6189A.5040200@FreeBSD.org>
In-Reply-To: <201104122349.p3CNn7kK039179@svn.freebsd.org>
References:  <201104122349.p3CNn7kK039179@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2011-04-13 01:49, Jung-uk Kim wrote:
> Author: jkim
> Date: Tue Apr 12 23:49:07 2011
> New Revision: 220584
> URL: http://svn.freebsd.org/changeset/base/220584
>
> Log:
>    Reduce errors in effective frequency calculation.
>
> Modified:
>    head/sys/amd64/amd64/machdep.c
>    head/sys/i386/i386/machdep.c
>
> Modified: head/sys/amd64/amd64/machdep.c
> ==============================================================================
> --- head/sys/amd64/amd64/machdep.c	Tue Apr 12 23:04:01 2011	(r220583)
> +++ head/sys/amd64/amd64/machdep.c	Tue Apr 12 23:49:07 2011	(r220584)
> @@ -546,7 +546,7 @@ int
>   cpu_est_clockrate(int cpu_id, uint64_t *rate)
>   {
>   	uint64_t tsc1, tsc2;
> -	uint64_t acnt, mcnt;
> +	uint64_t acnt, mcnt, perf;
>   	register_t reg;
>
>   	if (pcpu_find(cpu_id) == NULL || rate == NULL)
> @@ -579,7 +579,8 @@ cpu_est_clockrate(int cpu_id, uint64_t *
>   		acnt = rdmsr(MSR_APERF);
>   		tsc2 = rdtsc();
>   		intr_restore(reg);
> -		*rate = (tsc2 - tsc1) / 1000 * acnt / mcnt * 1000000;
> +		perf = 1000 * acnt / mcnt;
> +		*rate = (tsc2 - tsc1) * perf;
>   	} else {
>   		tsc1 = rdtsc();
>   		DELAY(1000);

Hmm...  on my VMs this now leads to:

Fatal trap 18: integer divide fault while in kernel mode
cpuid = 0; apic id = 00
instruction pointer     = 0x20:0xffffffff809c908d
stack pointer           = 0x28:0xffffff80f6a14850
frame pointer           = 0x28:0xffffff80f6a14880
code segment            = base 0x0, limit 0xfffff, type 0x1b
                         = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 54 (sysctl)
[ thread pid 54 tid 100060 ]
Stopped at      cpu_est_clockrate+0x11d:        divq    %rdi,%eax
db> bt
Tracing pid 54 tid 100060 td 0xfffffe0002dbe8c0
cpu_est_clockrate() at cpu_est_clockrate+0x11d
cf_get_method() at cf_get_method+0x2d4
cpufreq_curr_sysctl() at cpufreq_curr_sysctl+0x6c
sysctl_root() at sysctl_root+0x19d
userland_sysctl() at userland_sysctl+0x1a4
__sysctl() at __sysctl+0x75
syscallenter() at syscallenter+0x201
syscall() at syscall+0x38
Xfast_syscall() at Xfast_syscall+0xe1
--- syscall (202, FreeBSD ELF64, __sysctl), rip = 0x8009472ac, rsp = 0x7fffffffca38, rbp = 0x7fffffffd310 ---

But I don't really see why, yet. :)  With r220532, it worked fine.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4DA6189A.5040200>