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