Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp4663665pxu; Tue, 13 Oct 2020 04:18:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx0luYQLbTgNTs8BLW6u0MaZF5zh0i2zLJdP0ldt3Q/EEklaa7I8al23jl2f/pW6jRYAh5J X-Received: by 2002:a05:6402:176c:: with SMTP id da12mr19707567edb.28.1602587899505; Tue, 13 Oct 2020 04:18:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602587899; cv=none; d=google.com; s=arc-20160816; b=DITTVZv9erN4LUXRxv0KQTo5/NZJAcc+LInBSGZ1zqgFS7g5XxgKaNJiXoSCVLDxd+ CpvVeqHA6HL60CFKulsJmWgmNK5CfXCc39tJ7RWcBvh3ASEGMB9OhTPu2xRAYA3lUnzr 3v0CDsZD56dANHEqCT2MdDIu+b66ffcnJqQRpfig9ZtOkHAWEZYUQoeEnjvsPc5LD2Nb YS2nn9Df04dtmUbJzSyDm+2JSqtQSDW1klmRokDLwLAydnASOdgDxxIoqX7uECnVfkh7 CpEszyF+HqY1qBatxo1IO49yxTkRy+9GtGGuWbFLR/Wry6eHyN2ZvE5K9rvU4NBxxxfH 5Thw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=VQFsEpWuF4crrAFVUaO/CXC4VHrsA3+ZAZo85Yi/pU0=; b=Jb0XK8aUOK0ggdQwEWiUl2rAf4bZo+lh32qe5PE8T1ROWBqX+TpGV/wH0BZj5s+VYJ IelqxLTAHraH6Ffjuz2VZnhoERi1X+/APhXC+plpzOK2/W+/g5vfAbjtJed18EGufX3c KKgF5cGumzhKPdeJKcVh9tp8MVmsGY13Qnmj3f4PEZuZf23hO+xWj5sl4oOoVkjm9eZk ZnPs7M+i1RlEN52/U4JUkM9lpjK7ao58EAFDzQ5DtZt2xmYlT+Fx9FABAekiVsxOvUz7 jKLZgRBq/NJLcjsmx8gmJHz3Gdr5rHwUkj9pWCWIMgRCh9FUoGxg2XzyMDfC7TQGb9lL PcLg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=jh6Shp34; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=arista.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qk3si3582031ejb.700.2020.10.13.04.17.57; Tue, 13 Oct 2020 04:18:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@arista.com header.s=googlenew header.b=jh6Shp34; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=arista.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728301AbgJMBeb (ORCPT + 99 others); Mon, 12 Oct 2020 21:34:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728247AbgJMBeZ (ORCPT ); Mon, 12 Oct 2020 21:34:25 -0400 Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D223C0613D1 for ; Mon, 12 Oct 2020 18:34:25 -0700 (PDT) Received: by mail-wr1-x443.google.com with SMTP id n6so21536559wrm.13 for ; Mon, 12 Oct 2020 18:34:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=googlenew; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VQFsEpWuF4crrAFVUaO/CXC4VHrsA3+ZAZo85Yi/pU0=; b=jh6Shp34HrXFqwhbRrxN+YgzPDA8OoKF04HoFiyNjYZbVjAQaB03yWzpCRAqet1tBl qznQQVvt39gfc+rca19EffWNQulmC0gW4kOZ8oTyFIs115lHAaCkdHebfOmk4vwVJUR1 d2bQ9UoW57Nh9V9EzhGNzvekxXH9NTWdA1QVVsRmgMdO4ONwKofcPq8xEzaBF3S4R5jg jdusZLNIDiReYRlgKGWx6Z/UqIV8WzrGb6kyLnbpUec/Bapgh5SfttlYv6fPecZcoanq byDqDGINOzYslI8U3EIjdSphlS2zzm6PJPCEHPm660qZ4fQUqAT8u67Dx5YXCG+X9fLu uI9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VQFsEpWuF4crrAFVUaO/CXC4VHrsA3+ZAZo85Yi/pU0=; b=KavPrsngAfr/eGl/1S08HD9SBZOmSucdKFnlZP4HzyU4ak2WanH7ISeJa5GLefEwdJ XoGGDiPkRntgqgn4z6V/xvSc4+azK0buOjjtbl/x6esNvAE9UYztSGJxvE0xB0CAPjZx 54oGxsj96U2lSC7XgQJyxxFH/Hkqnyyuss24mmB4A+Vaad0lqijinEfkq3i4tr/a/Ogz rGEBHB+fLppVSw5JZinbnb4k6bxGpZNiGQQO3vrlhAwZDUkIORZjQ0VvFzu5OfI5KSWO 4cePJP3EA5sZ2emT3AWEdzEvDodfe13qKrZihAJEBU4RIP8pFBwKTuQuJXueyIDBw+us MoYw== X-Gm-Message-State: AOAM532Y1BDlKvdCB7QSji4RMZqZig8VBs/Qb2heXInji7Kfzh6/kWTX 6kaoEdLvmezGyzKl+ZCbpssR1ZOC3TNcWIBo X-Received: by 2002:adf:e881:: with SMTP id d1mr21447682wrm.395.1602552863641; Mon, 12 Oct 2020 18:34:23 -0700 (PDT) Received: from localhost.localdomain ([2a02:8084:e84:2480:228:f8ff:fe6f:83a8]) by smtp.gmail.com with ESMTPSA id d23sm24825325wmb.6.2020.10.12.18.34.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2020 18:34:23 -0700 (PDT) From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov <0x7f454c46@gmail.com>, Dmitry Safonov , Alexander Viro , Andrew Morton , Andy Lutomirski , Brian Geffon , Catalin Marinas , Dan Williams , Dave Jiang , Hugh Dickins , Ingo Molnar , "Kirill A. Shutemov" , Mike Kravetz , Minchan Kim , Russell King , Thomas Bogendoerfer , Thomas Gleixner , Vishal Verma , Vlastimil Babka , Will Deacon , linux-aio@kvack.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 3/6] mremap: Don't allow MREMAP_DONTUNMAP on special_mappings and aio Date: Tue, 13 Oct 2020 02:34:13 +0100 Message-Id: <20201013013416.390574-4-dima@arista.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201013013416.390574-1-dima@arista.com> References: <20201013013416.390574-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As kernel expect to see only one of such mappings, any further operations on the VMA-copy may be unexpected by the kernel. Maybe it's being on the safe side, but there doesn't seem to be any expected use-case for this, so restrict it now. Fixes: commit e346b3813067 ("mm/mremap: add MREMAP_DONTUNMAP to mremap()") Signed-off-by: Dmitry Safonov --- arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 2 +- fs/aio.c | 5 ++++- include/linux/mm.h | 2 +- mm/mmap.c | 6 +++++- mm/mremap.c | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c index 0daf2f1cf7a8..e916646adc69 100644 --- a/arch/x86/kernel/cpu/resctrl/pseudo_lock.c +++ b/arch/x86/kernel/cpu/resctrl/pseudo_lock.c @@ -1458,7 +1458,7 @@ static int pseudo_lock_dev_release(struct inode *inode, struct file *filp) return 0; } -static int pseudo_lock_dev_mremap(struct vm_area_struct *area) +static int pseudo_lock_dev_mremap(struct vm_area_struct *area, unsigned long flags) { /* Not supported */ return -EINVAL; diff --git a/fs/aio.c b/fs/aio.c index d5ec30385566..3be3c0f77548 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -324,13 +324,16 @@ static void aio_free_ring(struct kioctx *ctx) } } -static int aio_ring_mremap(struct vm_area_struct *vma) +static int aio_ring_mremap(struct vm_area_struct *vma, unsigned long flags) { struct file *file = vma->vm_file; struct mm_struct *mm = vma->vm_mm; struct kioctx_table *table; int i, res = -EINVAL; + if (flags & MREMAP_DONTUNMAP) + return -EINVAL; + spin_lock(&mm->ioctx_lock); rcu_read_lock(); table = rcu_dereference(mm->ioctx_table); diff --git a/include/linux/mm.h b/include/linux/mm.h index 16b799a0522c..fd51a4a1f722 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -550,7 +550,7 @@ struct vm_operations_struct { void (*open)(struct vm_area_struct * area); void (*close)(struct vm_area_struct * area); int (*split)(struct vm_area_struct * area, unsigned long addr); - int (*mremap)(struct vm_area_struct * area); + int (*mremap)(struct vm_area_struct *area, unsigned long flags); vm_fault_t (*fault)(struct vm_fault *vmf); vm_fault_t (*huge_fault)(struct vm_fault *vmf, enum page_entry_size pe_size); diff --git a/mm/mmap.c b/mm/mmap.c index bdd19f5b994e..50f853b0ec39 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -3372,10 +3372,14 @@ static const char *special_mapping_name(struct vm_area_struct *vma) return ((struct vm_special_mapping *)vma->vm_private_data)->name; } -static int special_mapping_mremap(struct vm_area_struct *new_vma) +static int special_mapping_mremap(struct vm_area_struct *new_vma, + unsigned long flags) { struct vm_special_mapping *sm = new_vma->vm_private_data; + if (flags & MREMAP_DONTUNMAP) + return -EINVAL; + if (WARN_ON_ONCE(current->mm != new_vma->vm_mm)) return -EFAULT; diff --git a/mm/mremap.c b/mm/mremap.c index c248f9a52125..898e9818ba6d 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -384,7 +384,7 @@ static unsigned long move_vma(struct vm_area_struct *vma, if (moved_len < old_len) { err = -ENOMEM; } else if (vma->vm_ops && vma->vm_ops->mremap) { - err = vma->vm_ops->mremap(new_vma); + err = vma->vm_ops->mremap(new_vma, flags); } if (unlikely(err)) { -- 2.28.0