@@ -88,6 +88,9 @@ typedef int __bitwise fpi_t;
88
88
*/
89
89
#define FPI_TO_TAIL ((__force fpi_t)BIT(1))
90
90
91
+ /* Free the page without taking locks. Rely on trylock only. */
92
+ #define FPI_TRYLOCK ((__force fpi_t)BIT(2))
93
+
91
94
/* prevent >1 _updater_ of zone percpu pageset ->high and ->batch fields */
92
95
static DEFINE_MUTEX (pcp_batch_high_lock );
93
96
#define MIN_PERCPU_PAGELIST_HIGH_FRACTION (8)
@@ -1249,13 +1252,44 @@ static void split_large_buddy(struct zone *zone, struct page *page,
1249
1252
} while (1 );
1250
1253
}
1251
1254
1255
+ static void add_page_to_zone_llist (struct zone * zone , struct page * page ,
1256
+ unsigned int order )
1257
+ {
1258
+ /* Remember the order */
1259
+ page -> order = order ;
1260
+ /* Add the page to the free list */
1261
+ llist_add (& page -> pcp_llist , & zone -> trylock_free_pages );
1262
+ }
1263
+
1252
1264
static void free_one_page (struct zone * zone , struct page * page ,
1253
1265
unsigned long pfn , unsigned int order ,
1254
1266
fpi_t fpi_flags )
1255
1267
{
1268
+ struct llist_head * llhead ;
1256
1269
unsigned long flags ;
1257
1270
1258
- spin_lock_irqsave (& zone -> lock , flags );
1271
+ if (!spin_trylock_irqsave (& zone -> lock , flags )) {
1272
+ if (unlikely (fpi_flags & FPI_TRYLOCK )) {
1273
+ add_page_to_zone_llist (zone , page , order );
1274
+ return ;
1275
+ }
1276
+ spin_lock_irqsave (& zone -> lock , flags );
1277
+ }
1278
+
1279
+ /* The lock succeeded. Process deferred pages. */
1280
+ llhead = & zone -> trylock_free_pages ;
1281
+ if (unlikely (!llist_empty (llhead ) && !(fpi_flags & FPI_TRYLOCK ))) {
1282
+ struct llist_node * llnode ;
1283
+ struct page * p , * tmp ;
1284
+
1285
+ llnode = llist_del_all (llhead );
1286
+ llist_for_each_entry_safe (p , tmp , llnode , pcp_llist ) {
1287
+ unsigned int p_order = p -> order ;
1288
+
1289
+ split_large_buddy (zone , p , page_to_pfn (p ), p_order , fpi_flags );
1290
+ __count_vm_events (PGFREE , 1 << p_order );
1291
+ }
1292
+ }
1259
1293
split_large_buddy (zone , page , pfn , order , fpi_flags );
1260
1294
spin_unlock_irqrestore (& zone -> lock , flags );
1261
1295
@@ -2599,7 +2633,7 @@ static int nr_pcp_high(struct per_cpu_pages *pcp, struct zone *zone,
2599
2633
2600
2634
static void free_frozen_page_commit (struct zone * zone ,
2601
2635
struct per_cpu_pages * pcp , struct page * page , int migratetype ,
2602
- unsigned int order )
2636
+ unsigned int order , fpi_t fpi_flags )
2603
2637
{
2604
2638
int high , batch ;
2605
2639
int pindex ;
@@ -2634,6 +2668,14 @@ static void free_frozen_page_commit(struct zone *zone,
2634
2668
}
2635
2669
if (pcp -> free_count < (batch << CONFIG_PCP_BATCH_SCALE_MAX ))
2636
2670
pcp -> free_count += (1 << order );
2671
+
2672
+ if (unlikely (fpi_flags & FPI_TRYLOCK )) {
2673
+ /*
2674
+ * Do not attempt to take a zone lock. Let pcp->count get
2675
+ * over high mark temporarily.
2676
+ */
2677
+ return ;
2678
+ }
2637
2679
high = nr_pcp_high (pcp , zone , batch , free_high );
2638
2680
if (pcp -> count >= high ) {
2639
2681
free_pcppages_bulk (zone , nr_pcp_free (pcp , batch , high , free_high ),
@@ -2648,7 +2690,8 @@ static void free_frozen_page_commit(struct zone *zone,
2648
2690
/*
2649
2691
* Free a pcp page
2650
2692
*/
2651
- void free_frozen_pages (struct page * page , unsigned int order )
2693
+ static void __free_frozen_pages (struct page * page , unsigned int order ,
2694
+ fpi_t fpi_flags )
2652
2695
{
2653
2696
unsigned long __maybe_unused UP_flags ;
2654
2697
struct per_cpu_pages * pcp ;
@@ -2657,7 +2700,7 @@ void free_frozen_pages(struct page *page, unsigned int order)
2657
2700
int migratetype ;
2658
2701
2659
2702
if (!pcp_allowed_order (order )) {
2660
- __free_pages_ok (page , order , FPI_NONE );
2703
+ __free_pages_ok (page , order , fpi_flags );
2661
2704
return ;
2662
2705
}
2663
2706
@@ -2675,23 +2718,33 @@ void free_frozen_pages(struct page *page, unsigned int order)
2675
2718
migratetype = get_pfnblock_migratetype (page , pfn );
2676
2719
if (unlikely (migratetype >= MIGRATE_PCPTYPES )) {
2677
2720
if (unlikely (is_migrate_isolate (migratetype ))) {
2678
- free_one_page (zone , page , pfn , order , FPI_NONE );
2721
+ free_one_page (zone , page , pfn , order , fpi_flags );
2679
2722
return ;
2680
2723
}
2681
2724
migratetype = MIGRATE_MOVABLE ;
2682
2725
}
2683
2726
2727
+ if (unlikely ((fpi_flags & FPI_TRYLOCK ) && IS_ENABLED (CONFIG_PREEMPT_RT )
2728
+ && (in_nmi () || in_hardirq ()))) {
2729
+ add_page_to_zone_llist (zone , page , order );
2730
+ return ;
2731
+ }
2684
2732
pcp_trylock_prepare (UP_flags );
2685
2733
pcp = pcp_spin_trylock (zone -> per_cpu_pageset );
2686
2734
if (pcp ) {
2687
- free_frozen_page_commit (zone , pcp , page , migratetype , order );
2735
+ free_frozen_page_commit (zone , pcp , page , migratetype , order , fpi_flags );
2688
2736
pcp_spin_unlock (pcp );
2689
2737
} else {
2690
- free_one_page (zone , page , pfn , order , FPI_NONE );
2738
+ free_one_page (zone , page , pfn , order , fpi_flags );
2691
2739
}
2692
2740
pcp_trylock_finish (UP_flags );
2693
2741
}
2694
2742
2743
+ void free_frozen_pages (struct page * page , unsigned int order )
2744
+ {
2745
+ __free_frozen_pages (page , order , FPI_NONE );
2746
+ }
2747
+
2695
2748
/*
2696
2749
* Free a batch of folios
2697
2750
*/
@@ -2780,7 +2833,7 @@ void free_unref_folios(struct folio_batch *folios)
2780
2833
2781
2834
trace_mm_page_free_batched (& folio -> page );
2782
2835
free_frozen_page_commit (zone , pcp , & folio -> page , migratetype ,
2783
- order );
2836
+ order , FPI_NONE );
2784
2837
}
2785
2838
2786
2839
if (pcp ) {
@@ -4822,9 +4875,10 @@ unsigned long get_zeroed_page_noprof(gfp_t gfp_mask)
4822
4875
EXPORT_SYMBOL (get_zeroed_page_noprof );
4823
4876
4824
4877
/**
4825
- * __free_pages - Free pages allocated with alloc_pages().
4878
+ * ___free_pages - Free pages allocated with alloc_pages().
4826
4879
* @page: The page pointer returned from alloc_pages().
4827
4880
* @order: The order of the allocation.
4881
+ * @fpi_flags: Free Page Internal flags.
4828
4882
*
4829
4883
* This function can free multi-page allocations that are not compound
4830
4884
* pages. It does not check that the @order passed in matches that of
@@ -4841,22 +4895,37 @@ EXPORT_SYMBOL(get_zeroed_page_noprof);
4841
4895
* Context: May be called in interrupt context or while holding a normal
4842
4896
* spinlock, but not in NMI context or while holding a raw spinlock.
4843
4897
*/
4844
- void __free_pages (struct page * page , unsigned int order )
4898
+ static void ___free_pages (struct page * page , unsigned int order ,
4899
+ fpi_t fpi_flags )
4845
4900
{
4846
4901
/* get PageHead before we drop reference */
4847
4902
int head = PageHead (page );
4848
4903
struct alloc_tag * tag = pgalloc_tag_get (page );
4849
4904
4850
4905
if (put_page_testzero (page ))
4851
- free_frozen_pages (page , order );
4906
+ __free_frozen_pages (page , order , fpi_flags );
4852
4907
else if (!head ) {
4853
4908
pgalloc_tag_sub_pages (tag , (1 << order ) - 1 );
4854
4909
while (order -- > 0 )
4855
- free_frozen_pages (page + (1 << order ), order );
4910
+ __free_frozen_pages (page + (1 << order ), order ,
4911
+ fpi_flags );
4856
4912
}
4857
4913
}
4914
+ void __free_pages (struct page * page , unsigned int order )
4915
+ {
4916
+ ___free_pages (page , order , FPI_NONE );
4917
+ }
4858
4918
EXPORT_SYMBOL (__free_pages );
4859
4919
4920
+ /*
4921
+ * Can be called while holding raw_spin_lock or from IRQ and NMI for any
4922
+ * page type (not only those that came from try_alloc_pages)
4923
+ */
4924
+ void free_pages_nolock (struct page * page , unsigned int order )
4925
+ {
4926
+ ___free_pages (page , order , FPI_TRYLOCK );
4927
+ }
4928
+
4860
4929
void free_pages (unsigned long addr , unsigned int order )
4861
4930
{
4862
4931
if (addr != 0 ) {
0 commit comments