superpages and kmem on amd64

Alan Cox alc at
Sun May 20 17:42:27 UTC 2012

On 05/20/2012 09:43, Marko Zec wrote:
> On Sunday 20 May 2012 09:25:59 Alan Cox wrote:
>> On Sun, May 20, 2012 at 2:01 AM, Marko Zec<zec at>  wrote:
>>> Hi all,
>>> I'm playing with an algorithm which makes use of large contiguous blocks
>>> of kernel memory (ranging from 1M to 1G in size), so it would be nice if
>>> those could be somehow forcibly mapped to superpages.  I was hoping that
>>> the VM system would automagically map (merge) contiguous 4k pages to
>>> superpages, but
>>> apparently it doesn't:
>>> vm.pmap.pdpe.demotions: 2
>>> vm.pmap.pde.promotions: 543
>>> vm.pmap.pde.p_failures: 266253
>>> vm.pmap.pde.mappings: 0
>>> vm.pmap.pde.demotions: 31
>> No, your conclusion is incorrect.  These counts show that 543 superpage
>> mappings were created by promotion.
> OK, that sounds promising.  Does "created by promotion" count reflect
> historic / cumulative stats, or is vm.pmap.pde.promotions the actual number
> of superpages active?  Or should we subtract vm.pmap.pde.demotions from it to
> get the current value?

The count is cumulative.  There is no instantaneous count.  Subtracting 
demotions from promotions plus mappings is not a reliable way to get the 
instantaneous total because a superpage mapping can be destroyed without 
first being demoted.

> In any case, I wish to be certain that a particular kmem virtual address range
> is mapped to superpages - how can I enforce that at malloc time, and / or
> find out later if I really got my kmem mapped to superpages?  Perhaps
> vm_map_lookup() could provide more info, but I'm wondering if someone already
> wrote a wrapper function for that, which takes only the base virtual address
> as a single argument?

Try using pmap_mincore() to verify that the mappings are superpages.

> BTW, apparently malloc(size, M_TEMP, M_NOWAIT) requests fail for size>  1G,
> even at boot time.  Any ideas how to circumvent that (8.3-STABLE, amd64, 4G
> physical RAM)?

I suspect that you need to increase the size of your kmem map.


More information about the freebsd-amd64 mailing list