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 3/5] x86/mm: add help function to check specific protection flags in range
Date: Tue, 21 Aug 2018 01:16:24 +0000 [thread overview]
Message-ID: <1534814186-37067-4-git-send-email-bin.yang@intel.com> (raw)
In-Reply-To: <1534814186-37067-1-git-send-email-bin.yang@intel.com>
Introduce the needs_static_protections() helper to check specific
protection flags in range. It calls static_protection() to check
whether any part of the address/len range is forced to change from 'prot'.
Suggested-by: Dave Hansen <dave.hansen@intel.com>
Signed-off-by: Bin Yang <bin.yang@intel.com>
---
arch/x86/mm/pageattr.c | 36 +++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 091f1d3..f630eb4 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -367,6 +367,30 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
}
/*
+ * static_protections() "forces" page protections for some address
+ * ranges. Return true if any part of the address/len range is forced
+ * to change from 'prot'.
+ */
+static inline bool
+needs_static_protections(pgprot_t prot, unsigned long address,
+ unsigned long len, unsigned long pfn)
+{
+ int i;
+
+ address &= PAGE_MASK;
+ len = PFN_ALIGN(len);
+ for (i = 0; i < (len >> PAGE_SHIFT); i++, address += PAGE_SIZE, pfn++) {
+ pgprot_t chk_prot = static_protections(prot, address, pfn);
+
+ if (pgprot_val(chk_prot) != pgprot_val(prot))
+ return true;
+ }
+
+ /* Does static_protections() demand a change ? */
+ return false;
+}
+
+/*
* Lookup the page table entry for a virtual address in a specific pgd.
* Return a pointer to the entry and the level of the mapping.
*/
@@ -556,7 +580,7 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
unsigned long nextpage_addr, numpages, pmask, psize, addr, pfn, old_pfn;
pte_t new_pte, old_pte, *tmp;
pgprot_t old_prot, new_prot, req_prot;
- int i, do_split = 1;
+ int do_split = 1;
enum pg_level level;
if (cpa->force_split)
@@ -660,14 +684,8 @@ try_preserve_large_page(pte_t *kpte, unsigned long address,
* static_protection() requires a different pgprot for one of
* the pages in the range we try to preserve:
*/
- 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);
-
- if (pgprot_val(chk_prot) != pgprot_val(new_prot))
- goto out_unlock;
- }
-
+ if (needs_static_protections(new_prot, addr, psize, old_pfn))
+ goto out_unlock;
/* All checks passed. Just change the large mapping entry */
new_pte = pfn_pte(old_pfn, new_prot);
--
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 ` [PATCH v3 2/5] x86/mm: avoid static_protection() checking if not whole large page attr change Bin Yang
2018-08-21 1:16 ` Bin Yang [this message]
2018-09-03 22:10 ` [PATCH v3 3/5] x86/mm: add help function to check specific protection flags in range 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-4-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.