Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Mar 2012 23:27:58 +0000
From:      Eric Saint-Etienne <eric.saintetienne@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   malloc pages map to user space
Message-ID:  <CACJX%2B52DPPYea5k6QxQ6WQ62GEA9YHGr4y=ETUpPArNL83kh5w@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi,

>From within the freeBSD kernel, not all malloc are made equal:
	* malloc() smaller than=C2=A0KMEM_ZMAX (set to=C2=A0one page size) end up =
in
UMA SLABs, themselves laid out in powers of 2 (from 16 bytes, 32... to
4096 bytes)
	* bigger malloc() are done through=C2=A0uma_large_malloc() which uses the
kmem wired space

In my driver, I need to map some malloc-ed memory, obtained from
another module, into userspace.

The problem: on the smaller mallocs, as well as on some bigeer ones
(8k seems fine, 64k fails): vm_map_lookup() fails finding the
underlying vm object.

Do somebody know how (or better, have a piece of code!) to retrieve
the vm_object associated with malloc-ed memory? (small and big ones)

As far as I can see in the vm code, there isn't any object associated
with the slabs (the smaller mallocs), it seems that a huge chunk of
virtual space is used "as is", so I presume the virtual addresses
where the SLABs are have some remarkable property, with respect to
physical addresses, that could allow creating an object from scratch?

The usual answer is: use mmap(). It seems mmap() is the solution to
everything. But what I dislike with mmap() is the following cost *for
each page*:
	1/ a page fault
	2/ a call to a pager function that will do the "on demand" mapping.

Thank you.
Eric



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACJX%2B52DPPYea5k6QxQ6WQ62GEA9YHGr4y=ETUpPArNL83kh5w>