On (24/02/27 03:02), Chengming Zhou wrote: > Hello, > > free_zspage() has to hold locks of all pages, since zs_page_migrate() > path rely on this page lock to protect the race between zs_free() and > it, so it can safely get zspage from page->private. > > But this way is not good and simple enough: > > 1. Since zs_free() couldn't be sleepable, it can only trylock pages, > or has to kick_deferred_free() to defer that to a work. > > 2. Even in the worker context, async_free_zspage() can't simply > lock all pages in lock_zspage(), it's still trylock because of > the race between zs_free() and zs_page_migrate(). Please see > the commit 2505a981114d ("zsmalloc: fix races between asynchronous > zspage free and page migration") for details. > > Actually, all free_zspage() needs is to get zspage from page safely, > we can use RCU to achieve it easily. Then free_zspage() don't need to > hold locks of all pages, so don't need the deferred free mechanism > at all. This patchset implements it and remove all of deferred free > related code. > > Thanks for review and comments! > > Signed-off-by: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> JFI, recovered from the SPAM folder "The sender hasn't authenticated this message"