From patchwork Wed Jun 20 22:09:30 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: 10478779 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 2D02260230 for ; Wed, 20 Jun 2018 22:09:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1E64D2883A for ; Wed, 20 Jun 2018 22:09:42 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 13339288BB; Wed, 20 Jun 2018 22:09:42 +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 89AD92883A for ; Wed, 20 Jun 2018 22:09:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C23EB6B0008; Wed, 20 Jun 2018 18:09:35 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id BD60D6B000A; Wed, 20 Jun 2018 18:09:35 -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 AC91D6B000C; Wed, 20 Jun 2018 18:09:35 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl0-f69.google.com (mail-pl0-f69.google.com [209.85.160.69]) by kanga.kvack.org (Postfix) with ESMTP id 6320A6B0008 for ; Wed, 20 Jun 2018 18:09:35 -0400 (EDT) Received: by mail-pl0-f69.google.com with SMTP id f5-v6so511142plf.18 for ; Wed, 20 Jun 2018 15:09:35 -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=MmVLSq6exIXftJBXRpc0Etl9d7TPtdb4DMy6kKODyi4=; b=s7jbRDZqQOCVeqTX01YMONMqg2+rG8r+hjRPSZqJp2MC31/AV4rjpPsFbP83mhxzSB vf8vhteAKfrCjC5WtdICUDRy3cfIFFbGOdoX+WUSBlUtfPaEnmIcc/B45c5IoYRabzS5 X/zgiPZNL6zkLD+CTZe19AYrutzawHm0tnq3HIK+x6SHGDUEUlt9+ZzoCfhvQVj/GGbs C/dfr268+0sGV7V78+aOH2uXym9RcgdWkdpnt79Z1ttDz6XcUqKqwEkfQYUxtCk2cdgZ J/vOKaJ7tjk6oUcpRUCYjpAWIDxBUltGiBJFHaNMsNgp0RwikRMsyqJJSHWtqUs1+bd4 R0Aw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.88 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: APt69E1C9VIswlxpOoG/uQ/P59EJBFd+KT36h1WIVlWjfFusCzQ0ExYt SSpsDyBxPm/9rBwfHu18dH8ghWMlPLxLPUmr3Uu+mw/NIyVkc++guJcsRG1fMBwty9rSReZhvW2 zhRaSbZMV4E4egyNj+ZoLQBsABLOw+OpozMBeop5rRagoU1/q53xUy0Q92ir8ykul/w== X-Received: by 2002:a17:902:1121:: with SMTP id d30-v6mr26112858pla.247.1529532575102; Wed, 20 Jun 2018 15:09:35 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLyXIuAI4f4qyy41wQ+ZamR1lB8QUysoVK2YXJWH7jsNCq4XJ581fAMTLfwit1ZpvKnnbsF X-Received: by 2002:a17:902:1121:: with SMTP id d30-v6mr26112805pla.247.1529532574176; Wed, 20 Jun 2018 15:09:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529532574; cv=none; d=google.com; s=arc-20160816; b=rHBoFX/hDI54o5qJr8/Q29jytzj5SsRnA+nUohd7Qj978ytAiuhjBJ2/zJCBS4FWZD xOSyFMv66yOUFdFDv21q4PlcZMkzX29T9tSAWmTpZgEENewcI1wMOthdzo+lK/+/QvGd 5mYJ21NzR0dI6DC0je+XRipdNfzT+Tj9cctVdpv1ZrtJWOeHlR/TqNtYPPi4fhGVBGKw z/ppA9do2i/8FVztEMFradZ2rpT9eIeOX5m3RY+ualBHURhPO0wWh3zNkuhI+vOSh0cH ECS9Wqo2ARnnSgtlU3wUW2dNoljrOpMNEEX4S289esfJRuxkP6z9t0WDWITGW5quAMP5 m3Pg== 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=MmVLSq6exIXftJBXRpc0Etl9d7TPtdb4DMy6kKODyi4=; b=aAl+bHIcSaF28foo0mv+jG2TUfxqAr0hKe5M7BH5xxj4Ay3TS4Fl1I+bgJJ7q9bqnt qjPmTKhbHUdsApjpPbyg8KYw3MCT0FkCZ2Za2DhmtP3VBrOK4gISCcxi+l1Jgp6EQ2fH uc3qs8eNhBlX0r5g5ZJ1No20pdJqMUmINHYDDYJ3dh3vfhXuvUUsqIsYo/f+k8VEnRR6 3OIi+aR15GgHbcfICmt4vP5g6pr0CAbAkktowKJZzH1uvv2IUOE6AfEA4bl15+E/DQ3k 76GcwfjFtL3+Be/1aQRzTdZrCPZYFsMB6TysYWM2ktTxna1jfAlC6I2XG3GTzlxPhORe t4WQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga01.intel.com (mga01.intel.com. [192.55.52.88]) by mx.google.com with ESMTPS id r10-v6si3395620pfe.121.2018.06.20.15.09.33 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Jun 2018 15:09:34 -0700 (PDT) Received-SPF: pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.88 as permitted sender) client-ip=192.55.52.88; Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.88 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 orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jun 2018 15:09:33 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,249,1526367600"; d="scan'208";a="66312721" Received: from linksys13920.jf.intel.com (HELO rpedgeco-HP-Z240-Tower-Workstation.jf.intel.com) ([10.7.197.56]) by orsmga001.jf.intel.com with ESMTP; 20 Jun 2018 15:09:33 -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.c.accardi@intel.com, dave.hansen@intel.com, arjan.van.de.ven@intel.com, Rick Edgecombe Subject: [PATCH 3/3] vmalloc: Add debugfs modfraginfo Date: Wed, 20 Jun 2018 15:09:30 -0700 Message-Id: <1529532570-21765-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1529532570-21765-1-git-send-email-rick.p.edgecombe@intel.com> References: <1529532570-21765-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 otherwise: Largest free space: 847253504 External Memory Fragementation: 20% Signed-off-by: Rick Edgecombe --- mm/vmalloc.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 9e0820c9..afb8fe9 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 @@ -2785,7 +2787,113 @@ 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 + +#ifdef CONFIG_DEBUG_FS +#if defined(CONFIG_RANDOMIZE_BASE) && defined(CONFIG_X86_64) +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); +} +static unsigned long get_backup_start(void) +{ + return MODULES_VADDR + MODULES_RAND_LEN; +} +#else +static void print_backup_area(struct seq_file *m, unsigned long backup_cnt) +{ +} +static unsigned long get_backup_start(void) +{ + return 0; +} +#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 >= get_backup_start()) + 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 Fragementation:\t%lu%%\n", + 100-(100*largest_free/total_free)); + else + seq_puts(m, "External Memory Fragementation:\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", 0x0400, NULL, NULL, + &debug_module_frag_operations); +} +#else +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