On Tue, Dec 12, 2023 at 4:25 AM Jason Gunthorpe jgg@nvidia.com wrote:
On Thu, Dec 07, 2023 at 04:52:39PM -0800, Mina Almasry wrote:
+static inline struct page_pool_iov *page_to_page_pool_iov(struct page *page) +{
if (page_is_page_pool_iov(page))
return (struct page_pool_iov *)((unsigned long)page & ~PP_IOV);
DEBUG_NET_WARN_ON_ONCE(true);
return NULL;
+}
We already asked not to do this, please do not allocate weird things can call them 'struct page' when they are not. It undermines the maintainability of the mm to have things mis-typed like this. Introduce a new type for your thing so the compiler can check it properly.
There is a new type introduced, it's the page_pool_iov. We set the LSB on page_pool_iov* and cast it to page* only to avoid the churn of renaming page* to page_pool_iov* in the page_pool and all the net drivers using it. Is that not a reasonable compromise in your opinion? Since the LSB is set on the resulting page pointers, they are not actually usuable as pages, and are never passed to mm APIs per your requirement.