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;
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 cache_async( swp_entry_ t entry, gfp_t gfp_mask, prepare( entry);
continue;
break;
+++ b/mm/swap_state.c
@@ -293,8 +293,10 @@ struct page *read_swap_
* Swap entry may have been freed since our caller observed it.
*/
err = swapcache_
- if (err == -EEXIST) /* seems racy */
+ if (err == -EEXIST) { /* seems racy */
+ cond_resched();
+ }
if (err) /* swp entry is obsolete ? */
@@ -320,6 +322,8 @@ struct page *read_swap_ cache_async( swp_entry_ t entry, gfp_t gfp_mask,
ClearPageSwap Backed( new_page) ;
__clear_ page_locked( new_page) ;
swapcache_ free(entry, NULL);
+ if (err != -ENOMEM)
+ cond_resched();
} while (err != -ENOMEM);
if (new_page)