getting the cpuid for a userspace process ?

C. P. Ghost cpghost at
Fri Nov 4 02:01:07 UTC 2011

On Tue, Oct 25, 2011 at 8:54 PM, John Baldwin <jhb at> wrote:
> On Tuesday, October 25, 2011 2:09:12 pm Poul-Henning Kamp wrote:
>> In message <201110251342.45194.jhb at>, John Baldwin writes:
>> >On Tuesday, October 25, 2011 11:06:22 am Luigi Rizzo wrote:
>> >> as the subject says... is there any way to get the current
>> >> CPU id for a userspace process (of course,
>> >> valid only at the time the function is called as the
>> >> process might be arbitrarily moved while it runs)
>> >
>> >Not from userland, no.  On x86 you can use cpuid to fetch the APIC ID, but
>> >that does not map 1:1 to FreeBSD cpu IDs.
>> How does JEmalloc do it ?
> I don't think it does on FreeBSD.  The only thing malloc() knows on FreeBSD is
> the total number of CPUs.  I believe Linux has a system call that returns this
> though (sched_getcpu() is the public interface which is a wrapper around a
> getcpu() system call).  From the manpage it would seem that sched_getcpu()
> uses a per-thread shared page of some sort so that it doesn't actually have to
> enter the kernel to get the CPU ID.  Alternatively, you could imagine it on
> x86 at least exporting a table mapping APIC IDs to CPU IDs and then using
> cpuid and that table to do the lookup purely in userland.  That would only
> necessitate a global shared page and not one per-thread.  You could still fall
> back to a system call for other architectures that simply returned
> curthread->td_oncpu.

Exposing a table mapping to userland would be somewhat similar
to the way L4Ka::Pistachio exports a UTCB area to userland threads:

> --
> John Baldwin


Cordula's Web.

More information about the freebsd-current mailing list