From patchwork Wed Aug 29 22:59: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: 10581039 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 4CB335A4 for ; Wed, 29 Aug 2018 22:59:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3C8FA2B157 for ; Wed, 29 Aug 2018 22:59:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 30D9C2B16D; Wed, 29 Aug 2018 22:59:53 +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 AE9162B157 for ; Wed, 29 Aug 2018 22:59:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CEC236B4E26; Wed, 29 Aug 2018 18:59:47 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C42396B4E27; Wed, 29 Aug 2018 18:59:47 -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 AE44F6B4E29; Wed, 29 Aug 2018 18:59:47 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by kanga.kvack.org (Postfix) with ESMTP id 46A186B4E26 for ; Wed, 29 Aug 2018 18:59:47 -0400 (EDT) Received: by mail-pf1-f199.google.com with SMTP id e15-v6so3618910pfi.5 for ; Wed, 29 Aug 2018 15:59:47 -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=hLc0RbD+q8QLHs+36mLDa6fqJ94HASWeBJPswc4ajRcU5e0maqRb9hdAbaSjLTdQmK MhwOrgH+mzwQ571rkhDqfAVdp29ZuLJ6qffjrhxS64ZlV0ZRkreHaB0QS6x4Ib+bCxWb ju3YLAxb4Zax3e5frqj5//1HzjetZYld2PCQh2l5GuHuLgRXAg1QAzC/+exI/kv9ZwXd 1J/3Qsc9tjZdC0STto3LHlWyGxPRM5h5nQrAPC9obJ7vZRjNSia3xmS/JQF1afRdE9iV 7cZMfC4P3efl6I8A3zlLqLij0fsubGq9IaAfdQ4qECNuxRN1VzJWoS9aHaAzfpoqcdyZ 40RQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.31 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: APzg51AExnQYqUh3QtzwL9flUZI2W1s/ypQH7KGAq1IgWsVZRkGiGiLw jp376SVhHoSIpotfj7Y75DLl+gtLjW72UUDvOrDmgjUZZniSqL/8LVU9zVbO/SzpdV3KvUO1yj2 OAMerCNG0Iutya4g6lcWhNaoIipgq/OodtO9jk6mBHwbi90vz7maxhS2LM4rz2s0F3w== X-Received: by 2002:a17:902:1121:: with SMTP id d30-v6mr7481180pla.250.1535583586940; Wed, 29 Aug 2018 15:59:46 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYhWmBUbgIlSxyCLODvwY1IM4m2WNJs2CGtZ/dV72sOp7yrzeD7Fg4VfFRu4wrHNjeUyuha X-Received: by 2002:a17:902:1121:: with SMTP id d30-v6mr7481128pla.250.1535583585188; Wed, 29 Aug 2018 15:59:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535583585; cv=none; d=google.com; s=arc-20160816; b=WVCZnpQrOL7ezrWZTMGxt3ZDd4TWKySuNm5LQ1pNQV4vxQJXCLn/jW141amHdVeV4b HHyvSAR7hWQucL6TDcQdPf5Os5bTBW18/CnHP7OGRvL9kBvMdrMsTbxbbZyYpJhDb2YQ tdLA3jSd92X3tICpNywsO1IVnnaB6DaPuQOO42CwgqGIxuwAhkao3hgntQbnSo1k+p1f 0ubpavuxz9Q4IAmtzuTv8t2DOupTr1BdoN1hVWbFIY7i5QNcwF9W+SQP0JtBFjbkCmCS KeGRgXmufSZRY0PJ3ElYOo7yohntlnFaL056vwrhCWAcUe41WeKfUuOeMmDGk6NAFcAi BnJA== 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=Lmk7RJ4HAcUTrVlTM0qUi0H/bFfvBm4kuPmUSOALSlM=; b=HAI3rQjc8DwDu/TmI7Ghrs7ULHCq9SFqdTes0TAyeFTWLu5+GI7fKhN0NY9GpICHgs IM3MKlKJLS45yNREynsK6+GFishSh4jz6K4b9pNzS5pp1+xVn1cWHuT+9oSxMNCPHVUu AYFhCqh16oSCqefo9R6tKIq4ufL0kLMkqT9qXUPLDh1SZKf/MGB5H6LayZ4jHtoDKMKJ saD49E2d1B5sHtTdBVLqy6Kge7zgDJV++ngxl3ucxSxM2pEJsaP6X8g0ZYOPimNAzGRC wCtZSTXb5OxQcIRGthZILZyD/uxRKCCfxrRe8iXLwLOX0WLUTG1h6nKvOe7AoKfmjpIe Wr/w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.31 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga06.intel.com (mga06.intel.com. [134.134.136.31]) by mx.google.com with ESMTPS id v11-v6si5026798pgg.303.2018.08.29.15.59.44 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Aug 2018 15:59:45 -0700 (PDT) Received-SPF: pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.31 as permitted sender) client-ip=134.134.136.31; Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.31 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 fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Aug 2018 15:59:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,305,1531810800"; d="scan'208";a="85609402" Received: from rpedgeco-desk5.jf.intel.com ([10.54.75.168]) by fmsmga001.fm.intel.com with ESMTP; 29 Aug 2018 15:59:42 -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 Cc: kristen@linux.intel.com, dave.hansen@intel.com, arjan@linux.intel.com, Rick Edgecombe Subject: [PATCH v4 3/3] vmalloc: Add debugfs modfraginfo Date: Wed, 29 Aug 2018 15:59:39 -0700 Message-Id: <1535583579-6138-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1535583579-6138-1-git-send-email-rick.p.edgecombe@intel.com> References: <1535583579-6138-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