]> Git Repo - linux.git/blob - net/core/page_pool.c
mm/page_alloc: free pages in a single pass during bulk free
[linux.git] / net / core / page_pool.c
1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * page_pool.c
4  *      Author: Jesper Dangaard Brouer <[email protected]>
5  *      Copyright (C) 2016 Red Hat, Inc.
6  */
7
8 #include <linux/types.h>
9 #include <linux/kernel.h>
10 #include <linux/slab.h>
11 #include <linux/device.h>
12
13 #include <net/page_pool.h>
14 #include <net/xdp.h>
15
16 #include <linux/dma-direction.h>
17 #include <linux/dma-mapping.h>
18 #include <linux/page-flags.h>
19 #include <linux/mm.h> /* for __put_page() */
20 #include <linux/poison.h>
21
22 #include <trace/events/page_pool.h>
23
24 #define DEFER_TIME (msecs_to_jiffies(1000))
25 #define DEFER_WARN_INTERVAL (60 * HZ)
26
27 #define BIAS_MAX        LONG_MAX
28
29 static int page_pool_init(struct page_pool *pool,
30                           const struct page_pool_params *params)
31 {
32         unsigned int ring_qsize = 1024; /* Default */
33
34         memcpy(&pool->p, params, sizeof(pool->p));
35
36         /* Validate only known flags were used */
37         if (pool->p.flags & ~(PP_FLAG_ALL))
38                 return -EINVAL;
39
40         if (pool->p.pool_size)
41                 ring_qsize = pool->p.pool_size;
42
43         /* Sanity limit mem that can be pinned down */
44         if (ring_qsize > 32768)
45                 return -E2BIG;
46
47         /* DMA direction is either DMA_FROM_DEVICE or DMA_BIDIRECTIONAL.
48          * DMA_BIDIRECTIONAL is for allowing page used for DMA sending,
49          * which is the XDP_TX use-case.
50          */
51         if (pool->p.flags & PP_FLAG_DMA_MAP) {
52                 if ((pool->p.dma_dir != DMA_FROM_DEVICE) &&
53                     (pool->p.dma_dir != DMA_BIDIRECTIONAL))
54                         return -EINVAL;
55         }
56
57         if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV) {
58                 /* In order to request DMA-sync-for-device the page
59                  * needs to be mapped
60                  */
61                 if (!(pool->p.flags & PP_FLAG_DMA_MAP))
62                         return -EINVAL;
63
64                 if (!pool->p.max_len)
65                         return -EINVAL;
66
67                 /* pool->p.offset has to be set according to the address
68                  * offset used by the DMA engine to start copying rx data
69                  */
70         }
71
72         if (PAGE_POOL_DMA_USE_PP_FRAG_COUNT &&
73             pool->p.flags & PP_FLAG_PAGE_FRAG)
74                 return -EINVAL;
75
76         if (ptr_ring_init(&pool->ring, ring_qsize, GFP_KERNEL) < 0)
77                 return -ENOMEM;
78
79         atomic_set(&pool->pages_state_release_cnt, 0);
80
81         /* Driver calling page_pool_create() also call page_pool_destroy() */
82         refcount_set(&pool->user_cnt, 1);
83
84         if (pool->p.flags & PP_FLAG_DMA_MAP)
85                 get_device(pool->p.dev);
86
87         return 0;
88 }
89
90 struct page_pool *page_pool_create(const struct page_pool_params *params)
91 {
92         struct page_pool *pool;
93         int err;
94
95         pool = kzalloc_node(sizeof(*pool), GFP_KERNEL, params->nid);
96         if (!pool)
97                 return ERR_PTR(-ENOMEM);
98
99         err = page_pool_init(pool, params);
100         if (err < 0) {
101                 pr_warn("%s() gave up with errno %d\n", __func__, err);
102                 kfree(pool);
103                 return ERR_PTR(err);
104         }
105
106         return pool;
107 }
108 EXPORT_SYMBOL(page_pool_create);
109
110 static void page_pool_return_page(struct page_pool *pool, struct page *page);
111
112 noinline
113 static struct page *page_pool_refill_alloc_cache(struct page_pool *pool)
114 {
115         struct ptr_ring *r = &pool->ring;
116         struct page *page;
117         int pref_nid; /* preferred NUMA node */
118
119         /* Quicker fallback, avoid locks when ring is empty */
120         if (__ptr_ring_empty(r))
121                 return NULL;
122
123         /* Softirq guarantee CPU and thus NUMA node is stable. This,
124          * assumes CPU refilling driver RX-ring will also run RX-NAPI.
125          */
126 #ifdef CONFIG_NUMA
127         pref_nid = (pool->p.nid == NUMA_NO_NODE) ? numa_mem_id() : pool->p.nid;
128 #else
129         /* Ignore pool->p.nid setting if !CONFIG_NUMA, helps compiler */
130         pref_nid = numa_mem_id(); /* will be zero like page_to_nid() */
131 #endif
132
133         /* Refill alloc array, but only if NUMA match */
134         do {
135                 page = __ptr_ring_consume(r);
136                 if (unlikely(!page))
137                         break;
138
139                 if (likely(page_to_nid(page) == pref_nid)) {
140                         pool->alloc.cache[pool->alloc.count++] = page;
141                 } else {
142                         /* NUMA mismatch;
143                          * (1) release 1 page to page-allocator and
144                          * (2) break out to fallthrough to alloc_pages_node.
145                          * This limit stress on page buddy alloactor.
146                          */
147                         page_pool_return_page(pool, page);
148                         page = NULL;
149                         break;
150                 }
151         } while (pool->alloc.count < PP_ALLOC_CACHE_REFILL);
152
153         /* Return last page */
154         if (likely(pool->alloc.count > 0))
155                 page = pool->alloc.cache[--pool->alloc.count];
156
157         return page;
158 }
159
160 /* fast path */
161 static struct page *__page_pool_get_cached(struct page_pool *pool)
162 {
163         struct page *page;
164
165         /* Caller MUST guarantee safe non-concurrent access, e.g. softirq */
166         if (likely(pool->alloc.count)) {
167                 /* Fast-path */
168                 page = pool->alloc.cache[--pool->alloc.count];
169         } else {
170                 page = page_pool_refill_alloc_cache(pool);
171         }
172
173         return page;
174 }
175
176 static void page_pool_dma_sync_for_device(struct page_pool *pool,
177                                           struct page *page,
178                                           unsigned int dma_sync_size)
179 {
180         dma_addr_t dma_addr = page_pool_get_dma_addr(page);
181
182         dma_sync_size = min(dma_sync_size, pool->p.max_len);
183         dma_sync_single_range_for_device(pool->p.dev, dma_addr,
184                                          pool->p.offset, dma_sync_size,
185                                          pool->p.dma_dir);
186 }
187
188 static bool page_pool_dma_map(struct page_pool *pool, struct page *page)
189 {
190         dma_addr_t dma;
191
192         /* Setup DMA mapping: use 'struct page' area for storing DMA-addr
193          * since dma_addr_t can be either 32 or 64 bits and does not always fit
194          * into page private data (i.e 32bit cpu with 64bit DMA caps)
195          * This mapping is kept for lifetime of page, until leaving pool.
196          */
197         dma = dma_map_page_attrs(pool->p.dev, page, 0,
198                                  (PAGE_SIZE << pool->p.order),
199                                  pool->p.dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
200         if (dma_mapping_error(pool->p.dev, dma))
201                 return false;
202
203         page_pool_set_dma_addr(page, dma);
204
205         if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV)
206                 page_pool_dma_sync_for_device(pool, page, pool->p.max_len);
207
208         return true;
209 }
210
211 static void page_pool_set_pp_info(struct page_pool *pool,
212                                   struct page *page)
213 {
214         page->pp = pool;
215         page->pp_magic |= PP_SIGNATURE;
216         if (pool->p.init_callback)
217                 pool->p.init_callback(page, pool->p.init_arg);
218 }
219
220 static void page_pool_clear_pp_info(struct page *page)
221 {
222         page->pp_magic = 0;
223         page->pp = NULL;
224 }
225
226 static struct page *__page_pool_alloc_page_order(struct page_pool *pool,
227                                                  gfp_t gfp)
228 {
229         struct page *page;
230
231         gfp |= __GFP_COMP;
232         page = alloc_pages_node(pool->p.nid, gfp, pool->p.order);
233         if (unlikely(!page))
234                 return NULL;
235
236         if ((pool->p.flags & PP_FLAG_DMA_MAP) &&
237             unlikely(!page_pool_dma_map(pool, page))) {
238                 put_page(page);
239                 return NULL;
240         }
241
242         page_pool_set_pp_info(pool, page);
243
244         /* Track how many pages are held 'in-flight' */
245         pool->pages_state_hold_cnt++;
246         trace_page_pool_state_hold(pool, page, pool->pages_state_hold_cnt);
247         return page;
248 }
249
250 /* slow path */
251 noinline
252 static struct page *__page_pool_alloc_pages_slow(struct page_pool *pool,
253                                                  gfp_t gfp)
254 {
255         const int bulk = PP_ALLOC_CACHE_REFILL;
256         unsigned int pp_flags = pool->p.flags;
257         unsigned int pp_order = pool->p.order;
258         struct page *page;
259         int i, nr_pages;
260
261         /* Don't support bulk alloc for high-order pages */
262         if (unlikely(pp_order))
263                 return __page_pool_alloc_page_order(pool, gfp);
264
265         /* Unnecessary as alloc cache is empty, but guarantees zero count */
266         if (unlikely(pool->alloc.count > 0))
267                 return pool->alloc.cache[--pool->alloc.count];
268
269         /* Mark empty alloc.cache slots "empty" for alloc_pages_bulk_array */
270         memset(&pool->alloc.cache, 0, sizeof(void *) * bulk);
271
272         nr_pages = alloc_pages_bulk_array(gfp, bulk, pool->alloc.cache);
273         if (unlikely(!nr_pages))
274                 return NULL;
275
276         /* Pages have been filled into alloc.cache array, but count is zero and
277          * page element have not been (possibly) DMA mapped.
278          */
279         for (i = 0; i < nr_pages; i++) {
280                 page = pool->alloc.cache[i];
281                 if ((pp_flags & PP_FLAG_DMA_MAP) &&
282                     unlikely(!page_pool_dma_map(pool, page))) {
283                         put_page(page);
284                         continue;
285                 }
286
287                 page_pool_set_pp_info(pool, page);
288                 pool->alloc.cache[pool->alloc.count++] = page;
289                 /* Track how many pages are held 'in-flight' */
290                 pool->pages_state_hold_cnt++;
291                 trace_page_pool_state_hold(pool, page,
292                                            pool->pages_state_hold_cnt);
293         }
294
295         /* Return last page */
296         if (likely(pool->alloc.count > 0))
297                 page = pool->alloc.cache[--pool->alloc.count];
298         else
299                 page = NULL;
300
301         /* When page just alloc'ed is should/must have refcnt 1. */
302         return page;
303 }
304
305 /* For using page_pool replace: alloc_pages() API calls, but provide
306  * synchronization guarantee for allocation side.
307  */
308 struct page *page_pool_alloc_pages(struct page_pool *pool, gfp_t gfp)
309 {
310         struct page *page;
311
312         /* Fast-path: Get a page from cache */
313         page = __page_pool_get_cached(pool);
314         if (page)
315                 return page;
316
317         /* Slow-path: cache empty, do real allocation */
318         page = __page_pool_alloc_pages_slow(pool, gfp);
319         return page;
320 }
321 EXPORT_SYMBOL(page_pool_alloc_pages);
322
323 /* Calculate distance between two u32 values, valid if distance is below 2^(31)
324  *  https://en.wikipedia.org/wiki/Serial_number_arithmetic#General_Solution
325  */
326 #define _distance(a, b) (s32)((a) - (b))
327
328 static s32 page_pool_inflight(struct page_pool *pool)
329 {
330         u32 release_cnt = atomic_read(&pool->pages_state_release_cnt);
331         u32 hold_cnt = READ_ONCE(pool->pages_state_hold_cnt);
332         s32 inflight;
333
334         inflight = _distance(hold_cnt, release_cnt);
335
336         trace_page_pool_release(pool, inflight, hold_cnt, release_cnt);
337         WARN(inflight < 0, "Negative(%d) inflight packet-pages", inflight);
338
339         return inflight;
340 }
341
342 /* Disconnects a page (from a page_pool).  API users can have a need
343  * to disconnect a page (from a page_pool), to allow it to be used as
344  * a regular page (that will eventually be returned to the normal
345  * page-allocator via put_page).
346  */
347 void page_pool_release_page(struct page_pool *pool, struct page *page)
348 {
349         dma_addr_t dma;
350         int count;
351
352         if (!(pool->p.flags & PP_FLAG_DMA_MAP))
353                 /* Always account for inflight pages, even if we didn't
354                  * map them
355                  */
356                 goto skip_dma_unmap;
357
358         dma = page_pool_get_dma_addr(page);
359
360         /* When page is unmapped, it cannot be returned to our pool */
361         dma_unmap_page_attrs(pool->p.dev, dma,
362                              PAGE_SIZE << pool->p.order, pool->p.dma_dir,
363                              DMA_ATTR_SKIP_CPU_SYNC);
364         page_pool_set_dma_addr(page, 0);
365 skip_dma_unmap:
366         page_pool_clear_pp_info(page);
367
368         /* This may be the last page returned, releasing the pool, so
369          * it is not safe to reference pool afterwards.
370          */
371         count = atomic_inc_return_relaxed(&pool->pages_state_release_cnt);
372         trace_page_pool_state_release(pool, page, count);
373 }
374 EXPORT_SYMBOL(page_pool_release_page);
375
376 /* Return a page to the page allocator, cleaning up our state */
377 static void page_pool_return_page(struct page_pool *pool, struct page *page)
378 {
379         page_pool_release_page(pool, page);
380
381         put_page(page);
382         /* An optimization would be to call __free_pages(page, pool->p.order)
383          * knowing page is not part of page-cache (thus avoiding a
384          * __page_cache_release() call).
385          */
386 }
387
388 static bool page_pool_recycle_in_ring(struct page_pool *pool, struct page *page)
389 {
390         int ret;
391         /* BH protection not needed if current is serving softirq */
392         if (in_serving_softirq())
393                 ret = ptr_ring_produce(&pool->ring, page);
394         else
395                 ret = ptr_ring_produce_bh(&pool->ring, page);
396
397         return (ret == 0) ? true : false;
398 }
399
400 /* Only allow direct recycling in special circumstances, into the
401  * alloc side cache.  E.g. during RX-NAPI processing for XDP_DROP use-case.
402  *
403  * Caller must provide appropriate safe context.
404  */
405 static bool page_pool_recycle_in_cache(struct page *page,
406                                        struct page_pool *pool)
407 {
408         if (unlikely(pool->alloc.count == PP_ALLOC_CACHE_SIZE))
409                 return false;
410
411         /* Caller MUST have verified/know (page_ref_count(page) == 1) */
412         pool->alloc.cache[pool->alloc.count++] = page;
413         return true;
414 }
415
416 /* If the page refcnt == 1, this will try to recycle the page.
417  * if PP_FLAG_DMA_SYNC_DEV is set, we'll try to sync the DMA area for
418  * the configured size min(dma_sync_size, pool->max_len).
419  * If the page refcnt != 1, then the page will be returned to memory
420  * subsystem.
421  */
422 static __always_inline struct page *
423 __page_pool_put_page(struct page_pool *pool, struct page *page,
424                      unsigned int dma_sync_size, bool allow_direct)
425 {
426         /* It is not the last user for the page frag case */
427         if (pool->p.flags & PP_FLAG_PAGE_FRAG &&
428             page_pool_atomic_sub_frag_count_return(page, 1))
429                 return NULL;
430
431         /* This allocator is optimized for the XDP mode that uses
432          * one-frame-per-page, but have fallbacks that act like the
433          * regular page allocator APIs.
434          *
435          * refcnt == 1 means page_pool owns page, and can recycle it.
436          *
437          * page is NOT reusable when allocated when system is under
438          * some pressure. (page_is_pfmemalloc)
439          */
440         if (likely(page_ref_count(page) == 1 && !page_is_pfmemalloc(page))) {
441                 /* Read barrier done in page_ref_count / READ_ONCE */
442
443                 if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV)
444                         page_pool_dma_sync_for_device(pool, page,
445                                                       dma_sync_size);
446
447                 if (allow_direct && in_serving_softirq() &&
448                     page_pool_recycle_in_cache(page, pool))
449                         return NULL;
450
451                 /* Page found as candidate for recycling */
452                 return page;
453         }
454         /* Fallback/non-XDP mode: API user have elevated refcnt.
455          *
456          * Many drivers split up the page into fragments, and some
457          * want to keep doing this to save memory and do refcnt based
458          * recycling. Support this use case too, to ease drivers
459          * switching between XDP/non-XDP.
460          *
461          * In-case page_pool maintains the DMA mapping, API user must
462          * call page_pool_put_page once.  In this elevated refcnt
463          * case, the DMA is unmapped/released, as driver is likely
464          * doing refcnt based recycle tricks, meaning another process
465          * will be invoking put_page.
466          */
467         /* Do not replace this with page_pool_return_page() */
468         page_pool_release_page(pool, page);
469         put_page(page);
470
471         return NULL;
472 }
473
474 void page_pool_put_page(struct page_pool *pool, struct page *page,
475                         unsigned int dma_sync_size, bool allow_direct)
476 {
477         page = __page_pool_put_page(pool, page, dma_sync_size, allow_direct);
478         if (page && !page_pool_recycle_in_ring(pool, page)) {
479                 /* Cache full, fallback to free pages */
480                 page_pool_return_page(pool, page);
481         }
482 }
483 EXPORT_SYMBOL(page_pool_put_page);
484
485 /* Caller must not use data area after call, as this function overwrites it */
486 void page_pool_put_page_bulk(struct page_pool *pool, void **data,
487                              int count)
488 {
489         int i, bulk_len = 0;
490
491         for (i = 0; i < count; i++) {
492                 struct page *page = virt_to_head_page(data[i]);
493
494                 page = __page_pool_put_page(pool, page, -1, false);
495                 /* Approved for bulk recycling in ptr_ring cache */
496                 if (page)
497                         data[bulk_len++] = page;
498         }
499
500         if (unlikely(!bulk_len))
501                 return;
502
503         /* Bulk producer into ptr_ring page_pool cache */
504         page_pool_ring_lock(pool);
505         for (i = 0; i < bulk_len; i++) {
506                 if (__ptr_ring_produce(&pool->ring, data[i]))
507                         break; /* ring full */
508         }
509         page_pool_ring_unlock(pool);
510
511         /* Hopefully all pages was return into ptr_ring */
512         if (likely(i == bulk_len))
513                 return;
514
515         /* ptr_ring cache full, free remaining pages outside producer lock
516          * since put_page() with refcnt == 1 can be an expensive operation
517          */
518         for (; i < bulk_len; i++)
519                 page_pool_return_page(pool, data[i]);
520 }
521 EXPORT_SYMBOL(page_pool_put_page_bulk);
522
523 static struct page *page_pool_drain_frag(struct page_pool *pool,
524                                          struct page *page)
525 {
526         long drain_count = BIAS_MAX - pool->frag_users;
527
528         /* Some user is still using the page frag */
529         if (likely(page_pool_atomic_sub_frag_count_return(page,
530                                                           drain_count)))
531                 return NULL;
532
533         if (page_ref_count(page) == 1 && !page_is_pfmemalloc(page)) {
534                 if (pool->p.flags & PP_FLAG_DMA_SYNC_DEV)
535                         page_pool_dma_sync_for_device(pool, page, -1);
536
537                 return page;
538         }
539
540         page_pool_return_page(pool, page);
541         return NULL;
542 }
543
544 static void page_pool_free_frag(struct page_pool *pool)
545 {
546         long drain_count = BIAS_MAX - pool->frag_users;
547         struct page *page = pool->frag_page;
548
549         pool->frag_page = NULL;
550
551         if (!page ||
552             page_pool_atomic_sub_frag_count_return(page, drain_count))
553                 return;
554
555         page_pool_return_page(pool, page);
556 }
557
558 struct page *page_pool_alloc_frag(struct page_pool *pool,
559                                   unsigned int *offset,
560                                   unsigned int size, gfp_t gfp)
561 {
562         unsigned int max_size = PAGE_SIZE << pool->p.order;
563         struct page *page = pool->frag_page;
564
565         if (WARN_ON(!(pool->p.flags & PP_FLAG_PAGE_FRAG) ||
566                     size > max_size))
567                 return NULL;
568
569         size = ALIGN(size, dma_get_cache_alignment());
570         *offset = pool->frag_offset;
571
572         if (page && *offset + size > max_size) {
573                 page = page_pool_drain_frag(pool, page);
574                 if (page)
575                         goto frag_reset;
576         }
577
578         if (!page) {
579                 page = page_pool_alloc_pages(pool, gfp);
580                 if (unlikely(!page)) {
581                         pool->frag_page = NULL;
582                         return NULL;
583                 }
584
585                 pool->frag_page = page;
586
587 frag_reset:
588                 pool->frag_users = 1;
589                 *offset = 0;
590                 pool->frag_offset = size;
591                 page_pool_set_frag_count(page, BIAS_MAX);
592                 return page;
593         }
594
595         pool->frag_users++;
596         pool->frag_offset = *offset + size;
597         return page;
598 }
599 EXPORT_SYMBOL(page_pool_alloc_frag);
600
601 static void page_pool_empty_ring(struct page_pool *pool)
602 {
603         struct page *page;
604
605         /* Empty recycle ring */
606         while ((page = ptr_ring_consume_bh(&pool->ring))) {
607                 /* Verify the refcnt invariant of cached pages */
608                 if (!(page_ref_count(page) == 1))
609                         pr_crit("%s() page_pool refcnt %d violation\n",
610                                 __func__, page_ref_count(page));
611
612                 page_pool_return_page(pool, page);
613         }
614 }
615
616 static void page_pool_free(struct page_pool *pool)
617 {
618         if (pool->disconnect)
619                 pool->disconnect(pool);
620
621         ptr_ring_cleanup(&pool->ring, NULL);
622
623         if (pool->p.flags & PP_FLAG_DMA_MAP)
624                 put_device(pool->p.dev);
625
626         kfree(pool);
627 }
628
629 static void page_pool_empty_alloc_cache_once(struct page_pool *pool)
630 {
631         struct page *page;
632
633         if (pool->destroy_cnt)
634                 return;
635
636         /* Empty alloc cache, assume caller made sure this is
637          * no-longer in use, and page_pool_alloc_pages() cannot be
638          * call concurrently.
639          */
640         while (pool->alloc.count) {
641                 page = pool->alloc.cache[--pool->alloc.count];
642                 page_pool_return_page(pool, page);
643         }
644 }
645
646 static void page_pool_scrub(struct page_pool *pool)
647 {
648         page_pool_empty_alloc_cache_once(pool);
649         pool->destroy_cnt++;
650
651         /* No more consumers should exist, but producers could still
652          * be in-flight.
653          */
654         page_pool_empty_ring(pool);
655 }
656
657 static int page_pool_release(struct page_pool *pool)
658 {
659         int inflight;
660
661         page_pool_scrub(pool);
662         inflight = page_pool_inflight(pool);
663         if (!inflight)
664                 page_pool_free(pool);
665
666         return inflight;
667 }
668
669 static void page_pool_release_retry(struct work_struct *wq)
670 {
671         struct delayed_work *dwq = to_delayed_work(wq);
672         struct page_pool *pool = container_of(dwq, typeof(*pool), release_dw);
673         int inflight;
674
675         inflight = page_pool_release(pool);
676         if (!inflight)
677                 return;
678
679         /* Periodic warning */
680         if (time_after_eq(jiffies, pool->defer_warn)) {
681                 int sec = (s32)((u32)jiffies - (u32)pool->defer_start) / HZ;
682
683                 pr_warn("%s() stalled pool shutdown %d inflight %d sec\n",
684                         __func__, inflight, sec);
685                 pool->defer_warn = jiffies + DEFER_WARN_INTERVAL;
686         }
687
688         /* Still not ready to be disconnected, retry later */
689         schedule_delayed_work(&pool->release_dw, DEFER_TIME);
690 }
691
692 void page_pool_use_xdp_mem(struct page_pool *pool, void (*disconnect)(void *),
693                            struct xdp_mem_info *mem)
694 {
695         refcount_inc(&pool->user_cnt);
696         pool->disconnect = disconnect;
697         pool->xdp_mem_id = mem->id;
698 }
699
700 void page_pool_destroy(struct page_pool *pool)
701 {
702         if (!pool)
703                 return;
704
705         if (!page_pool_put(pool))
706                 return;
707
708         page_pool_free_frag(pool);
709
710         if (!page_pool_release(pool))
711                 return;
712
713         pool->defer_start = jiffies;
714         pool->defer_warn  = jiffies + DEFER_WARN_INTERVAL;
715
716         INIT_DELAYED_WORK(&pool->release_dw, page_pool_release_retry);
717         schedule_delayed_work(&pool->release_dw, DEFER_TIME);
718 }
719 EXPORT_SYMBOL(page_pool_destroy);
720
721 /* Caller must provide appropriate safe context, e.g. NAPI. */
722 void page_pool_update_nid(struct page_pool *pool, int new_nid)
723 {
724         struct page *page;
725
726         trace_page_pool_update_nid(pool, new_nid);
727         pool->p.nid = new_nid;
728
729         /* Flush pool alloc cache, as refill will check NUMA node */
730         while (pool->alloc.count) {
731                 page = pool->alloc.cache[--pool->alloc.count];
732                 page_pool_return_page(pool, page);
733         }
734 }
735 EXPORT_SYMBOL(page_pool_update_nid);
736
737 bool page_pool_return_skb_page(struct page *page)
738 {
739         struct page_pool *pp;
740
741         page = compound_head(page);
742
743         /* page->pp_magic is OR'ed with PP_SIGNATURE after the allocation
744          * in order to preserve any existing bits, such as bit 0 for the
745          * head page of compound page and bit 1 for pfmemalloc page, so
746          * mask those bits for freeing side when doing below checking,
747          * and page_is_pfmemalloc() is checked in __page_pool_put_page()
748          * to avoid recycling the pfmemalloc page.
749          */
750         if (unlikely((page->pp_magic & ~0x3UL) != PP_SIGNATURE))
751                 return false;
752
753         pp = page->pp;
754
755         /* Driver set this to memory recycling info. Reset it on recycle.
756          * This will *not* work for NIC using a split-page memory model.
757          * The page will be returned to the pool here regardless of the
758          * 'flipped' fragment being in use or not.
759          */
760         page_pool_put_full_page(pp, page, false);
761
762         return true;
763 }
764 EXPORT_SYMBOL(page_pool_return_skb_page);
This page took 0.076421 seconds and 4 git commands to generate.