]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf...
authorStephen Rothwell <sfr@canb.auug.org.au>
Mon, 17 Mar 2025 01:52:36 +0000 (12:52 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Mon, 17 Mar 2025 01:52:38 +0000 (12:52 +1100)
1  2 
include/linux/mm.h
include/linux/mm_types.h
include/linux/mmzone.h
mm/internal.h
mm/memcontrol.c
mm/memory.c
mm/nommu.c
mm/page_alloc.c
mm/page_owner.c
security/selinux/hooks.c

Simple merge
Simple merge
Simple merge
diff --cc mm/internal.h
Simple merge
diff --cc mm/memcontrol.c
index 768d6b15dbfa43d066a504fb377051d8299b5912,385100b73012872b816422c5ca14ab62f65e2b8e..7a08ea557bf9cd84804a5c298de86614e6d4d2f2
@@@ -1934,18 -1938,9 +1951,18 @@@ void drain_all_stock(struct mem_cgroup 
  static int memcg_hotplug_cpu_dead(unsigned int cpu)
  {
        struct memcg_stock_pcp *stock;
 +      struct obj_cgroup *old;
 +      unsigned long flags;
  
        stock = &per_cpu(memcg_stock, cpu);
-       local_lock_irqsave(&memcg_stock.stock_lock, flags);
 +
 +      /* drain_obj_stock requires stock_lock */
-       local_unlock_irqrestore(&memcg_stock.stock_lock, flags);
++      localtry_lock_irqsave(&memcg_stock.stock_lock, flags);
 +      old = drain_obj_stock(stock);
++      localtry_unlock_irqrestore(&memcg_stock.stock_lock, flags);
 +
        drain_stock(stock);
 +      obj_cgroup_put(old);
  
        return 0;
  }
diff --cc mm/memory.c
Simple merge
diff --cc mm/nommu.c
Simple merge
diff --cc mm/page_alloc.c
index eb499a8d352c7c6669576913bebd611dd9786798,a0904315d4da2b776839c07c42d85c84dc0d6c19..c32d3319b482818b7f797fc9ac6d5c4547309648
@@@ -4961,17 -4900,32 +5029,31 @@@ static void ___free_pages(struct page *
  {
        /* get PageHead before we drop reference */
        int head = PageHead(page);
 -      struct alloc_tag *tag = pgalloc_tag_get(page);
  
        if (put_page_testzero(page))
-               free_frozen_pages(page, order);
+               __free_frozen_pages(page, order, fpi_flags);
        else if (!head) {
 -              pgalloc_tag_sub_pages(tag, (1 << order) - 1);
 +              pgalloc_tag_sub_pages(page, (1 << order) - 1);
                while (order-- > 0)
-                       free_frozen_pages(page + (1 << order), order);
+                       __free_frozen_pages(page + (1 << order), order,
+                                           fpi_flags);
        }
  }
+ void __free_pages(struct page *page, unsigned int order)
+ {
+       ___free_pages(page, order, FPI_NONE);
+ }
  EXPORT_SYMBOL(__free_pages);
  
+ /*
+  * Can be called while holding raw_spin_lock or from IRQ and NMI for any
+  * page type (not only those that came from try_alloc_pages)
+  */
+ void free_pages_nolock(struct page *page, unsigned int order)
+ {
+       ___free_pages(page, order, FPI_TRYLOCK);
+ }
  void free_pages(unsigned long addr, unsigned int order)
  {
        if (addr != 0) {
diff --cc mm/page_owner.c
index 849d4a471b6c1b33f7ba83b4e3f8e32a009855cc,90e31d0e3ed78d3aa9f3bc764ab0b812abe4e27a..cc4a6916eec6f2f65b641e423faa9a34ac900067
@@@ -297,11 -293,17 +297,17 @@@ void __reset_page_owner(struct page *pa
  
        page_owner = get_page_owner(page_ext);
        alloc_handle = page_owner->handle;
 +      page_ext_put(page_ext);
  
-       handle = save_stack(GFP_NOWAIT | __GFP_NOWARN);
+       /*
+        * Do not specify GFP_NOWAIT to make gfpflags_allow_spinning() == false
+        * to prevent issues in stack_depot_save().
+        * This is similar to try_alloc_pages() gfp flags, but only used
+        * to signal stack_depot to avoid spin_locks.
+        */
+       handle = save_stack(__GFP_NOWARN);
 -      __update_page_owner_free_handle(page_ext, handle, order, current->pid,
 +      __update_page_owner_free_handle(page, handle, order, current->pid,
                                        current->tgid, free_ts_nsec);
 -      page_ext_put(page_ext);
  
        if (alloc_handle != early_handle)
                /*
Simple merge