From: Bin Yang <bin.yang@intel.com>
To: tglx@linutronix.de, mingo@kernel.org, hpa@zytor.com,
x86@kernel.org, linux-kernel@vger.kernel.org,
peterz@infradead.org, dave.hansen@intel.com,
mark.gross@intel.com, bin.yang@intel.com
Subject: [PATCH v3 2/5] x86/mm: avoid static_protection() checking if not whole large page attr change
Date: Tue, 21 Aug 2018 01:16:23 +0000 [thread overview]
Message-ID: <1534814186-37067-3-git-send-email-bin.yang@intel.com> (raw)
In-Reply-To: <1534814186-37067-1-git-send-email-bin.yang@intel.com>
The range check whether the address is aligned to the large page and
covers the full large page (1G or 2M) is obvious to do _before_
static_protection() check, because if the requested range does not fit
and has a different pgprot_val() then it will decide to split after the
check anyway.
The approach and some of the comments came from Thomas Gleixner's
email example for how to do this
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Bin Yang <bin.yang@intel.com>
---
arch/x86/mm/pageattr.c | 35 ++++++++++++++++-------------------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 68613fd..091f1d3 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -645,11 +645,21 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
}
/*
+ * If the requested address range is not aligned to the start of
+ * the large page or does not cover the full range, split it up.
+ * No matter what the static_protections() check below does, it
+ * would anyway result in a split after doing all the check work
+ * for nothing.
+ */
+ addr = address & pmask;
+ if (address != addr || cpa->numpages != numpages)
+ goto out_unlock;
+
+ /*
* We need to check the full range, whether
* static_protection() requires a different pgprot for one of
* the pages in the range we try to preserve:
*/
- addr = address & pmask;
pfn = old_pfn;
for (i = 0; i < (psize >> PAGE_SHIFT); i++, addr += PAGE_SIZE, pfn++) {
pgprot_t chk_prot = static_protections(req_prot, addr, pfn);
@@ -659,24 +669,11 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
}
- /*
- * We need to change the attributes. Check, whether we can
- * change the large page in one go. We request a split, when
- * the address is not aligned and the number of pages is
- * smaller than the number of pages in the large page. Note
- * that we limited the number of possible pages already to
- * the number of pages in the large page.
- */
- if (address == (address & pmask) && cpa->numpages == (psize >> PAGE_SHIFT)) {
- /*
- * The address is aligned and the number of pages
- * covers the full page.
- */
- new_pte = pfn_pte(old_pfn, new_prot);
- __set_pmd_pte(kpte, address, new_pte);
- cpa->flags |= CPA_FLUSHTLB;
- do_split = 0;
- }
+ /* All checks passed. Just change the large mapping entry */
+ new_pte = pfn_pte(old_pfn, new_prot);
+ __set_pmd_pte(kpte, address, new_pte);
+ cpa->flags |= CPA_FLUSHTLB;
+ do_split = 0;
out_unlock:
spin_unlock(&pgd_lock);
--
2.7.4
next prev parent reply other threads:[~2018-08-21 1:16 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-21 1:16 [PATCH v3 0/5] x86/mm: fix cpu stuck issue in __change_page_attr_set_clr Bin Yang
2018-08-21 1:16 ` [PATCH v3 1/5] x86/mm: avoid redundant checking if pgprot has no change Bin Yang
2018-09-03 21:57 ` Thomas Gleixner
2018-09-04 7:01 ` Yang, Bin
2018-09-04 7:49 ` Thomas Gleixner
2018-09-04 9:12 ` Yang, Bin
2018-09-04 9:22 ` Yang, Bin
2018-08-21 1:16 ` Bin Yang [this message]
2018-08-21 1:16 ` [PATCH v3 3/5] x86/mm: add help function to check specific protection flags in range Bin Yang
2018-09-03 22:10 ` Thomas Gleixner
2018-09-04 6:22 ` Yang, Bin
2018-08-21 1:16 ` [PATCH v3 4/5] x86/mm: optimize static_protection() by using overlap() Bin Yang
2018-09-04 12:22 ` Thomas Gleixner
2018-09-07 1:14 ` Yang, Bin
2018-09-07 7:49 ` Thomas Gleixner
2018-09-07 8:04 ` Yang, Bin
2018-09-07 8:21 ` Thomas Gleixner
2018-09-07 8:26 ` Yang, Bin
2018-08-21 1:16 ` [PATCH v3 5/5] x86/mm: add WARN_ON_ONCE() for wrong large page mapping Bin Yang
2018-09-03 22:27 ` Thomas Gleixner
2018-09-04 6:32 ` Yang, Bin
2018-09-04 7:41 ` Thomas Gleixner
2018-09-04 16:52 ` Thomas Gleixner
2018-09-07 2:12 ` Yang, Bin
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=1534814186-37067-3-git-send-email-bin.yang@intel.com \
--to=bin.yang@intel.com \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.gross@intel.com \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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.