Re: [PATCH] x86/sgx: Free backing memory after faulting the enclave page

From: Jarkko Sakkinen
Date: Sun Nov 07 2021 - 17:28:54 EST


On Sun, 2021-11-07 at 11:51 -0800, Dave Hansen wrote:
> On 11/7/21 11:42 AM, Jarkko Sakkinen wrote:
> > > > It should be fairly effecient just to check the pages by using
> > > > encl->page_tree.
> > > That sounds more complicated and slower than what I suggested.  You
> > > could even just check the refcount on the page.  I _think_ page cache
> > > pages have a refcount of 2.  So, look for the refcount that means "no
> > > more PCMD in this page", and just free it if so.
> > Umh, so... there is total 32 PCMD's per one page.
>
> When you place PCMD in a page, you do a get_page().  The refcount goes
> up by one.  So, a PCMD page with one PCMD will (I think) have a refcount
> of 3.  If you totally fill it up with 31 *more* PCMD entries, it will
> have a refcount of 34.  You do *not* do a put_page() on the PCMD page at
> the end of the allocation phase.
>
> When the backing storage is freed, you drop the refcount.  So, going
> from 32 PCMD entries to 31 entries in a page, you go from 34->33.
>
> When that refcount drops to 2, you know there is no more data in the
> page that's useful.  At that point you can truncate it out of the
> backing storage.
>
> There's no reason to scan the page, or a boatload of other metadata.
> Just keep a refcount.  Just use the *existing* 'struct page' refcount.

Right! Thank you, I'll use this approach, and check that the refcount
actually behaves that way you described.

/Jarkko