@@ -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+
15821601static int zram_read_page (struct zram * zram , struct page * page , u32 index ,
15831602 struct bio * parent )
15841603{
0 commit comments