diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-02 19:29:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-02 19:29:19 -0400 |
commit | f929d3995d61ee0ff5d35e9f3fbef3b80bf4ccaa (patch) | |
tree | 12378638e4eb6cf56036029e4a6bc4e38478005c | |
parent | b601ce0fe3aafadba21cd42eb3d63660010e2a2b (diff) | |
parent | abe5f972912d086c080be4bde67750630b6fb38b (diff) |
Merge branch 'akpm' (fixes from Andrew Morton)
Merge fixes from Andrew Morton:
"5 fixes"
* emailed patches from Andrew Morton <akpm@linux-foundation.org>:
mm: page_alloc: fix zone allocation fairness on UP
perf: fix perf bug in fork()
MAINTAINERS: change git URL for mpc5xxx tree
mm: memcontrol: do not iterate uninitialized memcgs
ocfs2/dlm: should put mle when goto kill in dlm_assert_master_handler
-rw-r--r-- | MAINTAINERS | 2 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 4 | ||||
-rw-r--r-- | kernel/events/core.c | 4 | ||||
-rw-r--r-- | kernel/fork.c | 5 | ||||
-rw-r--r-- | mm/memcontrol.c | 36 | ||||
-rw-r--r-- | mm/page_alloc.c | 7 |
6 files changed, 45 insertions, 13 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index c3cfa1be846e..f10ed3914ea8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -5484,7 +5484,7 @@ F: drivers/macintosh/ | |||
5484 | LINUX FOR POWERPC EMBEDDED MPC5XXX | 5484 | LINUX FOR POWERPC EMBEDDED MPC5XXX |
5485 | M: Anatolij Gustschin <agust@denx.de> | 5485 | M: Anatolij Gustschin <agust@denx.de> |
5486 | L: linuxppc-dev@lists.ozlabs.org | 5486 | L: linuxppc-dev@lists.ozlabs.org |
5487 | T: git git://git.denx.de/linux-2.6-agust.git | 5487 | T: git git://git.denx.de/linux-denx-agust.git |
5488 | S: Maintained | 5488 | S: Maintained |
5489 | F: arch/powerpc/platforms/512x/ | 5489 | F: arch/powerpc/platforms/512x/ |
5490 | F: arch/powerpc/platforms/52xx/ | 5490 | F: arch/powerpc/platforms/52xx/ |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index e3cfa0227026..12ba682fc53c 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -2039,6 +2039,10 @@ kill: | |||
2039 | "and killing the other node now! This node is OK and can continue.\n"); | 2039 | "and killing the other node now! This node is OK and can continue.\n"); |
2040 | __dlm_print_one_lock_resource(res); | 2040 | __dlm_print_one_lock_resource(res); |
2041 | spin_unlock(&res->spinlock); | 2041 | spin_unlock(&res->spinlock); |
2042 | spin_lock(&dlm->master_lock); | ||
2043 | if (mle) | ||
2044 | __dlm_put_mle(mle); | ||
2045 | spin_unlock(&dlm->master_lock); | ||
2042 | spin_unlock(&dlm->spinlock); | 2046 | spin_unlock(&dlm->spinlock); |
2043 | *ret_data = (void *)res; | 2047 | *ret_data = (void *)res; |
2044 | dlm_put(dlm); | 2048 | dlm_put(dlm); |
diff --git a/kernel/events/core.c b/kernel/events/core.c index d640a8b4dcbc..963bf139e2b2 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -7948,8 +7948,10 @@ int perf_event_init_task(struct task_struct *child) | |||
7948 | 7948 | ||
7949 | for_each_task_context_nr(ctxn) { | 7949 | for_each_task_context_nr(ctxn) { |
7950 | ret = perf_event_init_context(child, ctxn); | 7950 | ret = perf_event_init_context(child, ctxn); |
7951 | if (ret) | 7951 | if (ret) { |
7952 | perf_event_free_task(child); | ||
7952 | return ret; | 7953 | return ret; |
7954 | } | ||
7953 | } | 7955 | } |
7954 | 7956 | ||
7955 | return 0; | 7957 | return 0; |
diff --git a/kernel/fork.c b/kernel/fork.c index 0cf9cdb6e491..a91e47d86de2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1360,7 +1360,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1360 | goto bad_fork_cleanup_policy; | 1360 | goto bad_fork_cleanup_policy; |
1361 | retval = audit_alloc(p); | 1361 | retval = audit_alloc(p); |
1362 | if (retval) | 1362 | if (retval) |
1363 | goto bad_fork_cleanup_policy; | 1363 | goto bad_fork_cleanup_perf; |
1364 | /* copy all the process information */ | 1364 | /* copy all the process information */ |
1365 | shm_init_task(p); | 1365 | shm_init_task(p); |
1366 | retval = copy_semundo(clone_flags, p); | 1366 | retval = copy_semundo(clone_flags, p); |
@@ -1566,8 +1566,9 @@ bad_fork_cleanup_semundo: | |||
1566 | exit_sem(p); | 1566 | exit_sem(p); |
1567 | bad_fork_cleanup_audit: | 1567 | bad_fork_cleanup_audit: |
1568 | audit_free(p); | 1568 | audit_free(p); |
1569 | bad_fork_cleanup_policy: | 1569 | bad_fork_cleanup_perf: |
1570 | perf_event_free_task(p); | 1570 | perf_event_free_task(p); |
1571 | bad_fork_cleanup_policy: | ||
1571 | #ifdef CONFIG_NUMA | 1572 | #ifdef CONFIG_NUMA |
1572 | mpol_put(p->mempolicy); | 1573 | mpol_put(p->mempolicy); |
1573 | bad_fork_cleanup_threadgroup_lock: | 1574 | bad_fork_cleanup_threadgroup_lock: |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 085dc6d2f876..28928ce9b07f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -292,6 +292,9 @@ struct mem_cgroup { | |||
292 | /* vmpressure notifications */ | 292 | /* vmpressure notifications */ |
293 | struct vmpressure vmpressure; | 293 | struct vmpressure vmpressure; |
294 | 294 | ||
295 | /* css_online() has been completed */ | ||
296 | int initialized; | ||
297 | |||
295 | /* | 298 | /* |
296 | * the counter to account for mem+swap usage. | 299 | * the counter to account for mem+swap usage. |
297 | */ | 300 | */ |
@@ -1099,10 +1102,21 @@ skip_node: | |||
1099 | * skipping css reference should be safe. | 1102 | * skipping css reference should be safe. |
1100 | */ | 1103 | */ |
1101 | if (next_css) { | 1104 | if (next_css) { |
1102 | if ((next_css == &root->css) || | 1105 | struct mem_cgroup *memcg = mem_cgroup_from_css(next_css); |
1103 | ((next_css->flags & CSS_ONLINE) && | 1106 | |
1104 | css_tryget_online(next_css))) | 1107 | if (next_css == &root->css) |
1105 | return mem_cgroup_from_css(next_css); | 1108 | return memcg; |
1109 | |||
1110 | if (css_tryget_online(next_css)) { | ||
1111 | /* | ||
1112 | * Make sure the memcg is initialized: | ||
1113 | * mem_cgroup_css_online() orders the the | ||
1114 | * initialization against setting the flag. | ||
1115 | */ | ||
1116 | if (smp_load_acquire(&memcg->initialized)) | ||
1117 | return memcg; | ||
1118 | css_put(next_css); | ||
1119 | } | ||
1106 | 1120 | ||
1107 | prev_css = next_css; | 1121 | prev_css = next_css; |
1108 | goto skip_node; | 1122 | goto skip_node; |
@@ -5549,6 +5563,7 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css) | |||
5549 | { | 5563 | { |
5550 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); | 5564 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
5551 | struct mem_cgroup *parent = mem_cgroup_from_css(css->parent); | 5565 | struct mem_cgroup *parent = mem_cgroup_from_css(css->parent); |
5566 | int ret; | ||
5552 | 5567 | ||
5553 | if (css->id > MEM_CGROUP_ID_MAX) | 5568 | if (css->id > MEM_CGROUP_ID_MAX) |
5554 | return -ENOSPC; | 5569 | return -ENOSPC; |
@@ -5585,7 +5600,18 @@ mem_cgroup_css_online(struct cgroup_subsys_state *css) | |||
5585 | } | 5600 | } |
5586 | mutex_unlock(&memcg_create_mutex); | 5601 | mutex_unlock(&memcg_create_mutex); |
5587 | 5602 | ||
5588 | return memcg_init_kmem(memcg, &memory_cgrp_subsys); | 5603 | ret = memcg_init_kmem(memcg, &memory_cgrp_subsys); |
5604 | if (ret) | ||
5605 | return ret; | ||
5606 | |||
5607 | /* | ||
5608 | * Make sure the memcg is initialized: mem_cgroup_iter() | ||
5609 | * orders reading memcg->initialized against its callers | ||
5610 | * reading the memcg members. | ||
5611 | */ | ||
5612 | smp_store_release(&memcg->initialized, 1); | ||
5613 | |||
5614 | return 0; | ||
5589 | } | 5615 | } |
5590 | 5616 | ||
5591 | /* | 5617 | /* |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 18cee0d4c8a2..eee961958021 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1612,7 +1612,7 @@ again: | |||
1612 | } | 1612 | } |
1613 | 1613 | ||
1614 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); | 1614 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); |
1615 | if (zone_page_state(zone, NR_ALLOC_BATCH) == 0 && | 1615 | if (atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH]) <= 0 && |
1616 | !zone_is_fair_depleted(zone)) | 1616 | !zone_is_fair_depleted(zone)) |
1617 | zone_set_flag(zone, ZONE_FAIR_DEPLETED); | 1617 | zone_set_flag(zone, ZONE_FAIR_DEPLETED); |
1618 | 1618 | ||
@@ -5701,9 +5701,8 @@ static void __setup_per_zone_wmarks(void) | |||
5701 | zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1); | 5701 | zone->watermark[WMARK_HIGH] = min_wmark_pages(zone) + (tmp >> 1); |
5702 | 5702 | ||
5703 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, | 5703 | __mod_zone_page_state(zone, NR_ALLOC_BATCH, |
5704 | high_wmark_pages(zone) - | 5704 | high_wmark_pages(zone) - low_wmark_pages(zone) - |
5705 | low_wmark_pages(zone) - | 5705 | atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); |
5706 | zone_page_state(zone, NR_ALLOC_BATCH)); | ||
5707 | 5706 | ||
5708 | setup_zone_migrate_reserve(zone); | 5707 | setup_zone_migrate_reserve(zone); |
5709 | spin_unlock_irqrestore(&zone->lock, flags); | 5708 | spin_unlock_irqrestore(&zone->lock, flags); |