Thread (34 messages) 34 messages, 12 authors, 2004-02-05

Re: Active Memory Defragmentation: Our implementation & problems

From: Martin J. Bligh <hidden>
Date: 2004-02-04 06:05:56
Also in: lkml

quoted
In order to move such pages, we will have to patch macros like
"virt_to_phys" & other related macros, so that the address 
translation for pages moved by us will take place vmalloc style, i.e.,
via page tables, instead of direct +-3GB. Is it worth introducing such
an overhead for address translation (vmalloc does it!)? If no, then is
there another way out, or is it better to stick to our current
definition of a movable page? 
Low memory kernel pages are a much bigger deal to defrag.  I've started
to think about these for hotplug memory and it just makes my head hurt. 
If you want to do this, you are right, you'll have to alter virt_to_phys
and company.  The best way I've seen this is with CONFIG_NONLINEAR:
http://lwn.net/2002/0411/a/discontig.php3
Those lookup tables are pretty fast, and have benefits to many areas
beyond defragmentation like NUMA and the memory hotplug projects.  
I don't think that helps you really - the mappings are usually done on
chunks signficantly larger than one page, and we don't want to break
away from using large pages for the kernel mappings.
 
Rather than try to defrag kernel memory now, it's probably better to
work on schemes that keep from fragmenting memory in the first place. 
Absolutely. Kernel pages are really hard (not any lowmem page is a 
kernel page, of course). 
quoted
Identifying pages moved by us may involve introducing a new page-flag. 
A new page-flag for per-cpu pages would be great, since we have to 
traverse the per-cpu hot & cold lists in order to identify if a page 
is on the pcp lists. 
Careful not to introduce new cacheline touches, etc whilst doing this.
The whole point of hot & cold pages is to be efficient.

If you don't need N kilobyte alignment on your N kilobyte page groups,
there's probably much more effective schemes that buddy allocator, but
that assumption may be too embedded to change.
If the per-cpu allocator caches are your only problem, I don't see why
we can't just flush them out when you're doing your operation.  Plus,
they aren't *that* big, so you could pretty easily go scanning them. 
Martin, can we just flush out and turn off the per-cpu hot/cold lists
for the defrag period?
Yup, should be fairly easy to do. Just free them back with the standard
mechanisms.
 
quoted
As of now, we have adopted a failure based approach, i.e, we
defragment only when a higher order allocation failure has taken place
(just before kswapd starts swapping).  We now want to defragment based
on thresholds kept for each allocation order.  Instead of a daemon
kicking in on a threshold  violation (as proposed by Mr. Daniel
Phillips), we intend to capture idle cpu cycles by inserting a new
process just above the idle process.  
I think I'd agree with Dan on that one.  When kswapd is going, it's
pretty much too late.  The daemon approach would be more flexible, allow
you to start earlier, and more easily have various levels of
aggressiveness.
I think the policy we've taken so far is that you can't *urgently* request
large contig areas. If you need that, you should be keeping your own cache.

M.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"aart@kvack.org"> aart@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help