mm, compaction: defer each zone individually instead of preferred zone
[deliverable/linux.git] / include / linux / compaction.h
1 #ifndef _LINUX_COMPACTION_H
2 #define _LINUX_COMPACTION_H
3
4 /* Return values for compact_zone() and try_to_compact_pages() */
5 /* compaction didn't start as it was deferred due to past failures */
6 #define COMPACT_DEFERRED 0
7 /* compaction didn't start as it was not possible or direct reclaim was more suitable */
8 #define COMPACT_SKIPPED 1
9 /* compaction should continue to another pageblock */
10 #define COMPACT_CONTINUE 2
11 /* direct compaction partially compacted a zone and there are suitable pages */
12 #define COMPACT_PARTIAL 3
13 /* The full zone was compacted */
14 #define COMPACT_COMPLETE 4
15
16 #ifdef CONFIG_COMPACTION
17 extern int sysctl_compact_memory;
18 extern int sysctl_compaction_handler(struct ctl_table *table, int write,
19 void __user *buffer, size_t *length, loff_t *ppos);
20 extern int sysctl_extfrag_threshold;
21 extern int sysctl_extfrag_handler(struct ctl_table *table, int write,
22 void __user *buffer, size_t *length, loff_t *ppos);
23
24 extern int fragmentation_index(struct zone *zone, unsigned int order);
25 extern unsigned long try_to_compact_pages(struct zonelist *zonelist,
26 int order, gfp_t gfp_mask, nodemask_t *mask,
27 enum migrate_mode mode, bool *contended,
28 struct zone **candidate_zone);
29 extern void compact_pgdat(pg_data_t *pgdat, int order);
30 extern void reset_isolation_suitable(pg_data_t *pgdat);
31 extern unsigned long compaction_suitable(struct zone *zone, int order);
32
33 /* Do not skip compaction more than 64 times */
34 #define COMPACT_MAX_DEFER_SHIFT 6
35
36 /*
37 * Compaction is deferred when compaction fails to result in a page
38 * allocation success. 1 << compact_defer_limit compactions are skipped up
39 * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
40 */
41 static inline void defer_compaction(struct zone *zone, int order)
42 {
43 zone->compact_considered = 0;
44 zone->compact_defer_shift++;
45
46 if (order < zone->compact_order_failed)
47 zone->compact_order_failed = order;
48
49 if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
50 zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
51 }
52
53 /* Returns true if compaction should be skipped this time */
54 static inline bool compaction_deferred(struct zone *zone, int order)
55 {
56 unsigned long defer_limit = 1UL << zone->compact_defer_shift;
57
58 if (order < zone->compact_order_failed)
59 return false;
60
61 /* Avoid possible overflow */
62 if (++zone->compact_considered > defer_limit)
63 zone->compact_considered = defer_limit;
64
65 return zone->compact_considered < defer_limit;
66 }
67
68 /*
69 * Update defer tracking counters after successful compaction of given order,
70 * which means an allocation either succeeded (alloc_success == true) or is
71 * expected to succeed.
72 */
73 static inline void compaction_defer_reset(struct zone *zone, int order,
74 bool alloc_success)
75 {
76 if (alloc_success) {
77 zone->compact_considered = 0;
78 zone->compact_defer_shift = 0;
79 }
80 if (order >= zone->compact_order_failed)
81 zone->compact_order_failed = order + 1;
82 }
83
84 /* Returns true if restarting compaction after many failures */
85 static inline bool compaction_restarting(struct zone *zone, int order)
86 {
87 if (order < zone->compact_order_failed)
88 return false;
89
90 return zone->compact_defer_shift == COMPACT_MAX_DEFER_SHIFT &&
91 zone->compact_considered >= 1UL << zone->compact_defer_shift;
92 }
93
94 #else
95 static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,
96 int order, gfp_t gfp_mask, nodemask_t *nodemask,
97 enum migrate_mode mode, bool *contended,
98 struct zone **candidate_zone)
99 {
100 return COMPACT_CONTINUE;
101 }
102
103 static inline void compact_pgdat(pg_data_t *pgdat, int order)
104 {
105 }
106
107 static inline void reset_isolation_suitable(pg_data_t *pgdat)
108 {
109 }
110
111 static inline unsigned long compaction_suitable(struct zone *zone, int order)
112 {
113 return COMPACT_SKIPPED;
114 }
115
116 static inline void defer_compaction(struct zone *zone, int order)
117 {
118 }
119
120 static inline bool compaction_deferred(struct zone *zone, int order)
121 {
122 return true;
123 }
124
125 #endif /* CONFIG_COMPACTION */
126
127 #if defined(CONFIG_COMPACTION) && defined(CONFIG_SYSFS) && defined(CONFIG_NUMA)
128 extern int compaction_register_node(struct node *node);
129 extern void compaction_unregister_node(struct node *node);
130
131 #else
132
133 static inline int compaction_register_node(struct node *node)
134 {
135 return 0;
136 }
137
138 static inline void compaction_unregister_node(struct node *node)
139 {
140 }
141 #endif /* CONFIG_COMPACTION && CONFIG_SYSFS && CONFIG_NUMA */
142
143 #endif /* _LINUX_COMPACTION_H */
This page took 0.033787 seconds and 5 git commands to generate.