Linux 3.0.39
I'm announcing the release of the 3.0.39 kernel.
All users of the 3.0 kernel series must upgrade.
Many thanks to Mel Gorman for all of the backported performance patches that he took the time to send in and get merged properly. That was an incredible job, everyone using the 3.0-stable tree now owes you a beverage of your choice when they see you.
The updated 3.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/trace/postprocess/trace-vmscan-postprocess.pl | 8 Makefile | 2 arch/mips/include/asm/thread_info.h | 4 arch/mips/kernel/vmlinux.lds.S | 3 drivers/base/memory.c | 58 +- drivers/md/dm-raid1.c | 2 drivers/md/dm-region-hash.c | 5 fs/btrfs/disk-io.c | 5 fs/cifs/readdir.c | 7 fs/hugetlbfs/inode.c | 3 fs/nfs/internal.h | 2 fs/nfs/write.c | 4 fs/ubifs/sb.c | 8 include/linux/cpuset.h | 47 - include/linux/fs.h | 11 include/linux/init_task.h | 8 include/linux/memcontrol.h | 3 include/linux/migrate.h | 23 include/linux/mmzone.h | 14 include/linux/sched.h | 2 include/linux/swap.h | 7 include/trace/events/vmscan.h | 85 +++ kernel/cpuset.c | 63 +- kernel/fork.c | 3 kernel/time/ntp.c | 8 mm/compaction.c | 26 - mm/filemap.c | 11 mm/hugetlb.c | 13 mm/memcontrol.c | 3 mm/memory-failure.c | 2 mm/memory_hotplug.c | 2 mm/mempolicy.c | 30 - mm/migrate.c | 240 ++++++--- mm/page_alloc.c | 118 +++- mm/slab.c | 13 mm/slub.c | 40 + mm/vmscan.c | 296 +++++++++--- mm/vmstat.c | 2 38 files changed, 826 insertions(+), 355 deletions(-)
Aaditya Kumar (1):
mm: fix lost kswapd wakeup in kswapd_stop()
Alex Shi (2):
kswapd: avoid unnecessary rebalance after an unsuccessful balancing
kswapd: assign new_order and new_classzone_idx after wakeup in sleeping
Artem Bityutskiy (1):
UBIFS: fix a bug in empty space fix-up
Dave Chinner (3):
vmscan: add shrink_slab tracepoints
vmscan: shrinker->nr updates race and go wrong
vmscan: reduce wind up shrinker->nr when shrinker can't do workDavid Daney (1):
MIPS: Properly align the .data..init_task section.
David Rientjes (2):
cpusets: avoid looping when storing to mems_allowed if one node remains set
cpusets: stall when updating mems_allowed for mempolicy or disjoint nodemask
Dimitri Sivanich (1):
mm/vmstat.c: cache align vm_stat
Greg Kroah-Hartman (1):
Linux 3.0.39
Hugh Dickins (1):
mm: test PageSwapBacked in lumpy reclaim
Jeff Layton (1):
cifs: always update the inode cache with the results from a FIND_*
Johannes Weiner (2):
mm: vmscan: fix force-scanning small targets without swap
mm: vmscan: convert global reclaim to per-memcg LRU lists
John Stultz (1):
ntp: Fix STA_INS/DEL clearing bug
Konstantin Khlebnikov (4):
vmscan: promote shared file mapped pages
vmscan: activate executable pages after first usage mm/hugetlb: fix warning in alloc_huge_page/dequeue_huge_page_vma
vmscan: fix initial shrinker size handling
Mel Gorman (12):
mm: memory hotplug: Check if pages are correctly reserved on a per-section basis
mm: reduce the amount of work done when updating min_free_kbytes
vmscan: abort reclaim/compaction if compaction can proceed
mm: compaction: allow compaction to isolate dirty pages
mm: compaction: determine if dirty pages can be migrated without blocking within ->migratepage
mm: page allocator: do not call direct reclaim for THP allocations while compaction is deferred
mm: compaction: make isolate_lru_page() filter-aware again
mm: compaction: introduce sync-light migration for use by compaction
mm: vmscan: when reclaiming for compaction, ensure there are sufficient free pages available
mm: vmscan: do not OOM if aborting reclaim to start compaction
mm: vmscan: check if reclaim should really abort even if compaction_ready() is true for one zone
cpuset: mm: reduce large amounts of memory barrier related damage v3
Mikulas Patocka (1):
dm raid1: fix crash with mirror recovery and discard
Minchan Kim (6):
mm: compaction: trivial clean up in acct_isolated()
mm: change isolate mode from #define to bitwise type
mm: compaction: make isolate_lru_page() filter-aware
mm: zone_reclaim: make isolate_lru_page() filter-aware
mm: migration: clean up unmap_and_move()
mm/vmscan.c: consider swap space when deciding whether to continue reclaim
Rik van Riel (1):
vmscan: limit direct reclaim for higher order allocations
Shaohua Li (1):
vmscan: clear ZONE_CONGESTED for zone with good watermark
Documentation/trace/postprocess/trace-vmscan-postprocess.pl +4 -4
@@ -379,10 +379,10 @@ EVENT_PROCESS: # To closer match vmstat scanning statistics, only count isolate_both # and isolate_inactive as scanning. isolate_active is rotation - # isolate_inactive == 0 - # isolate_active == 1 - # isolate_both == 2 - if ($isolate_mode != 1) { + # isolate_inactive == 1 + # isolate_active == 2 + # isolate_both == 3 + if ($isolate_mode != 2) { $perprocesspid{$process_pid}->{HIGH_NR_SCANNED} += $nr_scanned; } $perprocesspid{$process_pid}->{HIGH_NR_CONTIG_DIRTY} += $nr_contig_dirty;
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 38 +SUBLEVEL = 39 EXTRAVERSION = NAME = Sneaky Weasel
arch/mips/include/asm/thread_info.h +2 -2
@@ -60,6 +60,8 @@ struct thread_info { registerstruct thread_info *__current_thread_info __asm__("$28" );#define current_thread_info () __current_thread_info +#endif /* !__ASSEMBLY__ */ +/* thread information allocation */ #if defined(CONFIG_PAGE_SIZE_4KB ) && defined(CONFIG_32BIT )#define THREAD_SIZE_ORDER (1)
@@ -97,8 +99,6 @@ register struct thread_info *__current_thread_info __asm__("$28");#define free_thread_info (info) kfree(info) -#endif /* !__ASSEMBLY__ */ -#define PREEMPT_ACTIVE 0x10000000/*
arch/mips/kernel/vmlinux.lds.S +2 -1
@@ -1,5 +1,6 @@ #include <asm/asm-offsets.h> #include <asm/page.h> +#include <asm/thread_info.h> #include <asm-generic/vmlinux.lds.h> #undef mips
@@ -73,7 +74,7 @@ SECTIONS .data : { /* Data */ . = . + DATAOFFSET; /* for CONFIG_MAPPED_KERNEL */ - INIT_TASK_DATA(PAGE_SIZE) + INIT_TASK_DATA(THREAD_SIZE) NOSAVE_DATA CACHELINE_ALIGNED_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT) READ_MOSTLY_DATA(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
drivers/base/memory.c +40 -18
79 lines not on this page · raw message
drivers/md/dm-raid1.c +1 -1
@@ -1210,7 +1210,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio,* We need to dec pending if this was a write. */ if (rw ==WRITE ) { -if (!(bio->bi_rw &REQ_FLUSH )) +if (!(bio->bi_rw & (REQ_FLUSH |REQ_DISCARD )))dm_rh_dec (ms->rh, map_context->ll);return error; }
drivers/md/dm-region-hash.c +4 -1
@@ -404,6 +404,9 @@ void dm_rh_mark_nosync(struct dm_region_hash *rh, struct bio *bio)return ; } +if (bio->bi_rw &REQ_DISCARD ) +return ; +/* We must inform the log that the sync count has changed. */ log->type->set_region_sync (log, region,0 );
@@ -524,7 +527,7 @@ void dm_rh_inc_pending(struct dm_region_hash *rh, struct bio_list *bios)struct bio *bio;for (bio = bios->head; bio; bio = bio->bi_next) { -if (bio->bi_rw &REQ_FLUSH ) +if (bio->bi_rw & (REQ_FLUSH |REQ_DISCARD ))continue ;rh_inc (rh,dm_rh_bio_to_region (rh, bio)); }
fs/btrfs/disk-io.c +3 -2
@@ -801,7 +801,8 @@ static int btree_submit_bio_hook(struct inode *inode, int rw, struct bio *bio,#ifdef CONFIG_MIGRATION static int btree_migratepage (struct address_space *mapping, -struct page *newpage,struct page *page) +struct page *newpage,struct page *page, +enum migrate_mode mode) {/* * we can't safely write a btree page from here,
@@ -816,7 +817,7 @@ static int btree_migratepage(struct address_space *mapping,if (page_has_private (page) && !try_to_release_page (page,GFP_KERNEL ))return -EAGAIN ; - return migrate_page(mapping, newpage, page); + return migrate_page(mapping, newpage, page, mode); }#endif
fs/cifs/readdir.c +5 -2
@@ -85,9 +85,12 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, dentry =d_lookup (parent, name);if (dentry) { -/* FIXME: check for inode number changes? */ -if (dentry->d_inode !=NULL ) + inode = dentry->d_inode; +/* update inode in place if i_ino didn't change */ +if (inode &&CIFS_I (inode)->uniqueid == fattr->cf_uniqueid) { +cifs_fattr_to_inode (inode, fattr);return dentry; + }d_drop (dentry);dput (dentry); }
fs/hugetlbfs/inode.c +2 -1
@@ -568,7 +568,8 @@ static int hugetlbfs_set_page_dirty(struct page *page) }static int hugetlbfs_migrate_page (struct address_space *mapping, -struct page *newpage,struct page *page) +struct page *newpage,struct page *page, +enum migrate_mode mode) {int rc;
fs/nfs/internal.h +1 -1
@@ -315,7 +315,7 @@ void nfs_commit_release_pages(struct nfs_write_data *data);#ifdef CONFIG_MIGRATION extern int nfs_migrate_page (struct address_space *, -struct page *,struct page *); +struct page *,struct page *,enum migrate_mode );#else #define nfs_migrate_page NULL#endif
fs/nfs/write.c +2 -2
@@ -1662,7 +1662,7 @@ out_error:#ifdef CONFIG_MIGRATION int nfs_migrate_page (struct address_space *mapping,struct page *newpage, -struct page *page) +struct page *page,enum migrate_mode mode) {/* * If PagePrivate is set, then the page is currently associated with
@@ -1677,7 +1677,7 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,nfs_fscache_release_page (page,GFP_KERNEL ); - return migrate_page(mapping, newpage, page); + return migrate_page(mapping, newpage, page, mode); }#endif
fs/ubifs/sb.c +6 -2
@@ -715,8 +715,12 @@ static int fixup_free_space(struct ubifs_info *c) lnum =ubifs_next_log_lnum (c, lnum); } -/* Fixup the current log head */ - err =fixup_leb (c, c->lhead_lnum, c->lhead_offs); +/* +* Fixup the log head which contains the only a CS node at the +* beginning. +*/ + err =fixup_leb (c, c->lhead_lnum, +ALIGN (UBIFS_CS_NODE_SZ , c->min_io_size));if (err) goto out;
include/linux/cpuset.h +20 -27
74 lines not on this page · raw message
include/linux/fs.h +8 -3
@@ -523,6 +523,7 @@ enum positive_aop_returns {struct page ;struct address_space ;struct writeback_control ; +enum migrate_mode ;struct iov_iter {const struct iovec *iov;
@@ -607,9 +608,12 @@ struct address_space_operations { loff_t offset, unsigned long nr_segs);int (*get_xip_mem)(struct address_space *,pgoff_t ,int ,void **,unsigned long *); -/* migrate the contents of a page to the specified target */ +/* +* migrate the contents of a page to the specified target. If sync +* is false, it must not block. +*/ int (*migratepage) (struct address_space *, -struct page *,struct page *); +struct page *,struct page *,enum migrate_mode );int (*launder_page) (struct page *);int (*is_partially_uptodate) (struct page *,read_descriptor_t *,unsigned long );
@@ -2478,7 +2482,8 @@ extern int generic_check_addressable(unsigned, u64);#ifdef CONFIG_MIGRATION extern int buffer_migrate_page (struct address_space *, -struct page *,struct page *); +struct page *,struct page *, +enum migrate_mode );#else #define buffer_migrate_page NULL#endif
include/linux/init_task.h +8 -0
@@ -30,6 +30,13 @@ extern struct fs_struct init_fs;#define INIT_THREADGROUP_FORK_LOCK (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),\
@@ -193,6 +200,7 @@ extern struct cred init_cred;INIT_FTRACE_GRAPH \ INIT_TRACE_RECURSION \INIT_TASK_RCU_PREEMPT (tsk) \ + INIT_CPUSET_SEQ \ }
include/linux/memcontrol.h +2 -1
@@ -35,7 +35,8 @@ enum mem_cgroup_page_stat_item {extern unsigned long mem_cgroup_isolate_pages (unsigned long nr_to_scan,struct list_head *dst,unsigned long *scanned,int order, -int mode,struct zone *z, +isolate_mode_t mode, +struct zone *z,struct mem_cgroup *mem_cont,int active,int file);
include/linux/migrate.h +18 -5
@@ -6,18 +6,31 @@typedef struct page *new_page_t (struct page *,unsigned long private,int **); +/* +* MIGRATE_ASYNC means never block +* MIGRATE_SYNC_LIGHT in the current implementation means to allow blocking +* on most operations but not ->writepage as the potential stall time +* is too significant +* MIGRATE_SYNC will block when migrating pages +*/ +enum migrate_mode { +MIGRATE_ASYNC , +MIGRATE_SYNC_LIGHT , +MIGRATE_SYNC , +}; +#ifdef CONFIG_MIGRATION #define PAGE_MIGRATION 1extern void putback_lru_pages (struct list_head *l);extern int migrate_page (struct address_space *, -struct page *,struct page *); +struct page *,struct page *,enum migrate_mode );extern int migrate_pages (struct list_head *l,new_page_t x,unsigned long private,bool offlining, -bool sync); +enum migrate_mode mode);extern int migrate_huge_pages (struct list_head *l,new_page_t x,unsigned long private,bool offlining, -bool sync); +enum migrate_mode mode);extern int fail_migrate_page (struct address_space *,struct page *,struct page *);
@@ -36,10 +49,10 @@ extern int migrate_huge_page_move_mapping(struct address_space *mapping,static inline void putback_lru_pages (struct list_head *l) {}static inline int migrate_pages (struct list_head *l,new_page_t x,unsigned long private,bool offlining, -bool sync) {return -ENOSYS ; } +enum migrate_mode mode) {return -ENOSYS ; }static inline int migrate_huge_pages (struct list_head *l,new_page_t x,unsigned long private,bool offlining, -bool sync) {return -ENOSYS ; } +enum migrate_mode mode) {return -ENOSYS ; }static inline int migrate_prep (void ) {return -ENOSYS ; }static inline int migrate_prep_local (void ) {return -ENOSYS ; }
include/linux/mmzone.h +14 -0
@@ -158,6 +158,20 @@ static inline int is_unevictable_lru(enum lru_list l)return (l ==LRU_UNEVICTABLE ); } +/* Isolate inactive pages */ +#define ISOLATE_INACTIVE ((__force isolate_mode_t)0x1) +/* Isolate active pages */ +#define ISOLATE_ACTIVE ((__force isolate_mode_t)0x2) +/* Isolate clean file */ +#define ISOLATE_CLEAN ((__force isolate_mode_t)0x4) +/* Isolate unmapped file */ +#define ISOLATE_UNMAPPED ((__force isolate_mode_t)0x8) +/* Isolate for asynchronous migration */ +#define ISOLATE_ASYNC_MIGRATE ((__force isolate_mode_t)0x10) + +/* LRU Isolation modes. */ +typedef unsigned __bitwise__ isolate_mode_t ; +enum zone_watermarks {WMARK_MIN ,WMARK_LOW ,
include/linux/sched.h +1 -1
@@ -1484,7 +1484,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
include/linux/swap.h +1 -6
@@ -243,11 +243,6 @@ static inline void lru_cache_add_file(struct page *page)__lru_cache_add (page,LRU_INACTIVE_FILE ); } -/* LRU Isolation modes. */ -#define ISOLATE_INACTIVE 0/* Isolate inactive pages. */ -#define ISOLATE_ACTIVE 1/* Isolate active pages. */ -#define ISOLATE_BOTH 2/* Isolate both active and inactive pages. */ -/* linux/mm/vmscan.c */ extern unsigned long try_to_free_pages (struct zonelist *zonelist,int order,gfp_t gfp_mask,nodemask_t *mask);
@@ -259,7 +254,7 @@ extern unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,unsigned int swappiness, struct zone *zone, unsigned long *nr_scanned); -extern int __isolate_lru_page (struct page *page,int mode,int file); +extern int __isolate_lru_page (struct page *page,isolate_mode_t mode,int file);extern unsigned long shrink_all_memory (unsigned long nr_pages);extern int vm_swappiness;extern int remove_mapping (struct address_space *mapping,struct page *page);
include/trace/events/vmscan.h +81 -4
115 lines not on this page · raw message
kernel/cpuset.c +29 -34
88 lines not on this page · raw message
kernel/fork.c +3 -0
@@ -985,6 +985,9 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)#ifdef CONFIG_CGROUPS init_rwsem (&sig->threadgroup_fork_lock);#endif +#ifdef CONFIG_CPUSETS +seqcount_init (&tsk->mems_allowed_seq); +#endif sig->oom_adj = current->signal->oom_adj; sig->oom_score_adj = current->signal->oom_score_adj;
kernel/time/ntp.c +6 -2
@@ -375,7 +375,9 @@ int second_overflow(unsigned long secs) time_state =TIME_DEL ;break ;case TIME_INS : -if (secs %86400 ==0 ) { +if (!(time_status &STA_INS )) + time_state =TIME_OK ; +else if (secs %86400 ==0 ) { leap =-1 ; time_state =TIME_OOP ; time_tai++;
@@ -384,7 +386,9 @@ int second_overflow(unsigned long secs) }break ;case TIME_DEL : -if ((secs +1 ) %86400 ==0 ) { +if (!(time_status &STA_DEL )) + time_state =TIME_OK ; +else if ((secs +1 ) %86400 ==0 ) { leap =1 ; time_tai--; time_state =TIME_WAIT ;
mm/compaction.c +11 -15
@@ -35,10 +35,6 @@ struct compact_control {unsigned long migrate_pfn;/* isolate_migratepages search base */ bool sync;/* Synchronous migration */ -/* Account for isolated anon and file pages */ -unsigned long nr_anon; -unsigned long nr_file; -unsigned int order;/* order a direct compactor needs */ int migratetype;/* MOVABLE, RECLAIMABLE etc */ struct zone *zone;
@@ -223,17 +219,13 @@ static void isolate_freepages(struct zone *zone,static void acct_isolated (struct zone *zone,struct compact_control *cc) {struct page *page; -unsigned int count[NR_LRU_LISTS ] = {0 , }; +unsigned int count[2 ] = {0 , }; -list_for_each_entry (page, &cc->migratepages, lru) { -int lru =page_lru_base_type (page); - count[lru]++; - } +list_for_each_entry (page, &cc->migratepages, lru) + count[!!page_is_file_cache (page)]++; - cc->nr_anon = count[LRU_ACTIVE_ANON ] + count[LRU_INACTIVE_ANON ]; - cc->nr_file = count[LRU_ACTIVE_FILE ] + count[LRU_INACTIVE_FILE ]; -__mod_zone_page_state (zone,NR_ISOLATED_ANON , cc->nr_anon); -__mod_zone_page_state (zone,NR_ISOLATED_FILE , cc->nr_file); +__mod_zone_page_state (zone,NR_ISOLATED_ANON , count[0 ]); +__mod_zone_page_state (zone,NR_ISOLATED_FILE , count[1 ]); }/* Similar to reclaim, but different enough that they don't share logic */
@@ -269,6 +261,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,unsigned long last_pageblock_nr =0 , pageblock_nr;unsigned long nr_scanned =0 , nr_isolated =0 ;struct list_head *migratelist = &cc->migratepages; +isolate_mode_t mode =ISOLATE_ACTIVE |ISOLATE_INACTIVE ;/* Do not scan outside zone boundaries */ low_pfn =max (cc->migrate_pfn, zone->zone_start_pfn);
@@ -378,8 +371,11 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,continue ; } +if (!cc->sync) + mode |=ISOLATE_ASYNC_MIGRATE ; +/* Try isolate the page */ -if (__isolate_lru_page (page,ISOLATE_BOTH ,0 ) !=0 ) +if (__isolate_lru_page (page, mode,0 ) !=0 )continue ;VM_BUG_ON (PageTransCompound (page));
@@ -581,7 +577,7 @@ static int compact_zone(struct zone *zone, struct compact_control *cc) nr_migrate = cc->nr_migratepages; err =migrate_pages (&cc->migratepages, compaction_alloc, (unsigned long )cc, false, - cc->sync); + cc->sync ?MIGRATE_SYNC_LIGHT :MIGRATE_ASYNC );update_nr_listpages (cc); nr_remaining = cc->nr_migratepages;
mm/filemap.c +7 -4
@@ -516,10 +516,13 @@ struct page *__page_cache_alloc(gfp_t gfp)struct page *page;if (cpuset_do_page_mem_spread ()) { -get_mems_allowed (); - n =cpuset_mem_spread_node (); - page =alloc_pages_exact_node (n, gfp,0 ); -put_mems_allowed (); +unsigned int cpuset_mems_cookie; +do { + cpuset_mems_cookie =get_mems_allowed (); + n =cpuset_mem_spread_node (); + page =alloc_pages_exact_node (n, gfp,0 ); + }while (!put_mems_allowed (cpuset_mems_cookie) && !page); +return page; }return alloc_pages (gfp,0 );
mm/hugetlb.c +10 -3
@@ -460,8 +460,10 @@ static struct page *dequeue_huge_page_vma(struct hstate *h,struct zonelist *zonelist;struct zone *zone;struct zoneref *z; +unsigned int cpuset_mems_cookie; -get_mems_allowed (); +retry_cpuset: + cpuset_mems_cookie =get_mems_allowed (); zonelist =huge_zonelist (vma, address, htlb_alloc_mask, &mpol, &nodemask);/*
@@ -488,10 +490,15 @@ static struct page *dequeue_huge_page_vma(struct hstate *h, } } } -err: +mpol_cond_put (mpol); -put_mems_allowed (); +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !page)) + goto retry_cpuset;return page; + +err: +mpol_cond_put (mpol); +return NULL ; }static void update_and_free_page (struct hstate *h,struct page *page)
mm/memcontrol.c +2 -1
@@ -1251,7 +1251,8 @@ mem_cgroup_get_reclaim_stat_from_page(struct page *page)unsigned long mem_cgroup_isolate_pages (unsigned long nr_to_scan,struct list_head *dst,unsigned long *scanned,int order, -int mode,struct zone *z, +isolate_mode_t mode, +struct zone *z,struct mem_cgroup *mem_cont,int active,int file) {
mm/memory-failure.c +1 -1
@@ -1464,7 +1464,7 @@ int soft_offline_page(struct page *page, int flags) page_is_file_cache(page));list_add (&page->lru, &pagelist); ret =migrate_pages (&pagelist, new_page,MPOL_MF_MOVE_ALL , -0 , true); +0 ,MIGRATE_SYNC );if (ret) {putback_lru_pages (&pagelist); pr_info("soft offline: %#lx: migration failed %d, type %lx\n",
mm/memory_hotplug.c +1 -1
@@ -747,7 +747,7 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) }/* this function returns # of failed pages */ ret =migrate_pages (&source, hotremove_migrate_alloc,0 , - true, true); + true,MIGRATE_SYNC );if (ret)putback_lru_pages (&source); }
mm/mempolicy.c +22 -8
@@ -926,7 +926,7 @@ static int migrate_to_node(struct mm_struct *mm, int source, int dest,if (!list_empty (&pagelist)) { err =migrate_pages (&pagelist, new_node_page, dest, - false, true); + false,MIGRATE_SYNC );if (err)putback_lru_pages (&pagelist); }
@@ -1810,18 +1810,24 @@ struct page * alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, unsigned long addr, int node) { - struct mempolicy *pol = get_vma_policy(current, vma, addr); + struct mempolicy *pol;struct zonelist *zl;struct page *page; +unsigned int cpuset_mems_cookie; + +retry_cpuset: + pol =get_vma_policy (current, vma, addr); + cpuset_mems_cookie =get_mems_allowed (); -get_mems_allowed ();if (unlikely (pol->mode ==MPOL_INTERLEAVE )) {unsigned nid; nid =interleave_nid (pol, vma, addr,PAGE_SHIFT + order);mpol_cond_put (pol); page =alloc_page_interleave (gfp, order, nid); -put_mems_allowed (); +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !page)) + goto retry_cpuset; +return page; } zl =policy_zonelist (gfp, pol, node);
@@ -1832,7 +1838,8 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,struct page *page =__alloc_pages_nodemask (gfp, order, zl,policy_nodemask (gfp, pol));__mpol_put (pol); -put_mems_allowed (); +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !page)) + goto retry_cpuset;return page; }/*
@@ -1840,7 +1847,8 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma,*/ page =__alloc_pages_nodemask (gfp, order, zl,policy_nodemask (gfp, pol)); -put_mems_allowed (); +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !page)) + goto retry_cpuset;return page; }
@@ -1867,11 +1875,14 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order) {struct mempolicy *pol = current->mempolicy;struct page *page; +unsigned int cpuset_mems_cookie;if (!pol ||in_interrupt () || (gfp & __GFP_THISNODE)) pol = &default_policy; -get_mems_allowed (); +retry_cpuset: + cpuset_mems_cookie =get_mems_allowed (); +/* * No reference counting needed for current->mempolicy * nor system default_policy
@@ -1882,7 +1893,10 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order) page =__alloc_pages_nodemask (gfp, order,policy_zonelist (gfp, pol,numa_node_id ()),policy_nodemask (gfp, pol)); -put_mems_allowed (); + +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !page)) + goto retry_cpuset; +return page; }EXPORT_SYMBOL (alloc_pages_current);
mm/migrate.c +154 -86
412 lines not on this page · raw message
mm/page_alloc.c +82 -36
207 lines not on this page · raw message
mm/slab.c +8 -5
@@ -3218,12 +3218,10 @@ static void *alternate_node_alloc(struct kmem_cache *cachep, gfp_t flags)if (in_interrupt () || (flags & __GFP_THISNODE))return NULL ; nid_alloc = nid_here =numa_mem_id (); -get_mems_allowed ();if (cpuset_do_slab_mem_spread () && (cachep->flags &SLAB_MEM_SPREAD )) nid_alloc =cpuset_slab_spread_node ();else if (current->mempolicy) nid_alloc =slab_node (current->mempolicy); -put_mems_allowed ();if (nid_alloc != nid_here)return ____cache_alloc_node (cachep, flags, nid_alloc);return NULL ;
@@ -3246,14 +3244,17 @@ static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)enum zone_type high_zoneidx =gfp_zone (flags);void *obj =NULL ;int nid; +unsigned int cpuset_mems_cookie;if (flags & __GFP_THISNODE)return NULL ; -get_mems_allowed (); - zonelist =node_zonelist (slab_node (current->mempolicy), flags); local_flags = flags & (GFP_CONSTRAINT_MASK |GFP_RECLAIM_MASK ); +retry_cpuset: + cpuset_mems_cookie =get_mems_allowed (); + zonelist =node_zonelist (slab_node (current->mempolicy), flags); + retry:/* * Look through allowed nodes for objects available
@@ -3306,7 +3307,9 @@ retry: } } } -put_mems_allowed (); + +if (unlikely (!put_mems_allowed (cpuset_mems_cookie) && !obj)) + goto retry_cpuset;return obj; }
mm/slub.c +25 -15
@@ -1457,6 +1457,7 @@ static struct page *get_any_partial(struct kmem_cache *s, gfp_t flags)struct zone *zone;enum zone_type high_zoneidx =gfp_zone (flags);struct page *page; +unsigned int cpuset_mems_cookie;/* * The defrag ratio allows a configuration of the tradeoffs between
@@ -1480,23 +1481,32 @@ static struct page *get_any_partial(struct kmem_cache *s, gfp_t flags) get_cycles() % 1024 > s->remote_node_defrag_ratio)return NULL ; -get_mems_allowed (); - zonelist =node_zonelist (slab_node (current->mempolicy), flags); -for_each_zone_zonelist (zone, z, zonelist, high_zoneidx) { -struct kmem_cache_node *n; - - n =get_node (s,zone_to_nid (zone)); - -if (n &&cpuset_zone_allowed_hardwall (zone, flags) && - n->nr_partial > s->min_partial) { - page =get_partial_node (n); -if (page) { -put_mems_allowed (); -return page; +do { + cpuset_mems_cookie =get_mems_allowed (); + zonelist =node_zonelist (slab_node (current->mempolicy), flags); +for_each_zone_zonelist (zone, z, zonelist, high_zoneidx) { +struct kmem_cache_node *n; + + n =get_node (s,zone_to_nid (zone)); + +if (n &&cpuset_zone_allowed_hardwall (zone, flags) && + n->nr_partial > s->min_partial) { + page =get_partial_node (n); +if (page) { +/* +* Return the object even if +* put_mems_allowed indicated that +* the cpuset mems_allowed was +* updated in parallel. It's a +* harmless race between the alloc +* and the cpuset update. +*/ +put_mems_allowed (cpuset_mems_cookie); +return page; + } } } - } -put_mems_allowed (); + }while (!put_mems_allowed (cpuset_mems_cookie));#endif return NULL ; }
mm/vmscan.c +238 -58
537 lines not on this page · raw message
mm/vmstat.c +1 -1
@@ -78,7 +78,7 @@ void vm_events_fold_cpu(int cpu)* * vm_stat contains the global counters */ -atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS ]; +atomic_long_t vm_stat[NR_VM_ZONE_STAT_ITEMS] __cacheline_aligned_in_smp;EXPORT_SYMBOL (vm_stat);#ifdef CONFIG_SMP