---
include/linux/memcontrol.h | 8 +++
- mm/memcontrol.c | 95 ++++++++++++++++++++++++++++++++++++---------
+ mm/memcontrol.c | 91 ++++++++++++++++++++++++++++++++++++---------
mm/slab_common.c | 4 -
- 3 files changed, 86 insertions(+), 21 deletions(-)
+ 3 files changed, 83 insertions(+), 20 deletions(-)
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
static int alloc_mem_cgroup_per_zone_info(struct mem_cgroup *memcg, int node)
{
struct mem_cgroup_per_node *pn;
-@@ -4171,17 +4211,27 @@ static struct mem_cgroup *mem_cgroup_all
- if (!memcg)
- return NULL;
+@@ -4178,6 +4218,12 @@ static struct mem_cgroup *mem_cgroup_all
+ if (memcg_wb_domain_init(memcg, GFP_KERNEL))
+ goto out_free_stat;
+ memcg->id.id = idr_alloc(&mem_cgroup_idr, NULL,
+ 1, MEM_CGROUP_ID_MAX,
+ GFP_KERNEL);
+ if (memcg->id.id < 0)
-+ goto out_free;
++ goto out_free_stat;
+
- memcg->stat = alloc_percpu(struct mem_cgroup_stat_cpu);
- if (!memcg->stat)
-- goto out_free;
-+ goto out_idr;
-
- if (memcg_wb_domain_init(memcg, GFP_KERNEL))
- goto out_free_stat;
-
-+ idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
return memcg;
out_free_stat:
- free_percpu(memcg->stat);
-+out_idr:
-+ if (memcg->id.id > 0)
-+ idr_remove(&mem_cgroup_idr, memcg->id.id);
- out_free:
- kfree(memcg);
- return NULL;
-@@ -4277,8 +4327,9 @@ mem_cgroup_css_online(struct cgroup_subs
+@@ -4263,9 +4309,11 @@ mem_cgroup_css_alloc(struct cgroup_subsy
+ #ifdef CONFIG_CGROUP_WRITEBACK
+ INIT_LIST_HEAD(&memcg->cgwb_list);
+ #endif
++ idr_replace(&mem_cgroup_idr, memcg, memcg->id.id);
+ return &memcg->css;
+
+ free_out:
++ idr_remove(&mem_cgroup_idr, memcg->id.id);
+ __mem_cgroup_free(memcg);
+ return ERR_PTR(error);
+ }
+@@ -4277,8 +4325,9 @@ mem_cgroup_css_online(struct cgroup_subs
struct mem_cgroup *parent = mem_cgroup_from_css(css->parent);
int ret;
if (!parent)
return 0;
-@@ -4352,6 +4403,8 @@ static void mem_cgroup_css_offline(struc
+@@ -4352,6 +4401,8 @@ static void mem_cgroup_css_offline(struc
memcg_deactivate_kmem(memcg);
wb_memcg_offline(memcg);
}
static void mem_cgroup_css_released(struct cgroup_subsys_state *css)
-@@ -5685,6 +5738,7 @@ void mem_cgroup_swapout(struct page *pag
+@@ -5685,6 +5736,7 @@ void mem_cgroup_swapout(struct page *pag
if (!memcg)
return;
oldid = swap_cgroup_record(entry, mem_cgroup_id(memcg));
VM_BUG_ON_PAGE(oldid, page);
mem_cgroup_swap_statistics(memcg, true);
-@@ -5703,6 +5757,9 @@ void mem_cgroup_swapout(struct page *pag
+@@ -5703,6 +5755,9 @@ void mem_cgroup_swapout(struct page *pag
VM_BUG_ON(!irqs_disabled());
mem_cgroup_charge_statistics(memcg, page, -1);
memcg_check_events(memcg, page);
}
/**
-@@ -5726,7 +5783,7 @@ void mem_cgroup_uncharge_swap(swp_entry_
+@@ -5726,7 +5781,7 @@ void mem_cgroup_uncharge_swap(swp_entry_
if (!mem_cgroup_is_root(memcg))
page_counter_uncharge(&memcg->memsw, 1);
mem_cgroup_swap_statistics(memcg, false);
Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
-Cc: <stable@vger.kernel.org> [3.19+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
---
mm/memcontrol.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
/**
* mem_cgroup_from_id - look up a memcg from a memcg id
* @id: the memcg id to look up
-@@ -4856,6 +4866,8 @@ static void __mem_cgroup_clear_mc(void)
+@@ -4854,6 +4864,8 @@ static void __mem_cgroup_clear_mc(void)
if (!mem_cgroup_is_root(mc.from))
page_counter_uncharge(&mc.from->memsw, mc.moved_swap);
/*
* we charged both to->memory and to->memsw, so we
* should uncharge to->memory.
-@@ -4863,9 +4875,9 @@ static void __mem_cgroup_clear_mc(void)
+@@ -4861,9 +4873,9 @@ static void __mem_cgroup_clear_mc(void)
if (!mem_cgroup_is_root(mc.to))
page_counter_uncharge(&mc.to->memory, mc.moved_swap);
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
---
mm/memcontrol.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
static void mem_cgroup_id_put(struct mem_cgroup *memcg)
{
if (atomic_dec_and_test(&memcg->id.ref)) {
-@@ -5723,7 +5741,7 @@ subsys_initcall(mem_cgroup_init);
+@@ -5721,7 +5739,7 @@ subsys_initcall(mem_cgroup_init);
*/
void mem_cgroup_swapout(struct page *page, swp_entry_t entry)
{
unsigned short oldid;
VM_BUG_ON_PAGE(PageLRU(page), page);
-@@ -5738,16 +5756,27 @@ void mem_cgroup_swapout(struct page *pag
+@@ -5736,16 +5754,27 @@ void mem_cgroup_swapout(struct page *pag
if (!memcg)
return;
x86-pat-document-the-pat-initialization-sequence.patch
x86-mm-pat-fix-bug_on-in-mmap_mem-on-qemu-i386.patch
drm-i915-pretend-cursor-is-always-on-for-ilk-style-wm-calculations-v2.patch
-mm-memcontrol-fix-cgroup-creation-failure-after-many-small-jobs.patch
-mm-memcontrol-fix-swap-counter-leak-on-swapout-from-offline-cgroup.patch
-mm-memcontrol-fix-memcg-id-ref-counter-on-swap-charge-move.patch
x86-syscalls-64-add-compat_sys_keyctl-for-32-bit-userspace.patch
block-fix-use-after-free-in-seq-file.patch
sysv-ipc-fix-security-layer-leaking.patch
ext4-validate-s_reserved_gdt_blocks-on-mount.patch
ext4-short-cut-orphan-cleanup-on-error.patch
ext4-fix-reference-counting-bug-on-block-allocation-error.patch
+mm-memcontrol-fix-cgroup-creation-failure-after-many-small-jobs.patch
+mm-memcontrol-fix-swap-counter-leak-on-swapout-from-offline-cgroup.patch
+mm-memcontrol-fix-memcg-id-ref-counter-on-swap-charge-move.patch