On Thu, Apr 04, 2019 at 09:15:46AM -0600, Khalid Aziz wrote: > Thanks Peter. I really appreciate your review. Your feedback helps make > this code better and closer to where I can feel comfortable not calling > it RFC any more. > > The more I look at xpfo_kmap()/xpfo_kunmap() code, the more I get > uncomfortable with it. As you pointed out about calling kmap_atomic from > NMI context, that just makes the kmap_atomic code look even worse. I > pointed out one problem with this code in cover letter and suggested a > rewrite. I see these problems with this code: Well, I no longer use it from NMI context, but I did do that for a while. We now have a giant heap of magic in the NMI path that allows us to take faults from NMI context (please don't ask), this means we can mostly do copy_from_user_inatomic() now. > 1. When xpfo_kmap maps a page back in physmap, it opens up the ret2dir > attack security hole again even if just for the duration of kmap. A kmap > can stay around for some time if the page is being used for I/O. Correct. > 2. This code uses spinlock which leads to problems. If it does not > disable IRQ, it is exposed to deadlock around xpfo_lock. If it disables > IRQ, I think it can still deadlock around pgd_lock. I've not spotted that inversion yet, but then I didn't look at the lock usage outside of k{,un}map_xpfo(). > I think a better implementation of xpfo_kmap()/xpfo_kunmap() would map > the page at a new virtual address similar to what kmap_high for i386 > does. This avoids re-opening the ret2dir security hole. We can also > possibly do away with xpfo_lock saving bytes in page-frame and the not > so sane code sequence can go away. Right, the TLB invalidation issues are still tricky, even there :/