From patchwork Wed Sep 12 22:55:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Edgecombe, Rick P" X-Patchwork-Id: 10598435 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 768DE112B for ; Wed, 12 Sep 2018 22:55:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 172ED2AC76 for ; Wed, 12 Sep 2018 22:55:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0AA6E2AC7E; Wed, 12 Sep 2018 22:55:47 +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=-2.9 required=2.0 tests=BAYES_00,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 B325F2AC76 for ; Wed, 12 Sep 2018 22:55:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C1BD08E0005; Wed, 12 Sep 2018 18:55:39 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id BA2438E0001; Wed, 12 Sep 2018 18:55:39 -0400 (EDT) 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 A5EE88E0005; Wed, 12 Sep 2018 18:55:39 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by kanga.kvack.org (Postfix) with ESMTP id 4E7648E0003 for ; Wed, 12 Sep 2018 18:55:39 -0400 (EDT) Received: by mail-pl1-f199.google.com with SMTP id 90-v6so1628068pla.18 for ; Wed, 12 Sep 2018 15:55:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=Lmk7RJ4HAcUTrVlTM0qUi0H/bFfvBm4kuPmUSOALSlM=; b=pFF+B7XD6EueUH7QCKjAW/zcsA1Wuk+1LtP3g5dAskqgj5vABHTelf5kuPLBMhV+4e U+ygi/edOzauTbD4kH0I+c8YbqczCbGGOIiAmuX5wn9vfz0cab6X9QpSyI4cl87FhQRZ aeFDP+q1dCefIXA/BZ5h7uYMdiR5WaWen3OYtDDp4VP1FKX+GXZVqWd1Roh9pqmpaFKl 01NnQOEOc1WQKL7AH1tLkxfRqKUSg8YPljsb8tsT+0UkvfgPr9DmyfbISAprFA4/4PDL m4VjQNcMPjjCCvhF0KW+wY0lnn4/6XPFB6sB2svYFsBlbK0tLCDd075wiQ6NHkrtWauV niMw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.65 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APzg51D01xTHdWP2AUpeLs1bNfO7dc2PKLSv6dQNbyc6DJxq2FjJTkEj MjFLso/t25NPSUWSMuWZWOPqPuMVdML1cwWqUfuaD9nV4DztyyoqCdgPgMTRvfBjE/+qMKVqFs3 B4WmFG7RgbcBKssOeXeyW1iy/al/FAzeoKpt3q0Qwoi7X9ZggT1cXUnx0N3VVQoC0JA== X-Received: by 2002:a62:63c2:: with SMTP id x185-v6mr4552821pfb.13.1536792938973; Wed, 12 Sep 2018 15:55:38 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdasv0gMU2YtwEHuAiTTW4rZ5GfeWf3GVV1r6zXt7PiGE4GFweW1tOVDP/KWKuMhlIZUGwVa X-Received: by 2002:a62:63c2:: with SMTP id x185-v6mr4552779pfb.13.1536792937976; Wed, 12 Sep 2018 15:55:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536792937; cv=none; d=google.com; s=arc-20160816; b=w1JFXxJ1Z6SGRWsSzW/5xJoDcMwrHIYqc21Kbx7G8DhQqeIIwy2FpjoK5MzwUvaLRO TPA5TFTkyXLJsVMgFgDPP/UJh3qfu3rNTS5cFPSm2k7UuhXPMMB4kF7yhLrgDI8NrYWJ KXX4C0aSNlM6qSP4Juqp7RqI/LKfCo/eMUQ3diZHfjcoz+whFbAw81x97cR+BBwRZNMu j+++35gKI4pawgLPGLsPfAHesIqRozHCr4c8DNRFAVQ0CCEwS6RyEL8S3PbyWT0frfay +PV+xEQHw2oipnroboYgqboa75TVHMTwVj4ttWFcITgCW6x+7gqf/v4SWfIalyUKvUeh ptvA== 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; bh=Lmk7RJ4HAcUTrVlTM0qUi0H/bFfvBm4kuPmUSOALSlM=; b=sTIQwN9iTfSQmtlxsanieSnZZ5q6H8C086MzMpZKz9ayXQlQ2IcjGcrWYn2SXLlbfa Uhz1moNUMbFxGiwM5l+SCMv7fdR4IKgZLyPRNkqQmZZAfljtvcjKGFuehR01WNLaI1Qz UDqTcFGEc0q2szKYZl/Y/US65T8sGcwnq91lsj9rJD6yQSa5HPsTGMleI40+iqQci2LP i9mRCyX5hDwigveFDVJttFLoVny/k8TFEMSWMDBAaUoo9JUxtH+VnnOTgtqyxo8RGkXh WuvvC28rtMz0QkafDGWO4PKxJ1L2vxuNwA/7NWVT/VgcaPbaIERs1Bx14R++iTUeHZXN UqPw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.65 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga03.intel.com (mga03.intel.com. [134.134.136.65]) by mx.google.com with ESMTPS id g1-v6si2145414plt.77.2018.09.12.15.55.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Sep 2018 15:55:37 -0700 (PDT) Received-SPF: pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.65 as permitted sender) client-ip=134.134.136.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.65 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Sep 2018 15:55:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,366,1531810800"; d="scan'208";a="69545862" Received: from rpedgeco-desk5.jf.intel.com ([10.54.75.168]) by fmsmga007.fm.intel.com with ESMTP; 12 Sep 2018 15:55:22 -0700 From: Rick Edgecombe To: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, kernel-hardening@lists.openwall.com, daniel@iogearbox.net, jannh@google.com, keescook@chromium.org, alexei.starovoitov@gmail.com Cc: kristen@linux.intel.com, dave.hansen@intel.com, arjan@linux.intel.com, Rick Edgecombe Subject: [PATCH v5 3/4] vmalloc: Add debugfs modfraginfo Date: Wed, 12 Sep 2018 15:55:39 -0700 Message-Id: <1536792940-8294-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1536792940-8294-1-git-send-email-rick.p.edgecombe@intel.com> References: <1536792940-8294-1-git-send-email-rick.p.edgecombe@intel.com> 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 Add debugfs file "modfraginfo" for providing info on module space fragmentation. This can be used for determining if loadable module randomization is causing any problems for extreme module loading situations, like huge numbers of modules or extremely large modules. Sample output when KASLR is enabled and X86_64 is configured: Largest free space: 897912 kB Total free space: 1025424 kB Allocations in backup area: 0 Sample output when just X86_64: Largest free space: 897912 kB Total free space: 1025424 kB Signed-off-by: Rick Edgecombe --- mm/vmalloc.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1954458..a44b902 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,7 @@ #include #include +#include #include #include @@ -2919,7 +2921,105 @@ static int __init proc_vmalloc_init(void) proc_create_seq("vmallocinfo", 0400, NULL, &vmalloc_op); return 0; } -module_init(proc_vmalloc_init); +#else +static int __init proc_vmalloc_init(void) +{ + return 0; +} +#endif + +#if defined(CONFIG_RANDOMIZE_BASE) && defined(CONFIG_X86_64) +static inline unsigned long is_in_backup(unsigned long addr) +{ + return addr >= MODULES_VADDR + MODULES_RAND_LEN; +} +#else +static inline unsigned long is_in_backup(unsigned long addr) +{ + return 0; +} +inline bool kaslr_enabled(void); #endif + +#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_64) +static int modulefraginfo_debug_show(struct seq_file *m, void *v) +{ + unsigned long last_end = MODULES_VADDR; + unsigned long total_free = 0; + unsigned long largest_free = 0; + unsigned long backup_cnt = 0; + unsigned long gap; + struct vmap_area *prev, *cur = NULL; + + spin_lock(&vmap_area_lock); + + if (!pvm_find_next_prev(MODULES_VADDR, &cur, &prev) || !cur) + goto done; + + for (; cur->va_end <= MODULES_END; cur = list_next_entry(cur, list)) { + /* Don't count areas that are marked to be lazily freed */ + if (!(cur->flags & VM_LAZY_FREE)) { + backup_cnt += is_in_backup(cur->va_start); + gap = cur->va_start - last_end; + if (gap > largest_free) + largest_free = gap; + total_free += gap; + last_end = cur->va_end; + } + + if (list_is_last(&cur->list, &vmap_area_list)) + break; + } + +done: + gap = (MODULES_END - last_end); + if (gap > largest_free) + largest_free = gap; + total_free += gap; + + spin_unlock(&vmap_area_lock); + + seq_printf(m, "\tLargest free space:\t%lu kB\n", largest_free / 1024); + seq_printf(m, "\t Total free space:\t%lu kB\n", total_free / 1024); + + if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && kaslr_enabled()) + seq_printf(m, "Allocations in backup area:\t%lu\n", backup_cnt); + + return 0; +} + +static int proc_module_frag_debug_open(struct inode *inode, struct file *file) +{ + return single_open(file, modulefraginfo_debug_show, NULL); +} + +static const struct file_operations debug_module_frag_operations = { + .open = proc_module_frag_debug_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void __init debug_modfrag_init(void) +{ + debugfs_create_file("modfraginfo", 0400, NULL, NULL, + &debug_module_frag_operations); +} +#else /* defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_64) */ +static void __init debug_modfrag_init(void) +{ +} +#endif + +#if defined(CONFIG_DEBUG_FS) || defined(CONFIG_PROC_FS) +static int __init info_vmalloc_init(void) +{ + proc_vmalloc_init(); + debug_modfrag_init(); + return 0; +} + +module_init(info_vmalloc_init); +#endif