True but then we pass an address to kmem_freepages that is not the start
of the page. kmem_freepages will then in turn call free_pages() with an
address that is not the start of a page. free_pages() will then do another
virt_to_page() which ignored the offset into the page again. And so the
approach works but an uneasy feeling remains since the address we got from
kmem_getpages() is different from what we pass to kmem_freepages().
Could you think about a way to do this in a cleaner way? Maybe use a
struct page * in both kmem_get/freepages? Or add some comment explaining