From: Dave Hansen <dave.hansen@intel.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: Qiaowei Ren <qiaowei.ren@intel.com>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@redhat.com>,
x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v8 08/10] x86, mpx: add prctl commands PR_MPX_REGISTER, PR_MPX_UNREGISTER
Date: Fri, 12 Sep 2014 13:18:50 -0700 [thread overview]
Message-ID: <5413552A.1020907@intel.com> (raw)
In-Reply-To: <alpine.DEB.2.10.1409121812550.4178@nanos>
On 09/12/2014 10:34 AM, Thomas Gleixner wrote:
> On Fri, 12 Sep 2014, Dave Hansen wrote:
>> There are two mappings in play:
>> 1. The mapping with the actual data, which userspace is munmap()ing or
>> brk()ing away, etc... (never tagged VM_MPX)
>
> It's not tagged that way because it is mapped by user space.
Correct. It is not tagged because it is mapped by user space.
> This is the directory, right?
No. The untagged mapping in question here is for normal user data, like
an mmap() or brk(), unrelated to MPX.
The directory is a separate matter. It is also (currently) untagged
with VM_MPX since it is also allocated by userspace.
>> 2. The mapping for the bounds table *backing* the data (is tagged with
>> VM_MPX)
>
> That's the stuff, which gets magically allocated from do_bounds(). And
> the reason you do that from the #BR is that user space would have to
> allocate a gazillion of bound tables to make sure that every corner
> case is covered.
Yes.
> With the allocation from #BR you make that behaviour
> dynamic and you just provide an empty "no bounds" table to make the
> bound checker happy.
Kinda. We do provide an empty table, but the first access will always
be a write, so it doesn't stay empty for long.
...
> Now, I have a hard time to see how that is supposed to work.
>
> do_unmap()
> detach_vmas_to_be_unmapped()
> unmap_region()
> free_pgtables()
> arch_unmap()
> mpx_unmap()
>
> So at the point where you try to access the directory to gather the
> information about the entries which might be affected, that stuff is
> unmapped already and the page tables are gone.
>
> Brilliant idea, really. And if you run into the fault in mpx_unmap()
> you plan to delegate the fixup to a work queue. How is that thing
> going to find what belonged to the unmapped directory?
The bounds directory is not being unmapped here. I _think_ I covered
that above, but don't be shy if I'm not being clear. ;)
> Even if the stuff would be accessible at that point, it is a damned
> stupid idea to rely on anything userspace is providing to you. I
> learned that the hard way in futex.c
>
> The proper solution to this problem is:
>
> do_bounds()
> bd_addr = get_bd_addr_from_xsave();
> bd_entry = bndstatus & ADDR_MASK:
>
> bt = mpx_mmap(bd_addr, bd_entry, len);
>
> set_bt_entry_in_bd(bd_entry, bt);
>
> And in mpx_mmap()
>
> .....
> vma = find_vma();
>
> vma->bd_addr = bd_addr;
> vma->bd_entry = bd_entry;
If the bounds directory moved around, this would make sense. Otherwise,
it's a waste of space because all vmas in a given mm would have the
exact same bd_addr, and we might as well just store it in mm->bd_something.
Are you suggesting that we support moving the bounds directory around?
Also, the bd_entry can be _calculated_ from vma->vm_start and the
bd_addr. It seems a bit redundant to store it like this.
Also this would add 16 bytes to the currently 184-byte VMA. That seems
suboptimal to me. It would eat over a megabyte of memory on my *laptop*
alone.
> Now on mpx_unmap()
>
> for_each_vma()
> if (is_affected(vma->bd_addr, vma->bd_entry))
> unmap(vma);
>
> That does not require a prctl, no fault handling in the unmap path, it
> just works and is robust by design because it does not rely on any
> user space crappola. You store the directory context at allocation
> time and free it when that context goes away. It's that simple, really.
If you are talking about the VM_MPX VMA that was allocated to hold the
bounds table, this won't work.
Once we unmap the bounds table, we would have a bounds directory entry
pointing at empty address space. That address space could now be
allocated for some other (random) use, and the MPX hardware is now going
to go trying to walk it as if it were a bounds table. That would be bad.
Any unmapping of a bounds table has to be accompanied by a corresponding
write to the bounds directory entry. That write to the bounds directory
can fault.
--
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:[~2014-09-12 20:18 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-11 8:46 [PATCH v8 00/10] Intel MPX support Qiaowei Ren
2014-09-11 8:46 ` [PATCH v8 01/10] x86, mpx: introduce VM_MPX to indicate that a VMA is MPX specific Qiaowei Ren
2014-09-11 8:46 ` [PATCH v8 02/10] x86, mpx: add MPX specific mmap interface Qiaowei Ren
2014-09-11 8:46 ` [PATCH v8 03/10] x86, mpx: add macro cpu_has_mpx Qiaowei Ren
2014-09-11 8:46 ` [PATCH v8 04/10] x86, mpx: hook #BR exception handler to allocate bound tables Qiaowei Ren
2014-09-12 22:58 ` Dave Hansen
2014-09-13 7:24 ` Ren, Qiaowei
2014-09-24 14:40 ` Dave Hansen
2014-09-11 8:46 ` [PATCH v8 05/10] x86, mpx: extend siginfo structure to include bound violation information Qiaowei Ren
2014-09-11 8:46 ` [PATCH v8 06/10] mips: sync struct siginfo with general version Qiaowei Ren
2014-09-11 22:13 ` Thomas Gleixner
2014-09-12 2:54 ` Ren, Qiaowei
2014-09-12 8:17 ` Thomas Gleixner
2014-09-13 7:13 ` Ren, Qiaowei
2014-09-11 8:46 ` [PATCH v8 07/10] x86, mpx: decode MPX instruction to get bound violation information Qiaowei Ren
2014-09-11 22:18 ` Thomas Gleixner
2014-09-11 22:32 ` Dave Hansen
2014-09-11 22:35 ` H. Peter Anvin
2014-09-11 23:37 ` Thomas Gleixner
2014-09-12 4:44 ` H. Peter Anvin
2014-09-12 13:10 ` Thomas Gleixner
2014-09-12 13:39 ` H. Peter Anvin
2014-09-12 17:48 ` Thomas Gleixner
2014-09-12 17:52 ` Thomas Gleixner
2014-09-12 19:07 ` H. Peter Anvin
2014-09-11 8:46 ` [PATCH v8 08/10] x86, mpx: add prctl commands PR_MPX_REGISTER, PR_MPX_UNREGISTER Qiaowei Ren
2014-09-11 15:03 ` Dave Hansen
2014-09-12 3:10 ` Ren, Qiaowei
2014-09-11 23:28 ` Thomas Gleixner
2014-09-12 0:10 ` Dave Hansen
2014-09-12 8:11 ` Thomas Gleixner
2014-09-12 9:24 ` Thomas Gleixner
2014-09-12 14:36 ` Dave Hansen
2014-09-12 17:34 ` Thomas Gleixner
2014-09-12 18:42 ` Thomas Gleixner
2014-09-12 20:35 ` Dave Hansen
2014-09-12 20:18 ` Dave Hansen [this message]
2014-09-13 9:01 ` Thomas Gleixner
2014-09-12 15:22 ` Dave Hansen
2014-09-12 17:42 ` Thomas Gleixner
2014-09-12 20:33 ` Dave Hansen
2014-09-15 0:00 ` One Thousand Gnomes
2014-09-16 3:20 ` Ren, Qiaowei
2014-09-16 4:17 ` Dave Hansen
2014-09-16 7:50 ` Kevin Easton
2014-09-18 0:40 ` Ren, Qiaowei
2014-09-18 3:23 ` Kevin Easton
2014-09-18 2:37 ` Ren, Qiaowei
2014-09-18 4:43 ` Dave Hansen
2014-09-18 7:17 ` Kevin Easton
2014-09-18 6:20 ` Dave Hansen
2014-09-11 8:46 ` [PATCH v8 09/10] x86, mpx: cleanup unused bound tables Qiaowei Ren
2014-09-11 14:59 ` Dave Hansen
2014-09-12 3:02 ` Ren, Qiaowei
2014-09-12 4:59 ` Dave Hansen
2014-09-15 20:53 ` Dave Hansen
2014-09-16 8:06 ` Ren, Qiaowei
2014-09-11 8:46 ` [PATCH v8 10/10] x86, mpx: add documentation on Intel MPX Qiaowei Ren
2014-09-12 0:51 ` [PATCH v8 00/10] Intel MPX support Dave Hansen
2014-09-12 19:21 ` Thomas Gleixner
2014-09-12 21:23 ` Dave Hansen
2014-09-13 9:25 ` Thomas Gleixner
2014-09-12 21:31 ` Dave Hansen
2014-09-12 22:08 ` Dave Hansen
2014-09-13 9:39 ` Thomas Gleixner
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=5413552A.1020907@intel.com \
--to=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@redhat.com \
--cc=qiaowei.ren@intel.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).