Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Jun 2015 12:30:07 +0200
From:      Marko Zec <zec@fer.hr>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        FreeBSD Current <current@freebsd.org>, Giuseppe Lettieri <g.lettieri@iet.unipi.it>, Stefano Garzarella <stefanogarzarella@gmail.com>, Vincenzo Maffione <v.maffione@gmail.com>
Subject:   Re: superpages in FreeBSD (netmap related) ?
Message-ID:  <20150601123007.40def520@x23>
In-Reply-To: <CA%2BhQ2%2BhkWth=obecWzuXdfESeRXhGdzng7_Mj0g3HkMo=oyWNQ@mail.gmail.com>
References:  <CA%2BhQ2%2BiWq4rO-V0M9VZTHMcVORSJ_Qgn6u0JmSiZjTy-L2MAsQ@mail.gmail.com> <CA%2BhQ2%2Bh7LZp2cLUpOrqLvWwFmSSWSw4GKT1DJCc_AuH7-t042g@mail.gmail.com> <20150601115411.1f95bd00@x23> <CA%2BhQ2%2BhkWth=obecWzuXdfESeRXhGdzng7_Mj0g3HkMo=oyWNQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 1 Jun 2015 12:11:12 +0200
Luigi Rizzo <rizzo@iet.unipi.it> wrote:

> On Monday, June 1, 2015, Marko Zec <zec@fer.hr> wrote:
> 
> > On Mon, 1 Jun 2015 11:34:00 +0200
> > Luigi Rizzo <rizzo@iet.unipi.it <javascript:;>> wrote:
> >
> > > Hi,
> > > i was wondering how we can improve the netmap memory allocator
> > > to make use of 2M pages (through the page promotion trick).
> > >
> > > in netmap, when we allocate packet buffers,
> > > we issue requests for 4k blocks to contigmalloc(),
> > > and i have no idea if there is a way to improve the
> > > chance that the memory is mapped to 2M pages ?
> >
> > In my (previous life) experience, when requested large enough
> > blocks, malloc() did a good job at automatically promoting those to
> > superpages, and in my applications this behavior was 100%
> > consistent, at least on amd64.  After the block is allocated one
> > can check whether it is superpage-mapped:
> >
> > pmap_t pmap = vmspace_pmap(curthread->td_proc->p_vmspace);
> >
> > if (pmap_mincore(pmap, (vm_offset_t) addr) & MINCORE_SUPER)
> >         /* you're good */
> > else
> >         /* bad luck */
> 
> 
> Thanks. Do you know if there is any way to run some equivalente test
> from user space ?

Sure, here's a quickie:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>

int 
main(int argc, char **argv)
{
        size_t size, flags, i, super = 0, ordinary = 0;
        void *addr;
        char *vec;

        if (argc != 2)
                return (0);

        size = atoi(argv[1]);
        addr = malloc(size);
        vec = malloc(size / 4096);

        memset(addr, 0, size);

        flags = mincore(addr, size, vec);

        printf("addr %p len %d:\n", addr, size);
        for (i = 0; i <= size / 4096; i++)
                if (vec[i] & MINCORE_SUPER)
                        super++;
                else
                        ordinary++;
        printf("%d 4K blocks super-mapped, %d ordinary 4K pages\n",
            super, ordinary);

        return (0);
}

x23% ./a.out 1000000
addr 0x801006000 len 1000000:
0 4K blocks super-mapped, 245 ordinary 4K pages

x23% ./a.out 10000000
addr 0x801000000 len 10000000:
2048 4K blocks super-mapped, 394 ordinary 4K pages

x23% ./a.out 100000000000
addr 0x801000000 len 1215752192:
296448 4K blocks super-mapped, 367 ordinary 4K pages


The key is that the pages must be touched to be considered for merging
in superpages!

Marko


> Cheers
> Luigi
> 
> 
> > OTOH I'm not aware of any mechanisms for forcing superpage
> > allocations at malloc() time.
> >
> > Marko
> >
> 
> 




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