On 31.08.2017 16:45, Andrey Ryabinin wrote: > On 08/03/2017 12:54 PM, Kirill Tkhai wrote: >> static int tswap_frontswap_store(unsigned type, pgoff_t offset, >> struct page *page) >> { >> swp_entry_t entry = swp_entry(type, offset); >> + int zero_filled = -1, err = 0; >> struct page *cache_page; >> - int err = 0; >> >> if (!tswap_active) >> return -1; >> >> cache_page = tswap_lookup_page(entry); >> - if (cache_page) >> - goto copy; >> + if (cache_page) { >> + zero_filled = is_zero_filled_page(page); >> + /* If type of page has not changed, just reuse it */ >> + if (zero_filled == (cache_page == ZERO_PAGE(0))) >> + goto copy; >> + tswap_delete_page(entry, NULL); >> + put_page(cache_page); > > I think if we race with tswap_frontswap_load() this will lead to double > put_page().
Hm, then if load and store may be executed in parallel, doesn't the current code have the following problem? tswap_frontswap_store() tswap_frontswap_load() cache_page = tswap_lookup_page(entry); ... goto copy; ... ... cache_page = tswap_delete_page() ... put_page(cache_page); ... ... copy_highpage(cache_page, page); ... ^^^ copy to freed page? _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel