John Hubbard <jhubbard@xxxxxxxxxx> writes:
On 03/23/2017 07:41 PM, Huang, Ying wrote:
David Rientjes <rientjes@xxxxxxxxxx> writes:
On Mon, 20 Mar 2017, Huang, Ying wrote:
From: Huang Ying <ying.huang@xxxxxxxxx>
Now vzalloc() is used in swap code to allocate various data
structures, such as swap cache, swap slots cache, cluster info, etc.
Because the size may be too large on some system, so that normal
kzalloc() may fail. But using kzalloc() has some advantages, for
example, less memory fragmentation, less TLB pressure, etc. So change
the data structure allocation in swap code to use kvzalloc() which
will try kzalloc() firstly, and fallback to vzalloc() if kzalloc()
failed.
As questioned in -v1 of this patch, what is the benefit of directly
compacting and reclaiming memory for high-order pages by first preferring
kmalloc() if this does not require contiguous memory?
The memory allocation here is only for swap on time, not for swap out/in
time. The performance of swap on is not considered critical. But if
the kmalloc() is used instead of the vmalloc(), the swap out/in
performance could be improved (marginally). More importantly, the
interference for the other activity on the system could be reduced, For
example, less memory fragmentation, less TLB usage of swap subsystem,
etc.
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().