On Sun, Nov 07, 2021 at 10:34:02PM -0800, Dave Hansen wrote: > On 11/7/21 2:28 PM, Jarkko Sakkinen wrote: > >> 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. > > Thinking about this a bit more... We don't want to use the normal > get/put_page() refcount for this. If we do, it will pin the page while > there is any data in it, preventing it from being reclaimed (swapped). > > That isn't to say that we can't keep *a* refcount, just that we can't > use the page refcount for this. > > I still like the idea of just scanning the whole page for zeros. I can try that route first. I like the property in zeroing that it has predicatable O(1) cost. /Jarkko