All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Rothwell <sfr@canb.auug.org.au>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-next@vger.kernel.org, linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Gerald Schaefer <gerald.schaefer@de.ibm.com>
Subject: linux-next: manual merge of the akpm tree with the tip tree
Date: Thu, 27 Sep 2012 17:10:46 +1000	[thread overview]
Message-ID: <20120927171046.315e74c236e28c40e37e1553@canb.auug.org.au> (raw)

[-- Attachment #1: Type: text/plain, Size: 4947 bytes --]

Hi Andrew,

Today's linux-next merge of the akpm tree got a conflict in
mm/huge_memory.c between commit 93c9d633bd9e ("mm/thp: Preserve pgprot
across huge page split") from the tip tree and commit  ("thp: remove
assumptions on pgtable_t type") from the akpm tree.

I fixed it up (see below) and can carry the fix as necessary (no action
is required).

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au

diff --cc mm/huge_memory.c
index 6b176fe,a91bc3c..0000000
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@@ -1416,55 -1312,60 +1384,55 @@@ static int __split_huge_page_map(struc
  	spin_lock(&mm->page_table_lock);
  	pmd = page_check_address_pmd(page, mm, address,
  				     PAGE_CHECK_ADDRESS_PMD_SPLITTING_FLAG);
 -	if (pmd) {
 -		pgtable = pgtable_trans_huge_withdraw(mm);
 -		pmd_populate(mm, &_pmd, pgtable);
 -
 -		for (i = 0, haddr = address; i < HPAGE_PMD_NR;
 -		     i++, haddr += PAGE_SIZE) {
 -			pte_t *pte, entry;
 -			BUG_ON(PageCompound(page+i));
 -			entry = mk_pte(page + i, vma->vm_page_prot);
 -			entry = maybe_mkwrite(pte_mkdirty(entry), vma);
 -			if (!pmd_write(*pmd))
 -				entry = pte_wrprotect(entry);
 -			else
 -				BUG_ON(page_mapcount(page) != 1);
 -			if (!pmd_young(*pmd))
 -				entry = pte_mkold(entry);
 -			pte = pte_offset_map(&_pmd, haddr);
 -			BUG_ON(!pte_none(*pte));
 -			set_pte_at(mm, haddr, pte, entry);
 -			pte_unmap(pte);
 -		}
 +	if (!pmd)
 +		goto unlock;
  
 -		smp_wmb(); /* make pte visible before pmd */
 -		/*
 -		 * Up to this point the pmd is present and huge and
 -		 * userland has the whole access to the hugepage
 -		 * during the split (which happens in place). If we
 -		 * overwrite the pmd with the not-huge version
 -		 * pointing to the pte here (which of course we could
 -		 * if all CPUs were bug free), userland could trigger
 -		 * a small page size TLB miss on the small sized TLB
 -		 * while the hugepage TLB entry is still established
 -		 * in the huge TLB. Some CPU doesn't like that. See
 -		 * http://support.amd.com/us/Processor_TechDocs/41322.pdf,
 -		 * Erratum 383 on page 93. Intel should be safe but is
 -		 * also warns that it's only safe if the permission
 -		 * and cache attributes of the two entries loaded in
 -		 * the two TLB is identical (which should be the case
 -		 * here). But it is generally safer to never allow
 -		 * small and huge TLB entries for the same virtual
 -		 * address to be loaded simultaneously. So instead of
 -		 * doing "pmd_populate(); flush_tlb_range();" we first
 -		 * mark the current pmd notpresent (atomically because
 -		 * here the pmd_trans_huge and pmd_trans_splitting
 -		 * must remain set at all times on the pmd until the
 -		 * split is complete for this pmd), then we flush the
 -		 * SMP TLB and finally we write the non-huge version
 -		 * of the pmd entry with pmd_populate.
 -		 */
 -		set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd));
 -		flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
 -		pmd_populate(mm, pmd, pgtable);
 -		ret = 1;
 +	prot = pmd_pgprot(*pmd);
- 	pgtable = get_pmd_huge_pte(mm);
++	pgtable = pgtable_trans_huge_withdraw(mm);
 +	pmd_populate(mm, &_pmd, pgtable);
 +
 +	for (i = 0, haddr = address; i < HPAGE_PMD_NR; i++, haddr += PAGE_SIZE) {
 +		pte_t *pte, entry;
 +
 +		BUG_ON(PageCompound(page+i));
 +		entry = mk_pte(page + i, prot);
 +		entry = pte_mkdirty(entry);
 +		if (!pmd_young(*pmd))
 +			entry = pte_mkold(entry);
 +		pte = pte_offset_map(&_pmd, haddr);
 +		BUG_ON(!pte_none(*pte));
 +		set_pte_at(mm, haddr, pte, entry);
 +		pte_unmap(pte);
  	}
 +
 +	smp_wmb(); /* make ptes visible before pmd, see __pte_alloc */
 +	/*
 +	 * Up to this point the pmd is present and huge.
 +	 *
 +	 * If we overwrite the pmd with the not-huge version, we could trigger
 +	 * a small page size TLB miss on the small sized TLB while the hugepage
 +	 * TLB entry is still established in the huge TLB.
 +	 *
 +	 * Some CPUs don't like that. See
 +	 * http://support.amd.com/us/Processor_TechDocs/41322.pdf, Erratum 383
 +	 * on page 93.
 +	 *
 +	 * Thus it is generally safer to never allow small and huge TLB entries
 +	 * for overlapping virtual addresses to be loaded. So we first mark the
 +	 * current pmd not present, then we flush the TLB and finally we write
 +	 * the non-huge version of the pmd entry with pmd_populate.
 +	 *
 +	 * The above needs to be done under the ptl because pmd_trans_huge and
 +	 * pmd_trans_splitting must remain set on the pmd until the split is
 +	 * complete. The ptl also protects against concurrent faults due to
 +	 * making the pmd not-present.
 +	 */
 +	set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd));
 +	flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
 +	pmd_populate(mm, pmd, pgtable);
 +	ret = 1;
 +
 +unlock:
  	spin_unlock(&mm->page_table_lock);
  
  	return ret;

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

             reply	other threads:[~2012-09-27  7:10 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-27  7:10 Stephen Rothwell [this message]
  -- strict thread matches above, loose matches on Subject: below --
2020-05-29 10:57 linux-next: manual merge of the akpm tree with the tip tree Stephen Rothwell
2020-05-29 10:49 Stephen Rothwell
2020-01-22  6:37 Stephen Rothwell
2019-02-13  6:49 Stephen Rothwell
2019-02-13 19:59 ` Andrew Morton
2018-01-09  5:02 Stephen Rothwell
2018-01-09 10:36 ` Andy Shevchenko
2017-10-16 18:48 Mark Brown
2017-10-16 20:01 ` Mark Brown
2017-04-12  7:08 Stephen Rothwell
2017-03-31  5:44 Stephen Rothwell
2017-03-31  6:42 ` Peter Zijlstra
2017-03-31 13:54   ` Andi Kleen
2017-03-31 14:45     ` Peter Zijlstra
2017-03-31 16:02       ` Andi Kleen
2017-03-31 17:48         ` Peter Zijlstra
2017-03-24  5:40 Stephen Rothwell
2017-03-24  8:05 ` Peter Zijlstra
2016-03-10  5:28 Stephen Rothwell
2016-03-10  8:00 ` Ingo Molnar
2016-03-10  8:00   ` Ingo Molnar
2016-03-10 20:38   ` Andrew Morton
2016-02-09  4:50 Stephen Rothwell
2016-02-09 14:04 ` Matt Fleming
2016-02-09 14:07   ` Ingo Molnar
2015-06-09 14:12 Stephen Rothwell
2015-04-08  8:49 Stephen Rothwell
2015-04-08 15:13 ` Ingo Molnar
2015-04-08 20:46   ` Andrew Morton
2015-04-08 21:57   ` Stephen Rothwell
2014-03-21  6:45 Stephen Rothwell
2014-01-13  6:17 Stephen Rothwell
2013-04-23  7:17 Stephen Rothwell
2013-02-14  4:33 Stephen Rothwell
2013-02-14  4:25 Stephen Rothwell
2013-02-14  4:34 ` H. Peter Anvin
2013-02-04  7:00 Stephen Rothwell
2013-01-28 12:29 Stephen Rothwell
2012-12-10  8:29 Stephen Rothwell
2012-12-10 10:46 ` Ingo Molnar
2012-12-10  8:25 Stephen Rothwell
2012-12-10  8:20 Stephen Rothwell
2012-12-10  8:11 Stephen Rothwell
2012-12-10  8:01 Stephen Rothwell
2012-12-10 11:13 ` Will Deacon
2012-12-10  7:47 Stephen Rothwell
2012-11-15  6:32 Stephen Rothwell
2012-10-01 14:22 Stephen Rothwell
2012-09-27  7:15 Stephen Rothwell
2012-09-27  7:04 Stephen Rothwell
2012-09-27  6:57 Stephen Rothwell
2012-09-27  6:49 Stephen Rothwell
2012-07-27  3:50 Stephen Rothwell
2012-07-25  4:08 Stephen Rothwell
2012-07-25  7:10 ` Ingo Molnar
2012-07-25  7:35   ` Johannes Weiner
2012-07-25 18:57     ` Andrew Morton
2012-07-25 19:03       ` Ingo Molnar
2012-07-25 19:26         ` Andrew Morton
2012-07-26  7:51           ` Ingo Molnar
2012-07-26 18:05           ` Andrew Morton
2012-07-25 19:20       ` Johannes Weiner
2012-07-26  7:03     ` Stephen Rothwell
2012-05-21  8:29 Stephen Rothwell
2012-05-21  8:04 Stephen Rothwell
2012-05-21  7:59 Stephen Rothwell
2012-03-27  4:57 Stephen Rothwell
2012-03-26  4:01 Stephen Rothwell
2012-03-26  5:20 ` Alex Shi
2012-03-08  6:32 Stephen Rothwell
2012-03-08  6:28 Stephen Rothwell
2012-02-29  6:27 Stephen Rothwell
2012-02-28  4:52 Stephen Rothwell
2012-02-27  5:53 Stephen Rothwell
2012-02-27  5:57 ` Cyrill Gorcunov
2012-02-27  6:02   ` H. Peter Anvin
2012-02-27  6:05     ` Cyrill Gorcunov
2012-02-27  6:01 ` H. Peter Anvin
2012-02-27  6:19   ` Stephen Rothwell
2012-02-27  5:44 Stephen Rothwell
2012-02-27  5:33 Stephen Rothwell
2012-02-27  5:23 Stephen Rothwell
2012-02-27  5:16 Stephen Rothwell
2011-12-06  4:04 Stephen Rothwell
2011-09-27  7:13 Stephen Rothwell

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=20120927171046.315e74c236e28c40e37e1553@canb.auug.org.au \
    --to=sfr@canb.auug.org.au \
    --cc=akpm@linux-foundation.org \
    --cc=gerald.schaefer@de.ibm.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    /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: link
Be 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.