Andrew, this builds on my first patch eliminating the page_table_lock during page table cleanup on exit. I took a good hard look at clear_page_tables, and realized that it's using up a lot of time to run. It walks through a lot of empty slots looking for pte pages to free. I came to the realization that if we could just keep a count of mapped pages and swap entries, we'd know right away if a pte page is freeable. This patch tracks the count for pte pages and removes them as soon as they're unused, eliminating the need for clear_page_tables entirely. Doing this gained another 5% in my fork/exit timing tests, so the combined patch gives me a 10% improvement in fork/exit. Tracking the reference counts was the last straw in overloading struct page with pte page info, so I created a 'struct ptpage' to use when the struct page describes a page table page. It's a bit of a hack, but I think in the long run will make it more understandable. Dave McCracken ====================================================================== Dave McCracken IBM Linux Base Kernel Team 1-512-838-3059 dmccr@us.ibm.com T/L 678-3059