at v3.5-rc1 3.9 kB view raw
1#ifndef _LINUX_COMPACTION_H 2#define _LINUX_COMPACTION_H 3 4#include <linux/node.h> 5 6/* Return values for compact_zone() and try_to_compact_pages() */ 7/* compaction didn't start as it was not possible or direct reclaim was more suitable */ 8#define COMPACT_SKIPPED 0 9/* compaction should continue to another pageblock */ 10#define COMPACT_CONTINUE 1 11/* direct compaction partially compacted a zone and there are suitable pages */ 12#define COMPACT_PARTIAL 2 13/* The full zone was compacted */ 14#define COMPACT_COMPLETE 3 15 16/* 17 * compaction supports three modes 18 * 19 * COMPACT_ASYNC_MOVABLE uses asynchronous migration and only scans 20 * MIGRATE_MOVABLE pageblocks as migration sources and targets. 21 * COMPACT_ASYNC_UNMOVABLE uses asynchronous migration and only scans 22 * MIGRATE_MOVABLE pageblocks as migration sources. 23 * MIGRATE_UNMOVABLE pageblocks are scanned as potential migration 24 * targets and convers them to MIGRATE_MOVABLE if possible 25 * COMPACT_SYNC uses synchronous migration and scans all pageblocks 26 */ 27enum compact_mode { 28 COMPACT_ASYNC_MOVABLE, 29 COMPACT_ASYNC_UNMOVABLE, 30 COMPACT_SYNC, 31}; 32 33#ifdef CONFIG_COMPACTION 34extern int sysctl_compact_memory; 35extern int sysctl_compaction_handler(struct ctl_table *table, int write, 36 void __user *buffer, size_t *length, loff_t *ppos); 37extern int sysctl_extfrag_threshold; 38extern int sysctl_extfrag_handler(struct ctl_table *table, int write, 39 void __user *buffer, size_t *length, loff_t *ppos); 40 41extern int fragmentation_index(struct zone *zone, unsigned int order); 42extern unsigned long try_to_compact_pages(struct zonelist *zonelist, 43 int order, gfp_t gfp_mask, nodemask_t *mask, 44 bool sync); 45extern int compact_pgdat(pg_data_t *pgdat, int order); 46extern unsigned long compaction_suitable(struct zone *zone, int order); 47 48/* Do not skip compaction more than 64 times */ 49#define COMPACT_MAX_DEFER_SHIFT 6 50 51/* 52 * Compaction is deferred when compaction fails to result in a page 53 * allocation success. 1 << compact_defer_limit compactions are skipped up 54 * to a limit of 1 << COMPACT_MAX_DEFER_SHIFT 55 */ 56static inline void defer_compaction(struct zone *zone, int order) 57{ 58 zone->compact_considered = 0; 59 zone->compact_defer_shift++; 60 61 if (order < zone->compact_order_failed) 62 zone->compact_order_failed = order; 63 64 if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT) 65 zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT; 66} 67 68/* Returns true if compaction should be skipped this time */ 69static inline bool compaction_deferred(struct zone *zone, int order) 70{ 71 unsigned long defer_limit = 1UL << zone->compact_defer_shift; 72 73 if (order < zone->compact_order_failed) 74 return false; 75 76 /* Avoid possible overflow */ 77 if (++zone->compact_considered > defer_limit) 78 zone->compact_considered = defer_limit; 79 80 return zone->compact_considered < (1UL << zone->compact_defer_shift); 81} 82 83#else 84static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, 85 int order, gfp_t gfp_mask, nodemask_t *nodemask, 86 bool sync) 87{ 88 return COMPACT_CONTINUE; 89} 90 91static inline int compact_pgdat(pg_data_t *pgdat, int order) 92{ 93 return COMPACT_CONTINUE; 94} 95 96static inline unsigned long compaction_suitable(struct zone *zone, int order) 97{ 98 return COMPACT_SKIPPED; 99} 100 101static inline void defer_compaction(struct zone *zone, int order) 102{ 103} 104 105static inline bool compaction_deferred(struct zone *zone, int order) 106{ 107 return 1; 108} 109 110#endif /* CONFIG_COMPACTION */ 111 112#if defined(CONFIG_COMPACTION) && defined(CONFIG_SYSFS) && defined(CONFIG_NUMA) 113extern int compaction_register_node(struct node *node); 114extern void compaction_unregister_node(struct node *node); 115 116#else 117 118static inline int compaction_register_node(struct node *node) 119{ 120 return 0; 121} 122 123static inline void compaction_unregister_node(struct node *node) 124{ 125} 126#endif /* CONFIG_COMPACTION && CONFIG_SYSFS && CONFIG_NUMA */ 127 128#endif /* _LINUX_COMPACTION_H */