From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754969AbcE0ORx (ORCPT ); Fri, 27 May 2016 10:17:53 -0400 Received: from mail-am1on0124.outbound.protection.outlook.com ([157.56.112.124]:34848 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751205AbcE0ORw (ORCPT ); Fri, 27 May 2016 10:17:52 -0400 Authentication-Results: linux-foundation.org; dkim=none (message not signed) header.d=none;linux-foundation.org; dmarc=none action=none header.from=virtuozzo.com; From: Vladimir Davydov To: Andrew Morton CC: Michal Hocko , Tetsuo Handa , David Rientjes , Johannes Weiner , , Subject: [PATCH 1/2] mm: oom: add memcg to oom_control Date: Fri, 27 May 2016 17:17:41 +0300 Message-ID: <40e03fd7aaf1f55c75d787128d6d17c5a71226c2.1464358556.git.vdavydov@virtuozzo.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM2PR09CA0031.eurprd09.prod.outlook.com (2a01:111:e400:841f::41) To AM3PR08MB0579.eurprd08.prod.outlook.com (2a01:111:e400:c408::13) X-MS-Office365-Filtering-Correlation-Id: f705c989-a797-48b8-04eb-08d38639ae50 X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;2:Qwzxgtnd3HvhStU1RtXmrZzLSjcKERbNYwFWWDt3cqbdAqrPNcPo/riaZJLDwSsSfuhd6SkmrZ1Q2zC/TADmJ40iv/sIrS3bqCpbnDPtWevH5a12NORdArHCzgH2CrMDp9ofrkG4Dsi8mehCCqX2ky9O3wFpz7wXpj7cdYjXDaFJT3iWLwwRzsuWYWS1XfNb;3:JLifBTXqz9EZ7ZQ1k2PCgjxHNXpca8Rf0uWzDn28sVcyfHl+fWTpcTyIsOXhdWlG1AjYi762d9ZW1O15sgAKjx3OSKA6PkpSQnWaULF4tQNVKdgTC9dydloZlA179mk5 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0579; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;25:DGhnfWcVa5H+GFTLMs67P25lghZpwp0kWfg828dPjNCLOQu3Pk+SmqOfV7r3TcQYReRT/CDhSJiqhLpFKJqrMvpZ4G3aHryPZ+ayX92WSuOTEsqdaFCuQ0/6XRnIgxKbUIEvL8xawprge/J44pPPjkmOOPP/IEgoqMr/LDXH9ZvxFOFRsisK7NF0/X3JObm2NAnQKF0OcyCE7RbOwQd++CnmCuQl/bmwZAPTNyLdFQ0a1vD9RDU71bauwGRJ0q/yWEn/9PExqloB0t6/Pr3NUaZz71FZhdbH9NpPjaTdvm7X+88LZMnq38upHcXuMFcr3MpoE3HvEHOpo+d27g+ohaKCU0xpbl7iFBX0yElweg3DvDoU36lQAJBxKbgzpfobs22Zni9eBfcQEpr9PkLd5gKwfa4w69LPO/qld9mYInNza7Uz3B1DY4fvlWVdFuKHXW/N9nTuVRHbiA6Y4h9DcwB8EEb9O7I32DwCNSb5tzpdHW29ZXR1WnRLg81muWcMAlbkNUGl9RfgCf/oYT1AelU7UCUF/WGxnmQtLUnxQdnHp7Seg07R9J2umXib0h7iDrfJ3G2OElFOxjb1eAPqkvMiVo3AIxIhsxo5IQEY/gagdOMk0pNJKCBeCsiMiwfbxmRAsBtnaPUmK3SRqqCu9mqhrzzKQKtqNgBOIFXRM9zQq5yciU1076TnjAcu3lcclsKo+3A0yGvdXK6R5Is47w== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040130)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041072)(6043046);SRVR:AM3PR08MB0579;BCL:0;PCL:0;RULEID:;SRVR:AM3PR08MB0579; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;4:/JCaqZLcuYYpPehBpvz+rSWHGKiUWTqvTNyo70vaoGrvhSS19y1F7F/ANqoJc262NmXFI0nbUlqLoia0NFWX+LQUnPrQKSIUwuaJcxwvC5UXpVEAMR35eIlyAS5fWU7+qlkJTYv/wZD+LtCK6hLa1WK2sSEY7KqW6SxSx1xrwGykCki42bB/gge+MUEzbsHuF0veT5yeohDakzOASbHOWx/xoni5wmPXwGlPPLK0tbe/xKAxzMYTuFwAGTa+PuUx+thyoGE9VBK6YBMHb0/+/odYmnKdg1glDym5wCjJt9ytSQpN8W7k/RhOSM7wTldkhOuQ7pHliXB0awJ4c3XdZFj50+fXwflqc1aFFLZSvqZvl1sAWwHkXgttQ1R/PBTkydZSGSrQ59ofNp5kXpUTwEDptnQK/OXUiw50e+Ajigg= X-Forefront-PRVS: 09555FB1AD X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(8676002)(81166006)(4326007)(80792005)(2906002)(3846002)(118296001)(5004730100002)(42186005)(92566002)(586003)(5008740100001)(6116002)(110136002)(50226002)(189998001)(19580405001)(19580395003)(5003940100001)(86362001)(36756003)(50986999)(47776003)(50466002)(229853001)(66066001)(48376002)(33646002);DIR:OUT;SFP:1102;SCL:1;SRVR:AM3PR08MB0579;H:virtuozzo.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;23:UAh/AvqUKAM9/czTiq7twGpEe7/hMwUW6pD96ohi++wBUJ46fN8qkZkkHqZm+PdMJVL4e2u+EmVosD3bz3cET3vxBy+G6liieJsi6zKcBym5nw4Obz0I+Do+9S1dEwZaIGJlQcNz/ht9tvsDDgHDkw8uhI2miz9xASh6hOfWv0J78FPVqfCkTI1WSmGZemliOODseb6NFiGobXAmvTGTlfH3UbFhgjpQkQzeD2QknmIublQTczHoTYYwZ0nMU6o6Z0MVp0xZ0cPt3xHU36xYJT5Y5C4PaKBk/xdQttYodI/RNx2NGml0iTGIloa/k8Lme1gI2SOFIsBM9G/8EzM41LL7axHA9msNP5RrY4bkK7RAqU+cUmtQZZZVkGLAwrrITLAXkX6YNmB+UeVAUB0OF3Offg9GdticbZ8oLiSE4QJeZL7QJ6KnzowDqt/CbjF6owXOsilpRvnehCPz5o03M8NaFLrq2+PBFXyacs3s3cAZ00oV+TXRGim/p0e0wPHc9uBuHRBWVDXIWcjNUE27QGs9OqanvaZFB/y9SOnt1jI2opuz00BlhrH3t6FWORaMZLFCKy8dDUa0UavOQoNOIP7M6hukdknjbxzqPlLq0CkvVPfrUFJfnIv++5v4Bmx9BH6xqI9Pl3HrZwX0FLnAqHa3zKR8nmTlC/LVEi/oF26gJyFojqkm1SEqEN6Q7qNYsnHtVFl5C/r7/F5CJX7PRLpxMLJX35n4nz+FJolt0N9GQN5cnNC0qBqTKybgdEVju9iXJacwJTdtUIDmtn5dAch4g4MP6R461gKVPTLUO3gIeReqCAJl1CNakF6/l3dt0sd4lLmpLzxYMAbz4+O80w== X-Microsoft-Exchange-Diagnostics: 1;AM3PR08MB0579;5:8OhfH5jSRiaej93mVAgW8KiDWGxcOuFwNUR4+iADWN3V8tZk3NBtpeBK3+Nrg6PDrniQHPTz24ltwEfxN+z7ZlmkyJ/6aqNtx74jWwvD5KvybcaSXagFRzQ6FEPipwUK7faAwntirTgKisyfWkWrPg==;24:DvbHEiVUnQ7Ylurmubij2iAb8ylEmGDJr3exzDG+SLRD6UYletydNsV7d/jYyIZ9y/tNha0p2IuvqrTuNrJf6yHVfzCSbTABrac9Zn7swL0=;7:iw0tgOjtgdI7N5dsIobIq/1S4Ytd3SU+7me5HbwqXgLrqY/7asY3FVjUYnDkZ/xOERigzL+RsQIw0M8OER1bRwRvacnMYELNtzMtvlBKNekCU9xcWXsaWg0hJqnrV96stNuac5hdczR0E+OXRcZduPHLoBufM6C3zjxT+K+pOF+Oj14bJW5V1aQW25gZribL;20:nVf/lzHr4KEbDAqoVrudFU8BBe8zipAFTYKkT3kDSmIouYBiiMO1J8FnZc6sT7TDvU2maplUfM8gPpAAx4+wNuNuW6R95Be5OqA1LZMKXspvBljgCHSlKrGiZuuFxC+HXG50wQYo6JPFj+W1tBxvYxCMZUSLt8KW83LllJlGgqY= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 May 2016 14:17:47.8234 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR08MB0579 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It's a part of oom context just like allocation order and nodemask, so let's move it to oom_control instead of passing it in the argument list. Signed-off-by: Vladimir Davydov --- drivers/tty/sysrq.c | 1 + include/linux/oom.h | 8 +++++--- mm/memcontrol.c | 5 +++-- mm/oom_kill.c | 32 +++++++++++++++----------------- mm/page_alloc.c | 1 + 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index e5139402e7f8..52bbd27e93ae 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -363,6 +363,7 @@ static void moom_callback(struct work_struct *ignored) struct oom_control oc = { .zonelist = node_zonelist(first_memory_node, gfp_mask), .nodemask = NULL, + .memcg = NULL, .gfp_mask = gfp_mask, .order = -1, }; diff --git a/include/linux/oom.h b/include/linux/oom.h index 83469522690a..cbc24a5fe28d 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -23,6 +23,9 @@ struct oom_control { /* Used to determine mempolicy */ nodemask_t *nodemask; + /* Memory cgroup in which oom is invoked, or NULL for global oom */ + struct mem_cgroup *memcg; + /* Used to determine cpuset and node locality requirement */ const gfp_t gfp_mask; @@ -83,11 +86,10 @@ extern unsigned long oom_badness(struct task_struct *p, extern void oom_kill_process(struct oom_control *oc, struct task_struct *p, unsigned int points, unsigned long totalpages, - struct mem_cgroup *memcg, const char *message); + const char *message); extern void check_panic_on_oom(struct oom_control *oc, - enum oom_constraint constraint, - struct mem_cgroup *memcg); + enum oom_constraint constraint); extern enum oom_scan_t oom_scan_process_thread(struct oom_control *oc, struct task_struct *task, unsigned long totalpages); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 37ba604984c9..eeb3b14de01a 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1259,6 +1259,7 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, struct oom_control oc = { .zonelist = NULL, .nodemask = NULL, + .memcg = memcg, .gfp_mask = gfp_mask, .order = order, }; @@ -1281,7 +1282,7 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, goto unlock; } - check_panic_on_oom(&oc, CONSTRAINT_MEMCG, memcg); + check_panic_on_oom(&oc, CONSTRAINT_MEMCG); totalpages = mem_cgroup_get_limit(memcg) ? : 1; for_each_mem_cgroup_tree(iter, memcg) { struct css_task_iter it; @@ -1329,7 +1330,7 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, if (chosen) { points = chosen_points * 1000 / totalpages; - oom_kill_process(&oc, chosen, points, totalpages, memcg, + oom_kill_process(&oc, chosen, points, totalpages, "Memory cgroup out of memory"); } unlock: diff --git a/mm/oom_kill.c b/mm/oom_kill.c index b95c4c101b35..b3424199069b 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -383,8 +383,7 @@ static void dump_tasks(struct mem_cgroup *memcg, const nodemask_t *nodemask) rcu_read_unlock(); } -static void dump_header(struct oom_control *oc, struct task_struct *p, - struct mem_cgroup *memcg) +static void dump_header(struct oom_control *oc, struct task_struct *p) { pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), order=%d, oom_score_adj=%hd\n", current->comm, oc->gfp_mask, &oc->gfp_mask, oc->order, @@ -392,12 +391,12 @@ static void dump_header(struct oom_control *oc, struct task_struct *p, cpuset_print_current_mems_allowed(); dump_stack(); - if (memcg) - mem_cgroup_print_oom_info(memcg, p); + if (oc->memcg) + mem_cgroup_print_oom_info(oc->memcg, p); else show_mem(SHOW_MEM_FILTER_NODES); if (sysctl_oom_dump_tasks) - dump_tasks(memcg, oc->nodemask); + dump_tasks(oc->memcg, oc->nodemask); } /* @@ -748,7 +747,7 @@ void oom_killer_enable(void) */ void oom_kill_process(struct oom_control *oc, struct task_struct *p, unsigned int points, unsigned long totalpages, - struct mem_cgroup *memcg, const char *message) + const char *message) { struct task_struct *victim = p; struct task_struct *child; @@ -774,7 +773,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p, task_unlock(p); if (__ratelimit(&oom_rs)) - dump_header(oc, p, memcg); + dump_header(oc, p); pr_err("%s: Kill process %d (%s) score %u or sacrifice child\n", message, task_pid_nr(p), p->comm, points); @@ -795,8 +794,8 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p, /* * oom_badness() returns 0 if the thread is unkillable */ - child_points = oom_badness(child, memcg, oc->nodemask, - totalpages); + child_points = oom_badness(child, + oc->memcg, oc->nodemask, totalpages); if (child_points > victim_points) { put_task_struct(victim); victim = child; @@ -874,8 +873,7 @@ void oom_kill_process(struct oom_control *oc, struct task_struct *p, /* * Determines whether the kernel must panic because of the panic_on_oom sysctl. */ -void check_panic_on_oom(struct oom_control *oc, enum oom_constraint constraint, - struct mem_cgroup *memcg) +void check_panic_on_oom(struct oom_control *oc, enum oom_constraint constraint) { if (likely(!sysctl_panic_on_oom)) return; @@ -891,7 +889,7 @@ void check_panic_on_oom(struct oom_control *oc, enum oom_constraint constraint, /* Do not panic for oom kills triggered by sysrq */ if (is_sysrq_oom(oc)) return; - dump_header(oc, NULL, memcg); + dump_header(oc, NULL); panic("Out of memory: %s panic_on_oom is enabled\n", sysctl_panic_on_oom == 2 ? "compulsory" : "system-wide"); } @@ -966,13 +964,13 @@ bool out_of_memory(struct oom_control *oc) constraint = constrained_alloc(oc, &totalpages); if (constraint != CONSTRAINT_MEMORY_POLICY) oc->nodemask = NULL; - check_panic_on_oom(oc, constraint, NULL); + check_panic_on_oom(oc, constraint); if (sysctl_oom_kill_allocating_task && current->mm && !oom_unkillable_task(current, NULL, oc->nodemask) && current->signal->oom_score_adj != OOM_SCORE_ADJ_MIN) { get_task_struct(current); - oom_kill_process(oc, current, 0, totalpages, NULL, + oom_kill_process(oc, current, 0, totalpages, "Out of memory (oom_kill_allocating_task)"); return true; } @@ -980,12 +978,11 @@ bool out_of_memory(struct oom_control *oc) p = select_bad_process(oc, &points, totalpages); /* Found nothing?!?! Either we hang forever, or we panic. */ if (!p && !is_sysrq_oom(oc)) { - dump_header(oc, NULL, NULL); + dump_header(oc, NULL); panic("Out of memory and no killable processes...\n"); } if (p && p != (void *)-1UL) { - oom_kill_process(oc, p, points, totalpages, NULL, - "Out of memory"); + oom_kill_process(oc, p, points, totalpages, "Out of memory"); /* * Give the killed process a good chance to exit before trying * to allocate memory again. @@ -1005,6 +1002,7 @@ void pagefault_out_of_memory(void) struct oom_control oc = { .zonelist = NULL, .nodemask = NULL, + .memcg = NULL, .gfp_mask = 0, .order = 0, }; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index f21f56f88c8a..7da8310b86e9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3101,6 +3101,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, struct oom_control oc = { .zonelist = ac->zonelist, .nodemask = ac->nodemask, + .memcg = NULL, .gfp_mask = gfp_mask, .order = order, }; -- 2.1.4