| From bc1f8e1407d1ffaa714066621f187180b4eddd20 Mon Sep 17 00:00:00 2001 |
| From: David Miller <davem@davemloft.net> |
| Date: Wed, 2 Oct 2013 14:25:09 -0400 |
| Subject: mm: Fix generic hugetlb pte check return type. |
| |
| From: David Miller <davem@davemloft.net> |
| |
| [ Upstream commit 26794942461f438a6bc725ec7294b08a6bd782c4 ] |
| |
| The include/asm-generic/hugetlb.h stubs that just vector huge_pte_*() |
| calls to the pte_*() implementations won't work in certain situations. |
| |
| x86 and sparc, for example, return "unsigned long" from the bit |
| checks, and just go "return pte_val(pte) & PTE_BIT_FOO;" |
| |
| But since huge_pte_*() returns 'int', if any high bits on 64-bit are |
| relevant, they get chopped off. |
| |
| The net effect is that we can loop forever trying to COW a huge page, |
| because the huge_pte_write() check signals false all the time. |
| |
| Reported-by: Gurudas Pai <gurudas.pai@oracle.com> |
| Tested-by: Gurudas Pai <gurudas.pai@oracle.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Acked-by: David Rientjes <rientjes@google.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/asm-generic/hugetlb.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/include/asm-generic/hugetlb.h |
| +++ b/include/asm-generic/hugetlb.h |
| @@ -6,12 +6,12 @@ static inline pte_t mk_huge_pte(struct p |
| return mk_pte(page, pgprot); |
| } |
| |
| -static inline int huge_pte_write(pte_t pte) |
| +static inline unsigned long huge_pte_write(pte_t pte) |
| { |
| return pte_write(pte); |
| } |
| |
| -static inline int huge_pte_dirty(pte_t pte) |
| +static inline unsigned long huge_pte_dirty(pte_t pte) |
| { |
| return pte_dirty(pte); |
| } |