From patchwork Mon Dec 4 05:16:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Byungchul Park X-Patchwork-Id: 10089649 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8F17260327 for ; Mon, 4 Dec 2017 05:17:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7F2CB28EF1 for ; Mon, 4 Dec 2017 05:17:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 73C3328F59; Mon, 4 Dec 2017 05:17:54 +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=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F29AB28EF1 for ; Mon, 4 Dec 2017 05:17:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753363AbdLDFRk (ORCPT ); Mon, 4 Dec 2017 00:17:40 -0500 Received: from LGEAMRELO11.lge.com ([156.147.23.51]:47011 "EHLO lgeamrelo11.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753372AbdLDFQs (ORCPT ); Mon, 4 Dec 2017 00:16:48 -0500 Received: from unknown (HELO lgeamrelo01.lge.com) (156.147.1.125) by 156.147.23.51 with ESMTP; 4 Dec 2017 14:16:47 +0900 X-Original-SENDERIP: 156.147.1.125 X-Original-MAILFROM: byungchul.park@lge.com Received: from unknown (HELO localhost.localdomain) (10.177.222.33) by 156.147.1.125 with ESMTP; 4 Dec 2017 14:16:46 +0900 X-Original-SENDERIP: 10.177.222.33 X-Original-MAILFROM: byungchul.park@lge.com From: Byungchul Park To: peterz@infradead.org, mingo@kernel.org, akpm@linux-foundation.org Cc: tglx@linutronix.de, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-block@vger.kernel.org, kernel-team@lge.com, jack@suse.cz, jlayton@redhat.com, viro@zeniv.linux.org.uk, hannes@cmpxchg.org, npiggin@gmail.com, rgoldwyn@suse.com, vbabka@suse.cz, mhocko@suse.com, pombredanne@nexb.com, vinmenon@codeaurora.org, gregkh@linuxfoundation.org Subject: [PATCH v2 4/4] lockdep: Add a boot parameter enabling to track page locks using lockdep and disable it by default Date: Mon, 4 Dec 2017 14:16:23 +0900 Message-Id: <1512364583-26070-5-git-send-email-byungchul.park@lge.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1512364583-26070-1-git-send-email-byungchul.park@lge.com> References: <1512364583-26070-1-git-send-email-byungchul.park@lge.com> Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP To track page locks using lockdep, we need a huge memory space for lockdep_map per page. So, it would be better to make it disabled by default and provide a boot parameter to turn it on. Do it. Suggested-by: Michal Hocko Signed-off-by: Byungchul Park --- Documentation/admin-guide/kernel-parameters.txt | 7 +++++++ lib/Kconfig.debug | 5 ++++- mm/filemap.c | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index f20ed5e..5e8d15d 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -712,6 +712,13 @@ crossrelease_fullstack [KNL] Allow to record full stack trace in cross-release + lockdep_pagelock= + [KNL] Boot-time lockdep_pagelock enabling option. + Storage of lockdep_map per page to track lock_page()/ + unlock_page() is disabled by default. With this switch, + we can turn it on. + on: enable the feature + cryptomgr.notests [KNL] Disable crypto self-tests diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 45fdb3a..c609e97 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1185,7 +1185,10 @@ config LOCKDEP_PAGELOCK select PAGE_EXTENSION help PG_locked lock is a kind of crosslock. Using crossrelease feature, - PG_locked lock can work with lockdep. + PG_locked lock can work with lockdep. Even if you include this + feature on your build, it is disabled in default. You should pass + "lockdep_pagelock=on" to boot parameter in order to enable it. It + consumes a fair amount of memory if enabled. config BOOTPARAM_LOCKDEP_CROSSRELEASE_FULLSTACK bool "Enable the boot parameter, crossrelease_fullstack" diff --git a/mm/filemap.c b/mm/filemap.c index 34251fb..cb7b20b 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1231,8 +1231,24 @@ int __lock_page_or_retry(struct page *page, struct mm_struct *mm, #ifdef CONFIG_LOCKDEP_PAGELOCK +static int lockdep_pagelock; +static int __init allow_lockdep_pagelock(char *str) +{ + if (!str) + return -EINVAL; + + if (!strcmp(str, "on")) + lockdep_pagelock = 1; + + return 0; +} +early_param("lockdep_pagelock", allow_lockdep_pagelock); + static bool need_lockdep_pagelock(void) { + if (!lockdep_pagelock) + return false; + return true; } @@ -1286,6 +1302,10 @@ static void init_zones_in_node(pg_data_t *pgdat) static void init_lockdep_pagelock(void) { pg_data_t *pgdat; + + if (!lockdep_pagelock) + return; + for_each_online_pgdat(pgdat) init_zones_in_node(pgdat); } @@ -1305,6 +1325,9 @@ struct lockdep_map *get_page_map(struct page *p) { struct page_ext *e; + if (!lockdep_pagelock) + return NULL; + e = lookup_page_ext(p); if (!e) return NULL;