zswap の same filled pages について
Published: 2021/5/6
Zswap には、 same filled pages があるが、それはどういうものかについての覚書。
Zswap は、圧縮して管理対象にしたページに対しては、その管理用のメタデータを保持する。 そのメタデータにおいて、圧縮後のバイト数とプール上の場所を表す handle を保持する必要があるが、 そこにバイト数を0、handle を実際の何かしらの long 値を突っ込むことで、 その long 値が繰り返し現れていたページを表現する。
struct zswap_entry {
struct rb_node rbnode;
pgoff_t offset;
int refcount;
unsigned int length;
struct zswap_pool *pool;
union {
unsigned long handle;
unsigned long value;
};
};
このように管理することで、同一の long 値が繰り返されるようなページに対しては、 メタデータだけでそれを表現して、圧縮してしまうことが可能になり、 これが same filled page の動作原理である。
おそらく、 0 埋めのページなどがよくある利用パターンなのだろうな、と思われる。
参考: https://github.com/torvalds/linux/blob/master/mm/zswap.c