zswap の same filled pages について

Published at: 2021/05/06

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

tags: linuxzswap