[Devel] [PATCH rh7] tswap: Add support for zero-filled pages
Kirill Tkhai
ktkhai at virtuozzo.com
Mon Sep 4 14:52:02 MSK 2017
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?
More information about the Devel
mailing list