1Page fragments 2-------------- 3 4A page fragment is an arbitrary-length arbitrary-offset area of memory 5which resides within a 0 or higher order compound page. Multiple 6fragments within that page are individually refcounted, in the page's 7reference counter. 8 9The page_frag functions, page_frag_alloc and page_frag_free, provide a 10simple allocation framework for page fragments. This is used by the 11network stack and network device drivers to provide a backing region of 12memory for use as either an sk_buff->head, or to be used in the "frags" 13portion of skb_shared_info. 14 15In order to make use of the page fragment APIs a backing page fragment 16cache is needed. This provides a central point for the fragment allocation 17and tracks allows multiple calls to make use of a cached page. The 18advantage to doing this is that multiple calls to get_page can be avoided 19which can be expensive at allocation time. However due to the nature of 20this caching it is required that any calls to the cache be protected by 21either a per-cpu limitation, or a per-cpu limitation and forcing interrupts 22to be disabled when executing the fragment allocation. 23 24The network stack uses two separate caches per CPU to handle fragment 25allocation. The netdev_alloc_cache is used by callers making use of the 26__netdev_alloc_frag and __netdev_alloc_skb calls. The napi_alloc_cache is 27used by callers of the __napi_alloc_frag and __napi_alloc_skb calls. The 28main difference between these two calls is the context in which they may be 29called. The "netdev" prefixed functions are usable in any context as these 30functions will disable interrupts, while the "napi" prefixed functions are 31only usable within the softirq context. 32 33Many network device drivers use a similar methodology for allocating page 34fragments, but the page fragments are cached at the ring or descriptor 35level. In order to enable these cases it is necessary to provide a generic 36way of tearing down a page cache. For this reason __page_frag_cache_drain 37was implemented. It allows for freeing multiple references from a single 38page via a single call. The advantage to doing this is that it allows for 39cleaning up the multiple references that were added to a page in order to 40avoid calling get_page per allocation. 41 42Alexander Duyck, Nov 29, 2016. 43