On 03/18/2013 12:03 PM, Simon Jeons wrote: > Hi Kirill, > On 03/15/2013 01:50 AM, Kirill A. Shutemov wrote: >> From: "Kirill A. Shutemov" >> >> Here's the second version of the patchset. >> >> The intend of the work is get code ready to enable transparent huge page >> cache for the most simple fs -- ramfs. >> >> We have read()/write()/mmap() functionality now. Still plenty work >> ahead. > > One offline question. > > Why set PG_mlocked to page_tail which be splited in function > __split_huge_page_refcount? > Also why can't find where _PAGE_SPLITTING and _PAGE_PSE flags are cleared in split_huge_page path? >> >> Any feedback is welcome. >> >> Changes since v1: >> - mmap(); >> - fix add_to_page_cache_locked() and delete_from_page_cache(); >> - introduce mapping_can_have_hugepages(); >> - call split_huge_page() only for head page in filemap_fault(); >> - wait_split_huge_page(): serialize over i_mmap_mutex too; >> - lru_add_page_tail: avoid PageUnevictable on active/inactive lru >> lists; >> - fix off-by-one in zero_huge_user_segment(); >> - THP_WRITE_ALLOC/THP_WRITE_FAILED counters; >> >> TODO: >> - memcg accounting has not yet evaluated; >> - collapse; >> - migration (?); >> - stats, knobs, etc.; >> - tmpfs/shmem enabling; >> >> >> Kirill A. Shutemov (30): >> block: implement add_bdi_stat() >> mm: implement zero_huge_user_segment and friends >> mm: drop actor argument of do_generic_file_read() >> radix-tree: implement preload for multiple contiguous elements >> thp, mm: avoid PageUnevictable on active/inactive lru lists >> thp, mm: basic defines for transparent huge page cache >> thp, mm: introduce mapping_can_have_hugepages() predicate >> thp, mm: rewrite add_to_page_cache_locked() to support huge pages >> thp, mm: rewrite delete_from_page_cache() to support huge pages >> thp, mm: locking tail page is a bug >> thp, mm: handle tail pages in page_cache_get_speculative() >> thp, mm: add event counters for huge page alloc on write to a file >> thp, mm: implement grab_cache_huge_page_write_begin() >> thp, mm: naive support of thp in generic read/write routines >> thp, libfs: initial support of thp in >> simple_read/write_begin/write_end >> thp: handle file pages in split_huge_page() >> thp: wait_split_huge_page(): serialize over i_mmap_mutex too >> thp, mm: truncate support for transparent huge page cache >> thp, mm: split huge page on mmap file page >> ramfs: enable transparent huge page cache >> x86-64, mm: proper alignment mappings with hugepages >> mm: add huge_fault() callback to vm_operations_struct >> thp: prepare zap_huge_pmd() to uncharge file pages >> thp: move maybe_pmd_mkwrite() out of mk_huge_pmd() >> thp, mm: basic huge_fault implementation for generic_file_vm_ops >> thp: extract fallback path from do_huge_pmd_anonymous_page() to a >> function >> thp: initial implementation of do_huge_linear_fault() >> thp: handle write-protect exception to file-backed huge pages >> thp: call __vma_adjust_trans_huge() for file-backed VMA >> thp: map file-backed huge pages on fault >> >> arch/x86/kernel/sys_x86_64.c | 13 +- >> fs/libfs.c | 50 ++++- >> fs/ramfs/inode.c | 6 +- >> include/linux/backing-dev.h | 10 + >> include/linux/huge_mm.h | 36 +++- >> include/linux/mm.h | 16 ++ >> include/linux/pagemap.h | 24 ++- >> include/linux/radix-tree.h | 3 + >> include/linux/vm_event_item.h | 2 + >> lib/radix-tree.c | 32 ++- >> mm/filemap.c | 283 +++++++++++++++++++++---- >> mm/huge_memory.c | 462 >> ++++++++++++++++++++++++++++++++++------- >> mm/memory.c | 31 ++- >> mm/swap.c | 3 +- >> mm/truncate.c | 12 ++ >> mm/vmstat.c | 2 + >> 16 files changed, 842 insertions(+), 143 deletions(-) >> >