From patchwork Sat Jul 7 00:35:44 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: 10512637 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 D069D600CA for ; Sat, 7 Jul 2018 00:35:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C2D4F28701 for ; Sat, 7 Jul 2018 00:35:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B727F2883A; Sat, 7 Jul 2018 00:35:39 +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 3799628701 for ; Sat, 7 Jul 2018 00:35:39 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1F2916B0007; Fri, 6 Jul 2018 20:35:31 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 12AEF6B0008; Fri, 6 Jul 2018 20:35:31 -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 EB76A6B000C; Fri, 6 Jul 2018 20:35:30 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl0-f71.google.com (mail-pl0-f71.google.com [209.85.160.71]) by kanga.kvack.org (Postfix) with ESMTP id A6CAC6B0008 for ; Fri, 6 Jul 2018 20:35:30 -0400 (EDT) Received: by mail-pl0-f71.google.com with SMTP id 31-v6so5643155plf.19 for ; Fri, 06 Jul 2018 17:35:30 -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=rU2PUdcNB7q+iDpi+FDn/W94ChHFPxkyg8HvZ0P/4gY=; b=lQa7/lmnuks9o8Hl3oqHa4qffW5wYXmNPpUqiXv64q/ajuwweRs+akrEXwj9NK5gvq sC1t5MKsSxMRWR0y++uPiek8w+IBnSvmXNLMYvfYnsWjlxpZDZGMgub7XfMGdcLRPc91 PZTgDuf00ZSJxVVBsLwMU3zUfJ0LURrSmvHadgwDoukSfa1enyK84tla0rpUBSG6HwBN GjCiiynNEqbgcd6ZbK94S80jurerpdKTntV6NABbiQ+A5enO95o6Rn/c82tD/oCHJLQm DaIi3NCApEg86D1RMkL0iz4n1JcPmr6OZ4MVeVUz6TvnkH6KfP7p3PfyGmvWVsO/QZEF 27qg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.93 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: APt69E2uT9ZZFoAtlLLL3SsR3nDOzTTqC8FjPV93YW2fVB0ue9hav8FY wH/39SHx6nFqyJfrdZIoLFvY35gwd/rwnbiKv8xFD0JhQHmnv8lVZYX3LO6P2w0zpjj43r/7TSK l8TSeRV6xWIpWghRaY7v+yCM3Ggi5LJk88GKOPw5HTiJm0jz2A5YMjJJ5EZM7uqwdBA== X-Received: by 2002:a63:24c:: with SMTP id 73-v6mr4263576pgc.252.1530923730354; Fri, 06 Jul 2018 17:35:30 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdpeIlL/NYWAtjIJCn7eePl/3v0+5P2Vi1GhqR4M1BbulYGVNrBVUe4Vc081uBF9exEHRVE X-Received: by 2002:a63:24c:: with SMTP id 73-v6mr4263559pgc.252.1530923729505; Fri, 06 Jul 2018 17:35:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530923729; cv=none; d=google.com; s=arc-20160816; b=Lv77m9FieNxS9KMpe0AWCn0eAbDzAHTn6y1foR6vVHs5+bwQkf7NpNQYrD6zVK5qG1 mlVVZrlJQX8mLE/Ei8cG+GUs5JWMDt8s67YOknRVADNhky03GX948Ej9NK39DZDb+IWD cp691wSUyIUk072FkuemEXqub+K31LMy9wFKoS/52Zel3IQEtwuY+AmMurlZq1BrX9Ze BrGzF7sPY7N+XcnTSNy4OsZinN0iQt8Egm77EirIOC/d5VioGKPoyVbEtqUTmlZwPuX8 9kFpQ1QNG/zPhuiwxuKF8PcTKlilC53vOpP1lCzZ7SUvIUJFcauMSVyOxjr0uXzaC16Z ypQA== 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 :arc-authentication-results; bh=rU2PUdcNB7q+iDpi+FDn/W94ChHFPxkyg8HvZ0P/4gY=; b=LzBcETEgEOepFkdSaHynijfGu/MuA7jG7zV9Dm9On9uy9KJojf3NzXfiARAvcx8agj ZngtkKfA1vAtLy3kvJzM7M7Z2cSOHN9t7/9FW0+E+UAreYolcNL4itN/ppz33iB+ZH3s Se4hBDver1N8Gyd+zIaPCI2Nj0My4lxmgCpyO7F0xbeNfreGGbIAbTuJtHYZBVSZ/mCS firEyNW2EdjySDYUc9Mi4k5sH7qcFUZgOg9g1Kf7jUBhX9vz3OhpDV5KRJPjwl+rjQ4L UHGo1mbQ5jJuHf0zzRDcQ65dOJFAudmxbvi2k2qmE3Hb2wkxLHhTJLpiugpGq7g90Gi7 UvSw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga11.intel.com (mga11.intel.com. [192.55.52.93]) by mx.google.com with ESMTPS id 1-v6si9618339pla.509.2018.07.06.17.35.29 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 06 Jul 2018 17:35:29 -0700 (PDT) Received-SPF: pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.93 as permitted sender) client-ip=192.55.52.93; Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.93 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 orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Jul 2018 17:35:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,318,1526367600"; d="scan'208";a="238445490" Received: from linksys13920.jf.intel.com (HELO rpedgeco-HP-Z240-Tower-Workstation.jf.intel.com) ([10.7.197.56]) by orsmga005.jf.intel.com with ESMTP; 06 Jul 2018 17:35:29 -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 Cc: kristen@linux.intel.com, dave.hansen@intel.com, arjan@linux.intel.com, Rick Edgecombe Subject: [PATCH 3/3] vmalloc: Add debugfs modfraginfo Date: Fri, 6 Jul 2018 17:35:44 -0700 Message-Id: <1530923744-25687-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1530923744-25687-1-git-send-email-rick.p.edgecombe@intel.com> References: <1530923744-25687-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 RANDOMIZE_BASE and X86_64 is configured: Largest free space: 847253504 External Memory Fragementation: 20% Allocations in backup area: 0 Sample output when just X86_64: Largest free space: 847253504 External Memory Fragementation: 20% Signed-off-by: Rick Edgecombe --- mm/vmalloc.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index b6f2449..85441f2 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 @@ -2922,7 +2924,104 @@ 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 proc_vmalloc_init(void) +{ + return 0; +} +#endif +#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_64) +#if defined(CONFIG_RANDOMIZE_BASE) +static void print_backup_area(struct seq_file *m, unsigned long backup_cnt) +{ + if (kaslr_enabled()) + seq_printf(m, "Allocations in backup area:\t%lu\n", backup_cnt); +} +#else +static void print_backup_area(struct seq_file *m, unsigned long backup_cnt) +{ +} #endif +static int modulefraginfo_debug_show(struct seq_file *m, void *v) +{ + struct list_head *i; + unsigned long last_end = MODULES_VADDR; + unsigned long total_free = 0; + unsigned long largest_free = 0; + unsigned long backup_cnt = 0; + unsigned long gap; + + spin_lock(&vmap_area_lock); + + list_for_each(i, &vmap_area_list) { + struct vmap_area *obj = list_entry(i, struct vmap_area, list); + + if (!(obj->flags & VM_LAZY_FREE) + && obj->va_start >= MODULES_VADDR + && obj->va_end <= MODULES_END) { + + if (obj->va_start >= MODULES_VADDR + MODULES_RAND_LEN) + backup_cnt++; + + gap = (obj->va_start - last_end); + if (gap > largest_free) + largest_free = gap; + total_free += gap; + + last_end = obj->va_end; + } + } + + gap = (MODULES_END - last_end); + if (gap > largest_free) + largest_free = gap; + total_free += gap; + + spin_unlock(&vmap_area_lock); + seq_printf(m, "Largest free space:\t\t%lu\n", largest_free); + if (total_free) + seq_printf(m, "External Memory Fragmentation:\t%lu%%\n", + 100-(100*largest_free/total_free)); + else + seq_puts(m, "External Memory Fragmentation:\t0%%\n"); + + print_backup_area(m, 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 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 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