[PATCH] hwpmc(4) changes to use 'mp_maxid' instead of
'mp_ncpus'.
John Baldwin
jhb at freebsd.org
Mon Mar 17 13:55:32 UTC 2008
On Saturday 15 March 2008 01:43:00 am Joseph Koshy wrote:
> > FreeBSD has been trying to not be quite as i386-centric as it used to
> > be. If you look at other code in the kernel that handles per-cpu data
> > such as UMA you will see that it uses mp_maxid and CPU_ABSENT(). There
> > are other places in the kernel that are broken though (such as ndis(4)).
>
> HWPMC is very x86 centric, for obvious reasons.
Considering other CPU archictectures support various performance counters it
really shouldn't be designed to be x86-centric even if it is currently only
implemented for x86 CPUs.
> > > - Will sysctl hw.ncpus represent the count of present CPUs or will it
> > > represent the maximum CPU id?
> >
> > hw.ncpus is always mp_ncpus
> > kern.smp.cpus is also mp_ncpus
> > kern.smp.maxcpus is MAX_CPUS.
> >
> > Userland can just iterate from 0 to kern.smp.maxcpus while handling
> > absent CPUs. (For example, the kern.cp_time[] sysctl just writes out all
> > 0's for absent CPUs so that is how userland can determine an absent CPU
> > in that case.)
>
> I thought of that. For PMCTools use, using the proposed 'online_cpus'
> mask would be a better option. MAX_CPUS is a compile time value and could
> be large, whereas most machines will have far fewer CPUs than that limit.
> Why waste cycles needlessly?
Userland cycles are "cheaper". :) I think having both is fine and userland
can choose which to use (maxcpus is probably easier to impl but perhaps less
efficient).
> Now it appears to me that in the scheme of things described
> above one of mp_maxid and mp_ncpus is superfluous.
>
> Here is the reasoning:
>
> 0) We need a compile time limit for the kernel; this is kern.smp.maxcpus.
>
> 1) A given machine has a maximum number of CPUs that can fit in it.
> This is usually <<= MAXCPUS. Let us call this {MACHINE-MAX}.
> We need to scale kernel data structures based on {MACHINE-MAX}
> since using {MAXCPUS} is probably wasteful. We cannot just count the
> current number of CPUS, as we do today, because more could be
> hotplugged in later.
>
> 2) At any given instant a subset of CPUs 0..{MACHINE_MAX} will be
> online. This would be tracked by the kern.smp.online_cpus/all_cpus
> bitmask.
>
> Therefore we can use either a count (mp_ncpus) or a maximum id
> (mp_maxid) to represent {MACHINE-MAX}, but either one would do.
>
> However, x86 MD code uses both, with newer code seeming to prefer
> mp_maxid. So I am puzzled. There are far more uses of mp_ncpus
> there though.
The mp_ncpus uses are mostly bugs (e.g. ndis). I think mp_ncpus's primary use
is for userland so people can do:
make -j $(sysctl hw.ncpus)
or the like. That is, if you need a simple count of CPUs in the system, that
is what mp_ncpus is for. If you need to address invididual CPUs by ID, then
mp_ncpus is not appropriate and you need to iterate from 0 to mp_maxid
suitable to some bitmask (e.g. all_cpus via CPU_ABSENT, or a
not-yet-implemented onlines_cpus wth CPU_ONLINE/CPU_OFFLINE wrappers).
> jk> Changing HWPMC and its userland before the base kernel itself
> jk> changes does not seem to be the right thing to do.
>
> jb> While the userland intIerface is somewhat lacking, all of the
> in-kernel jb> infrastructure has been in place for at least the past 4
> years, and there is
> jb> no excuse for any in-kernel code not properly handling sparse CPU IDs.
>
> I try keep userland, kernel and documentation associated with PmcTools
> in sync.
>
> Looking around, there appear to be lots of nits that need correction.
> For one, the kern.smp sysctl hierarchy is undocumented.
Not entirely:
> sysctl -d kern.smp
kern.smp: Kernel SMP
kern.smp.maxcpus: Max number of CPUs that the system was compiled for.
kern.smp.active: Number of Auxillary Processors (APs) that were successfully
started
kern.smp.disabled: SMP has been disabled from the loader
kern.smp.cpus: Number of CPUs online
(On a UP 6.3 box)
--
John Baldwin
More information about the freebsd-arch
mailing list