From patchwork Mon Oct 1 21:38:46 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: 10622773 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 3EB8E15E8 for ; Mon, 1 Oct 2018 21:38:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2BB8A285EB for ; Mon, 1 Oct 2018 21:38:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1EF4B285EF; Mon, 1 Oct 2018 21:38:41 +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 8DA2B285EB for ; Mon, 1 Oct 2018 21:38:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 632746B0006; Mon, 1 Oct 2018 17:38:34 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 5E2086B0007; Mon, 1 Oct 2018 17:38:34 -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 4653C6B000A; Mon, 1 Oct 2018 17:38:34 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by kanga.kvack.org (Postfix) with ESMTP id E5DB06B0007 for ; Mon, 1 Oct 2018 17:38:33 -0400 (EDT) Received: by mail-pf1-f197.google.com with SMTP id 8-v6so3271702pfr.0 for ; Mon, 01 Oct 2018 14:38:33 -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=pFzqtxEXvRvvBXwhhu3kcbNbv4A2T4Qp4KLLXovdK+E=; b=UCLlJEf+qMTfGEZGvmzHaIfVnb/CwCWt+sj46LISAhvmtZmDM+kPREPYNSNwn5xywW 05cBH1O7QtQshSnRlYIWcf4X73gi3PFvrNIhQ3TxjNJKeKJQTj8U1mqoUvMx7BRdnejQ 2CMvxtjKRz0tAEIVSPy5epRcRHY+IUbqZ6aGfmjeZ8w7+2bBCgHV7btva/mS9Po7xkKs Y/ivb+Evw6JoU3p2A12ozZQVoRyLof4fh3rtDeeuVaxr4VZyYwLFBoJ56iPsiNVtOt9H ihFvYkMfHi3k8oLJqcpUJo9CgWc0JtrniJftk/p1qIfj7iRbxx+fUHu1cgI2jM6Nuvzl EJzw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.24 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: ABuFfoiWFG1btrB9R6yKB+1RHKvvHWKg2pEov0rJ9iimP2d406R+v3cJ 24y/3p3xhM3ZtyYXDuHZ6aWK1BRpN70rje25t0zWb6X6h8qzjZjwuR0xJkxHzPPLwcR/jXTh71B KKCYmQTUwrrdoAxfoqgfQX1H7Nk+1bFD4RWXvN5CFd+FjGcCA8MLZhq8iKVZpv4jTyg== X-Received: by 2002:a63:d502:: with SMTP id c2-v6mr11851346pgg.324.1538429913589; Mon, 01 Oct 2018 14:38:33 -0700 (PDT) X-Google-Smtp-Source: ACcGV61k6FCPEDHZpN+i99oaneaGVl+UsqIa7R1jlWkMhtilAJAZA7E2BVUOOZAKPwdOiRfDSKYB X-Received: by 2002:a63:d502:: with SMTP id c2-v6mr11851315pgg.324.1538429912626; Mon, 01 Oct 2018 14:38:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538429912; cv=none; d=google.com; s=arc-20160816; b=wq/XtCz5txMI3VS3jqB8pizod5JFOX5PCuY3PkXTEv5in2DadNqq0y8XyMQf6FwAIT wWRGTBT9ggjOX8WpvxpSMvyB4KctbUtjUIR9bITEHjWXVWAgl8uT4nKsSmrmyoICspFz IIR843gzDHZkwTlrsevrmNEjceTCFWQRr00auKK89cYawfWayLiKGYs2KMY9zc61xoVU fQHbNq7oFFrXvX4ZK6QcqiLcpffKTd+BpwzQ2TSF/qiqcaAtvKPaqmy9d2m5KjEvMq9G ZHIWPVE8me+BX2QHSVIMVT/wKIFlZZQBvu32vF+aojhQT9NoAKe+47Jh/s4mdUPhx0Ma d0Dg== 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=pFzqtxEXvRvvBXwhhu3kcbNbv4A2T4Qp4KLLXovdK+E=; b=pUNKMVH1nbtuq7Qv3fE/VRXE1AwwEA0UW9Qpg7UeFuVSESZtSUUG6hI862ZEhn1vyr VBoba9wvP4AQnykqHp1JRSoQC9+Otz3mPiv6Ba2Ue41ZAN5Qq5tI/h1vws7x46bLkDHe EQXfzI5E/dLGcUrrkgwPp4Y7G6wImaEis0QJuRIE7N52NuveRTGTi69gbWFcAcUegVus KvKaQxwk9d1n+uWHRq+aFBU086TJmn+pk6EZE6nMpGmt0hWn28OYbkFdSwFr2+6EpDB7 MaflmgzQY74bC4y+9YryYAXgsFkJLQK5gJ0JTVrw6hq2Uem9czI2r2xISfeGfJLMuwYR WdMA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.24 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga09.intel.com (mga09.intel.com. [134.134.136.24]) by mx.google.com with ESMTPS id f62-v6si14059200pfb.218.2018.10.01.14.38.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Oct 2018 14:38:32 -0700 (PDT) Received-SPF: pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.24 as permitted sender) client-ip=134.134.136.24; Authentication-Results: mx.google.com; spf=pass (google.com: domain of rick.p.edgecombe@intel.com designates 134.134.136.24 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 fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Oct 2018 14:38:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,328,1534834800"; d="scan'208";a="84916742" Received: from rpedgeco-desk5.jf.intel.com ([10.54.75.168]) by FMSMGA003.fm.intel.com with ESMTP; 01 Oct 2018 14:38:03 -0700 From: Rick Edgecombe To: akpm@linux-foundation.org, willy@infradead.org, 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 v7 3/4] vmalloc: Add debugfs modfraginfo Date: Mon, 1 Oct 2018 14:38:46 -0700 Message-Id: <1538429927-17834-4-git-send-email-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1538429927-17834-1-git-send-email-rick.p.edgecombe@intel.com> References: <1538429927-17834-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 | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1954458..1b3c3da 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -36,6 +37,12 @@ #include #include +#ifdef CONFIG_X86 +#include +#include +#include +#endif + #include "internal.h" struct vfree_deferred { @@ -2919,7 +2926,96 @@ static int __init proc_vmalloc_init(void) proc_create_seq("vmallocinfo", 0400, NULL, &vmalloc_op); return 0; } -module_init(proc_vmalloc_init); +#elif defined(CONFIG_DEBUG_FS) +static int __init proc_vmalloc_init(void) +{ + return 0; +} +#endif +#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_RANDOMIZE_FINE_MODULE) +static inline unsigned long is_in_backup(unsigned long addr) +{ + return addr >= MODULES_VADDR + get_modules_rand_len(); +} + +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)) { + if (kaslr_mod_randomize_each_module()) + 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 (kaslr_mod_randomize_each_module()) + 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); +} +#elif defined(CONFIG_DEBUG_FS) || defined(CONFIG_PROC_FS) +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