On Mon, Dec 17, 2018 at 10:21:49PM +0200, Jarkko Sakkinen wrote: > On Mon, Dec 17, 2018 at 09:33:22PM +0200, Jarkko Sakkinen wrote: > > On Mon, Dec 17, 2018 at 10:48:58AM -0800, Sean Christopherson wrote: > > > On Mon, Dec 17, 2018 at 08:43:33PM +0200, Jarkko Sakkinen wrote: > > > > On Mon, Dec 17, 2018 at 10:36:13AM -0800, Sean Christopherson wrote: > > > > > I'm pretty sure doing mmget() would result in circular dependencies and > > > > > a zombie enclave. In the do_exit() case where a task is abruptly killed: > > > > > > > > > > - __mmput() is never called because the enclave holds a ref > > > > > - sgx_encl_release() is never be called because its VMAs hold refs > > > > > - sgx_vma_close() is never called because __mmput()->exit_mmap() is > > > > > blocked and the process itself is dead, i.e. won't unmap anything. > > > > > > > > Right, it does, you are absolutely right. Tried it and removed the > > > > commit already. > > > > > > > > Well, what we came up from your suggestion i.e. setting mm to NULL > > > > and checking that is very subtle change and does not have any such > > > > circular dependencies. We'll go with that. > > > > > > We can't set mm to NULL as we need it to unregister the notifier, and > > > I'm fairly certain attempting to unregister in the release callback > > > will deadlock. > > > > Noticed that too. mmu_notifier_unregister() requires a valid mm. > > Both branches updated... I'm not still seeing why you would want to call sgx_free_page() from sgx_invalidate(). Kind of resistant to adding extra logging just for checking for programming errors. What I would do if I had to debug there a leak would be simply put kretprobe on __sgx_free_page(). /Jarkko