]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - mm/page_alloc.c
tunnels: do not assume mac header is set in skb_tunnel_check_pmtu()
[mirror_ubuntu-jammy-kernel.git] / mm / page_alloc.c
index b37435c274cf1cb1fabd26465ca7899bb610d91f..a0b7afae59e9cbf8a9a55a31c234b1af9baf7952 100644 (file)
@@ -1312,8 +1312,10 @@ static __always_inline bool free_pages_prepare(struct page *page,
 
                VM_BUG_ON_PAGE(compound && compound_order(page) != order, page);
 
-               if (compound)
+               if (compound) {
                        ClearPageDoubleMap(page);
+                       ClearPageHasHWPoisoned(page);
+               }
                for (i = 1; i < (1 << order); i++) {
                        if (compound)
                                bad += free_tail_pages_check(page, page + i);
@@ -4208,7 +4210,9 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
        va_list args;
        static DEFINE_RATELIMIT_STATE(nopage_rs, 10*HZ, 1);
 
-       if ((gfp_mask & __GFP_NOWARN) || !__ratelimit(&nopage_rs))
+       if ((gfp_mask & __GFP_NOWARN) ||
+            !__ratelimit(&nopage_rs) ||
+            ((gfp_mask & __GFP_DMA) && !has_managed_dma()))
                return;
 
        va_start(args, fmt);
@@ -5223,6 +5227,10 @@ unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
        if (unlikely(page_array && nr_pages - nr_populated == 0))
                goto out;
 
+       /* Bulk allocator does not support memcg accounting. */
+       if (memcg_kmem_enabled() && (gfp & __GFP_ACCOUNT))
+               goto failed;
+
        /* Use the single page allocator for one page. */
        if (nr_pages - nr_populated == 1)
                goto failed;
@@ -5291,8 +5299,8 @@ unsigned long __alloc_pages_bulk(gfp_t gfp, int preferred_nid,
                page = __rmqueue_pcplist(zone, 0, ac.migratetype, alloc_flags,
                                                                pcp, pcp_list);
                if (unlikely(!page)) {
-                       /* Try and get at least one page */
-                       if (!nr_populated)
+                       /* Try and allocate at least one page */
+                       if (!nr_account)
                                goto failed_irq;
                        break;
                }
@@ -6084,7 +6092,7 @@ static int build_zonerefs_node(pg_data_t *pgdat, struct zoneref *zonerefs)
        do {
                zone_type--;
                zone = pgdat->node_zones + zone_type;
-               if (managed_zone(zone)) {
+               if (populated_zone(zone)) {
                        zoneref_set_zone(zone, &zonerefs[nr_zones++]);
                        check_highest_zone(zone_type);
                }
@@ -7891,10 +7899,17 @@ restart:
 
 out2:
        /* Align start of ZONE_MOVABLE on all nids to MAX_ORDER_NR_PAGES */
-       for (nid = 0; nid < MAX_NUMNODES; nid++)
+       for (nid = 0; nid < MAX_NUMNODES; nid++) {
+               unsigned long start_pfn, end_pfn;
+
                zone_movable_pfn[nid] =
                        roundup(zone_movable_pfn[nid], MAX_ORDER_NR_PAGES);
 
+               get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
+               if (zone_movable_pfn[nid] >= end_pfn)
+                       zone_movable_pfn[nid] = 0;
+       }
+
 out:
        /* restore the node_state */
        node_states[N_MEMORY] = saved_node_state;
@@ -8154,7 +8169,7 @@ void __init mem_init_print_info(void)
         */
 #define adj_init_size(start, end, size, pos, adj) \
        do { \
-               if (start <= pos && pos < end && size > adj) \
+               if (&start[0] <= &pos[0] && &pos[0] < &end[0] && size > adj) \
                        size -= adj; \
        } while (0)
 
@@ -9443,3 +9458,18 @@ bool take_page_off_buddy(struct page *page)
        return ret;
 }
 #endif
+
+#ifdef CONFIG_ZONE_DMA
+bool has_managed_dma(void)
+{
+       struct pglist_data *pgdat;
+
+       for_each_online_pgdat(pgdat) {
+               struct zone *zone = &pgdat->node_zones[ZONE_DMA];
+
+               if (managed_zone(zone))
+                       return true;
+       }
+       return false;
+}
+#endif /* CONFIG_ZONE_DMA */