Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp523400imu; Tue, 27 Nov 2018 16:35:06 -0800 (PST) X-Google-Smtp-Source: AFSGD/WAC66XNonoA0YXvnG/O5degyvXhUv56aNBUs1XO6VbNTgtsaUsnUs0WGEGwau4gIPTVVSL X-Received: by 2002:a62:9f01:: with SMTP id g1mr29397147pfe.223.1543365306658; Tue, 27 Nov 2018 16:35:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543365306; cv=none; d=google.com; s=arc-20160816; b=hxMTQ3SAWOseBTYACEOMn9JBE6wQdXs7FizRllzALcov9PTU4ZHk3E8fJjU035RCkK vfr1m8QrtDIg8iAUSgLsrh7JI6kZH8igXGQfvrTTvG0cBhJvn6eaUfavF+3m03b3D83K fNhuy9La20kNkkJxvLvhtJPjR38gRS5pL47yJDNoKFxjCu3NlVt1JX6nrauVs/zeBibD YUiIWD5zLq4oW11CSZi2xCmyxdrXGDKtuWaTHRO15t54Nt0FCKR1Ma8Ga9NgpDYD9JE/ Pbv5N3yacZnvYf0GNJfchMrrp+I+vfThdEVuPjzXJOwjOHj8UEZPTrBfluhZ3Ei+BS/s sdRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=fsN4TEM+Jd846VfbpOFhinDwRxIYax74GBQHpii2IVI=; b=p9mgF7v5W1sfRopSrJlgg7iwCjHt2foImBkLx5f0phNDJUpZ/FzIcMid6TKOdb2gQq fxceYUL8fqd24/cMescm79nEh2AbskplgVQvHDwJEKZWO5YfwQ1UD/EDOXWck//myBw2 N41iUylr8s2iEJ0NfvQ8wn4oXohCk/MLwwvF4YeEZFGg9qRIzvrllWDgABvHyDzJ2qWk hUAuE/Bkyk8YaWD9EqkAsVWVDe6qiK+0dVEcg3FlzlSXTlGaFgve5R7yVf+IRVBub63q pIinrGi4mI3QXJGtJuQla2llYCdcUxde7Sso+2zJVC5lvNtQc0VbGxibDt2mchFXI2U8 hssQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k142si6429632pfd.174.2018.11.27.16.34.52; Tue, 27 Nov 2018 16:35:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727071AbeK1Ldr (ORCPT + 99 others); Wed, 28 Nov 2018 06:33:47 -0500 Received: from mga18.intel.com ([134.134.136.126]:49268 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726418AbeK1Ldr (ORCPT ); Wed, 28 Nov 2018 06:33:47 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Nov 2018 16:34:07 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,288,1539673200"; d="scan'208";a="91641478" Received: from rpedgeco-desk5.jf.intel.com ([10.54.75.128]) by fmsmga007.fm.intel.com with ESMTP; 27 Nov 2018 16:34:06 -0800 From: Rick Edgecombe To: akpm@linux-foundation.org, luto@kernel.org, will.deacon@arm.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-hardening@lists.openwall.com, naveen.n.rao@linux.vnet.ibm.com, anil.s.keshavamurthy@intel.com, davem@davemloft.net, mhiramat@kernel.org, rostedt@goodmis.org, mingo@redhat.com, ast@kernel.org, daniel@iogearbox.net, jeyu@kernel.org, netdev@vger.kernel.org, ard.biesheuvel@linaro.org, jannh@google.com Cc: kristen@linux.intel.com, dave.hansen@intel.com, deneen.t.dock@intel.com, Rick Edgecombe Subject: [PATCH 1/2] vmalloc: New flag for flush before releasing pages Date: Tue, 27 Nov 2018 16:07:53 -0800 Message-Id: <20181128000754.18056-2-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181128000754.18056-1-rick.p.edgecombe@intel.com> References: <20181128000754.18056-1-rick.p.edgecombe@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since vfree will lazily flush the TLB, but not lazily free the underlying pages, it often leaves stale TLB entries to freed pages that could get re-used. This is undesirable for cases where the memory being freed has special permissions such as executable. Having callers flush the TLB after calling vfree still leaves a window where the pages are freed, but the TLB entry remains. Also the entire operation can be deferred if the vfree is called from an interrupt and so a TLB flush after calling vfree would miss the entire operation. So in order to support this use case, a new flag VM_IMMEDIATE_UNMAP is added, that will cause the free operation to take place like this: 1. Unmap 2. Flush TLB/Unmap aliases 3. Free pages In the deferred case these steps are all done by the work queue. This implementation derives from two sketches from Dave Hansen and Andy Lutomirski. Suggested-by: Dave Hansen Suggested-by: Andy Lutomirski Suggested-by: Will Deacon Signed-off-by: Rick Edgecombe --- include/linux/vmalloc.h | 1 + mm/vmalloc.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 398e9c95cd61..cca6b6b83cf0 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -21,6 +21,7 @@ struct notifier_block; /* in notifier.h */ #define VM_UNINITIALIZED 0x00000020 /* vm_struct is not fully initialized */ #define VM_NO_GUARD 0x00000040 /* don't add guard page */ #define VM_KASAN 0x00000080 /* has allocated kasan shadow memory */ +#define VM_IMMEDIATE_UNMAP 0x00000200 /* flush before releasing pages */ /* bits [20..32] reserved for arch specific ioremap internals */ /* diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 97d4b25d0373..68766651b5a7 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -1516,6 +1516,14 @@ static void __vunmap(const void *addr, int deallocate_pages) debug_check_no_obj_freed(area->addr, get_vm_area_size(area)); remove_vm_area(addr); + + /* + * Need to flush the TLB before freeing pages in the case of this flag. + * As long as that's happening, unmap aliases. + */ + if (area->flags & VM_IMMEDIATE_UNMAP) + vm_unmap_aliases(); + if (deallocate_pages) { int i; @@ -1925,8 +1933,9 @@ EXPORT_SYMBOL(vzalloc_node); void *vmalloc_exec(unsigned long size) { - return __vmalloc_node(size, 1, GFP_KERNEL, PAGE_KERNEL_EXEC, - NUMA_NO_NODE, __builtin_return_address(0)); + return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, + GFP_KERNEL, PAGE_KERNEL_EXEC, VM_IMMEDIATE_UNMAP, + NUMA_NO_NODE, __builtin_return_address(0)); } #if defined(CONFIG_64BIT) && defined(CONFIG_ZONE_DMA32) -- 2.17.1