From: Dave Hansen <dave@sr71.net>
To: dave@sr71.net
Cc: borntraeger@de.ibm.com, x86@kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
dave.hansen@linux.intel.com
Subject: [PATCH 16/25] x86, pkeys: optimize fault handling in access_error()
Date: Mon, 28 Sep 2015 12:18:23 -0700 [thread overview]
Message-ID: <20150928191823.2563873B@viggo.jf.intel.com> (raw)
In-Reply-To: <20150928191817.035A64E2@viggo.jf.intel.com>
From: Dave Hansen <dave.hansen@linux.intel.com>
We might not strictly have to make modifictions to
access_error() to check the VMA here.
If we do not, we will do this:
1. app sets VMA pkey to K
2. app touches a !present page
3. do_page_fault(), allocates and maps page, sets pte.pkey=K
4. return to userspace
5. touch instruction reexecutes, but triggers PF_PK
6. do PKEY signal
What happens with this patch applied:
1. app sets VMA pkey to K
2. app touches a !present page
3. do_page_fault() notices that K is inaccessible
4. do PKEY signal
We basically skip the fault that does an allocation.
So what this lets us do is protect areas from even being
*populated* unless it is accessible according to protection
keys. That seems handy to me and makes protection keys work
more like an mprotect()'d mapping.
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
---
b/arch/x86/mm/fault.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff -puN arch/x86/mm/fault.c~pkeys-15-access_error arch/x86/mm/fault.c
--- a/arch/x86/mm/fault.c~pkeys-15-access_error 2015-09-28 11:39:48.287289263 -0700
+++ b/arch/x86/mm/fault.c 2015-09-28 11:39:48.290289400 -0700
@@ -904,6 +904,9 @@ static inline bool bad_area_access_from_
return false;
if (error_code & PF_PK)
return true;
+ /* this checks permission keys on the VMA: */
+ if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE)))
+ return true;
return false;
}
@@ -1091,6 +1094,13 @@ access_error(unsigned long error_code, s
*/
if (error_code & PF_PK)
return 1;
+ /*
+ * Make sure to check the VMA so that we do not perform
+ * faults just to hit a PF_PK as soon as we fill in a
+ * page.
+ */
+ if (!arch_vma_access_permitted(vma, (error_code & PF_WRITE)))
+ return 1;
if (error_code & PF_WRITE) {
/* write, present and write, not present: */
_
next prev parent reply other threads:[~2015-09-28 19:18 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-28 19:18 [PATCH 00/25] x86: Memory Protection Keys Dave Hansen
2015-09-28 19:18 ` [PATCH 02/25] x86, pkeys: Add Kconfig option Dave Hansen
2015-10-01 11:02 ` Thomas Gleixner
2015-09-28 19:18 ` [PATCH 03/25] x86, pkeys: cpuid bit definition Dave Hansen
2015-10-01 11:02 ` Thomas Gleixner
2015-09-28 19:18 ` [PATCH 01/25] x86, fpu: add placeholder for Processor Trace XSAVE state Dave Hansen
2015-10-01 11:01 ` Thomas Gleixner
2015-09-28 19:18 ` [PATCH 06/25] x86, pkeys: PTE bits for storing protection key Dave Hansen
2015-10-01 11:51 ` Thomas Gleixner
2015-09-28 19:18 ` [PATCH 05/25] x86, pkey: add PKRU xsave fields and data structure(s) Dave Hansen
2015-10-01 11:50 ` Thomas Gleixner
2015-10-01 17:17 ` Dave Hansen
2015-09-28 19:18 ` [PATCH 04/25] x86, pku: define new CR4 bit Dave Hansen
2015-10-01 11:03 ` Thomas Gleixner
2015-09-28 19:18 ` [PATCH 07/25] x86, pkeys: new page fault error code bit: PF_PK Dave Hansen
2015-10-01 11:54 ` Thomas Gleixner
2015-10-01 17:19 ` Dave Hansen
2015-09-28 19:18 ` [PATCH 08/25] x86, pkeys: store protection in high VMA flags Dave Hansen
2015-09-28 19:18 ` [PATCH 09/25] x86, pkeys: arch-specific protection bits Dave Hansen
2015-09-28 19:18 ` [PATCH 10/25] x86, pkeys: pass VMA down in to fault signal generation code Dave Hansen
2015-09-28 19:18 ` [PATCH 13/25] mm: factor out VMA fault permission checking Dave Hansen
2015-09-28 19:18 ` [PATCH 11/25] x86, pkeys: notify userspace about protection key faults Dave Hansen
2015-09-28 19:18 ` [PATCH 12/25] x86, pkeys: add functions to fetch PKRU Dave Hansen
2015-09-28 19:18 ` [PATCH 15/25] x86, pkeys: check VMAs and PTEs for protection keys Dave Hansen
2015-10-22 20:57 ` Jerome Glisse
2015-10-22 21:23 ` Dave Hansen
2015-10-22 22:25 ` Jerome Glisse
2015-10-23 0:49 ` Dave Hansen
2015-09-28 19:18 ` [PATCH 14/25] mm: simplify get_user_pages() PTE bit handling Dave Hansen
2015-09-28 19:18 ` Dave Hansen [this message]
2015-09-28 19:18 ` [PATCH 17/25] x86, pkeys: dump PKRU with other kernel registers Dave Hansen
2015-09-28 19:18 ` [PATCH 18/25] x86, pkeys: dump PTE pkey in /proc/pid/smaps Dave Hansen
2015-09-28 19:18 ` [PATCH 19/25] x86, pkeys: add Kconfig prompt to existing config option Dave Hansen
2015-09-28 19:18 ` [PATCH 20/25] mm, multi-arch: pass a protection key in to calc_vm_flag_bits() Dave Hansen
2015-09-28 19:18 ` [PATCH 22/25] x86: wire up mprotect_key() system call Dave Hansen
2015-09-28 19:18 ` [PATCH 23/25] x86, pkeys: actually enable Memory Protection Keys in CPU Dave Hansen
2015-09-28 19:18 ` [PATCH 21/25] mm: implement new mprotect_key() system call Dave Hansen
2015-09-29 6:39 ` Michael Ellerman
2015-09-29 14:16 ` Dave Hansen
2015-09-28 19:18 ` [PATCH 25/25] x86, pkeys: Documentation Dave Hansen
2015-09-28 20:34 ` Andi Kleen
2015-09-28 20:41 ` Dave Hansen
2015-09-28 19:18 ` [PATCH 24/25] x86, pkeys: add self-tests Dave Hansen
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=20150928191823.2563873B@viggo.jf.intel.com \
--to=dave@sr71.net \
--cc=borntraeger@de.ibm.com \
--cc=dave.hansen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome