diff options
Diffstat (limited to 'include/linux/compaction.h')
-rw-r--r-- | include/linux/compaction.h | 86 |
1 files changed, 18 insertions, 68 deletions
diff --git a/include/linux/compaction.h b/include/linux/compaction.h index 3238ffa33f68..a014559e4a49 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h | |||
@@ -12,6 +12,10 @@ | |||
12 | #define COMPACT_PARTIAL 3 | 12 | #define COMPACT_PARTIAL 3 |
13 | /* The full zone was compacted */ | 13 | /* The full zone was compacted */ |
14 | #define COMPACT_COMPLETE 4 | 14 | #define COMPACT_COMPLETE 4 |
15 | /* For more detailed tracepoint output */ | ||
16 | #define COMPACT_NO_SUITABLE_PAGE 5 | ||
17 | #define COMPACT_NOT_SUITABLE_ZONE 6 | ||
18 | /* When adding new state, please change compaction_status_string, too */ | ||
15 | 19 | ||
16 | /* Used to signal whether compaction detected need_sched() or lock contention */ | 20 | /* Used to signal whether compaction detected need_sched() or lock contention */ |
17 | /* No contention detected */ | 21 | /* No contention detected */ |
@@ -21,6 +25,8 @@ | |||
21 | /* Zone lock or lru_lock was contended in async compaction */ | 25 | /* Zone lock or lru_lock was contended in async compaction */ |
22 | #define COMPACT_CONTENDED_LOCK 2 | 26 | #define COMPACT_CONTENDED_LOCK 2 |
23 | 27 | ||
28 | struct alloc_context; /* in mm/internal.h */ | ||
29 | |||
24 | #ifdef CONFIG_COMPACTION | 30 | #ifdef CONFIG_COMPACTION |
25 | extern int sysctl_compact_memory; | 31 | extern int sysctl_compact_memory; |
26 | extern int sysctl_compaction_handler(struct ctl_table *table, int write, | 32 | extern int sysctl_compaction_handler(struct ctl_table *table, int write, |
@@ -30,81 +36,25 @@ extern int sysctl_extfrag_handler(struct ctl_table *table, int write, | |||
30 | void __user *buffer, size_t *length, loff_t *ppos); | 36 | void __user *buffer, size_t *length, loff_t *ppos); |
31 | 37 | ||
32 | extern int fragmentation_index(struct zone *zone, unsigned int order); | 38 | extern int fragmentation_index(struct zone *zone, unsigned int order); |
33 | extern unsigned long try_to_compact_pages(struct zonelist *zonelist, | 39 | extern unsigned long try_to_compact_pages(gfp_t gfp_mask, unsigned int order, |
34 | int order, gfp_t gfp_mask, nodemask_t *mask, | 40 | int alloc_flags, const struct alloc_context *ac, |
35 | enum migrate_mode mode, int *contended, | 41 | enum migrate_mode mode, int *contended); |
36 | int alloc_flags, int classzone_idx); | ||
37 | extern void compact_pgdat(pg_data_t *pgdat, int order); | 42 | extern void compact_pgdat(pg_data_t *pgdat, int order); |
38 | extern void reset_isolation_suitable(pg_data_t *pgdat); | 43 | extern void reset_isolation_suitable(pg_data_t *pgdat); |
39 | extern unsigned long compaction_suitable(struct zone *zone, int order, | 44 | extern unsigned long compaction_suitable(struct zone *zone, int order, |
40 | int alloc_flags, int classzone_idx); | 45 | int alloc_flags, int classzone_idx); |
41 | 46 | ||
42 | /* Do not skip compaction more than 64 times */ | 47 | extern void defer_compaction(struct zone *zone, int order); |
43 | #define COMPACT_MAX_DEFER_SHIFT 6 | 48 | extern bool compaction_deferred(struct zone *zone, int order); |
44 | 49 | extern void compaction_defer_reset(struct zone *zone, int order, | |
45 | /* | 50 | bool alloc_success); |
46 | * Compaction is deferred when compaction fails to result in a page | 51 | extern bool compaction_restarting(struct zone *zone, int order); |
47 | * allocation success. 1 << compact_defer_limit compactions are skipped up | ||
48 | * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT | ||
49 | */ | ||
50 | static inline void defer_compaction(struct zone *zone, int order) | ||
51 | { | ||
52 | zone->compact_considered = 0; | ||
53 | zone->compact_defer_shift++; | ||
54 | |||
55 | if (order < zone->compact_order_failed) | ||
56 | zone->compact_order_failed = order; | ||
57 | |||
58 | if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT) | ||
59 | zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT; | ||
60 | } | ||
61 | |||
62 | /* Returns true if compaction should be skipped this time */ | ||
63 | static inline bool compaction_deferred(struct zone *zone, int order) | ||
64 | { | ||
65 | unsigned long defer_limit = 1UL << zone->compact_defer_shift; | ||
66 | |||
67 | if (order < zone->compact_order_failed) | ||
68 | return false; | ||
69 | |||
70 | /* Avoid possible overflow */ | ||
71 | if (++zone->compact_considered > defer_limit) | ||
72 | zone->compact_considered = defer_limit; | ||
73 | |||
74 | return zone->compact_considered < defer_limit; | ||
75 | } | ||
76 | |||
77 | /* | ||
78 | * Update defer tracking counters after successful compaction of given order, | ||
79 | * which means an allocation either succeeded (alloc_success == true) or is | ||
80 | * expected to succeed. | ||
81 | */ | ||
82 | static inline void compaction_defer_reset(struct zone *zone, int order, | ||
83 | bool alloc_success) | ||
84 | { | ||
85 | if (alloc_success) { | ||
86 | zone->compact_considered = 0; | ||
87 | zone->compact_defer_shift = 0; | ||
88 | } | ||
89 | if (order >= zone->compact_order_failed) | ||
90 | zone->compact_order_failed = order + 1; | ||
91 | } | ||
92 | |||
93 | /* Returns true if restarting compaction after many failures */ | ||
94 | static inline bool compaction_restarting(struct zone *zone, int order) | ||
95 | { | ||
96 | if (order < zone->compact_order_failed) | ||
97 | return false; | ||
98 | |||
99 | return zone->compact_defer_shift == COMPACT_MAX_DEFER_SHIFT && | ||
100 | zone->compact_considered >= 1UL << zone->compact_defer_shift; | ||
101 | } | ||
102 | 52 | ||
103 | #else | 53 | #else |
104 | static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, | 54 | static inline unsigned long try_to_compact_pages(gfp_t gfp_mask, |
105 | int order, gfp_t gfp_mask, nodemask_t *nodemask, | 55 | unsigned int order, int alloc_flags, |
106 | enum migrate_mode mode, int *contended, | 56 | const struct alloc_context *ac, |
107 | int alloc_flags, int classzone_idx) | 57 | enum migrate_mode mode, int *contended) |
108 | { | 58 | { |
109 | return COMPACT_CONTINUE; | 59 | return COMPACT_CONTINUE; |
110 | } | 60 | } |