[1] introduced down_write in zram_slot_free_notify to prevent race
between zram_slot_free_notify and zram_bvec_[read|write]. The race
could happen if somebody who has right permission to open swap device
is reading swap device while it is used by swap in parallel.
However, zram_slot_free_notify is called with holding spin_lock of
swap layer so we shouldn't avoid holing mutex. Otherwise, lockdep
warns it.
This patch adds new list to handle free slot and workqueue
so zram_slot_free_notify just registers slot index to be freed and
registers the request to workqueue. If workqueue is expired,
it holds mutex_lock so there is no problem any more.
If any I/O is issued, zram handles pending slot-free request
caused by zram_slot_free_notify right before handling issued
request because workqueue wouldn't be expired yet so zram I/O
request handling function can miss it.
Lastly, when zram is reset, flush_work could handle all of pending
free request so we shouldn't have memory leak.
NOTE: If zram_slot_free_notify's kmalloc with GFP_ATOMIC would be
failed, the slot will be freed when next write I/O write the slot.
[1] [57ab0485, zram: use zram->lock to protect zram_free_page()
in swap free notify path]
* from v2
* refactoring
* from v1
* totally redesign
Cc: Nitin Gupta <ngupta@vflare.org>
Cc: Jiang Liu <jiang.liu@huawei.com>
Cc: stable@vger.kernel.org
Signed-off-by: Minchan Kim <minchan@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
(cherry picked from commit a0c516cbfc)
Conflicts:
drivers/staging/zram/zram_drv.c
1.use list_for_each_safe instead of list_for_each ,_list_del may happend in
interrupt,may cause the unsync operation
2.add msleep(500) in the entry of kbase_release to postpone the operation when app quit
3.version to 0x06
1. For 0 length buf, perform dma map with length 4
to avoid kernel stack dump occurred.
2. Do dma unmap before req->complete to avoid dma
addr reused after unmapped.
In dwc_otg_pcd_ep_queue, allocate DMA memory for
align buf. Because dwc_otg_pcd_ep_queue can be
called in irq, so it must be used GFP_ATOMIC to
avoid sleep in irq.
the pages being used in the system come from CMA, and now need recycling
them for new CMA allocation, it need to allocate a new page for storing data
that will be reclaim CMA's pages, but new page may also be come from CMA memory
when memory allocate fall back to MIGRATE_CMA freelist.
Now we protect the CMA's pages in the memory fallback allocate
[ 1637.058550] alloc_contig_range test_pages_isolated(431a0, 431c0) failed