Comment 5 for bug 433646

Revision history for this message
Petr Vandrovec (petr-vmware) wrote :

Attached is patch which seems to fix problem on my system. I'm not sure whether cond_resched() is necessary in failure path when add fails (err != -ENOMEM), as I cannot trigger that path in the test, but one in EEXIST path is rather vital...

Signed-off-by: Petr Vandrovec <email address hidden>

--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -293,8 +293,10 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                 * Swap entry may have been freed since our caller observed it.
                 */
                err = swapcache_prepare(entry);
- if (err == -EEXIST) /* seems racy */
+ if (err == -EEXIST) { /* seems racy */
+ cond_resched();
                        continue;
+ }
                if (err) /* swp entry is obsolete ? */
                        break;

@@ -320,6 +322,8 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                ClearPageSwapBacked(new_page);
                __clear_page_locked(new_page);
                swapcache_free(entry, NULL);
+ if (err != -ENOMEM)
+ cond_resched();
        } while (err != -ENOMEM);

        if (new_page)