From patchwork Thu Sep 13 21:31:37 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: 10600113 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 72624112B for ; Thu, 13 Sep 2018 21:37:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 77A1D2B2C2 for ; Thu, 13 Sep 2018 21:37:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6BCE72B327; Thu, 13 Sep 2018 21:37:19 +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 DAF262B2C2 for ; Thu, 13 Sep 2018 21:37:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 95CBE8E0001; Thu, 13 Sep 2018 17:37:11 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 825168E000E; Thu, 13 Sep 2018 17:37:11 -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 4EBBA8E0001; Thu, 13 Sep 2018 17:37:11 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by kanga.kvack.org (Postfix) with ESMTP id 0661D8E000C for ; Thu, 13 Sep 2018 17:37:11 -0400 (EDT) Received: by mail-pl1-f198.google.com with SMTP id k18-v6so3218881pls.12 for ; Thu, 13 Sep 2018 14:37:10 -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=suZmZTKsFr9X8WJ5wlfKP1uE1pbeJxoFsYJUHCVCAK61vPfUckeoSx/4hLR4z7Lny9 WO5QIpNBsRfqFUO9+VUOsyLe2jWt01qOLlIGttaRWvW6HiOvffzQo8rnmSckxCoaGEUw xELdIQ/cWoAZjFTL7Gz1BcDzLWUUWefbpRQNZisXlM3oB1jSahORPz5mo8IJL0EJbVaP mAtHMcWtWnjKHTd8NO4/6AJA9jvy8VlHVHjABxGrHLYpwI7r1IwUofEmN+9O9wgPeb8r ItDj8qBo3GX9Du3NS/CkQtyysTfmniZ8Tf3u/JyEKp37So+YdxZk1BLOMrJU3ro4wb82 G98w== 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: APzg51CU9t4YaQ5J65cNzyyBb+t7huNjj4eJ0tsohNqgQGKLG/LlS5WZ WMdK3rpxq3uQOLFS0Ch1piFN4ri+fDldVrzGxaBcaLTyvyO6ZhK0o92DhGDublpVjUXAGBPv12R DgOjQNWuNup7sLJsXr9cpKXeA1G5j0hqwjnNj1Hqg83dkTD243U05H/M6KP/x2GsiRA== X-Received: by 2002:a17:902:33c2:: with SMTP id b60-v6mr8930316plc.11.1536874630666; Thu, 13 Sep 2018 14:37:10 -0700 (PDT) X-Google-Smtp-Source: ANB0Vda3rPg+h/htDm5MhKmR1Ns09Aucwea3BTfUFsm1ZWm1R4c730d1xH0T5xG79k781v7bAaF7 X-Received: by 2002:a17:902:33c2:: with SMTP id b60-v6mr8930253plc.11.1536874629513; Thu, 13 Sep 2018 14:37:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536874629; cv=none; d=google.com; s=arc-20160816; b=bBhmk11wZilY6c4qfhTJYoarq/icM4rlscs9o3+jaH6rY4yLDQd9ccA7Hg9huEmNPH anAr2oaSf5ujY9G6iLsyzdkLEYVVOWEH/SXuVzOmvbz8InN/wd6U6uoRecgQ79EpsUhR P3iXVifrqOG86PG5ORmfzCaYSYWt/sjYd7/pOdfokFDDV0rfh7nw/QCtw3W/064vyNBC /N8azJ1I8rZ24xC0v5itdOS9fPXm0ibnGiCBRHUGfkgEHvsEJLDeJvrXy8Kl2j9kBhKs i8qo2d5N7cSI0YvNc55Nh7w8L+TP/m1kkX33caCEgE4yE7/lkv6xwkD+qZAKgwIxXYp+ Bb4w== 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=VkHi+EJq7J42qsBASKCiTtbMGMV7zbIMK1FhtBxsNTcSPgu3ndHfT7bplKEsyEW/tk ai+ecLjk5+tEys0guCJcKaMRWTkJELN+odrxSCJ4Ab1xPY5MJda+/OGKjy8JkhaNaiV4 fhh1Ljf+L7Gt/AotzjN2+onTlqUmuE+auDaRvTIsOPI5M7HboFlGqaKBH/HWYH4ipuN9 GrAQ78zzdOMhta+YGCpSwkkWesxUFzfwBFqMsj6q8uAUJb180sVFrmIqoSUZqgIdBwTP FMbmHUprquIJJxgtZ00JWKfICt0lW+wy5D4LPhpCLFgb5Fnr6cmvlCONLe5ZiXQy/tr7 H5WQ== 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 h7-v6si5264503plr.98.2018.09.13.14.37.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Sep 2018 14:37:09 -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 fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Sep 2018 14:37:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,370,1531810800"; d="scan'208";a="263300615" Received: from rpedgeco-desk5.jf.intel.com ([10.54.75.168]) by fmsmga006.fm.intel.com with ESMTP; 13 Sep 2018 14:37:08 -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 v6 3/4] vmalloc: Add debugfs modfraginfo Date: Thu, 13 Sep 2018 14:31:37 -0700 Message-Id: <1536874298-23492-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1536874298-23492-1-git-send-email-rick.p.edgecombe@intel.com> References: <1536874298-23492-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 Reviewed-by: Kees Cook --- 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