| From b35a35b556f5e6b7993ad0baf20173e75c09ce8c Mon Sep 17 00:00:00 2001 |
| From: Andrea Arcangeli <aarcange@redhat.com> |
| Date: Wed, 2 Nov 2011 13:37:36 -0700 |
| Subject: thp: share get_huge_page_tail() |
| |
| From: Andrea Arcangeli <aarcange@redhat.com> |
| |
| commit b35a35b556f5e6b7993ad0baf20173e75c09ce8c upstream. |
| |
| This avoids duplicating the function in every arch gup_fast. |
| |
| Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> |
| Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: Johannes Weiner <jweiner@redhat.com> |
| Cc: Rik van Riel <riel@redhat.com> |
| Cc: Mel Gorman <mgorman@suse.de> |
| Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> |
| Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Cc: David Gibson <david@gibson.dropbear.id.au> |
| Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Cc: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Cc: David Miller <davem@davemloft.net> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/powerpc/mm/hugetlbpage.c | 11 ----------- |
| arch/s390/mm/gup.c | 11 ----------- |
| arch/sparc/mm/gup.c | 11 ----------- |
| arch/x86/mm/gup.c | 11 ----------- |
| include/linux/mm.h | 11 +++++++++++ |
| 5 files changed, 11 insertions(+), 44 deletions(-) |
| |
| --- a/arch/powerpc/mm/hugetlbpage.c |
| +++ b/arch/powerpc/mm/hugetlbpage.c |
| @@ -385,17 +385,6 @@ follow_huge_pmd(struct mm_struct *mm, un |
| return NULL; |
| } |
| |
| -static inline void get_huge_page_tail(struct page *page) |
| -{ |
| - /* |
| - * __split_huge_page_refcount() cannot run |
| - * from under us. |
| - */ |
| - VM_BUG_ON(page_mapcount(page) < 0); |
| - VM_BUG_ON(atomic_read(&page->_count) != 0); |
| - atomic_inc(&page->_mapcount); |
| -} |
| - |
| static noinline int gup_hugepte(pte_t *ptep, unsigned long sz, unsigned long addr, |
| unsigned long end, int write, struct page **pages, int *nr) |
| { |
| --- a/arch/s390/mm/gup.c |
| +++ b/arch/s390/mm/gup.c |
| @@ -48,17 +48,6 @@ static inline int gup_pte_range(pmd_t *p |
| return 1; |
| } |
| |
| -static inline void get_huge_page_tail(struct page *page) |
| -{ |
| - /* |
| - * __split_huge_page_refcount() cannot run |
| - * from under us. |
| - */ |
| - VM_BUG_ON(page_mapcount(page) < 0); |
| - VM_BUG_ON(atomic_read(&page->_count) != 0); |
| - atomic_inc(&page->_mapcount); |
| -} |
| - |
| static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, |
| unsigned long end, int write, struct page **pages, int *nr) |
| { |
| --- a/arch/sparc/mm/gup.c |
| +++ b/arch/sparc/mm/gup.c |
| @@ -12,17 +12,6 @@ |
| #include <linux/rwsem.h> |
| #include <asm/pgtable.h> |
| |
| -static inline void get_huge_page_tail(struct page *page) |
| -{ |
| - /* |
| - * __split_huge_page_refcount() cannot run |
| - * from under us. |
| - */ |
| - VM_BUG_ON(page_mapcount(page) < 0); |
| - VM_BUG_ON(atomic_read(&page->_count) != 0); |
| - atomic_inc(&page->_mapcount); |
| -} |
| - |
| /* |
| * The performance critical leaf functions are made noinline otherwise gcc |
| * inlines everything into a single function which results in too much |
| --- a/arch/x86/mm/gup.c |
| +++ b/arch/x86/mm/gup.c |
| @@ -108,17 +108,6 @@ static inline void get_head_page_multipl |
| SetPageReferenced(page); |
| } |
| |
| -static inline void get_huge_page_tail(struct page *page) |
| -{ |
| - /* |
| - * __split_huge_page_refcount() cannot run |
| - * from under us. |
| - */ |
| - VM_BUG_ON(page_mapcount(page) < 0); |
| - VM_BUG_ON(atomic_read(&page->_count) != 0); |
| - atomic_inc(&page->_mapcount); |
| -} |
| - |
| static noinline int gup_huge_pmd(pmd_t pmd, unsigned long addr, |
| unsigned long end, int write, struct page **pages, int *nr) |
| { |
| --- a/include/linux/mm.h |
| +++ b/include/linux/mm.h |
| @@ -376,6 +376,17 @@ static inline int page_count(struct page |
| return atomic_read(&compound_head(page)->_count); |
| } |
| |
| +static inline void get_huge_page_tail(struct page *page) |
| +{ |
| + /* |
| + * __split_huge_page_refcount() cannot run |
| + * from under us. |
| + */ |
| + VM_BUG_ON(page_mapcount(page) < 0); |
| + VM_BUG_ON(atomic_read(&page->_count) != 0); |
| + atomic_inc(&page->_mapcount); |
| +} |
| + |
| extern bool __get_page_tail(struct page *page); |
| |
| static inline void get_page(struct page *page) |