Merge branch 'akpm' (Andrew's patch-bomb)
Merge first batch of patches from Andrew Morton: "A few misc things and all the MM queue" * emailed from Andrew Morton <akpm@linux-foundation.org>: (92 commits) memcg: avoid THP split in task migration thp: add HPAGE_PMD_* definitions for !CONFIG_TRANSPARENT_HUGEPAGE memcg: clean up existing move charge code mm/memcontrol.c: remove unnecessary 'break' in mem_cgroup_read() mm/memcontrol.c: remove redundant BUG_ON() in mem_cgroup_usage_unregister_event() mm/memcontrol.c: s/stealed/stolen/ memcg: fix performance of mem_cgroup_begin_update_page_stat() memcg: remove PCG_FILE_MAPPED memcg: use new logic for page stat accounting memcg: remove PCG_MOVE_LOCK flag from page_cgroup memcg: simplify move_account() check memcg: remove EXPORT_SYMBOL(mem_cgroup_update_page_stat) memcg: kill dead prev_priority stubs memcg: remove PCG_CACHE page_cgroup flag memcg: let css_get_next() rely upon rcu_read_lock() cgroup: revert ss_id_lock to spinlock idr: make idr_get_next() good for rcu_read_lock() memcg: remove unnecessary thp check in page stat accounting memcg: remove redundant returns memcg: enum lru_list lru ...
This commit is contained in:
@@ -498,7 +498,7 @@ struct cgroup_subsys {
|
||||
struct list_head sibling;
|
||||
/* used when use_id == true */
|
||||
struct idr idr;
|
||||
rwlock_t id_lock;
|
||||
spinlock_t id_lock;
|
||||
|
||||
/* should be defined only by modular subsystems */
|
||||
struct module *module;
|
||||
|
@@ -23,6 +23,7 @@ extern int fragmentation_index(struct zone *zone, unsigned int order);
|
||||
extern unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
int order, gfp_t gfp_mask, nodemask_t *mask,
|
||||
bool sync);
|
||||
extern int compact_pgdat(pg_data_t *pgdat, int order);
|
||||
extern unsigned long compaction_suitable(struct zone *zone, int order);
|
||||
|
||||
/* Do not skip compaction more than 64 times */
|
||||
@@ -33,20 +34,26 @@ extern unsigned long compaction_suitable(struct zone *zone, int order);
|
||||
* allocation success. 1 << compact_defer_limit compactions are skipped up
|
||||
* to a limit of 1 << COMPACT_MAX_DEFER_SHIFT
|
||||
*/
|
||||
static inline void defer_compaction(struct zone *zone)
|
||||
static inline void defer_compaction(struct zone *zone, int order)
|
||||
{
|
||||
zone->compact_considered = 0;
|
||||
zone->compact_defer_shift++;
|
||||
|
||||
if (order < zone->compact_order_failed)
|
||||
zone->compact_order_failed = order;
|
||||
|
||||
if (zone->compact_defer_shift > COMPACT_MAX_DEFER_SHIFT)
|
||||
zone->compact_defer_shift = COMPACT_MAX_DEFER_SHIFT;
|
||||
}
|
||||
|
||||
/* Returns true if compaction should be skipped this time */
|
||||
static inline bool compaction_deferred(struct zone *zone)
|
||||
static inline bool compaction_deferred(struct zone *zone, int order)
|
||||
{
|
||||
unsigned long defer_limit = 1UL << zone->compact_defer_shift;
|
||||
|
||||
if (order < zone->compact_order_failed)
|
||||
return false;
|
||||
|
||||
/* Avoid possible overflow */
|
||||
if (++zone->compact_considered > defer_limit)
|
||||
zone->compact_considered = defer_limit;
|
||||
@@ -62,16 +69,21 @@ static inline unsigned long try_to_compact_pages(struct zonelist *zonelist,
|
||||
return COMPACT_CONTINUE;
|
||||
}
|
||||
|
||||
static inline int compact_pgdat(pg_data_t *pgdat, int order)
|
||||
{
|
||||
return COMPACT_CONTINUE;
|
||||
}
|
||||
|
||||
static inline unsigned long compaction_suitable(struct zone *zone, int order)
|
||||
{
|
||||
return COMPACT_SKIPPED;
|
||||
}
|
||||
|
||||
static inline void defer_compaction(struct zone *zone)
|
||||
static inline void defer_compaction(struct zone *zone, int order)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool compaction_deferred(struct zone *zone)
|
||||
static inline bool compaction_deferred(struct zone *zone, int order)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
@@ -89,42 +89,33 @@ extern void rebuild_sched_domains(void);
|
||||
extern void cpuset_print_task_mems_allowed(struct task_struct *p);
|
||||
|
||||
/*
|
||||
* reading current mems_allowed and mempolicy in the fastpath must protected
|
||||
* by get_mems_allowed()
|
||||
* get_mems_allowed is required when making decisions involving mems_allowed
|
||||
* such as during page allocation. mems_allowed can be updated in parallel
|
||||
* and depending on the new value an operation can fail potentially causing
|
||||
* process failure. A retry loop with get_mems_allowed and put_mems_allowed
|
||||
* prevents these artificial failures.
|
||||
*/
|
||||
static inline void get_mems_allowed(void)
|
||||
static inline unsigned int get_mems_allowed(void)
|
||||
{
|
||||
current->mems_allowed_change_disable++;
|
||||
|
||||
/*
|
||||
* ensure that reading mems_allowed and mempolicy happens after the
|
||||
* update of ->mems_allowed_change_disable.
|
||||
*
|
||||
* the write-side task finds ->mems_allowed_change_disable is not 0,
|
||||
* and knows the read-side task is reading mems_allowed or mempolicy,
|
||||
* so it will clear old bits lazily.
|
||||
*/
|
||||
smp_mb();
|
||||
return read_seqcount_begin(¤t->mems_allowed_seq);
|
||||
}
|
||||
|
||||
static inline void put_mems_allowed(void)
|
||||
/*
|
||||
* If this returns false, the operation that took place after get_mems_allowed
|
||||
* may have failed. It is up to the caller to retry the operation if
|
||||
* appropriate.
|
||||
*/
|
||||
static inline bool put_mems_allowed(unsigned int seq)
|
||||
{
|
||||
/*
|
||||
* ensure that reading mems_allowed and mempolicy before reducing
|
||||
* mems_allowed_change_disable.
|
||||
*
|
||||
* the write-side task will know that the read-side task is still
|
||||
* reading mems_allowed or mempolicy, don't clears old bits in the
|
||||
* nodemask.
|
||||
*/
|
||||
smp_mb();
|
||||
--ACCESS_ONCE(current->mems_allowed_change_disable);
|
||||
return !read_seqcount_retry(¤t->mems_allowed_seq, seq);
|
||||
}
|
||||
|
||||
static inline void set_mems_allowed(nodemask_t nodemask)
|
||||
{
|
||||
task_lock(current);
|
||||
write_seqcount_begin(¤t->mems_allowed_seq);
|
||||
current->mems_allowed = nodemask;
|
||||
write_seqcount_end(¤t->mems_allowed_seq);
|
||||
task_unlock(current);
|
||||
}
|
||||
|
||||
@@ -234,12 +225,14 @@ static inline void set_mems_allowed(nodemask_t nodemask)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void get_mems_allowed(void)
|
||||
static inline unsigned int get_mems_allowed(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void put_mems_allowed(void)
|
||||
static inline bool put_mems_allowed(unsigned int seq)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_CPUSETS */
|
||||
|
@@ -51,6 +51,9 @@ extern pmd_t *page_check_address_pmd(struct page *page,
|
||||
unsigned long address,
|
||||
enum page_check_address_pmd_flag flag);
|
||||
|
||||
#define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
|
||||
#define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
#define HPAGE_PMD_SHIFT HPAGE_SHIFT
|
||||
#define HPAGE_PMD_MASK HPAGE_MASK
|
||||
@@ -102,8 +105,6 @@ extern void __split_huge_page_pmd(struct mm_struct *mm, pmd_t *pmd);
|
||||
BUG_ON(pmd_trans_splitting(*____pmd) || \
|
||||
pmd_trans_huge(*____pmd)); \
|
||||
} while (0)
|
||||
#define HPAGE_PMD_ORDER (HPAGE_PMD_SHIFT-PAGE_SHIFT)
|
||||
#define HPAGE_PMD_NR (1<<HPAGE_PMD_ORDER)
|
||||
#if HPAGE_PMD_ORDER > MAX_ORDER
|
||||
#error "hugepages can't be allocated by the buddy allocator"
|
||||
#endif
|
||||
@@ -113,6 +114,18 @@ extern void __vma_adjust_trans_huge(struct vm_area_struct *vma,
|
||||
unsigned long start,
|
||||
unsigned long end,
|
||||
long adjust_next);
|
||||
extern int __pmd_trans_huge_lock(pmd_t *pmd,
|
||||
struct vm_area_struct *vma);
|
||||
/* mmap_sem must be held on entry */
|
||||
static inline int pmd_trans_huge_lock(pmd_t *pmd,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
VM_BUG_ON(!rwsem_is_locked(&vma->vm_mm->mmap_sem));
|
||||
if (pmd_trans_huge(*pmd))
|
||||
return __pmd_trans_huge_lock(pmd, vma);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
|
||||
unsigned long start,
|
||||
unsigned long end,
|
||||
@@ -146,9 +159,9 @@ static inline struct page *compound_trans_head(struct page *page)
|
||||
return page;
|
||||
}
|
||||
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
#define HPAGE_PMD_SHIFT ({ BUG(); 0; })
|
||||
#define HPAGE_PMD_MASK ({ BUG(); 0; })
|
||||
#define HPAGE_PMD_SIZE ({ BUG(); 0; })
|
||||
#define HPAGE_PMD_SHIFT ({ BUILD_BUG(); 0; })
|
||||
#define HPAGE_PMD_MASK ({ BUILD_BUG(); 0; })
|
||||
#define HPAGE_PMD_SIZE ({ BUILD_BUG(); 0; })
|
||||
|
||||
#define hpage_nr_pages(x) 1
|
||||
|
||||
@@ -176,6 +189,11 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma,
|
||||
long adjust_next)
|
||||
{
|
||||
}
|
||||
static inline int pmd_trans_huge_lock(pmd_t *pmd,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
|
||||
#endif /* _LINUX_HUGE_MM_H */
|
||||
|
@@ -14,6 +14,15 @@ struct user_struct;
|
||||
#include <linux/shm.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
struct hugepage_subpool {
|
||||
spinlock_t lock;
|
||||
long count;
|
||||
long max_hpages, used_hpages;
|
||||
};
|
||||
|
||||
struct hugepage_subpool *hugepage_new_subpool(long nr_blocks);
|
||||
void hugepage_put_subpool(struct hugepage_subpool *spool);
|
||||
|
||||
int PageHuge(struct page *page);
|
||||
|
||||
void reset_vma_resv_huge_pages(struct vm_area_struct *vma);
|
||||
@@ -128,35 +137,14 @@ enum {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HUGETLBFS
|
||||
struct hugetlbfs_config {
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
umode_t mode;
|
||||
long nr_blocks;
|
||||
long nr_inodes;
|
||||
struct hstate *hstate;
|
||||
};
|
||||
|
||||
struct hugetlbfs_sb_info {
|
||||
long max_blocks; /* blocks allowed */
|
||||
long free_blocks; /* blocks free */
|
||||
long max_inodes; /* inodes allowed */
|
||||
long free_inodes; /* inodes free */
|
||||
spinlock_t stat_lock;
|
||||
struct hstate *hstate;
|
||||
struct hugepage_subpool *spool;
|
||||
};
|
||||
|
||||
|
||||
struct hugetlbfs_inode_info {
|
||||
struct shared_policy policy;
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
|
||||
static inline struct hugetlbfs_inode_info *HUGETLBFS_I(struct inode *inode)
|
||||
{
|
||||
return container_of(inode, struct hugetlbfs_inode_info, vfs_inode);
|
||||
}
|
||||
|
||||
static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
|
||||
{
|
||||
return sb->s_fs_info;
|
||||
@@ -164,10 +152,9 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
|
||||
|
||||
extern const struct file_operations hugetlbfs_file_operations;
|
||||
extern const struct vm_operations_struct hugetlb_vm_ops;
|
||||
struct file *hugetlb_file_setup(const char *name, size_t size, vm_flags_t acct,
|
||||
struct file *hugetlb_file_setup(const char *name, unsigned long addr,
|
||||
size_t size, vm_flags_t acct,
|
||||
struct user_struct **user, int creat_flags);
|
||||
int hugetlb_get_quota(struct address_space *mapping, long delta);
|
||||
void hugetlb_put_quota(struct address_space *mapping, long delta);
|
||||
|
||||
static inline int is_file_hugepages(struct file *file)
|
||||
{
|
||||
@@ -179,15 +166,11 @@ static inline int is_file_hugepages(struct file *file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void set_file_hugepages(struct file *file)
|
||||
{
|
||||
file->f_op = &hugetlbfs_file_operations;
|
||||
}
|
||||
#else /* !CONFIG_HUGETLBFS */
|
||||
|
||||
#define is_file_hugepages(file) 0
|
||||
#define set_file_hugepages(file) BUG()
|
||||
static inline struct file *hugetlb_file_setup(const char *name, size_t size,
|
||||
static inline struct file *
|
||||
hugetlb_file_setup(const char *name, unsigned long addr, size_t size,
|
||||
vm_flags_t acctflag, struct user_struct **user, int creat_flags)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
|
@@ -29,6 +29,13 @@ extern struct fs_struct init_fs;
|
||||
#define INIT_GROUP_RWSEM(sig)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPUSETS
|
||||
#define INIT_CPUSET_SEQ \
|
||||
.mems_allowed_seq = SEQCNT_ZERO,
|
||||
#else
|
||||
#define INIT_CPUSET_SEQ
|
||||
#endif
|
||||
|
||||
#define INIT_SIGNALS(sig) { \
|
||||
.nr_threads = 1, \
|
||||
.wait_chldexit = __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),\
|
||||
@@ -192,6 +199,7 @@ extern struct cred init_cred;
|
||||
INIT_FTRACE_GRAPH \
|
||||
INIT_TRACE_RECURSION \
|
||||
INIT_TASK_RCU_PREEMPT(tsk) \
|
||||
INIT_CPUSET_SEQ \
|
||||
}
|
||||
|
||||
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#define KPF_NOPAGE 20
|
||||
|
||||
#define KPF_KSM 21
|
||||
#define KPF_THP 22
|
||||
|
||||
/* kernel hacking assistances
|
||||
* WARNING: subject to change, never rely on them!
|
||||
|
@@ -77,7 +77,8 @@ extern void mem_cgroup_uncharge_end(void);
|
||||
extern void mem_cgroup_uncharge_page(struct page *page);
|
||||
extern void mem_cgroup_uncharge_cache_page(struct page *page);
|
||||
|
||||
extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask);
|
||||
extern void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
|
||||
int order);
|
||||
int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg);
|
||||
|
||||
extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page);
|
||||
@@ -140,6 +141,34 @@ static inline bool mem_cgroup_disabled(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
void __mem_cgroup_begin_update_page_stat(struct page *page, bool *locked,
|
||||
unsigned long *flags);
|
||||
|
||||
extern atomic_t memcg_moving;
|
||||
|
||||
static inline void mem_cgroup_begin_update_page_stat(struct page *page,
|
||||
bool *locked, unsigned long *flags)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
rcu_read_lock();
|
||||
*locked = false;
|
||||
if (atomic_read(&memcg_moving))
|
||||
__mem_cgroup_begin_update_page_stat(page, locked, flags);
|
||||
}
|
||||
|
||||
void __mem_cgroup_end_update_page_stat(struct page *page,
|
||||
unsigned long *flags);
|
||||
static inline void mem_cgroup_end_update_page_stat(struct page *page,
|
||||
bool *locked, unsigned long *flags)
|
||||
{
|
||||
if (mem_cgroup_disabled())
|
||||
return;
|
||||
if (*locked)
|
||||
__mem_cgroup_end_update_page_stat(page, flags);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void mem_cgroup_update_page_stat(struct page *page,
|
||||
enum mem_cgroup_page_stat_item idx,
|
||||
int val);
|
||||
@@ -298,21 +327,6 @@ static inline void mem_cgroup_iter_break(struct mem_cgroup *root,
|
||||
{
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_get_reclaim_priority(struct mem_cgroup *memcg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_note_reclaim_priority(struct mem_cgroup *memcg,
|
||||
int priority)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_record_reclaim_priority(struct mem_cgroup *memcg,
|
||||
int priority)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool mem_cgroup_disabled(void)
|
||||
{
|
||||
return true;
|
||||
@@ -355,6 +369,16 @@ mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_begin_update_page_stat(struct page *page,
|
||||
bool *locked, unsigned long *flags)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_end_update_page_stat(struct page *page,
|
||||
bool *locked, unsigned long *flags)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void mem_cgroup_inc_page_stat(struct page *page,
|
||||
enum mem_cgroup_page_stat_item idx)
|
||||
{
|
||||
@@ -391,7 +415,7 @@ static inline void mem_cgroup_replace_page_cache(struct page *oldpage,
|
||||
struct page *newpage)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_CGROUP_MEM_CONT */
|
||||
#endif /* CONFIG_CGROUP_MEM_RES_CTLR */
|
||||
|
||||
#if !defined(CONFIG_CGROUP_MEM_RES_CTLR) || !defined(CONFIG_DEBUG_VM)
|
||||
static inline bool
|
||||
|
@@ -8,7 +8,6 @@
|
||||
typedef struct page *new_page_t(struct page *, unsigned long private, int **);
|
||||
|
||||
#ifdef CONFIG_MIGRATION
|
||||
#define PAGE_MIGRATION 1
|
||||
|
||||
extern void putback_lru_pages(struct list_head *l);
|
||||
extern int migrate_page(struct address_space *,
|
||||
@@ -32,7 +31,6 @@ extern void migrate_page_copy(struct page *newpage, struct page *page);
|
||||
extern int migrate_huge_page_move_mapping(struct address_space *mapping,
|
||||
struct page *newpage, struct page *page);
|
||||
#else
|
||||
#define PAGE_MIGRATION 0
|
||||
|
||||
static inline void putback_lru_pages(struct list_head *l) {}
|
||||
static inline int migrate_pages(struct list_head *l, new_page_t x,
|
||||
|
@@ -1040,6 +1040,9 @@ static inline int stack_guard_page_end(struct vm_area_struct *vma,
|
||||
!vma_growsup(vma->vm_next, addr);
|
||||
}
|
||||
|
||||
extern pid_t
|
||||
vm_is_stack(struct task_struct *task, struct vm_area_struct *vma, int in_group);
|
||||
|
||||
extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
||||
unsigned long old_addr, struct vm_area_struct *new_vma,
|
||||
unsigned long new_addr, unsigned long len);
|
||||
@@ -1058,19 +1061,20 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
|
||||
/*
|
||||
* per-process(per-mm_struct) statistics.
|
||||
*/
|
||||
static inline void set_mm_counter(struct mm_struct *mm, int member, long value)
|
||||
{
|
||||
atomic_long_set(&mm->rss_stat.count[member], value);
|
||||
}
|
||||
|
||||
#if defined(SPLIT_RSS_COUNTING)
|
||||
unsigned long get_mm_counter(struct mm_struct *mm, int member);
|
||||
#else
|
||||
static inline unsigned long get_mm_counter(struct mm_struct *mm, int member)
|
||||
{
|
||||
return atomic_long_read(&mm->rss_stat.count[member]);
|
||||
}
|
||||
long val = atomic_long_read(&mm->rss_stat.count[member]);
|
||||
|
||||
#ifdef SPLIT_RSS_COUNTING
|
||||
/*
|
||||
* counter is updated in asynchronous manner and may go to minus.
|
||||
* But it's never be expected number for users.
|
||||
*/
|
||||
if (val < 0)
|
||||
val = 0;
|
||||
#endif
|
||||
return (unsigned long)val;
|
||||
}
|
||||
|
||||
static inline void add_mm_counter(struct mm_struct *mm, int member, long value)
|
||||
{
|
||||
@@ -1127,9 +1131,9 @@ static inline void setmax_mm_hiwater_rss(unsigned long *maxrss,
|
||||
}
|
||||
|
||||
#if defined(SPLIT_RSS_COUNTING)
|
||||
void sync_mm_rss(struct task_struct *task, struct mm_struct *mm);
|
||||
void sync_mm_rss(struct mm_struct *mm);
|
||||
#else
|
||||
static inline void sync_mm_rss(struct task_struct *task, struct mm_struct *mm)
|
||||
static inline void sync_mm_rss(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -1291,8 +1295,6 @@ extern void get_pfn_range_for_nid(unsigned int nid,
|
||||
extern unsigned long find_min_pfn_with_active_regions(void);
|
||||
extern void free_bootmem_with_active_regions(int nid,
|
||||
unsigned long max_low_pfn);
|
||||
int add_from_early_node_map(struct range *range, int az,
|
||||
int nr_range, int nid);
|
||||
extern void sparse_memory_present_with_active_regions(int nid);
|
||||
|
||||
#endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
|
||||
|
@@ -365,6 +365,7 @@ struct zone {
|
||||
*/
|
||||
unsigned int compact_considered;
|
||||
unsigned int compact_defer_shift;
|
||||
int compact_order_failed;
|
||||
#endif
|
||||
|
||||
ZONE_PADDING(_pad1_)
|
||||
|
@@ -49,7 +49,7 @@ extern int try_set_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
|
||||
extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
|
||||
|
||||
extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
|
||||
int order, nodemask_t *mask);
|
||||
int order, nodemask_t *mask, bool force_kill);
|
||||
extern int register_oom_notifier(struct notifier_block *nb);
|
||||
extern int unregister_oom_notifier(struct notifier_block *nb);
|
||||
|
||||
|
@@ -414,11 +414,26 @@ static inline int PageTransHuge(struct page *page)
|
||||
return PageHead(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* PageTransCompound returns true for both transparent huge pages
|
||||
* and hugetlbfs pages, so it should only be called when it's known
|
||||
* that hugetlbfs pages aren't involved.
|
||||
*/
|
||||
static inline int PageTransCompound(struct page *page)
|
||||
{
|
||||
return PageCompound(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* PageTransTail returns true for both transparent huge pages
|
||||
* and hugetlbfs pages, so it should only be called when it's known
|
||||
* that hugetlbfs pages aren't involved.
|
||||
*/
|
||||
static inline int PageTransTail(struct page *page)
|
||||
{
|
||||
return PageTail(page);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int PageTransHuge(struct page *page)
|
||||
@@ -430,6 +445,11 @@ static inline int PageTransCompound(struct page *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int PageTransTail(struct page *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
|
@@ -4,12 +4,8 @@
|
||||
enum {
|
||||
/* flags for mem_cgroup */
|
||||
PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */
|
||||
PCG_CACHE, /* charged as cache */
|
||||
PCG_USED, /* this object is in use. */
|
||||
PCG_MIGRATION, /* under page migration */
|
||||
/* flags for mem_cgroup and file and I/O status */
|
||||
PCG_MOVE_LOCK, /* For race between move_account v.s. following bits */
|
||||
PCG_FILE_MAPPED, /* page is accounted as "mapped" */
|
||||
__NR_PCG_FLAGS,
|
||||
};
|
||||
|
||||
@@ -64,19 +60,10 @@ static inline void ClearPageCgroup##uname(struct page_cgroup *pc) \
|
||||
static inline int TestClearPageCgroup##uname(struct page_cgroup *pc) \
|
||||
{ return test_and_clear_bit(PCG_##lname, &pc->flags); }
|
||||
|
||||
/* Cache flag is set only once (at allocation) */
|
||||
TESTPCGFLAG(Cache, CACHE)
|
||||
CLEARPCGFLAG(Cache, CACHE)
|
||||
SETPCGFLAG(Cache, CACHE)
|
||||
|
||||
TESTPCGFLAG(Used, USED)
|
||||
CLEARPCGFLAG(Used, USED)
|
||||
SETPCGFLAG(Used, USED)
|
||||
|
||||
SETPCGFLAG(FileMapped, FILE_MAPPED)
|
||||
CLEARPCGFLAG(FileMapped, FILE_MAPPED)
|
||||
TESTPCGFLAG(FileMapped, FILE_MAPPED)
|
||||
|
||||
SETPCGFLAG(Migration, MIGRATION)
|
||||
CLEARPCGFLAG(Migration, MIGRATION)
|
||||
TESTPCGFLAG(Migration, MIGRATION)
|
||||
@@ -85,7 +72,7 @@ static inline void lock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
/*
|
||||
* Don't take this lock in IRQ context.
|
||||
* This lock is for pc->mem_cgroup, USED, CACHE, MIGRATION
|
||||
* This lock is for pc->mem_cgroup, USED, MIGRATION
|
||||
*/
|
||||
bit_spin_lock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
@@ -95,24 +82,6 @@ static inline void unlock_page_cgroup(struct page_cgroup *pc)
|
||||
bit_spin_unlock(PCG_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
static inline void move_lock_page_cgroup(struct page_cgroup *pc,
|
||||
unsigned long *flags)
|
||||
{
|
||||
/*
|
||||
* We know updates to pc->flags of page cache's stats are from both of
|
||||
* usual context or IRQ context. Disable IRQ to avoid deadlock.
|
||||
*/
|
||||
local_irq_save(*flags);
|
||||
bit_spin_lock(PCG_MOVE_LOCK, &pc->flags);
|
||||
}
|
||||
|
||||
static inline void move_unlock_page_cgroup(struct page_cgroup *pc,
|
||||
unsigned long *flags)
|
||||
{
|
||||
bit_spin_unlock(PCG_MOVE_LOCK, &pc->flags);
|
||||
local_irq_restore(*flags);
|
||||
}
|
||||
|
||||
#else /* CONFIG_CGROUP_MEM_RES_CTLR */
|
||||
struct page_cgroup;
|
||||
|
||||
|
@@ -122,7 +122,6 @@ void unlink_anon_vmas(struct vm_area_struct *);
|
||||
int anon_vma_clone(struct vm_area_struct *, struct vm_area_struct *);
|
||||
void anon_vma_moveto_tail(struct vm_area_struct *);
|
||||
int anon_vma_fork(struct vm_area_struct *, struct vm_area_struct *);
|
||||
void __anon_vma_link(struct vm_area_struct *);
|
||||
|
||||
static inline void anon_vma_merge(struct vm_area_struct *vma,
|
||||
struct vm_area_struct *next)
|
||||
|
@@ -1514,7 +1514,7 @@ struct task_struct {
|
||||
#endif
|
||||
#ifdef CONFIG_CPUSETS
|
||||
nodemask_t mems_allowed; /* Protected by alloc_lock */
|
||||
int mems_allowed_change_disable;
|
||||
seqcount_t mems_allowed_seq; /* Seqence no to catch updates */
|
||||
int cpuset_mem_spread_rotor;
|
||||
int cpuset_slab_spread_rotor;
|
||||
#endif
|
||||
|
@@ -223,6 +223,7 @@ extern void lru_add_page_tail(struct zone* zone,
|
||||
extern void activate_page(struct page *);
|
||||
extern void mark_page_accessed(struct page *);
|
||||
extern void lru_add_drain(void);
|
||||
extern void lru_add_drain_cpu(int cpu);
|
||||
extern int lru_add_drain_all(void);
|
||||
extern void rotate_reclaimable_page(struct page *page);
|
||||
extern void deactivate_page(struct page *page);
|
||||
@@ -329,7 +330,6 @@ extern long total_swap_pages;
|
||||
extern void si_swapinfo(struct sysinfo *);
|
||||
extern swp_entry_t get_swap_page(void);
|
||||
extern swp_entry_t get_swap_page_of_type(int);
|
||||
extern int valid_swaphandles(swp_entry_t, unsigned long *);
|
||||
extern int add_swap_count_continuation(swp_entry_t, gfp_t);
|
||||
extern void swap_shmem_alloc(swp_entry_t);
|
||||
extern int swap_duplicate(swp_entry_t);
|
||||
|
Reference in New Issue
Block a user