From patchwork Wed Jan 2 16:08:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qian Cai X-Patchwork-Id: 10746531 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DCA716C2 for ; Wed, 2 Jan 2019 16:09:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CBA7D285BE for ; Wed, 2 Jan 2019 16:09:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BF7F92863D; Wed, 2 Jan 2019 16:09:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 47416285BE for ; Wed, 2 Jan 2019 16:09:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 67EE48E002A; Wed, 2 Jan 2019 11:09:11 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 62D4A8E0002; Wed, 2 Jan 2019 11:09:11 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F7068E002A; Wed, 2 Jan 2019 11:09:11 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by kanga.kvack.org (Postfix) with ESMTP id 22BC58E0002 for ; Wed, 2 Jan 2019 11:09:11 -0500 (EST) Received: by mail-qk1-f197.google.com with SMTP id c84so37671857qkb.13 for ; Wed, 02 Jan 2019 08:09:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:cc:subject:date :message-id:in-reply-to:references; bh=EGjYGPLV79cTTAx88qQx8JrYVlIA/Dm5mTiflkZ49i0=; b=MxfWcqEorg9nwf2MnMIshRyMLYIO4fiUatrcdkpWg67DufmKW/R2cJAZJHG4snWD45 OcmIEnlbNhMDbRZCYQpyWrvCdF1f3c3XHSjFjjKCBK/4IgQi1orlV5Gj9wRi557FKCSs O4KzyGN7Njwbv2axw7f7AY2Ul3u+XrhTDJ5DhYRuqK4t2V34GoqjSUukO4PPmgYb/bWb Xrq+zyMmVc7e5PfubnpkeF8D+GiG3TxrlMqq4BCQtJtE9N8hf83JcBzA4ef6LgMIx/b/ ecVTpUQr3i71147NyVrvUrROLlH1znMslQRkf7385htpN3XFSGzU/q9Rc92R7k1sc3yx PW6Q== X-Gm-Message-State: AJcUukdv/yRZYsxHckxy2NP4nXSYzoeMcqbhsBIrdhKXFsW4Df7N8JpN ERuIvTg7oFphYWdyNlBM+AmQW+5ttZCjYs+13l6ITBttDdcceMkqhruEKozbJMk5H08GdQw4T4Z wAMvKP/t4zgXjgGCN8op0ENDYgU294bqWpHBE8AU7WucLMmz9LehK1rtbpX8iBWFi/dmHKWloJo IQPe3wtJyG0uvO5gYJqXr4nOB5BW1l2dXogBPyzrY9uFJNQsKHqb+RB0KzH/YK2KNkRkdkmKqVG OnwUcPNO24hdi4Q1uANrTuZw43pPeTpaBkyXUU6dtsmkNc3vTyG4wPH/G6xWIp/KGjOZ/gEmJ7m Yy/q9J/UAnOr2Sg+CrpgOly/9fap0O7BPynrZgqYnYDKWh+o6cMxnbHHk/dIBL+QhQ+E1o50YWA r X-Received: by 2002:a0c:9549:: with SMTP id m9mr43981717qvm.214.1546445350761; Wed, 02 Jan 2019 08:09:10 -0800 (PST) X-Received: by 2002:a0c:9549:: with SMTP id m9mr43981684qvm.214.1546445350149; Wed, 02 Jan 2019 08:09:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546445350; cv=none; d=google.com; s=arc-20160816; b=lEqCbSis4L1c58S3DkpGBtFIA/hnT36scpkKipJ6zvyEQVZy0bUKKDdsPFbrecfgFw rR+pA8EcVvRzjKRzqq9FGwXffEZmgubEn9b2B5lx8xiW/QXWjZxZPf87eabKa6jvOTzl vuD/e2p4gVUGt+Nlt8Wvn/bfqgoanvKNijXzIpUlFrCz9aJJjUZ4Elovm4sItP8rwicG ZBw9eSEyDSB1yHKNNvBoNvqw8iqZ58yMHiPL6Jhx55XgJE2Fdcfmx+UXgYLpDOGzSqUp /r37Tlv6VUBgE5dHPVYp++dfts90loBLUDmzdErSZZEjaj4Xcp61Uk7cGpTosl6+J6Y0 pEeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=EGjYGPLV79cTTAx88qQx8JrYVlIA/Dm5mTiflkZ49i0=; b=fuFnDgoJvaeo0hIwdpSfW1Jf6UTQGrwWDm4FpO8ILkjCbNHRTqRrMyMi0RNntbRRAy MybVFkYYXlsVXGyfN79Tkn71havJGXKDnd2VoL+iZqNDE91mGsqpVdiMFT3MFPZB3DEG Xew1O1N8JiMv3ap+Mzja+kYuAYkNjm6xOibLytrge+Spw73Ho6xF/o6MOGKk6h2fIMDS L3PCgECqtOIxwSCD6gZ0RP3h0g9pRZ5cEdfQdz1/R21+bGjroyh8DJ+KwZODAYdmTgds WTxYdY0041TqSQpFJhAb54c2fnNlGFBfFuCM2Szb/RWzckYEcVo4Qwtr05/3PyjCt3ea zF4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lca.pw header.s=google header.b="JI62b/4t"; spf=pass (google.com: domain of cai@lca.pw designates 209.85.220.65 as permitted sender) smtp.mailfrom=cai@lca.pw Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id y17sor27399959qvl.33.2019.01.02.08.09.10 for (Google Transport Security); Wed, 02 Jan 2019 08:09:10 -0800 (PST) Received-SPF: pass (google.com: domain of cai@lca.pw designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@lca.pw header.s=google header.b="JI62b/4t"; spf=pass (google.com: domain of cai@lca.pw designates 209.85.220.65 as permitted sender) smtp.mailfrom=cai@lca.pw DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EGjYGPLV79cTTAx88qQx8JrYVlIA/Dm5mTiflkZ49i0=; b=JI62b/4t57zikLrILsFrQDuVhi7swP/jBfBQNzeEM+jsFup2AJngLTQJbpu+053IJI BkRonK1QmetROv0XGT7cAZkOBxnZq0zR80JhQQi3XYivW1N5dSNm0jxOmfq61XU5rHIU f+OxvdRksQhlMUZrZF6NXC95mWy8qXLxJR5Fq8+3b5p1Cyw5mTZcyfhhYTg+zRJn3QW4 zymxS6ZCcZp7NHoxCfD7n1hc4yiTc2qMfMyM6BFq9vgJbMjrcbeuXv8A7qzbZQqYiIzz MRJ/4NkrGzN+fJoC+AgKPrS7IPM6kVRRo76sZwuqsPl0xCRTuqD9eNehN4hH9vnwPzpJ 3tvA== X-Google-Smtp-Source: ALg8bN4CozgshsojEr9SRo9gEV0nvl6+w91J2qQJG0JU0C+qEghXkGDfijqpZFshk2Tam4IPvQYJFw== X-Received: by 2002:a0c:d6c2:: with SMTP id l2mr42305547qvi.97.1546445349896; Wed, 02 Jan 2019 08:09:09 -0800 (PST) Received: from ovpn-120-55.rdu2.redhat.com (pool-71-184-117-43.bstnma.fios.verizon.net. [71.184.117.43]) by smtp.gmail.com with ESMTPSA id y12sm30994640qta.13.2019.01.02.08.09.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Jan 2019 08:09:09 -0800 (PST) From: Qian Cai To: catalin.marinas@arm.com, akpm@linux-foundation.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Qian Cai Subject: [PATCH] kmemleak: survive in a low-memory situation Date: Wed, 2 Jan 2019 11:08:49 -0500 Message-Id: <20190102160849.11480-1-cai@lca.pw> X-Mailer: git-send-email 2.17.2 (Apple Git-113) In-Reply-To: <0b2ecfe8-b98b-755c-5b5d-00a09a0d9e57@lca.pw> References: <0b2ecfe8-b98b-755c-5b5d-00a09a0d9e57@lca.pw> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP Kmemleak could quickly fail to allocate an object structure and then disable itself in a low-memory situation. For example, running a mmap() workload triggering swapping and OOM [1]. First, it unnecessarily attempt to allocate even though the tracking object is NULL in kmem_cache_alloc(). For example, alloc_io bio_alloc_bioset mempool_alloc mempool_alloc_slab kmem_cache_alloc slab_alloc_node __slab_alloc <-- could return NULL slab_post_alloc_hook kmemleak_alloc_recursive Second, kmemleak allocation could fail even though the trackig object is succeeded. Hence, it could still try to start a direct reclaim if it is not executed in an atomic context (spinlock, irq-handler etc), or a high-priority allocation in an atomic context as a last-ditch effort. [1] https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/mem/oom/oom01.c Signed-off-by: Qian Cai --- mm/kmemleak.c | 10 ++++++++++ mm/slab.h | 17 +++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index f9d9dc250428..9e1aa3b7df75 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -576,6 +576,16 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, struct rb_node **link, *rb_parent; object = kmem_cache_alloc(object_cache, gfp_kmemleak_mask(gfp)); +#ifdef CONFIG_PREEMPT_COUNT + if (!object) { + /* last-ditch effort in a low-memory situation */ + if (irqs_disabled() || is_idle_task(current) || in_atomic()) + gfp = GFP_ATOMIC; + else + gfp = gfp_kmemleak_mask(gfp) | __GFP_DIRECT_RECLAIM; + object = kmem_cache_alloc(object_cache, gfp); + } +#endif if (!object) { pr_warn("Cannot allocate a kmemleak_object structure\n"); kmemleak_disable(); diff --git a/mm/slab.h b/mm/slab.h index 4190c24ef0e9..51a9a942cc56 100644 --- a/mm/slab.h +++ b/mm/slab.h @@ -435,15 +435,16 @@ static inline void slab_post_alloc_hook(struct kmem_cache *s, gfp_t flags, { size_t i; - flags &= gfp_allowed_mask; - for (i = 0; i < size; i++) { - void *object = p[i]; - - kmemleak_alloc_recursive(object, s->object_size, 1, - s->flags, flags); - p[i] = kasan_slab_alloc(s, object, flags); + if (*p) { + flags &= gfp_allowed_mask; + for (i = 0; i < size; i++) { + void *object = p[i]; + + kmemleak_alloc_recursive(object, s->object_size, 1, + s->flags, flags); + p[i] = kasan_slab_alloc(s, object, flags); + } } - if (memcg_kmem_enabled()) memcg_kmem_put_cache(s); }