Hi Ying,
I'm a little surprised to see vmalloc calls replaced with
kmalloc-then-vmalloc calls, because that actually makes fragmentation
worse (contrary to the above claim). That's because you will consume
contiguous memory (even though you don't need it to be contiguous),
whereas before, you would have been able to get by with page-at-a-time
for vmalloc.
So, things like THP will find fewer contiguous chunks, as a result of patches such as this.
Hi, John,
I don't think so. The pages allocated by vmalloc() cannot be moved
during de-fragment. For example, if 512 dis-continuous physical pages
are allocated via vmalloc(), at worst, one page will be allocate from
one distinct 2MB continous physical pages. This makes 512 * 2MB = 1GB
memory cannot be used for THP allocation. Because these pages cannot be
defragmented until vfree().
kmalloc requires a resource that vmalloc does not: contiguous
pages. Therefore, given the same mix of pages (some groups of
contiguous pages, and a scattering of isolated single-page, or
too-small-to-satisfy-entire-alloc groups of pages, and the same
underlying page allocator, kmalloc *must* consume the more valuable
contiguous pages. However, vmalloc *may* consume those same pages.
So, if you run kmalloc a bunch of times, with higher-order requests,
you *will* run out of contiguous pages (until more are freed up). If
you run vmalloc with the same initial conditions and the same
requests, you may not necessary use up those contiguous pages.
It's true that there are benefits to doing a kmalloc-then-vmalloc, of
course: if the pages are available, it's faster and uses less
resources. Yes. I just don't think "less fragmentation" should be
listed as a benefit, because you can definitely cause *more*
fragmentation if you use up contiguous blocks unnecessarily.
Yes, I agree that for some cases, kmalloc() will use more contiguous
blocks, for example, non-movable pages are scattered all over the
memory. But I still think in common cases, if defragement is enabled,
and non-movable pages allocation is restricted to some memory area if
possible, kmalloc() is better than vmalloc() as for fragmentation.