[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <186120e4754fa0b583d5f4cb31aa49ccd5795d09.camel@kernel.org>
Date: Mon, 08 Nov 2021 00:28:44 +0200
From: Jarkko Sakkinen <jarkko@...nel.org>
To: Dave Hansen <dave.hansen@...el.com>
Cc: Dave Hansen <dave.hansen@...ux.intel.com>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>,
x86@...nel.org, "H. Peter Anvin" <hpa@...or.com>,
Jethro Beekman <jethro@...tanix.com>,
Sean Christopherson <seanjc@...gle.com>,
reinette.chatre@...el.com, tony.luck@...el.com,
nathaniel@...fian.com, stable@...r.kernel.org,
Borislav Petkov <bp@...e.de>, linux-sgx@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] x86/sgx: Free backing memory after faulting the enclave
page
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
Powered by blists - more mailing lists