mm, swap: fix comment in __read_swap_cache_async
authorHuang Ying <ying.huang@intel.com>
Wed, 3 May 2017 21:54:33 +0000 (14:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2017 22:52:10 +0000 (15:52 -0700)
Commit cbab0e4eec29 ("swap: avoid read_swap_cache_async() race to
deadlock while waiting on discard I/O completion") fixed a deadlock in
read_swap_cache_async().  Because at that time, in swap allocation path,
a swap entry may be set as SWAP_HAS_CACHE, then wait for discarding to
complete before the page for the swap entry is added to the swap cache.

But in commit 815c2c543d3a ("swap: make swap discard async"), the
discarding for swap become asynchronous, waiting for discarding to
complete will be done before the swap entry is set as SWAP_HAS_CACHE.
So the comments in code is incorrect now.  This patch fixes the
comments.

The cond_resched() added in the commit cbab0e4eec29 is not necessary now
too.  But if we added some sleep in swap allocation path in the future,
there may be some hard to debug/reproduce deadlock bug.  So it is kept.

Link: http://lkml.kernel.org/r/20170317064635.12792-1-ying.huang@intel.com
Signed-off-by: "Huang, Ying" <ying.huang@intel.com>
Acked-by: Rafael Aquini <aquini@redhat.com>
Cc: Shaohua Li <shli@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/swap_state.c

index 473b71e052a8ed29df7c496af747e2b43491c782..7bfb9bd1ca211ef0682085b99e9723cfeab9b5fe 100644 (file)
@@ -360,17 +360,7 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,
                        /*
                         * We might race against get_swap_page() and stumble
                         * across a SWAP_HAS_CACHE swap_map entry whose page
-                        * has not been brought into the swapcache yet, while
-                        * the other end is scheduled away waiting on discard
-                        * I/O completion at scan_swap_map().
-                        *
-                        * In order to avoid turning this transitory state
-                        * into a permanent loop around this -EEXIST case
-                        * if !CONFIG_PREEMPT and the I/O completion happens
-                        * to be waiting on the CPU waitqueue where we are now
-                        * busy looping, we just conditionally invoke the
-                        * scheduler here, if there are some more important
-                        * tasks to run.
+                        * has not been brought into the swapcache yet.
                         */
                        cond_resched();
                        continue;