On Fri, 2017-03-24 at 06:56 -0700, Dave Hansen wrote:
On 03/24/2017 12:33 AM, John Hubbard wrote:
You guys are having quite a discussion over a very small point.
There might be some additional information you are using to come up with
that conclusion, that is not obvious to me. Any thoughts there? These
calls use the same underlying page allocator (and I thought that both
were subject to the same constraints on defragmentation, as a result of
that). So I am not seeing any way that kmalloc could possibly be a
less-fragmenting call than vmalloc.
But, Ying is right.
Let's say we have a two-page data structure. vmalloc() takes two
effectively random order-0 pages, probably from two different 2M pages
and pins them. That "kills" two 2M pages.
kmalloc(), allocating two *contiguous* pages, is very unlikely to cross
a 2M boundary (it theoretically could). That means it will only "kill"
the possibility of a single 2M page. More 2M pages == less fragmentation.
In vmalloc, it eventually calls __vmalloc_area_node that allocates the
page one at a time. There's no attempt there to make the pages contiguous
if I am reading the code correctly. So that will increase the memory
fragmentation as we will be piecing together pages from all over the places.
Tim