diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/android/lowmemorykiller.c | 254 | ||||
-rw-r--r-- | drivers/staging/zram/Kconfig | 7 | ||||
-rw-r--r-- | drivers/staging/zram/zram_drv.c | 53 | ||||
-rw-r--r-- | drivers/staging/zram/zram_drv.h | 2 | ||||
-rw-r--r-- | drivers/staging/zram/zram_sysfs.c | 31 |
5 files changed, 10 insertions, 337 deletions
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index 15bbcd3..d412581 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -35,12 +35,6 @@ #include <linux/oom.h> #include <linux/sched.h> #include <linux/notifier.h> -#ifdef CONFIG_ZRAM_FOR_ANDROID -#include <linux/swap.h> -#include <linux/device.h> -#include <linux/err.h> -#include <linux/mm_inline.h> -#endif /* CONFIG_ZRAM_FOR_ANDROID */ #define ENHANCED_LMK_ROUTINE #ifdef ENHANCED_LMK_ROUTINE @@ -62,35 +56,6 @@ static size_t lowmem_minfree[6] = { 16 * 1024, /* 64MB */ }; static int lowmem_minfree_size = 4; -#ifdef CONFIG_ZRAM_FOR_ANDROID -static struct class *lmk_class; -static struct device *lmk_dev; -static int lmk_kill_pid = 0; -static int lmk_kill_ok = 0; - -extern atomic_t optimize_comp_on; - -extern int isolate_lru_page_compcache(struct page *page); -extern void putback_lru_page(struct page *page); -extern unsigned int zone_id_shrink_pagelist(struct zone *zone_id,struct list_head *page_list); - -#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru)) - -#define SWAP_PROCESS_DEBUG_LOG 0 -/* free RAM 8M(2048 pages) */ -#define CHECK_FREE_MEMORY 2048 -/* free swap (10240 pages) */ -#define CHECK_FREE_SWAPSPACE 10240 - -static unsigned int check_free_memory = 0; - -enum pageout_io { - PAGEOUT_IO_ASYNC, - PAGEOUT_IO_SYNC, -}; - - -#endif /* CONFIG_ZRAM_FOR_ANDROID */ #ifdef ENHANCED_LMK_ROUTINE static struct task_struct *lowmem_deathpending[LOWMEM_DEATHPENDING_DEPTH] = {NULL,}; @@ -323,229 +288,10 @@ static struct shrinker lowmem_shrinker = { .seeks = DEFAULT_SEEKS * 16 }; -#ifdef CONFIG_ZRAM_FOR_ANDROID -/* - * zone_id_shrink_pagelist() clear page flags, - * update the memory zone status, and swap pagelist - */ - -static unsigned int shrink_pages(struct mm_struct *mm, - struct list_head *zone0_page_list, - struct list_head *zone1_page_list, - unsigned int num_to_scan) -{ - unsigned long addr; - unsigned int isolate_pages_countter = 0; - - struct vm_area_struct *vma = mm->mmap; - while (vma != NULL) { - - for (addr = vma->vm_start; addr < vma->vm_end; - addr += PAGE_SIZE) { - struct page *page; - /*get the page address from virtual memory address */ - page = follow_page(vma, addr, FOLL_GET); - - if (page && !IS_ERR(page)) { - - put_page(page); - /* only moveable, anonymous and not dirty pages can be swapped */ - if ((!PageUnevictable(page)) - && (!PageDirty(page)) && ((PageAnon(page))) - && (0 == page_is_file_cache(page))) { - switch (page_zone_id(page)) { - case 0: - if (!isolate_lru_page_compcache(page)) { - /* isolate page from LRU and add to temp list */ - /*create new page list, it will be used in shrink_page_list */ - list_add_tail(&page->lru, zone0_page_list); - isolate_pages_countter++; - } - break; - case 1: - if (!isolate_lru_page_compcache(page)) { - /* isolate page from LRU and add to temp list */ - /*create new page list, it will be used in shrink_page_list */ - list_add_tail(&page->lru, zone1_page_list); - isolate_pages_countter++; - } - break; - default: - break; - } - } - } - - if (isolate_pages_countter >= num_to_scan) { - return isolate_pages_countter; - } - } - - vma = vma->vm_next; - } - - return isolate_pages_countter; -} - -/* - * swap_application_pages() will search the - * pages which can be swapped, then call - * zone_id_shrink_pagelist to update zone - * status - */ -static unsigned int swap_pages(struct list_head *zone0_page_list, - struct list_head *zone1_page_list) -{ - struct zone *zone_id_0 = &NODE_DATA(0)->node_zones[0]; - struct zone *zone_id_1 = &NODE_DATA(0)->node_zones[1]; - unsigned int pages_counter = 0; - - /*if the page list is not empty, call zone_id_shrink_pagelist to update zone status */ - if ((zone_id_0) && (!list_empty(zone0_page_list))) { - pages_counter += - zone_id_shrink_pagelist(zone_id_0, zone0_page_list); - } - if ((zone_id_1) && (!list_empty(zone1_page_list))) { - pages_counter += - zone_id_shrink_pagelist(zone_id_1, zone1_page_list); - } - return pages_counter; -} - -static ssize_t lmk_state_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return sprintf(buf, "%d,%d\n", lmk_kill_pid, lmk_kill_ok); -} - -/* - * lmk_state_store() will called by framework, - * the framework will send the pid of process that need to be swapped - */ -static ssize_t lmk_state_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - sscanf(buf, "%d,%d", &lmk_kill_pid, &lmk_kill_ok); - - /* if the screen on, the optimized compcache will stop */ - if (atomic_read(&optimize_comp_on) != 1) - return size; - - if (lmk_kill_ok == 1) { - struct task_struct *p; - struct task_struct *selected = NULL; - struct sysinfo ramzswap_info = { 0 }; - struct mm_struct *mm_scan = NULL; - - /* - * check the free RAM and swap area, - * stop the optimized compcache in cpu idle case; - * leave some swap area for using in low memory case - */ - si_swapinfo(&ramzswap_info); - si_meminfo(&ramzswap_info); - - if ((ramzswap_info.freeswap < CHECK_FREE_SWAPSPACE) || - (ramzswap_info.freeram < check_free_memory)) { -#if SWAP_PROCESS_DEBUG_LOG > 0 - printk(KERN_INFO "idletime compcache is ignored : free RAM %lu, free swap %lu\n", - ramzswap_info.freeram, ramzswap_info.freeswap); -#endif - lmk_kill_ok = 0; - return size; - } - - read_lock(&tasklist_lock); - for_each_process(p) { - if ((p->pid == lmk_kill_pid) && - (__task_cred(p)->uid > 10000)) { - task_lock(p); - selected = p; - if (!selected->mm || !selected->signal) { - task_unlock(p); - selected = NULL; - break; - } - mm_scan = selected->mm; - if (mm_scan) { - if (selected->flags & PF_KTHREAD) - mm_scan = NULL; - else - atomic_inc(&mm_scan->mm_users); - } - task_unlock(selected); - -#if SWAP_PROCESS_DEBUG_LOG > 0 - printk(KERN_INFO "idle time compcache: swap process pid %d, name %s, oom %d, task size %ld\n", - p->pid, p->comm, - p->signal->oom_adj, - get_mm_rss(p->mm)); -#endif - break; - } - } - read_unlock(&tasklist_lock); - - if (mm_scan) { - LIST_HEAD(zone0_page_list); - LIST_HEAD(zone1_page_list); - int pages_tofree = 0, pages_freed = 0; - - down_read(&mm_scan->mmap_sem); - pages_tofree = - shrink_pages(mm_scan, &zone0_page_list, - &zone1_page_list, 0x7FFFFFFF); - up_read(&mm_scan->mmap_sem); - mmput(mm_scan); - pages_freed = - swap_pages(&zone0_page_list, - &zone1_page_list); - lmk_kill_ok = 0; - - } - } - - return size; -} - -static DEVICE_ATTR(lmk_state, 0664, lmk_state_show, lmk_state_store); - -#endif /* CONFIG_ZRAM_FOR_ANDROID */ - static int __init lowmem_init(void) { -#ifdef CONFIG_ZRAM_FOR_ANDROID - struct zone *zone; - unsigned int high_wmark = 0; -#endif task_free_register(&task_nb); register_shrinker(&lowmem_shrinker); - -#ifdef CONFIG_ZRAM_FOR_ANDROID - for_each_zone(zone) { - if (high_wmark < zone->watermark[WMARK_HIGH]) - high_wmark = zone->watermark[WMARK_HIGH]; - } - check_free_memory = (high_wmark != 0) ? high_wmark : CHECK_FREE_MEMORY; - - lmk_class = class_create(THIS_MODULE, "lmk"); - if (IS_ERR(lmk_class)) { - printk(KERN_ERR "Failed to create class(lmk)\n"); - return 0; - } - lmk_dev = device_create(lmk_class, NULL, 0, NULL, "lowmemorykiller"); - if (IS_ERR(lmk_dev)) { - printk(KERN_ERR - "Failed to create device(lowmemorykiller)!= %ld\n", - IS_ERR(lmk_dev)); - return 0; - } - if (device_create_file(lmk_dev, &dev_attr_lmk_state) < 0) - printk(KERN_ERR "Failed to create device file(%s)!\n", - dev_attr_lmk_state.attr.name); -#endif /* CONFIG_ZRAM_FOR_ANDROID */ - return 0; } diff --git a/drivers/staging/zram/Kconfig b/drivers/staging/zram/Kconfig index 06f741a..3bec4db 100644 --- a/drivers/staging/zram/Kconfig +++ b/drivers/staging/zram/Kconfig @@ -28,10 +28,3 @@ config ZRAM_DEBUG help This option adds additional debugging code to the compressed RAM block device driver. - -config ZRAM_FOR_ANDROID - bool "Optimize zram behavior for android" - depends on ZRAM && ANDROID - default n - help - This option enables modified zram behavior optimized for android diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 5258c78..aab4ec4 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c @@ -32,16 +32,12 @@ #include <linux/lzo.h> #include <linux/string.h> #include <linux/vmalloc.h> -#ifdef CONFIG_ZRAM_FOR_ANDROID -#include <linux/swap.h> -#endif /* CONFIG_ZRAM_FOR_ANDROID */ - #include "zram_drv.h" /* Globals */ static int zram_major; -struct zram *zram_devices; +struct zram *devices; /* Module params (documentation at end) */ unsigned int num_devices; @@ -137,22 +133,6 @@ static void zram_set_disksize(struct zram *zram, size_t totalram_bytes) zram->disksize &= PAGE_MASK; } -#ifdef CONFIG_ZRAM_FOR_ANDROID -/* - * Swap header (1st page of swap device) contains information - * about a swap file/partition. Prepare such a header for the - * given ramzswap device so that swapon can identify it as a - * swap partition. - */ -static void setup_swap_header(struct zram *zram, union swap_header *s) -{ - s->info.version = 1; - s->info.last_page = (zram->disksize >> PAGE_SHIFT) - 1; - s->info.nr_badpages = 0; - memcpy(s->magic.magic, "SWAPSPACE2", 10); -} -#endif /* CONFIG_ZRAM_FOR_ANDROID */ - static void zram_free_page(struct zram *zram, size_t index) { u32 clen; @@ -521,10 +501,6 @@ int zram_init_device(struct zram *zram) { int ret; size_t num_pages; -#ifdef CONFIG_ZRAM_FOR_ANDROID - struct page *page; - union swap_header *swap_header; -#endif /* CONFIG_ZRAM_FOR_ANDROID */ mutex_lock(&zram->init_lock); @@ -559,19 +535,6 @@ int zram_init_device(struct zram *zram) goto fail; } -#ifdef CONFIG_ZRAM_FOR_ANDROID - page = alloc_page(__GFP_ZERO); - if (!page) { - pr_err("Error allocating swap header page\n"); - ret = -ENOMEM; - goto fail; - } - zram->table[0].page = page; - zram_set_flag(zram, 0, ZRAM_UNCOMPRESSED); - swap_header = kmap(page); - setup_swap_header(zram, swap_header); - kunmap(page); -#endif /* CONFIG_ZRAM_FOR_ANDROID */ set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); /* zram devices sort of resembles non-rotational disks */ @@ -715,14 +678,14 @@ static int __init zram_init(void) /* Allocate the device array and initialize each one */ pr_info("Creating %u devices ...\n", num_devices); - zram_devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL); - if (!zram_devices) { + devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL); + if (!devices) { ret = -ENOMEM; goto unregister; } for (dev_id = 0; dev_id < num_devices; dev_id++) { - ret = create_device(&zram_devices[dev_id], dev_id); + ret = create_device(&devices[dev_id], dev_id); if (ret) goto free_devices; } @@ -731,8 +694,8 @@ static int __init zram_init(void) free_devices: while (dev_id) - destroy_device(&zram_devices[--dev_id]); - kfree(zram_devices); + destroy_device(&devices[--dev_id]); + kfree(devices); unregister: unregister_blkdev(zram_major, "zram"); out: @@ -745,7 +708,7 @@ static void __exit zram_exit(void) struct zram *zram; for (i = 0; i < num_devices; i++) { - zram = &zram_devices[i]; + zram = &devices[i]; destroy_device(zram); if (zram->init_done) @@ -754,7 +717,7 @@ static void __exit zram_exit(void) unregister_blkdev(zram_major, "zram"); - kfree(zram_devices); + kfree(devices); pr_debug("Cleanup done!\n"); } diff --git a/drivers/staging/zram/zram_drv.h b/drivers/staging/zram/zram_drv.h index 3ad9486..408b2c0 100644 --- a/drivers/staging/zram/zram_drv.h +++ b/drivers/staging/zram/zram_drv.h @@ -120,7 +120,7 @@ struct zram { struct zram_stats stats; }; -extern struct zram *zram_devices; +extern struct zram *devices; extern unsigned int num_devices; #ifdef CONFIG_SYSFS extern struct attribute_group zram_disk_attr_group; diff --git a/drivers/staging/zram/zram_sysfs.c b/drivers/staging/zram/zram_sysfs.c index 8a23554..6996eb3 100644 --- a/drivers/staging/zram/zram_sysfs.c +++ b/drivers/staging/zram/zram_sysfs.c @@ -35,7 +35,7 @@ static struct zram *dev_to_zram(struct device *dev) struct zram *zram = NULL; for (i = 0; i < num_devices; i++) { - zram = &zram_devices[i]; + zram = &devices[i]; if (disk_to_dev(zram->disk) == dev) break; } @@ -80,41 +80,12 @@ static ssize_t initstate_show(struct device *dev, return sprintf(buf, "%u\n", zram->init_done); } -#ifdef CONFIG_ZRAM_FOR_ANDROID -extern int swapon(const char*specialfile, int swap_flags); - -static ssize_t initstate_store(struct device *dev, - struct device_attribute *attr, const char *buf, - size_t len) -{ - int ret; - unsigned long do_init; - struct zram *zram = dev_to_zram(dev); - - if (zram->init_done) { - pr_info("the device is initialized device\n"); - return -EBUSY; - } - - ret = strict_strtoul(buf, 10, &do_init); - if (ret) - return ret; - if (!do_init) - return -EINVAL; - - zram_init_device(zram); - swapon("/dev/block/zram0", 0); - return len; -} -#else static inline ssize_t initstate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { return 0; } -#endif /* CONFIG_ZRAM_FOR_ANDROID */ - static ssize_t reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) |