Messages in this thread | ![/](/images/icornerl.gif) | | From | Brian Gerst <> | Date | Thu, 7 Nov 2019 16:00:13 -0500 | Subject | Re: [patch 5/9] x86/ioport: Reduce ioperm impact for sane usage further |
| |
On Thu, Nov 7, 2019 at 2:54 PM Linus Torvalds <torvalds@linux-foundation.org> wrote: > > On Thu, Nov 7, 2019 at 11:24 AM Brian Gerst <brgerst@gmail.com> wrote: > > > > Here is a different idea: We already map the TSS virtually in > > cpu_entry_area. Why not page-align the IO bitmap and remap it to the > > task's bitmap on task switch? That would avoid all copying on task > > switch. > > We map the tss _once_, statically, percpu, without ever changing it, > and then we just (potentially) change a couple of fields in it on > process switch. > > Your idea isn't horrible, but it would involve a TLB flush for the > page when the io bitmap changes. Which is almost certainly more > expensive than just copying the bitmap intelligently. > > Particularly since I do think that the copy can basically be done > effectively never, assuming there really aren't multiple concurrent > users of ioperm() (and iopl).
There wouldn't have to be a flush on every task switch. If we make it so that tasks that don't use a bitmap just unmap the pages in the cpu_entry_area and set tss.io_bitmap_base to outside the segment limit, we would only have to flush when switching from a task using the bitmap (because the next task uses a different bitmap or we are unmapping it). If the previous task doesn't have a bitmap the pages in cpu_entry_area were unmapped and can't be in the TLB, so no flush is needed.
Going a step further, we could track which task is mapped to the current cpu like proposed above, and only flush when a different task needs the IO bitmap, or when the bitmap is being freed on task exit.
-- Brian Gerst
| ![\](/images/icornerr.gif) |