page_alloc.c (624f58d8f4639676d2fa1238425ab0148d501c4a) | page_alloc.c (36e66c554b5c6a9d17a229faca7a61693527b0bd) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/mm/page_alloc.c 4 * 5 * Manages the free list, the system allocates free pages here. 6 * Note that kmalloc() lives in slab.c 7 * 8 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds --- 60 unchanged lines hidden (view full) --- 69#include <linux/nmi.h> 70#include <linux/psi.h> 71 72#include <asm/sections.h> 73#include <asm/tlbflush.h> 74#include <asm/div64.h> 75#include "internal.h" 76#include "shuffle.h" | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/mm/page_alloc.c 4 * 5 * Manages the free list, the system allocates free pages here. 6 * Note that kmalloc() lives in slab.c 7 * 8 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds --- 60 unchanged lines hidden (view full) --- 69#include <linux/nmi.h> 70#include <linux/psi.h> 71 72#include <asm/sections.h> 73#include <asm/tlbflush.h> 74#include <asm/div64.h> 75#include "internal.h" 76#include "shuffle.h" |
77#include "page_reporting.h" |
|
77 78/* prevent >1 _updater_ of zone percpu pageset ->high and ->batch fields */ 79static DEFINE_MUTEX(pcp_batch_high_lock); 80#define MIN_PERCPU_PAGELIST_FRACTION (8) 81 82#ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID 83DEFINE_PER_CPU(int, numa_node); 84EXPORT_PER_CPU_SYMBOL(numa_node); --- 806 unchanged lines hidden (view full) --- 891 struct free_area *area = &zone->free_area[order]; 892 893 list_move(&page->lru, &area->free_list[migratetype]); 894} 895 896static inline void del_page_from_free_list(struct page *page, struct zone *zone, 897 unsigned int order) 898{ | 78 79/* prevent >1 _updater_ of zone percpu pageset ->high and ->batch fields */ 80static DEFINE_MUTEX(pcp_batch_high_lock); 81#define MIN_PERCPU_PAGELIST_FRACTION (8) 82 83#ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID 84DEFINE_PER_CPU(int, numa_node); 85EXPORT_PER_CPU_SYMBOL(numa_node); --- 806 unchanged lines hidden (view full) --- 892 struct free_area *area = &zone->free_area[order]; 893 894 list_move(&page->lru, &area->free_list[migratetype]); 895} 896 897static inline void del_page_from_free_list(struct page *page, struct zone *zone, 898 unsigned int order) 899{ |
900 /* clear reported state and update reported page count */ 901 if (page_reported(page)) 902 __ClearPageReported(page); 903 |
|
899 list_del(&page->lru); 900 __ClearPageBuddy(page); 901 set_page_private(page, 0); 902 zone->free_area[order].nr_free--; 903} 904 905/* 906 * If this is not the largest possible page, check if the buddy --- 47 unchanged lines hidden (view full) --- 954 * triggers coalescing into a block of larger size. 955 * 956 * -- nyc 957 */ 958 959static inline void __free_one_page(struct page *page, 960 unsigned long pfn, 961 struct zone *zone, unsigned int order, | 904 list_del(&page->lru); 905 __ClearPageBuddy(page); 906 set_page_private(page, 0); 907 zone->free_area[order].nr_free--; 908} 909 910/* 911 * If this is not the largest possible page, check if the buddy --- 47 unchanged lines hidden (view full) --- 959 * triggers coalescing into a block of larger size. 960 * 961 * -- nyc 962 */ 963 964static inline void __free_one_page(struct page *page, 965 unsigned long pfn, 966 struct zone *zone, unsigned int order, |
962 int migratetype) | 967 int migratetype, bool report) |
963{ 964 struct capture_control *capc = task_capc(zone); 965 unsigned long uninitialized_var(buddy_pfn); 966 unsigned long combined_pfn; 967 unsigned int max_order; 968 struct page *buddy; 969 bool to_tail; 970 --- 68 unchanged lines hidden (view full) --- 1039 to_tail = shuffle_pick_tail(); 1040 else 1041 to_tail = buddy_merge_likely(pfn, buddy_pfn, page, order); 1042 1043 if (to_tail) 1044 add_to_free_list_tail(page, zone, order, migratetype); 1045 else 1046 add_to_free_list(page, zone, order, migratetype); | 968{ 969 struct capture_control *capc = task_capc(zone); 970 unsigned long uninitialized_var(buddy_pfn); 971 unsigned long combined_pfn; 972 unsigned int max_order; 973 struct page *buddy; 974 bool to_tail; 975 --- 68 unchanged lines hidden (view full) --- 1044 to_tail = shuffle_pick_tail(); 1045 else 1046 to_tail = buddy_merge_likely(pfn, buddy_pfn, page, order); 1047 1048 if (to_tail) 1049 add_to_free_list_tail(page, zone, order, migratetype); 1050 else 1051 add_to_free_list(page, zone, order, migratetype); |
1052 1053 /* Notify page reporting subsystem of freed page */ 1054 if (report) 1055 page_reporting_notify_free(order); |
|
1047} 1048 1049/* 1050 * A bad page could be due to a number of fields. Instead of multiple branches, 1051 * try and check multiple fields with one check. The caller must do a detailed 1052 * check if necessary. 1053 */ 1054static inline bool page_expected_state(struct page *page, --- 300 unchanged lines hidden (view full) --- 1355 list_for_each_entry_safe(page, tmp, &head, lru) { 1356 int mt = get_pcppage_migratetype(page); 1357 /* MIGRATE_ISOLATE page should not go to pcplists */ 1358 VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); 1359 /* Pageblock could have been isolated meanwhile */ 1360 if (unlikely(isolated_pageblocks)) 1361 mt = get_pageblock_migratetype(page); 1362 | 1056} 1057 1058/* 1059 * A bad page could be due to a number of fields. Instead of multiple branches, 1060 * try and check multiple fields with one check. The caller must do a detailed 1061 * check if necessary. 1062 */ 1063static inline bool page_expected_state(struct page *page, --- 300 unchanged lines hidden (view full) --- 1364 list_for_each_entry_safe(page, tmp, &head, lru) { 1365 int mt = get_pcppage_migratetype(page); 1366 /* MIGRATE_ISOLATE page should not go to pcplists */ 1367 VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); 1368 /* Pageblock could have been isolated meanwhile */ 1369 if (unlikely(isolated_pageblocks)) 1370 mt = get_pageblock_migratetype(page); 1371 |
1363 __free_one_page(page, page_to_pfn(page), zone, 0, mt); | 1372 __free_one_page(page, page_to_pfn(page), zone, 0, mt, true); |
1364 trace_mm_page_pcpu_drain(page, 0, mt); 1365 } 1366 spin_unlock(&zone->lock); 1367} 1368 1369static void free_one_page(struct zone *zone, 1370 struct page *page, unsigned long pfn, 1371 unsigned int order, 1372 int migratetype) 1373{ 1374 spin_lock(&zone->lock); 1375 if (unlikely(has_isolate_pageblock(zone) || 1376 is_migrate_isolate(migratetype))) { 1377 migratetype = get_pfnblock_migratetype(page, pfn); 1378 } | 1373 trace_mm_page_pcpu_drain(page, 0, mt); 1374 } 1375 spin_unlock(&zone->lock); 1376} 1377 1378static void free_one_page(struct zone *zone, 1379 struct page *page, unsigned long pfn, 1380 unsigned int order, 1381 int migratetype) 1382{ 1383 spin_lock(&zone->lock); 1384 if (unlikely(has_isolate_pageblock(zone) || 1385 is_migrate_isolate(migratetype))) { 1386 migratetype = get_pfnblock_migratetype(page, pfn); 1387 } |
1379 __free_one_page(page, pfn, zone, order, migratetype); | 1388 __free_one_page(page, pfn, zone, order, migratetype, true); |
1380 spin_unlock(&zone->lock); 1381} 1382 1383static void __meminit __init_single_page(struct page *page, unsigned long pfn, 1384 unsigned long zone, int nid) 1385{ 1386 mm_zero_struct_page(page); 1387 set_page_links(page, zone, nid, pfn); --- 1834 unchanged lines hidden (view full) --- 3222void __putback_isolated_page(struct page *page, unsigned int order, int mt) 3223{ 3224 struct zone *zone = page_zone(page); 3225 3226 /* zone lock should be held when this function is called */ 3227 lockdep_assert_held(&zone->lock); 3228 3229 /* Return isolated page to tail of freelist. */ | 1389 spin_unlock(&zone->lock); 1390} 1391 1392static void __meminit __init_single_page(struct page *page, unsigned long pfn, 1393 unsigned long zone, int nid) 1394{ 1395 mm_zero_struct_page(page); 1396 set_page_links(page, zone, nid, pfn); --- 1834 unchanged lines hidden (view full) --- 3231void __putback_isolated_page(struct page *page, unsigned int order, int mt) 3232{ 3233 struct zone *zone = page_zone(page); 3234 3235 /* zone lock should be held when this function is called */ 3236 lockdep_assert_held(&zone->lock); 3237 3238 /* Return isolated page to tail of freelist. */ |
3230 __free_one_page(page, page_to_pfn(page), zone, order, mt); | 3239 __free_one_page(page, page_to_pfn(page), zone, order, mt, false); |
3231} 3232 3233/* 3234 * Update NUMA hit/miss statistics 3235 * 3236 * Must be called with interrupts disabled. 3237 */ 3238static inline void zone_statistics(struct zone *preferred_zone, struct zone *z) --- 5597 unchanged lines hidden --- | 3240} 3241 3242/* 3243 * Update NUMA hit/miss statistics 3244 * 3245 * Must be called with interrupts disabled. 3246 */ 3247static inline void zone_statistics(struct zone *preferred_zone, struct zone *z) --- 5597 unchanged lines hidden --- |