From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9DD3CC4829E for ; Thu, 15 Feb 2024 23:14:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 286D36B008C; Thu, 15 Feb 2024 18:14:47 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 210C96B008A; Thu, 15 Feb 2024 18:14:47 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E6A566B0098; Thu, 15 Feb 2024 18:14:46 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id C3EDC6B0092 for ; Thu, 15 Feb 2024 18:14:46 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id A0CD28097F for ; Thu, 15 Feb 2024 23:14:46 +0000 (UTC) X-FDA: 81795594972.26.A27C81D Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.21]) by imf06.hostedemail.com (Postfix) with ESMTP id 7DE82180009 for ; Thu, 15 Feb 2024 23:14:44 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=MwAOkfEU; spf=pass (imf06.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 198.175.65.21 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1708038884; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=eepGtBS7D3bO89xNOPfpfUsP1AAKKSi19IceRmMHNEc=; b=mZREkw2HPtngiRVLJrwxc91L/hu/cAblQYEnMu/oiOOnPLl6oCtFfkzx/H2PrK9UizVB+C yX82J7BeDFcFIebPCeXnl3kvpINJTbZThYpxk45UpYGnnvolry2AO+xJXcxx6bXCQbPWTw nPeBZEsH9zSSBrONIgx2ZECoRlz0hhk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1708038884; a=rsa-sha256; cv=none; b=fVevAyCcNJqJMGfCJEpINQV014eO9W7GugyrrajcJEl1lr2F9Sw8JQngyKRqYeSKFq/bWo LohJ/QalQajWbvcaBg2db612tk9U9YDT5zA7E+zIqfQYwXMnkzi3EYc5f60lnwqFiU61p2 v5OIFp7YaQA6iowbit2SM/1rH5PPYiw= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=MwAOkfEU; spf=pass (imf06.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 198.175.65.21 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com; dmarc=pass (policy=none) header.from=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708038885; x=1739574885; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=VO9DQY6lGtiG1eC5gi6w3K4FE6tMMi6+Q5ti33XNprc=; b=MwAOkfEU3MSNIrYf3wDj1WECyeOxkbFR4I8LE2qXwp74w1g1yqToULZ6 whMtMVN8Us/CTtDJcjJTmIz1uspWZvJ0Gsz1HbahbYT9I5OVVe0x8feer cpCDaLz1Zj8P6AT6+BSbkrfm+h6Buiw2tzL6ydUpkq0etjcsvMAPW1tbb W4zoURgAZWKZfx1jXdnNqnMGuidwCeWAIHountMXVUW+7fQGRyK74y6O7 /E9n2PhlZhNjv/7SPI6eagYz7G90iSLWmjrErJpDstl6dVgCTZ/xQNGeG X8rgdL8sa8n5eI9VGWJvw6AMqsT6XN6sGBxVaaHNuWhjsS+/M7rBxtwMw w==; X-IronPort-AV: E=McAfee;i="6600,9927,10985"; a="2066375" X-IronPort-AV: E=Sophos;i="6.06,162,1705392000"; d="scan'208";a="2066375" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orvoesa113.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Feb 2024 15:14:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10985"; a="912250203" X-IronPort-AV: E=Sophos;i="6.06,162,1705392000"; d="scan'208";a="912250203" Received: from yshin-mobl1.amr.corp.intel.com (HELO rpedgeco-desk4.intel.com) ([10.209.95.133]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Feb 2024 15:14:41 -0800 From: Rick Edgecombe To: Liam.Howlett@oracle.com, akpm@linux-foundation.org, debug@rivosinc.com, broonie@kernel.org, kirill.shutemov@linux.intel.com, keescook@chromium.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, luto@kernel.org, peterz@infradead.org, hpa@zytor.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: rick.p.edgecombe@intel.com Subject: [RFC PATCH 6/8] x86/mm: Implement HAVE_ARCH_UNMAPPED_AREA_VMFLAGS Date: Thu, 15 Feb 2024 15:13:30 -0800 Message-Id: <20240215231332.1556787-7-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240215231332.1556787-1-rick.p.edgecombe@intel.com> References: <20240215231332.1556787-1-rick.p.edgecombe@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 7DE82180009 X-Rspam-User: X-Stat-Signature: 9wjrc3tk4egmadqk7x1a85ynmz1kpwk4 X-Rspamd-Server: rspam03 X-HE-Tag: 1708038884-518179 X-HE-Meta: U2FsdGVkX1/gfQuLatR44mi/Fk5yq8AUk4YbN10cKLHA9uLNe80QSjdo4jsF2I1TcbhvEJBLwp5N5OVQ03aRUMg1XyZGP3pozdBwXGdKq7m7HXk1VzXTyZbVZqIvsrLo3h/RwozmAau4ueeUkoJeNHt6uvNYA8haeUpX5r85Or5j9CvyU2CBfC731b4XX5qEGZI3ca4EFuCaIOwC6X7Wpinp+1Pl8BWJeaECS7dRS3NpoOPhjZPMt+nnb2ydFyJt2+SdYzmyDRJSICVnTsq9Ma+JorJ/W5nEr3ZLHVXdPPWYNaHczJh4HBHqjcsTE4htWOgdj+FaYhVS0MfgfkHjIwWbtdDkb5zxrfrWQlXo2Hsbom3115kdpf9yswxgglaxBqSaAjH6BtE/jk74dfJShH9AKgM8wU3k9LtbL7G1RQaaFlTf5B/bLYBaMp2oCCJqLSo+GCE0EtwQ3Dp6OKVMDyC4elnP7l2oeHGQy2JfUULo9vfON0lxnDHV56i1RZ4nWJXtJNRIbRfF1+aZdrfqs3y+7Fsn//I4Lerr2yPbKQQFvTcL1nqSpJL3VrS6gIJ1V/oIRXsegtn2wxkDEh8OF7ozKG8bveGoEdwuuXk8uicje0VJ+V1Pst4xtVDyn+RJJesq2seFSEi0MjTjL37GB07kupR8c5E/IDWD9NTjCc7Zln0dyZ8M6Lox+F8r/xSqjLxAFRYYQOYRAK69+WOJiwbtLuviuoqQvBS8JU+yhTw8ebSC7OAb0baVfpkMe1ifLrv0h18j61JUW4e6/3EWyjA6/8ha2VKthZk5ZXgi8/T7Uw0Bi+i+RvLOFoBX6CQTX7vWbSlUFT7iQ/1fADyjjrDwzMVJBvBKflwwV+qzMvxowPc+b4XhA+X5i+gc3UtPFDn1jXChmfzNgPdrdcOT86rbyQXh2oebrYK1fhOrQMhHOZ6ikt4u07Upsu7D4ynbyInMqQtiWaJr1xw7cv9 CMpCzCU8 9zd/jt2tWCXT+FXcc3o54S7eGhuZQxt08Ldjx7i9SwAN2mczCflaSz8G3IGn6EnJOp3N80/MH3RiHZkm7DwD5ZLsaB4EYUkS9t7eiii23n+e5in2lP0cjfCg8E8tNsHtFlAKUQk/CNzwliaY0+zT+t84bUNMAQ5Cgg/1RwG0xw1GtE+ZreMzSIgLbT8WZYBbdJQ1ILawDZtQ0x5H4+sAIZn9nVA== 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: List-Subscribe: List-Unsubscribe: When memory is being placed, mmap() will take care to respect the guard gaps of certain types of memory (VM_SHADOWSTACK, VM_GROWSUP and VM_GROWSDOWN). In order to ensure guard gaps between mappings, mmap() needs to consider two things: 1. That the new mapping isn’t placed in an any existing mappings guard gaps. 2. That the new mapping isn’t placed such that any existing mappings are not in *its* guard gaps. The long standing behavior of mmap() is to ensure 1, but not take any care around 2. So for example, if there is a PAGE_SIZE free area, and a mmap() with a PAGE_SIZE size, and a type that has a guard gap is being placed, mmap() may place the shadow stack in the PAGE_SIZE free area. Then the mapping that is supposed to have a guard gap will not have a gap to the adjacent VMA. Add x86 arch implementations of arch_get_unmapped_area_vmflags/_topdown() so future changes can allow the the guard gap of type of vma being placed to be taken into account. This will be used for shadow stack memory. Signed-off-by: Rick Edgecombe --- arch/x86/include/asm/pgtable_64.h | 1 + arch/x86/kernel/sys_x86_64.c | 29 ++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index a629b1b9f65a..eb09a11621ad 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h @@ -244,6 +244,7 @@ extern void cleanup_highmap(void); #define HAVE_ARCH_UNMAPPED_AREA #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN +#define HAVE_ARCH_UNMAPPED_AREA_VMFLAGS #define PAGE_AGP PAGE_KERNEL_NOCACHE #define HAVE_PAGE_AGP 1 diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index c783aeb37dce..f92780cf9662 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c @@ -119,9 +119,9 @@ static void find_start_end(unsigned long addr, unsigned long flags, *end = task_size_64bit(addr > DEFAULT_MAP_WINDOW); } -unsigned long -arch_get_unmapped_area(struct file *filp, unsigned long addr, - unsigned long len, unsigned long pgoff, unsigned long flags) +extern unsigned long +arch_get_unmapped_area_vmflags(struct file *filp, unsigned long addr, unsigned long len, + unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags) { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; @@ -157,10 +157,10 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, return vm_unmapped_area(&info); } -unsigned long -arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, - const unsigned long len, const unsigned long pgoff, - const unsigned long flags) +extern unsigned long +arch_get_unmapped_area_topdown_vmflags(struct file *filp, unsigned long addr0, + unsigned long len, unsigned long pgoff, + unsigned long flags, vm_flags_t vm_flags) { struct vm_area_struct *vma; struct mm_struct *mm = current->mm; @@ -230,3 +230,18 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, */ return arch_get_unmapped_area(filp, addr0, len, pgoff, flags); } + +unsigned long +arch_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, unsigned long flags) +{ + return arch_get_unmapped_area_vmflags(filp, addr, len, pgoff, flags, 0); +} + +unsigned long +arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr, + const unsigned long len, const unsigned long pgoff, + const unsigned long flags) +{ + return arch_get_unmapped_area_topdown_vmflags(filp, addr, len, pgoff, flags, 0); +} -- 2.34.1