Commit 3f2b1a04 authored by Minchan Kim's avatar Minchan Kim Committed by Linus Torvalds

zram: revive swap_slot_free_notify

Commit b430e9d1 ("remove compressed copy from zram in-memory")
applied swap_slot_free_notify call in *end_swap_bio_read* to remove
duplicated memory between zram and memory.

However, with the introduction of rw_page in zram: 8c7f0102 ("zram:
implement rw_page operation of zram"), it became void because rw_page
doesn't need bio.

Memory footprint is really important in embedded platforms which have
small memory, for example, 512M) recently because it could start to kill
processes if memory footprint exceeds some threshold by LMK or some
similar memory management modules.

This patch restores the function for rw_page, thereby eliminating this
duplication.
Signed-off-by: default avatarMinchan Kim <minchan@kernel.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: karam.lee <karam.lee@lge.com>
Cc: <sangseok.lee@lge.com>
Cc: Chan Jeong <chan.jeong@lge.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d750c42a
...@@ -66,21 +66,10 @@ void end_swap_bio_write(struct bio *bio) ...@@ -66,21 +66,10 @@ void end_swap_bio_write(struct bio *bio)
bio_put(bio); bio_put(bio);
} }
static void end_swap_bio_read(struct bio *bio) static void swap_slot_free_notify(struct page *page)
{ {
struct page *page = bio->bi_io_vec[0].bv_page; struct swap_info_struct *sis;
struct gendisk *disk;
if (bio->bi_error) {
SetPageError(page);
ClearPageUptodate(page);
pr_alert("Read-error on swap-device (%u:%u:%llu)\n",
imajor(bio->bi_bdev->bd_inode),
iminor(bio->bi_bdev->bd_inode),
(unsigned long long)bio->bi_iter.bi_sector);
goto out;
}
SetPageUptodate(page);
/* /*
* There is no guarantee that the page is in swap cache - the software * There is no guarantee that the page is in swap cache - the software
...@@ -88,11 +77,13 @@ static void end_swap_bio_read(struct bio *bio) ...@@ -88,11 +77,13 @@ static void end_swap_bio_read(struct bio *bio)
* swapcache page. So we must check PG_swapcache before proceeding with * swapcache page. So we must check PG_swapcache before proceeding with
* this optimization. * this optimization.
*/ */
if (likely(PageSwapCache(page))) { if (unlikely(!PageSwapCache(page)))
struct swap_info_struct *sis; return;
sis = page_swap_info(page); sis = page_swap_info(page);
if (sis->flags & SWP_BLKDEV) { if (!(sis->flags & SWP_BLKDEV))
return;
/* /*
* The swap subsystem performs lazy swap slot freeing, * The swap subsystem performs lazy swap slot freeing,
* expecting that the page will be swapped out again. * expecting that the page will be swapped out again.
...@@ -109,7 +100,7 @@ static void end_swap_bio_read(struct bio *bio) ...@@ -109,7 +100,7 @@ static void end_swap_bio_read(struct bio *bio)
* so the page should be swapped out somewhere again if * so the page should be swapped out somewhere again if
* we again wish to reclaim it. * we again wish to reclaim it.
*/ */
struct gendisk *disk = sis->bdev->bd_disk; disk = sis->bdev->bd_disk;
if (disk->fops->swap_slot_free_notify) { if (disk->fops->swap_slot_free_notify) {
swp_entry_t entry; swp_entry_t entry;
unsigned long offset; unsigned long offset;
...@@ -121,9 +112,24 @@ static void end_swap_bio_read(struct bio *bio) ...@@ -121,9 +112,24 @@ static void end_swap_bio_read(struct bio *bio)
disk->fops->swap_slot_free_notify(sis->bdev, disk->fops->swap_slot_free_notify(sis->bdev,
offset); offset);
} }
} }
static void end_swap_bio_read(struct bio *bio)
{
struct page *page = bio->bi_io_vec[0].bv_page;
if (bio->bi_error) {
SetPageError(page);
ClearPageUptodate(page);
pr_alert("Read-error on swap-device (%u:%u:%llu)\n",
imajor(bio->bi_bdev->bd_inode),
iminor(bio->bi_bdev->bd_inode),
(unsigned long long)bio->bi_iter.bi_sector);
goto out;
} }
SetPageUptodate(page);
swap_slot_free_notify(page);
out: out:
unlock_page(page); unlock_page(page);
bio_put(bio); bio_put(bio);
...@@ -347,6 +353,7 @@ int swap_readpage(struct page *page) ...@@ -347,6 +353,7 @@ int swap_readpage(struct page *page)
ret = bdev_read_page(sis->bdev, swap_page_sector(page), page); ret = bdev_read_page(sis->bdev, swap_page_sector(page), page);
if (!ret) { if (!ret) {
swap_slot_free_notify(page);
count_vm_event(PSWPIN); count_vm_event(PSWPIN);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment