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" <kirill.shutemov@linux.intel.com>

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(-)