Skip to content

Commit e355b25

Browse files
sergey-senozhatskyakpm00
authored andcommitted
zram: factor out different page types read
Similarly to write, split the page read code into ZRAM_HUGE read, ZRAM_SAME read and compressed page read to simplify the code. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Sergey Senozhatsky <[email protected]> Cc: Minchan Kim <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
1 parent ef932cd commit e355b25

File tree

1 file changed

+52
-33
lines changed

1 file changed

+52
-33
lines changed

drivers/block/zram/zram_drv.c

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,54 +1531,73 @@ static void zram_free_page(struct zram *zram, size_t index)
15311531
zram_set_obj_size(zram, index, 0);
15321532
}
15331533

1534-
/*
1535-
* Reads (decompresses if needed) a page from zspool (zsmalloc).
1536-
* Corresponding ZRAM slot should be locked.
1537-
*/
1538-
static int zram_read_from_zspool(struct zram *zram, struct page *page,
1534+
static int read_same_filled_page(struct zram *zram, struct page *page,
15391535
u32 index)
15401536
{
1541-
struct zcomp_strm *zstrm;
1537+
void *mem;
1538+
1539+
mem = kmap_local_page(page);
1540+
zram_fill_page(mem, PAGE_SIZE, zram_get_handle(zram, index));
1541+
kunmap_local(mem);
1542+
return 0;
1543+
}
1544+
1545+
static int read_incompressible_page(struct zram *zram, struct page *page,
1546+
u32 index)
1547+
{
15421548
unsigned long handle;
1543-
unsigned int size;
15441549
void *src, *dst;
1545-
u32 prio;
1546-
int ret;
15471550

15481551
handle = zram_get_handle(zram, index);
1549-
if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) {
1550-
void *mem;
1552+
src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
1553+
dst = kmap_local_page(page);
1554+
copy_page(dst, src);
1555+
kunmap_local(dst);
1556+
zs_unmap_object(zram->mem_pool, handle);
15511557

1552-
mem = kmap_local_page(page);
1553-
zram_fill_page(mem, PAGE_SIZE, handle);
1554-
kunmap_local(mem);
1555-
return 0;
1556-
}
1558+
return 0;
1559+
}
15571560

1558-
size = zram_get_obj_size(zram, index);
1561+
static int read_compressed_page(struct zram *zram, struct page *page, u32 index)
1562+
{
1563+
struct zcomp_strm *zstrm;
1564+
unsigned long handle;
1565+
unsigned int size;
1566+
void *src, *dst;
1567+
int ret, prio;
15591568

1560-
if (size != PAGE_SIZE) {
1561-
prio = zram_get_priority(zram, index);
1562-
zstrm = zcomp_stream_get(zram->comps[prio]);
1563-
}
1569+
handle = zram_get_handle(zram, index);
1570+
size = zram_get_obj_size(zram, index);
1571+
prio = zram_get_priority(zram, index);
15641572

1573+
zstrm = zcomp_stream_get(zram->comps[prio]);
15651574
src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
1566-
if (size == PAGE_SIZE) {
1567-
dst = kmap_local_page(page);
1568-
copy_page(dst, src);
1569-
kunmap_local(dst);
1570-
ret = 0;
1571-
} else {
1572-
dst = kmap_local_page(page);
1573-
ret = zcomp_decompress(zram->comps[prio], zstrm,
1574-
src, size, dst);
1575-
kunmap_local(dst);
1576-
zcomp_stream_put(zram->comps[prio]);
1577-
}
1575+
dst = kmap_local_page(page);
1576+
ret = zcomp_decompress(zram->comps[prio], zstrm, src, size, dst);
1577+
kunmap_local(dst);
15781578
zs_unmap_object(zram->mem_pool, handle);
1579+
zcomp_stream_put(zram->comps[prio]);
1580+
15791581
return ret;
15801582
}
15811583

1584+
/*
1585+
* Reads (decompresses if needed) a page from zspool (zsmalloc).
1586+
* Corresponding ZRAM slot should be locked.
1587+
*/
1588+
static int zram_read_from_zspool(struct zram *zram, struct page *page,
1589+
u32 index)
1590+
{
1591+
if (zram_test_flag(zram, index, ZRAM_SAME) ||
1592+
!zram_get_handle(zram, index))
1593+
return read_same_filled_page(zram, page, index);
1594+
1595+
if (!zram_test_flag(zram, index, ZRAM_HUGE))
1596+
return read_compressed_page(zram, page, index);
1597+
else
1598+
return read_incompressible_page(zram, page, index);
1599+
}
1600+
15821601
static int zram_read_page(struct zram *zram, struct page *page, u32 index,
15831602
struct bio *parent)
15841603
{

0 commit comments

Comments
 (0)