• J
    mm/swap.c: introduce put_[un]refcounted_compound_page helpers for splitting put_compound_page() · c747ce79
    Jianyu Zhan 提交于
    Currently, put_compound_page() carefully handles tricky cases to avoid
    racing with compound page releasing or splitting, which makes it quite
    lenthy (about 200+ lines) and needs deep tab indention, which makes it
    quite hard to follow and maintain.
    
    This patch and the next patch refactor this function.
    
    Based on the code skeleton of put_compound_page:
    
    put_compound_pge:
            if !PageTail(page)
            	put head page fastpath;
    		return;
    
            /* else PageTail */
            page_head = compound_head(page)
            if !__compound_tail_refcounted(page_head)
    		put head page optimal path; <---(1)
    		return;
            else
    		put head page slowpath; <--- (2)
                    return;
    
    This patch introduces two helpers, put_[un]refcounted_compound_page,
    handling the code path (1) and code path (2), respectively.  They both are
    tagged __always_inline, thus elmiating function call overhead, making them
    operating the same way as before.
    
    They are almost copied verbatim(except one place, a "goto out_put_single"
    is expanded), with some comments rephrasing.
    Signed-off-by: NJianyu Zhan <nasa4836@gmail.com>
    Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Jiang Liu <liuj97@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Sasha Levin <sasha.levin@oracle.com>
    Cc: Wanpeng Li <liwanp@linux.vnet.ibm.com>
    Cc: Hugh Dickins <hughd@google.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    c747ce79
swap.c 34.0 KB