compaction.h 4.0 KB
Newer Older
1 2 3
#ifndef _LINUX_COMPACTION_H
#define _LINUX_COMPACTION_H

4
/* Return values for compact_zone() and try_to_compact_pages() */
5
/* When adding new states, please adjust include/trace/events/compaction.h */
6 7 8 9 10 11
enum compact_result {
	/*
	 * compaction didn't start as it was not possible or direct reclaim
	 * was more suitable
	 */
	COMPACT_SKIPPED,
12 13 14 15 16
	/* compaction didn't start as it was deferred due to past failures */
	COMPACT_DEFERRED,
	/* compaction not active last round */
	COMPACT_INACTIVE = COMPACT_DEFERRED,

17 18 19 20 21 22 23
	/* compaction should continue to another pageblock */
	COMPACT_CONTINUE,
	/*
	 * direct compaction partially compacted a zone and there are suitable
	 * pages
	 */
	COMPACT_PARTIAL,
24 25 26 27 28 29 30 31 32
	/*
	 * direct compaction has scanned part of the zone but wasn't successfull
	 * to compact suitable pages.
	 */
	COMPACT_PARTIAL_SKIPPED,
	/*
	 * The full zone was compacted scanned but wasn't successfull to compact
	 * suitable pages.
	 */
33 34 35 36 37 38
	COMPACT_COMPLETE,
	/* For more detailed tracepoint output */
	COMPACT_NO_SUITABLE_PAGE,
	COMPACT_NOT_SUITABLE_ZONE,
	COMPACT_CONTENDED,
};
39

40 41 42 43 44 45 46 47
/* Used to signal whether compaction detected need_sched() or lock contention */
/* No contention detected */
#define COMPACT_CONTENDED_NONE	0
/* Either need_sched() was true or fatal signal pending */
#define COMPACT_CONTENDED_SCHED	1
/* Zone lock or lru_lock was contended in async compaction */
#define COMPACT_CONTENDED_LOCK	2

48 49
struct alloc_context; /* in mm/internal.h */

50 51 52 53
#ifdef CONFIG_COMPACTION
extern int sysctl_compact_memory;
extern int sysctl_compaction_handler(struct ctl_table *table, int write,
			void __user *buffer, size_t *length, loff_t *ppos);
54 55 56
extern int sysctl_extfrag_threshold;
extern int sysctl_extfrag_handler(struct ctl_table *table, int write,
			void __user *buffer, size_t *length, loff_t *ppos);
57
extern int sysctl_compact_unevictable_allowed;
58 59

extern int fragmentation_index(struct zone *zone, unsigned int order);
60 61
extern enum compact_result try_to_compact_pages(gfp_t gfp_mask,
			unsigned int order,
62 63
		unsigned int alloc_flags, const struct alloc_context *ac,
		enum migrate_mode mode, int *contended);
64
extern void compact_pgdat(pg_data_t *pgdat, int order);
65
extern void reset_isolation_suitable(pg_data_t *pgdat);
66
extern enum compact_result compaction_suitable(struct zone *zone, int order,
67
		unsigned int alloc_flags, int classzone_idx);
68

69 70 71 72 73
extern void defer_compaction(struct zone *zone, int order);
extern bool compaction_deferred(struct zone *zone, int order);
extern void compaction_defer_reset(struct zone *zone, int order,
				bool alloc_success);
extern bool compaction_restarting(struct zone *zone, int order);
74

75 76 77 78
extern int kcompactd_run(int nid);
extern void kcompactd_stop(int nid);
extern void wakeup_kcompactd(pg_data_t *pgdat, int order, int classzone_idx);

79
#else
80
static inline enum compact_result try_to_compact_pages(gfp_t gfp_mask,
81 82 83
			unsigned int order, int alloc_flags,
			const struct alloc_context *ac,
			enum migrate_mode mode, int *contended)
84 85 86 87
{
	return COMPACT_CONTINUE;
}

88
static inline void compact_pgdat(pg_data_t *pgdat, int order)
89 90 91
{
}

92 93 94 95
static inline void reset_isolation_suitable(pg_data_t *pgdat)
{
}

96
static inline enum compact_result compaction_suitable(struct zone *zone, int order,
97
					int alloc_flags, int classzone_idx)
98 99 100 101
{
	return COMPACT_SKIPPED;
}

102
static inline void defer_compaction(struct zone *zone, int order)
103 104 105
{
}

106
static inline bool compaction_deferred(struct zone *zone, int order)
107
{
108
	return true;
109 110
}

111 112 113 114 115 116 117 118 119 120 121 122
static inline int kcompactd_run(int nid)
{
	return 0;
}
static inline void kcompactd_stop(int nid)
{
}

static inline void wakeup_kcompactd(pg_data_t *pgdat, int order, int classzone_idx)
{
}

123 124
#endif /* CONFIG_COMPACTION */

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#if defined(CONFIG_COMPACTION) && defined(CONFIG_SYSFS) && defined(CONFIG_NUMA)
extern int compaction_register_node(struct node *node);
extern void compaction_unregister_node(struct node *node);

#else

static inline int compaction_register_node(struct node *node)
{
	return 0;
}

static inline void compaction_unregister_node(struct node *node)
{
}
#endif /* CONFIG_COMPACTION && CONFIG_SYSFS && CONFIG_NUMA */

141
#endif /* _LINUX_COMPACTION_H */