From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: Andrew Morton <akpm@linux-foundation.org>, Andrea Arcangeli <aarcange@redhat.com>, Hugh Dickins <hughd@google.com> Cc: Dave Hansen <dave.hansen@intel.com>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Vlastimil Babka <vbabka@suse.cz>, Christoph Lameter <cl@gentwo.org>, Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>, Steve Capper <steve.capper@linaro.org>, "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>, Johannes Weiner <hannes@cmpxchg.org>, Michal Hocko <mhocko@suse.cz>, Jerome Marchand <jmarchan@redhat.com>, Sasha Levin <sasha.levin@oracle.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Subject: [PATCHv10 14/36] futex, thp: remove special case for THP in get_futex_key Date: Thu, 3 Sep 2015 18:13:00 +0300 [thread overview] Message-ID: <1441293202-137314-15-git-send-email-kirill.shutemov@linux.intel.com> (raw) In-Reply-To: <1441293202-137314-1-git-send-email-kirill.shutemov@linux.intel.com> With new THP refcounting, we don't need tricks to stabilize huge page. If we've got reference to tail page, it can't split under us. This patch effectively reverts a5b338f2b0b1. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Tested-by: Sasha Levin <sasha.levin@oracle.com> Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Jerome Marchand <jmarchan@redhat.com> --- kernel/futex.c | 61 ++++++++++++---------------------------------------------- 1 file changed, 12 insertions(+), 49 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index c4a182f5357e..f9d46c3d9be9 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -399,7 +399,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; - struct page *page, *page_head; + struct page *page; int err, ro = 0; /* @@ -442,46 +442,9 @@ again: else err = 0; -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - page_head = page; - if (unlikely(PageTail(page))) { - put_page(page); - /* serialize against __split_huge_page_splitting() */ - local_irq_disable(); - if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) { - page_head = compound_head(page); - /* - * page_head is valid pointer but we must pin - * it before taking the PG_lock and/or - * PG_compound_lock. The moment we re-enable - * irqs __split_huge_page_splitting() can - * return and the head page can be freed from - * under us. We can't take the PG_lock and/or - * PG_compound_lock on a page that could be - * freed from under us. - */ - if (page != page_head) { - get_page(page_head); - put_page(page); - } - local_irq_enable(); - } else { - local_irq_enable(); - goto again; - } - } -#else - page_head = compound_head(page); - if (page != page_head) { - get_page(page_head); - put_page(page); - } -#endif - - lock_page(page_head); - + lock_page(page); /* - * If page_head->mapping is NULL, then it cannot be a PageAnon + * If page->mapping is NULL, then it cannot be a PageAnon * page; but it might be the ZERO_PAGE or in the gate area or * in a special mapping (all cases which we are happy to fail); * or it may have been a good file page when get_user_pages_fast @@ -493,12 +456,12 @@ again: * * The case we do have to guard against is when memory pressure made * shmem_writepage move it from filecache to swapcache beneath us: - * an unlikely race, but we do need to retry for page_head->mapping. + * an unlikely race, but we do need to retry for page->mapping. */ - if (!page_head->mapping) { - int shmem_swizzled = PageSwapCache(page_head); - unlock_page(page_head); - put_page(page_head); + if (!page->mapping) { + int shmem_swizzled = PageSwapCache(page); + unlock_page(page); + put_page(page); if (shmem_swizzled) goto again; return -EFAULT; @@ -511,7 +474,7 @@ again: * it's a read-only handle, it's expected that futexes attach to * the object not the particular process. */ - if (PageAnon(page_head)) { + if (PageAnon(page)) { /* * A RO anonymous page will never change and thus doesn't make * sense for futex operations. @@ -526,15 +489,15 @@ again: key->private.address = address; } else { key->both.offset |= FUT_OFF_INODE; /* inode-based key */ - key->shared.inode = page_head->mapping->host; + key->shared.inode = page->mapping->host; key->shared.pgoff = basepage_index(page); } get_futex_key_refs(key); /* implies MB (B) */ out: - unlock_page(page_head); - put_page(page_head); + unlock_page(page); + put_page(page); return err; } -- 2.5.0
WARNING: multiple messages have this Message-ID (diff)
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> To: Andrew Morton <akpm@linux-foundation.org>, Andrea Arcangeli <aarcange@redhat.com>, Hugh Dickins <hughd@google.com> Cc: Dave Hansen <dave.hansen@intel.com>, Mel Gorman <mgorman@suse.de>, Rik van Riel <riel@redhat.com>, Vlastimil Babka <vbabka@suse.cz>, Christoph Lameter <cl@gentwo.org>, Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>, Steve Capper <steve.capper@linaro.org>, "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>, Johannes Weiner <hannes@cmpxchg.org>, Michal Hocko <mhocko@suse.cz>, Jerome Marchand <jmarchan@redhat.com>, Sasha Levin <sasha.levin@oracle.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org, "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Subject: [PATCHv10 14/36] futex, thp: remove special case for THP in get_futex_key Date: Thu, 3 Sep 2015 18:13:00 +0300 [thread overview] Message-ID: <1441293202-137314-15-git-send-email-kirill.shutemov@linux.intel.com> (raw) In-Reply-To: <1441293202-137314-1-git-send-email-kirill.shutemov@linux.intel.com> With new THP refcounting, we don't need tricks to stabilize huge page. If we've got reference to tail page, it can't split under us. This patch effectively reverts a5b338f2b0b1. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Tested-by: Sasha Levin <sasha.levin@oracle.com> Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Acked-by: Jerome Marchand <jmarchan@redhat.com> --- kernel/futex.c | 61 ++++++++++++---------------------------------------------- 1 file changed, 12 insertions(+), 49 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index c4a182f5357e..f9d46c3d9be9 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -399,7 +399,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; - struct page *page, *page_head; + struct page *page; int err, ro = 0; /* @@ -442,46 +442,9 @@ again: else err = 0; -#ifdef CONFIG_TRANSPARENT_HUGEPAGE - page_head = page; - if (unlikely(PageTail(page))) { - put_page(page); - /* serialize against __split_huge_page_splitting() */ - local_irq_disable(); - if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) { - page_head = compound_head(page); - /* - * page_head is valid pointer but we must pin - * it before taking the PG_lock and/or - * PG_compound_lock. The moment we re-enable - * irqs __split_huge_page_splitting() can - * return and the head page can be freed from - * under us. We can't take the PG_lock and/or - * PG_compound_lock on a page that could be - * freed from under us. - */ - if (page != page_head) { - get_page(page_head); - put_page(page); - } - local_irq_enable(); - } else { - local_irq_enable(); - goto again; - } - } -#else - page_head = compound_head(page); - if (page != page_head) { - get_page(page_head); - put_page(page); - } -#endif - - lock_page(page_head); - + lock_page(page); /* - * If page_head->mapping is NULL, then it cannot be a PageAnon + * If page->mapping is NULL, then it cannot be a PageAnon * page; but it might be the ZERO_PAGE or in the gate area or * in a special mapping (all cases which we are happy to fail); * or it may have been a good file page when get_user_pages_fast @@ -493,12 +456,12 @@ again: * * The case we do have to guard against is when memory pressure made * shmem_writepage move it from filecache to swapcache beneath us: - * an unlikely race, but we do need to retry for page_head->mapping. + * an unlikely race, but we do need to retry for page->mapping. */ - if (!page_head->mapping) { - int shmem_swizzled = PageSwapCache(page_head); - unlock_page(page_head); - put_page(page_head); + if (!page->mapping) { + int shmem_swizzled = PageSwapCache(page); + unlock_page(page); + put_page(page); if (shmem_swizzled) goto again; return -EFAULT; @@ -511,7 +474,7 @@ again: * it's a read-only handle, it's expected that futexes attach to * the object not the particular process. */ - if (PageAnon(page_head)) { + if (PageAnon(page)) { /* * A RO anonymous page will never change and thus doesn't make * sense for futex operations. @@ -526,15 +489,15 @@ again: key->private.address = address; } else { key->both.offset |= FUT_OFF_INODE; /* inode-based key */ - key->shared.inode = page_head->mapping->host; + key->shared.inode = page->mapping->host; key->shared.pgoff = basepage_index(page); } get_futex_key_refs(key); /* implies MB (B) */ out: - unlock_page(page_head); - put_page(page_head); + unlock_page(page); + put_page(page); return err; } -- 2.5.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2015-09-03 15:15 UTC|newest] Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-09-03 15:12 [PATCHv10 00/36] THP refcounting redesign Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 01/36] mm, proc: adjust PSS calculation Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 02/36] rmap: add argument to charge compound page Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 03/36] memcg: adjust to support new THP refcounting Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 04/36] mm, thp: adjust conditions when we can reuse the page on WP fault Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 05/36] mm: adjust FOLL_SPLIT for new refcounting Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 06/36] mm: handle PTE-mapped tail pages in gerneric fast gup implementaiton Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 07/36] thp, mlock: do not allow huge pages in mlocked area Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 08/36] khugepaged: ignore pmd tables with THP mapped with ptes Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 09/36] thp: rename split_huge_page_pmd() to split_huge_pmd() Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 10/36] mm, vmstats: new THP splitting event Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 11/36] mm: temporally mark THP broken Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 12/36] thp: drop all split_huge_page()-related code Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:12 ` [PATCHv10 13/36] mm: drop tail page refcounting Kirill A. Shutemov 2015-09-03 15:12 ` Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov [this message] 2015-09-03 15:13 ` [PATCHv10 14/36] futex, thp: remove special case for THP in get_futex_key Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 15/36] ksm: prepare to new THP semantics Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 16/36] mm, thp: remove compound_lock Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 17/36] arm64, thp: remove infrastructure for handling splitting PMDs Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 18/36] arm, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 19/36] mips, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 20/36] powerpc, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 21/36] s390, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 22/36] sparc, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 23/36] tile, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 24/36] x86, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 25/36] mm, " Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 26/36] mm: rework mapcount accounting to enable 4k mapping of THPs Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 27/36] mm: differentiate page_mapped() from page_mapcount() for compound pages Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 28/36] mm, numa: skip PTE-mapped THP on numa fault Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 29/36] thp: implement split_huge_pmd() Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 30/36] thp: add option to setup migration entries during PMD split Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 31/36] thp, mm: split_huge_page(): caller need to lock page Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 32/36] thp: reintroduce split_huge_page() Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 33/36] migrate_pages: try to split pages on qeueuing Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 34/36] thp: introduce deferred_split_huge_page() Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 35/36] mm: re-enable THP Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:13 ` [PATCHv10 36/36] thp: update documentation Kirill A. Shutemov 2015-09-03 15:13 ` Kirill A. Shutemov 2015-09-03 15:16 ` [PATCHv10 37/36, RFC] thp: allow mlocked THP again Kirill A. Shutemov 2015-09-03 15:16 ` Kirill A. Shutemov 2015-09-11 13:22 ` Vlastimil Babka 2015-09-11 13:22 ` Vlastimil Babka 2015-09-14 11:05 ` Kirill A. Shutemov 2015-09-14 11:05 ` Kirill A. Shutemov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1441293202-137314-15-git-send-email-kirill.shutemov@linux.intel.com \ --to=kirill.shutemov@linux.intel.com \ --cc=aarcange@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=aneesh.kumar@linux.vnet.ibm.com \ --cc=cl@gentwo.org \ --cc=dave.hansen@intel.com \ --cc=hannes@cmpxchg.org \ --cc=hughd@google.com \ --cc=jmarchan@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mgorman@suse.de \ --cc=mhocko@suse.cz \ --cc=n-horiguchi@ah.jp.nec.com \ --cc=riel@redhat.com \ --cc=sasha.levin@oracle.com \ --cc=steve.capper@linaro.org \ --cc=vbabka@suse.cz \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.