helpers.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /* SPDX-License-Identifier: GPL-2.0
  2. *
  3. * page_pool/helpers.h
  4. * Author: Jesper Dangaard Brouer <netoptimizer@brouer.com>
  5. * Copyright (C) 2016 Red Hat, Inc.
  6. */
  7. /**
  8. * DOC: page_pool allocator
  9. *
  10. * The page_pool allocator is optimized for recycling page or page fragment used
  11. * by skb packet and xdp frame.
  12. *
  13. * Basic use involves replacing any alloc_pages() calls with page_pool_alloc(),
  14. * which allocate memory with or without page splitting depending on the
  15. * requested memory size.
  16. *
  17. * If the driver knows that it always requires full pages or its allocations are
  18. * always smaller than half a page, it can use one of the more specific API
  19. * calls:
  20. *
  21. * 1. page_pool_alloc_pages(): allocate memory without page splitting when
  22. * driver knows that the memory it need is always bigger than half of the page
  23. * allocated from page pool. There is no cache line dirtying for 'struct page'
  24. * when a page is recycled back to the page pool.
  25. *
  26. * 2. page_pool_alloc_frag(): allocate memory with page splitting when driver
  27. * knows that the memory it need is always smaller than or equal to half of the
  28. * page allocated from page pool. Page splitting enables memory saving and thus
  29. * avoids TLB/cache miss for data access, but there also is some cost to
  30. * implement page splitting, mainly some cache line dirtying/bouncing for
  31. * 'struct page' and atomic operation for page->pp_ref_count.
  32. *
  33. * The API keeps track of in-flight pages, in order to let API users know when
  34. * it is safe to free a page_pool object, the API users must call
  35. * page_pool_put_page() or page_pool_free_va() to free the page_pool object, or
  36. * attach the page_pool object to a page_pool-aware object like skbs marked with
  37. * skb_mark_for_recycle().
  38. *
  39. * page_pool_put_page() may be called multiple times on the same page if a page
  40. * is split into multiple fragments. For the last fragment, it will either
  41. * recycle the page, or in case of page->_refcount > 1, it will release the DMA
  42. * mapping and in-flight state accounting.
  43. *
  44. * dma_sync_single_range_for_device() is only called for the last fragment when
  45. * page_pool is created with PP_FLAG_DMA_SYNC_DEV flag, so it depends on the
  46. * last freed fragment to do the sync_for_device operation for all fragments in
  47. * the same page when a page is split. The API user must setup pool->p.max_len
  48. * and pool->p.offset correctly and ensure that page_pool_put_page() is called
  49. * with dma_sync_size being -1 for fragment API.
  50. */
  51. #ifndef _NET_PAGE_POOL_HELPERS_H
  52. #define _NET_PAGE_POOL_HELPERS_H
  53. #include <linux/dma-mapping.h>
  54. #include <net/page_pool/types.h>
  55. #include <net/net_debug.h>
  56. #include <net/netmem.h>
  57. #ifdef CONFIG_PAGE_POOL_STATS
  58. /* Deprecated driver-facing API, use netlink instead */
  59. int page_pool_ethtool_stats_get_count(void);
  60. u8 *page_pool_ethtool_stats_get_strings(u8 *data);
  61. u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats);
  62. bool page_pool_get_stats(const struct page_pool *pool,
  63. struct page_pool_stats *stats);
  64. #else
  65. static inline int page_pool_ethtool_stats_get_count(void)
  66. {
  67. return 0;
  68. }
  69. static inline u8 *page_pool_ethtool_stats_get_strings(u8 *data)
  70. {
  71. return data;
  72. }
  73. static inline u64 *page_pool_ethtool_stats_get(u64 *data, const void *stats)
  74. {
  75. return data;
  76. }
  77. #endif
  78. /**
  79. * page_pool_dev_alloc_pages() - allocate a page.
  80. * @pool: pool from which to allocate
  81. *
  82. * Get a page from the page allocator or page_pool caches.
  83. */
  84. static inline struct page *page_pool_dev_alloc_pages(struct page_pool *pool)
  85. {
  86. gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
  87. return page_pool_alloc_pages(pool, gfp);
  88. }
  89. /**
  90. * page_pool_dev_alloc_frag() - allocate a page fragment.
  91. * @pool: pool from which to allocate
  92. * @offset: offset to the allocated page
  93. * @size: requested size
  94. *
  95. * Get a page fragment from the page allocator or page_pool caches.
  96. *
  97. * Return:
  98. * Return allocated page fragment, otherwise return NULL.
  99. */
  100. static inline struct page *page_pool_dev_alloc_frag(struct page_pool *pool,
  101. unsigned int *offset,
  102. unsigned int size)
  103. {
  104. gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
  105. return page_pool_alloc_frag(pool, offset, size, gfp);
  106. }
  107. static inline struct page *page_pool_alloc(struct page_pool *pool,
  108. unsigned int *offset,
  109. unsigned int *size, gfp_t gfp)
  110. {
  111. unsigned int max_size = PAGE_SIZE << pool->p.order;
  112. struct page *page;
  113. if ((*size << 1) > max_size) {
  114. *size = max_size;
  115. *offset = 0;
  116. return page_pool_alloc_pages(pool, gfp);
  117. }
  118. page = page_pool_alloc_frag(pool, offset, *size, gfp);
  119. if (unlikely(!page))
  120. return NULL;
  121. /* There is very likely not enough space for another fragment, so append
  122. * the remaining size to the current fragment to avoid truesize
  123. * underestimate problem.
  124. */
  125. if (pool->frag_offset + *size > max_size) {
  126. *size = max_size - *offset;
  127. pool->frag_offset = max_size;
  128. }
  129. return page;
  130. }
  131. /**
  132. * page_pool_dev_alloc() - allocate a page or a page fragment.
  133. * @pool: pool from which to allocate
  134. * @offset: offset to the allocated page
  135. * @size: in as the requested size, out as the allocated size
  136. *
  137. * Get a page or a page fragment from the page allocator or page_pool caches
  138. * depending on the requested size in order to allocate memory with least memory
  139. * utilization and performance penalty.
  140. *
  141. * Return:
  142. * Return allocated page or page fragment, otherwise return NULL.
  143. */
  144. static inline struct page *page_pool_dev_alloc(struct page_pool *pool,
  145. unsigned int *offset,
  146. unsigned int *size)
  147. {
  148. gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
  149. return page_pool_alloc(pool, offset, size, gfp);
  150. }
  151. static inline void *page_pool_alloc_va(struct page_pool *pool,
  152. unsigned int *size, gfp_t gfp)
  153. {
  154. unsigned int offset;
  155. struct page *page;
  156. /* Mask off __GFP_HIGHMEM to ensure we can use page_address() */
  157. page = page_pool_alloc(pool, &offset, size, gfp & ~__GFP_HIGHMEM);
  158. if (unlikely(!page))
  159. return NULL;
  160. return page_address(page) + offset;
  161. }
  162. /**
  163. * page_pool_dev_alloc_va() - allocate a page or a page fragment and return its
  164. * va.
  165. * @pool: pool from which to allocate
  166. * @size: in as the requested size, out as the allocated size
  167. *
  168. * This is just a thin wrapper around the page_pool_alloc() API, and
  169. * it returns va of the allocated page or page fragment.
  170. *
  171. * Return:
  172. * Return the va for the allocated page or page fragment, otherwise return NULL.
  173. */
  174. static inline void *page_pool_dev_alloc_va(struct page_pool *pool,
  175. unsigned int *size)
  176. {
  177. gfp_t gfp = (GFP_ATOMIC | __GFP_NOWARN);
  178. return page_pool_alloc_va(pool, size, gfp);
  179. }
  180. /**
  181. * page_pool_get_dma_dir() - Retrieve the stored DMA direction.
  182. * @pool: pool from which page was allocated
  183. *
  184. * Get the stored dma direction. A driver might decide to store this locally
  185. * and avoid the extra cache line from page_pool to determine the direction.
  186. */
  187. static inline enum dma_data_direction
  188. page_pool_get_dma_dir(const struct page_pool *pool)
  189. {
  190. return pool->p.dma_dir;
  191. }
  192. static inline void page_pool_fragment_netmem(netmem_ref netmem, long nr)
  193. {
  194. atomic_long_set(netmem_get_pp_ref_count_ref(netmem), nr);
  195. }
  196. /**
  197. * page_pool_fragment_page() - split a fresh page into fragments
  198. * @page: page to split
  199. * @nr: references to set
  200. *
  201. * pp_ref_count represents the number of outstanding references to the page,
  202. * which will be freed using page_pool APIs (rather than page allocator APIs
  203. * like put_page()). Such references are usually held by page_pool-aware
  204. * objects like skbs marked for page pool recycling.
  205. *
  206. * This helper allows the caller to take (set) multiple references to a
  207. * freshly allocated page. The page must be freshly allocated (have a
  208. * pp_ref_count of 1). This is commonly done by drivers and
  209. * "fragment allocators" to save atomic operations - either when they know
  210. * upfront how many references they will need; or to take MAX references and
  211. * return the unused ones with a single atomic dec(), instead of performing
  212. * multiple atomic inc() operations.
  213. */
  214. static inline void page_pool_fragment_page(struct page *page, long nr)
  215. {
  216. page_pool_fragment_netmem(page_to_netmem(page), nr);
  217. }
  218. static inline long page_pool_unref_netmem(netmem_ref netmem, long nr)
  219. {
  220. atomic_long_t *pp_ref_count = netmem_get_pp_ref_count_ref(netmem);
  221. long ret;
  222. /* If nr == pp_ref_count then we have cleared all remaining
  223. * references to the page:
  224. * 1. 'n == 1': no need to actually overwrite it.
  225. * 2. 'n != 1': overwrite it with one, which is the rare case
  226. * for pp_ref_count draining.
  227. *
  228. * The main advantage to doing this is that not only we avoid a atomic
  229. * update, as an atomic_read is generally a much cheaper operation than
  230. * an atomic update, especially when dealing with a page that may be
  231. * referenced by only 2 or 3 users; but also unify the pp_ref_count
  232. * handling by ensuring all pages have partitioned into only 1 piece
  233. * initially, and only overwrite it when the page is partitioned into
  234. * more than one piece.
  235. */
  236. if (atomic_long_read(pp_ref_count) == nr) {
  237. /* As we have ensured nr is always one for constant case using
  238. * the BUILD_BUG_ON(), only need to handle the non-constant case
  239. * here for pp_ref_count draining, which is a rare case.
  240. */
  241. BUILD_BUG_ON(__builtin_constant_p(nr) && nr != 1);
  242. if (!__builtin_constant_p(nr))
  243. atomic_long_set(pp_ref_count, 1);
  244. return 0;
  245. }
  246. ret = atomic_long_sub_return(nr, pp_ref_count);
  247. WARN_ON(ret < 0);
  248. /* We are the last user here too, reset pp_ref_count back to 1 to
  249. * ensure all pages have been partitioned into 1 piece initially,
  250. * this should be the rare case when the last two fragment users call
  251. * page_pool_unref_page() currently.
  252. */
  253. if (unlikely(!ret))
  254. atomic_long_set(pp_ref_count, 1);
  255. return ret;
  256. }
  257. static inline long page_pool_unref_page(struct page *page, long nr)
  258. {
  259. return page_pool_unref_netmem(page_to_netmem(page), nr);
  260. }
  261. static inline void page_pool_ref_netmem(netmem_ref netmem)
  262. {
  263. atomic_long_inc(netmem_get_pp_ref_count_ref(netmem));
  264. }
  265. static inline void page_pool_ref_page(struct page *page)
  266. {
  267. page_pool_ref_netmem(page_to_netmem(page));
  268. }
  269. static inline bool page_pool_is_last_ref(netmem_ref netmem)
  270. {
  271. /* If page_pool_unref_page() returns 0, we were the last user */
  272. return page_pool_unref_netmem(netmem, 1) == 0;
  273. }
  274. static inline void page_pool_put_netmem(struct page_pool *pool,
  275. netmem_ref netmem,
  276. unsigned int dma_sync_size,
  277. bool allow_direct)
  278. {
  279. /* When page_pool isn't compiled-in, net/core/xdp.c doesn't
  280. * allow registering MEM_TYPE_PAGE_POOL, but shield linker.
  281. */
  282. #ifdef CONFIG_PAGE_POOL
  283. if (!page_pool_is_last_ref(netmem))
  284. return;
  285. page_pool_put_unrefed_netmem(pool, netmem, dma_sync_size, allow_direct);
  286. #endif
  287. }
  288. /**
  289. * page_pool_put_page() - release a reference to a page pool page
  290. * @pool: pool from which page was allocated
  291. * @page: page to release a reference on
  292. * @dma_sync_size: how much of the page may have been touched by the device
  293. * @allow_direct: released by the consumer, allow lockless caching
  294. *
  295. * The outcome of this depends on the page refcnt. If the driver bumps
  296. * the refcnt > 1 this will unmap the page. If the page refcnt is 1
  297. * the allocator owns the page and will try to recycle it in one of the pool
  298. * caches. If PP_FLAG_DMA_SYNC_DEV is set, the page will be synced for_device
  299. * using dma_sync_single_range_for_device().
  300. */
  301. static inline void page_pool_put_page(struct page_pool *pool,
  302. struct page *page,
  303. unsigned int dma_sync_size,
  304. bool allow_direct)
  305. {
  306. page_pool_put_netmem(pool, page_to_netmem(page), dma_sync_size,
  307. allow_direct);
  308. }
  309. static inline void page_pool_put_full_netmem(struct page_pool *pool,
  310. netmem_ref netmem,
  311. bool allow_direct)
  312. {
  313. page_pool_put_netmem(pool, netmem, -1, allow_direct);
  314. }
  315. /**
  316. * page_pool_put_full_page() - release a reference on a page pool page
  317. * @pool: pool from which page was allocated
  318. * @page: page to release a reference on
  319. * @allow_direct: released by the consumer, allow lockless caching
  320. *
  321. * Similar to page_pool_put_page(), but will DMA sync the entire memory area
  322. * as configured in &page_pool_params.max_len.
  323. */
  324. static inline void page_pool_put_full_page(struct page_pool *pool,
  325. struct page *page, bool allow_direct)
  326. {
  327. page_pool_put_netmem(pool, page_to_netmem(page), -1, allow_direct);
  328. }
  329. /**
  330. * page_pool_recycle_direct() - release a reference on a page pool page
  331. * @pool: pool from which page was allocated
  332. * @page: page to release a reference on
  333. *
  334. * Similar to page_pool_put_full_page() but caller must guarantee safe context
  335. * (e.g NAPI), since it will recycle the page directly into the pool fast cache.
  336. */
  337. static inline void page_pool_recycle_direct(struct page_pool *pool,
  338. struct page *page)
  339. {
  340. page_pool_put_full_page(pool, page, true);
  341. }
  342. #define PAGE_POOL_32BIT_ARCH_WITH_64BIT_DMA \
  343. (sizeof(dma_addr_t) > sizeof(unsigned long))
  344. /**
  345. * page_pool_free_va() - free a va into the page_pool
  346. * @pool: pool from which va was allocated
  347. * @va: va to be freed
  348. * @allow_direct: freed by the consumer, allow lockless caching
  349. *
  350. * Free a va allocated from page_pool_allo_va().
  351. */
  352. static inline void page_pool_free_va(struct page_pool *pool, void *va,
  353. bool allow_direct)
  354. {
  355. page_pool_put_page(pool, virt_to_head_page(va), -1, allow_direct);
  356. }
  357. static inline dma_addr_t page_pool_get_dma_addr_netmem(netmem_ref netmem)
  358. {
  359. dma_addr_t ret = netmem_get_dma_addr(netmem);
  360. if (PAGE_POOL_32BIT_ARCH_WITH_64BIT_DMA)
  361. ret <<= PAGE_SHIFT;
  362. return ret;
  363. }
  364. /**
  365. * page_pool_get_dma_addr() - Retrieve the stored DMA address.
  366. * @page: page allocated from a page pool
  367. *
  368. * Fetch the DMA address of the page. The page pool to which the page belongs
  369. * must had been created with PP_FLAG_DMA_MAP.
  370. */
  371. static inline dma_addr_t page_pool_get_dma_addr(const struct page *page)
  372. {
  373. return page_pool_get_dma_addr_netmem(page_to_netmem((struct page *)page));
  374. }
  375. /**
  376. * page_pool_dma_sync_for_cpu - sync Rx page for CPU after it's written by HW
  377. * @pool: &page_pool the @page belongs to
  378. * @page: page to sync
  379. * @offset: offset from page start to "hard" start if using PP frags
  380. * @dma_sync_size: size of the data written to the page
  381. *
  382. * Can be used as a shorthand to sync Rx pages before accessing them in the
  383. * driver. Caller must ensure the pool was created with ``PP_FLAG_DMA_MAP``.
  384. * Note that this version performs DMA sync unconditionally, even if the
  385. * associated PP doesn't perform sync-for-device.
  386. */
  387. static inline void page_pool_dma_sync_for_cpu(const struct page_pool *pool,
  388. const struct page *page,
  389. u32 offset, u32 dma_sync_size)
  390. {
  391. dma_sync_single_range_for_cpu(pool->p.dev,
  392. page_pool_get_dma_addr(page),
  393. offset + pool->p.offset, dma_sync_size,
  394. page_pool_get_dma_dir(pool));
  395. }
  396. static inline bool page_pool_put(struct page_pool *pool)
  397. {
  398. return refcount_dec_and_test(&pool->user_cnt);
  399. }
  400. static inline void page_pool_nid_changed(struct page_pool *pool, int new_nid)
  401. {
  402. if (unlikely(pool->p.nid != new_nid))
  403. page_pool_update_nid(pool, new_nid);
  404. }
  405. #endif /* _NET_PAGE_POOL_HELPERS_H */