Now, swap_info_get hides lock holding by doing it internally but releasing the lock so caller should release the lock. Normally, it's not a good pattern and I need to handle lock from caller in next patchset. Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx> --- mm/swapfile.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mm/swapfile.c b/mm/swapfile.c index 8798b2e0ac59..ec2ce926ea5f 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -740,7 +740,6 @@ static struct swap_info_struct *swap_info_get(swp_entry_t entry) goto bad_offset; if (!p->swap_map[offset]) goto bad_free; - spin_lock(&p->lock); return p; bad_free: @@ -835,6 +834,7 @@ void swap_free(swp_entry_t entry) p = swap_info_get(entry); if (p) { + spin_lock(&p->lock); swap_entry_free(p, entry, 1); spin_unlock(&p->lock); } @@ -849,6 +849,7 @@ void swapcache_free(swp_entry_t entry) p = swap_info_get(entry); if (p) { + spin_lock(&p->lock); swap_entry_free(p, entry, SWAP_HAS_CACHE); spin_unlock(&p->lock); } @@ -868,6 +869,7 @@ int page_swapcount(struct page *page) entry.val = page_private(page); p = swap_info_get(entry); if (p) { + spin_lock(&p->lock); count = swap_count(p->swap_map[swp_offset(entry)]); spin_unlock(&p->lock); } @@ -950,6 +952,7 @@ int free_swap_and_cache(swp_entry_t entry) p = swap_info_get(entry); if (p) { + spin_lock(&p->lock); if (swap_entry_free(p, entry, 1) == SWAP_HAS_CACHE) { page = find_get_page(swap_address_space(entry), entry.val); @@ -2763,6 +2766,7 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) goto outer; } + spin_lock(&si->lock); offset = swp_offset(entry); count = si->swap_map[offset] & ~SWAP_HAS_CACHE; -- 2.0.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>