On Fri, Oct 11, 2024 at 4:40 AM Yunsheng Lin <linyunsheng@xxxxxxxxxx> wrote: > > On 2024/10/10 22:33, Alexander Duyck wrote: > > ... > > > > > For the decodes yes. I was referring to page_frag_encode_page. > > Basically the output from that isn't anything page frag, it is your > > encoded page type so you could probably just call it > > encoded_page_encode, or encoded_page_create or something like that. > > It is kind of confusing as there is some mix of encode/encoded/decode > here, but let's be more specific if it is something like below: > > static unsigned long encoded_page_create(struct page *page, unsigned int order, > bool pfmemalloc) > { > BUILD_BUG_ON(PAGE_FRAG_CACHE_MAX_ORDER > PAGE_FRAG_CACHE_ORDER_MASK); > BUILD_BUG_ON(PAGE_FRAG_CACHE_PFMEMALLOC_BIT >= PAGE_SIZE); > > return (unsigned long)page_address(page) | > (order & PAGE_FRAG_CACHE_ORDER_MASK) | > ((unsigned long)pfmemalloc * PAGE_FRAG_CACHE_PFMEMALLOC_BIT); > } > > static inline bool encoded_page_decode_pfmemalloc(unsigned long encoded_page) > { > return !!(encoded_page & PAGE_FRAG_CACHE_PFMEMALLOC_BIT); > } > > static unsigned long encoded_page_decode_order(unsigned long encoded_page) > { > return encoded_page & PAGE_FRAG_CACHE_ORDER_MASK; > } > > static void *encoded_page_decode_virt(unsigned long encoded_page) > { > return (void *)(encoded_page & PAGE_MASK); > } > > static struct page *encoded_page_decode_page(unsigned long encoded_page) > { > return virt_to_page((void *)encoded_page); > } Yes, this is what I had in mind. Basically the encoded_page is the object you are working on so it becomes the prefix for the function name and the action is the suffix, so you are either doing a "create" to put together the object, or performing a "decode" to get the individual components.