summaryrefslogtreecommitdiff
path: root/mm/zcache.c
AgeCommit message (Collapse)Author
2016-06-07mm: zcache: fix merge issuesVinayak Menon
Fix 4.4 merge issues in zero page support, and add the missing label. Change-Id: I4bed7add011e0c9b0e148d1b44132ba1873cf607 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-05-31mm: zcache: remove __GFP_NO_KSWAPDVinayak Menon
Remove __GFP_NO_KSWAPD. It no longer exist. Change-Id: I8b50a06bdae050b3a3c47b80e21d0d2edf18b7c5 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-05-31mm: add WasActive page flagBob Liu
Zcache could be ineffective if the compressed memory pool is full with compressed inactive file pages and most of them will be never used again. So we pick up pages from active file list only, those pages would probably be accessed again. Compress them in memory can reduce the latency significantly compared with rereading from disk. When a file page is shrunk from active file list to inactive file list, PageActive flag is also cleared. So adding an extra WasActive page flag for zcache to know whether the file page was shrunk from the active list. Change-Id: Ida1f4db17075d1f6f825ef7ce2b3bae4eb799e3f Signed-off-by: Bob Liu <bob.liu@oracle.com> Patch-mainline: linux-mm @ 2013-08-06 11:36:17 [vinmenon@codeaurora.org: trivial merge conflict fixes, checkpatch fixes, fix the definitions of was_active page flag so that it does not create compile time errors with CONFIG_CLEANCACHE disabled. Also remove the unnecessary use of PG_was_active in PAGE_FLAGS_CHECK_AT_PREP. Since was_active is a requirement for zcache, make the definitions dependent on CONFIG_ZCACHE rather than CONFIG_CLEANCACHE.] Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-25mm: zcache: fix locking sequenceShiraz Hashim
Deadlock is observed in zcache reclaim paths due to different locking sequence. Core#0: Core#1: |spin_bug() |do_raw_write_lock() |do_raw_spin_lock() |_raw_write_lock_irqsave() |_raw_spin_lock_irqsave() |zcache_rbnode_isolate() |zcache_flush_inode() |zcache_load_delete_zaddr() |__cleancache_invalidate_inode() |zcache_evict_zpage() |truncate_inode_pages_range() |zbud_reclaim_page() |truncate_inode_pages() |zcache_scan() |truncate_inode_pages_final() |shrink_slab_node() |ext4_evict_inode() |shrink_slab() |evict() |try_to_free_pages() |dispose_list() |__alloc_pages_nodemask() |prune_icache_sb() |alloc_kmem_pages_node() |super_cache_scan() |copy_process.part.52() |shrink_slab_node() |do_fork() |shrink_slab() |sys_clone() |kswapd_shrink_zone.constprop |el0_svc() |balance_pgdat() |kswapd() |kthread() |ret_from_fork() The deadlock happens because alternate sequence are followed while taking zpool->rb_lock (protects zpool rb tree), and rbnode->ra_lock (protects radix tree maintained by rbtree node) Fix the sequence of locks being taken to avoid deadlock. Change-Id: I32db23268f63eb8eb5aee30e4462c190e2e02f48 Signed-off-by: Shiraz Hashim <shashim@codeaurora.org>
2016-03-23mm: zcache: fix use after free in zcache_store_pageVinayak Menon
There is a chance of zbud handle being used after a free. Unable to handle kernel paging request at virtual address ffffffc05be72040 PC is at zcache_store_page+0x59c/0x618 LR is at zcache_store_page+0x59c/0x618 [<ffffffc00019c99c>] zcache_store_page+0x59c/0x618 [<ffffffc0001a70c4>] __cleancache_put_page+0x94/0xcc [<ffffffc00015da4c>] __delete_from_page_cache+0xc0/0x2cc [<ffffffc00016d230>] __remove_mapping+0xe4/0x128 [<ffffffc00016e750>] shrink_page_list+0x634/0x95c [<ffffffc00016f32c>] shrink_inactive_list+0x41c/0x67c [<ffffffc00016fc14>] shrink_lruvec+0x364/0x510 [<ffffffc00016fe10>] shrink_zone+0x50/0x12c [<ffffffc000170278>] try_to_free_pages+0x38c/0x56c [<ffffffc000164e4c>] __alloc_pages_nodemask+0x5e0/0x994 [<ffffffc000165214>] __get_free_pages+0x14/0x60 CRs-Fixed: 968859 Change-Id: I24f6cf8ccbac956d4c3114e70a9f94f5e3bfa1c8 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: reduce prints on store errorVinayak Menon
zcache store can fail on lowmemory conditions. Do not throw unnecessary prints on such events, causing a stall. Change-Id: I8fba6938f75ef5b6054ee079951b7409279e1c02 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: fix race between store and evictVinayak Menon
The following race is possible: CPU 1 CPU2 zcache_store_page zbud_alloc zcache_evict_zpage zpool = zhandle->zpool; CRASH zcache_store_page zhandle->zpool = zpool Fix this by properly initializing the zhandle and validating in zcache_evict_zpage Change-Id: I02328220b30f415fa1f171236eab3a2e40072fd9 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: clear zcache when low on file pagesVinayak Menon
When files pages are very low, it is better to clear off zcache pages, since the freed memory can be used to sustain an application in foreground. Moreover when file pages are too low, we don't gain much by holding a few zcache pages. Change-Id: I88dd295d24b7de18fb3bc0788e0baeb6bfdb2f6d Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: add zero page supportVinayak Menon
zero pages need not be compressed and stored unnecessarily. Rather insert a special handle to the radix tree to identify a zero page. Change-Id: Ic92321c4753401a90d69a6e8c61b5119168c9df7 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: do not wake up kswapd for zcache allocsVinayak Menon
zcache allocations happen during reclaim of pages, and waking up kswapd at this time hinders system performance. During tests it was seen that without this patch, there were a lot of kswapd wakeups and was resulting in bad launches. Change-Id: Ic0f0240b8fdad6b3fe142b2bdc0366cfd870635e Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: fix accouting of pool pagesVinayak Menon
zcache_pool_pages is supposed to store the total pages in all the pools used by zcache. But at present zcache_pool_pages is assigned pages of any particular pool on a load, store or any operation which modifies the pool size. And this is more important for external clients which depend on zcache pool size, like the lowmemorykiller. Change-Id: Ifdaab8646c40f1fec71dfa5903658fbdc6b3cce5 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: shrink zcache on memory pressureVinayak Menon
When file pages drops down, at a point zcache pages can be more than the file pages, and even further when we have to reclaim the maximum number of file pages possible to launch an application, we need a way to reclaim even the zcache pages at least to an extend which makes it match with the number of file pages. This can help in better foreground headroom. Change-Id: I481bfb9961ed5cee47ebeae08eb910bb269b644c Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: disallow sleep in zcache storeVinayak Menon
zcache store ops cannot sleep since it is called from an atomic context. Pass the right flags to alloc functions. Change-Id: I9c7956e895fb7909932315aa3d85845127aa02e1 Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
2016-03-23mm: zcache: add evict zpages supportingBob Liu
Implemented zbud_ops->evict, so that compressed zpages can be evicted from zbud memory pool in the case that the compressed pool is full. zbud already managered the compressed pool based on LRU. The evict was implemented just by dropping the compressed file page data directly, if the data is required again then no more disk reading can be saved. Signed-off-by: Bob Liu <bob.liu@oracle.com> Patch-mainline: linux-mm @ 2013-08-06 11:36:16 [vinmenon@codeaurora.org: trivial merge conflict fixes] Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org> Change-Id: Ia66652475e490f0233547511e80abf7587054e65
2016-03-23mm: zcache: add core filesBob Liu
zcache is a backend for cleancache that takes file pages that are in the process of being reclaimed and attempts to compress them and store them in a RAM-based memory pool. This can result in a significant I/O reduction if system is full with file pages and, in the case where decompressing from RAM is faster than reading from the disk, can also improve workload performance. Signed-off-by: Bob Liu <bob.liu@oracle.com> Patch-mainline: linux-mm @ 2013-08-06 11:36:14 [vinmenon@codeaurora.org: trivial merge conflict fixes, checkpatch fixes] Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org> Change-Id: Id05bcc1946eee22b94a83adeb0134a3f6e357ef8