Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155/* SPDX-License-Identifier: GPL-2.0 */#ifndef _LINUX_COMPACTION_H#define _LINUX_COMPACTION_H
#include <linux/swap.h>
/* * Determines how hard direct compaction should try to succeed. * Lower value means higher priority, analogically to reclaim priority. */enum compact_priority { COMPACT_PRIO_SYNC_FULL, MIN_COMPACT_PRIORITY = COMPACT_PRIO_SYNC_FULL, COMPACT_PRIO_SYNC_LIGHT, MIN_COMPACT_COSTLY_PRIORITY = COMPACT_PRIO_SYNC_LIGHT, DEF_COMPACT_PRIORITY = COMPACT_PRIO_SYNC_LIGHT, COMPACT_PRIO_ASYNC, INIT_COMPACT_PRIORITY = COMPACT_PRIO_ASYNC};
/* Return values for compact_zone() and try_to_compact_pages() *//* When adding new states, please adjust include/trace/events/compaction.h */enum compact_result { /* For more detailed tracepoint output - internal to compaction */ COMPACT_NOT_SUITABLE_ZONE, /* * compaction didn't start as it was not possible or direct reclaim * was more suitable */ COMPACT_SKIPPED, /* compaction didn't start as it was deferred due to past failures */ COMPACT_DEFERRED,
/* For more detailed tracepoint output - internal to compaction */ COMPACT_NO_SUITABLE_PAGE, /* compaction should continue to another pageblock */ COMPACT_CONTINUE,
/* * The full zone was compacted scanned but wasn't successful to compact * suitable pages. */ COMPACT_COMPLETE, /* * direct compaction has scanned part of the zone but wasn't successful * to compact suitable pages. */ COMPACT_PARTIAL_SKIPPED,
/* compaction terminated prematurely due to lock contentions */ COMPACT_CONTENDED,
/* * direct compaction terminated after concluding that the allocation * should now succeed */ COMPACT_SUCCESS,};
struct alloc_context; /* in mm/internal.h */struct capture_control; /* in mm/internal.h */
/* * Number of free order-0 pages that should be available above given watermark * to make sure compaction has reasonable chance of not running out of free * pages that it needs to isolate as migration target during its work. */static inline unsigned long compact_gap(unsigned int order){ /* * Although all the isolations for migration are temporary, compaction * free scanner may have up to 1 << order pages on its list and then * try to split an (order - 1) free page. At that point, a gap of * 1 << order might not be enough, so it's safer to require twice that * amount. Note that the number of pages on the list is also * effectively limited by COMPACT_CLUSTER_MAX, as that's the maximum * that the migrate scanner can have isolated on migrate list, and free * scanner is only invoked when the number of isolated free pages is * lower than that. */ return min(2UL << order, COMPACT_CLUSTER_MAX);}
static inline int current_is_kcompactd(void){ return current->flags & PF_KCOMPACTD;}
#ifdef CONFIG_COMPACTION
extern unsigned int extfrag_for_order(struct zone *zone, unsigned int order);extern int fragmentation_index(struct zone *zone, unsigned int order);extern enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, enum compact_priority prio, struct capture_control *capc);extern void reset_isolation_suitable(pg_data_t *pgdat);extern bool compaction_suitable(struct zone *zone, int order, unsigned long watermark, int highest_zoneidx);
extern void compaction_defer_reset(struct zone *zone, int order, bool alloc_success);
bool compaction_zonelist_suitable(struct alloc_context *ac, int order, int alloc_flags, gfp_t gfp_mask);
extern void __meminit kcompactd_run(int nid);extern void __meminit kcompactd_stop(int nid);extern void wakeup_kcompactd(pg_data_t *pgdat, int order, int highest_zoneidx);
#elsestatic inline void reset_isolation_suitable(pg_data_t *pgdat){}
static inline bool compaction_suitable(struct zone *zone, int order, unsigned long watermark, int highest_zoneidx){ return false;}
static inline void kcompactd_run(int nid){}static inline void kcompactd_stop(int nid){}
static inline void wakeup_kcompactd(pg_data_t *pgdat, int order, int highest_zoneidx){}
#endif /* CONFIG_COMPACTION */
struct node;#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 */
#endif /* _LINUX_COMPACTION_H */