I think it's bit confusing to have relay_alloc_page_array() return a pointer to struct page as it's really allocating an _array_ of pointers to struct page. So why not just use void * here as the kernel memory allocators do?