On Thu, Oct 24, 2013 at 05:51:11PM +0800, Weijie Yang wrote:
> Consider the following scenario:
> thread 0: reclaim entry x (get refcount, but not call 
> zswap_get_swap_cache_page)
> thread 1: call zswap_frontswap_invalidate_page to invalidate entry x.
>       finished, entry x and its zbud is not freed as its refcount != 0
>       now, the swap_map[x] = 0
> thread 0: now call zswap_get_swap_cache_page
>       swapcache_prepare return -ENOENT because entry x is not used any more
>       zswap_get_swap_cache_page return ZSWAP_SWAPCACHE_NOMEM
>       zswap_writeback_entry do nothing except put refcount
> Now, the memory of zswap_entry x and its zpage leak.
> 
> Modify:
>  - check the refcount in fail path, free memory if it is not referenced.
> 
>  - use ZSWAP_SWAPCACHE_FAIL instead of ZSWAP_SWAPCACHE_NOMEM as the fail path
>    can be not only caused by nomem but also by invalidate.
> 
> Signed-off-by: Weijie Yang <[email protected]>
> Reviewed-by: Bob Liu <[email protected]>
> Cc: Minchan Kim <[email protected]>
> Cc: <[email protected]>
> Acked-by: Seth Jennings <[email protected]>
> Signed-off-by: Andrew Morton <[email protected]>

Reviewed-by: Minchan Kim <[email protected]>

Thanks, Weijie!

-- 
Kind regards,
Minchan Kim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to