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 X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 802B0C4361B for ; Mon, 7 Dec 2020 11:35:01 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id F2EB723340 for ; Mon, 7 Dec 2020 11:35:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F2EB723340 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 7D5AA8D0016; Mon, 7 Dec 2020 06:35:00 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7AC798D0001; Mon, 7 Dec 2020 06:35:00 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 69B828D0016; Mon, 7 Dec 2020 06:35:00 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0135.hostedemail.com [216.40.44.135]) by kanga.kvack.org (Postfix) with ESMTP id 551BA8D0001 for ; Mon, 7 Dec 2020 06:35:00 -0500 (EST) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 20BE5824999B for ; Mon, 7 Dec 2020 11:35:00 +0000 (UTC) X-FDA: 77566279560.28.pen00_53168ad273de Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin28.hostedemail.com (Postfix) with ESMTP id EE2776D64 for ; Mon, 7 Dec 2020 11:34:59 +0000 (UTC) X-HE-Tag: pen00_53168ad273de X-Filterd-Recvd-Size: 7864 Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by imf41.hostedemail.com (Postfix) with ESMTP for ; Mon, 7 Dec 2020 11:34:59 +0000 (UTC) Received: by mail-pf1-f193.google.com with SMTP id t8so9608587pfg.8 for ; Mon, 07 Dec 2020 03:34:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3Q5MS2UXjUQqUjTpuPXnY5Lc/xhe4Tibwul6rnRwWL4=; b=nW7tHnXavpC5taczb2SrIKzWwWUMvoY4U2MTkN3vDPPis+BUGXKaGqPDCsIxEfquXK 6tmf6cEkdZTLCJdDXSh6MnNQCPBTV6kFB9HnhWkc91ozY0AAtLOOKkEMOqDBzYi4fqmn vakqjy46p1cUwbWXP/xi7QIAw9YzTSRnmgmnJrHoKXeAFo3V1L5iM3PHOBMX46KN5v3Z 34HgCx9eDmAlKhggnpFYM8ACTmm6p267BNhSJCIFO9+Der0ooC1Q9+xIQNrzo5WPJwHE 9owlGXBvga1yQ91B0OHtPxgNUCzR6oEuiJ6+Tvv4ZAklNhM3orxx6h4kzT/nmxGA3nGL lpuQ== 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=3Q5MS2UXjUQqUjTpuPXnY5Lc/xhe4Tibwul6rnRwWL4=; b=f7spxUudkbXvHZZJBiDcD04rKe+kqCwWtd8ciGqjhxnM0LMeTO4UNiZONlfAwViwnu DuspnQ9A0VXzMCmgr4ljZaU5Jr06DHI5doXGXAc1cBICKG52vcjGrSGcx8bNHUCwcOOZ ji/EitWXkfSGvyTVNq15R/H5P1tj9HtmmgIkAYs6X3ZrUoINGEyEJ+CPq4Kzthdkm4V2 76aZ1ETUZYYBUYWmf8spYHp9l20Dc9QZXXOcIH5+8AwisRT1Qk+2Ky69N4ZvGnXznXOp IM1ttBg2lju7yBNq2Fc3EzN0If/QUcBhuZv35/2nUwdcB7dqTMMW+ENECj4CRHu9GhL9 VTtA== X-Gm-Message-State: AOAM5319rGlzJSYH7CLSMDiq5UMcM5mGZEVBlGOUjMlEFZYp80GrzpDh GoxxOZcHDGHnBOwjup8GCvNBSdY4NDI= X-Google-Smtp-Source: ABdhPJzvNvnKPK0JB4i5KGpQCvE8rYhnqcuhj31K/F7yMqFfiJ9DwwOo6y8xk/RvjaqCiew/ogf9Kg== X-Received: by 2002:a62:9205:0:b029:19d:bab0:ba17 with SMTP id o5-20020a6292050000b029019dbab0ba17mr15435970pfd.37.1607340898388; Mon, 07 Dec 2020 03:34:58 -0800 (PST) Received: from localhost.localdomain ([203.205.141.39]) by smtp.gmail.com with ESMTPSA id d4sm14219822pfo.127.2020.12.07.03.34.54 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Dec 2020 03:34:57 -0800 (PST) From: yulei.kernel@gmail.com X-Google-Original-From: yuleixzhang@tencent.com To: linux-mm@kvack.org, akpm@linux-foundation.org, linux-fsdevel@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, naoya.horiguchi@nec.com, viro@zeniv.linux.org.uk, pbonzini@redhat.com Cc: joao.m.martins@oracle.com, rdunlap@infradead.org, sean.j.christopherson@intel.com, xiaoguangrong.eric@gmail.com, kernellwp@gmail.com, lihaiwei.kernel@gmail.com, Yulei Zhang , Chen Zhuo Subject: [RFC V2 23/37] kvm, x86: introduce VM_DMEM for syscall support usage Date: Mon, 7 Dec 2020 19:31:16 +0800 Message-Id: X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: From: Yulei Zhang Currently dmemfs do not support memory readonly, so change_protection() will be disabled for dmemfs vma. Since vma->vm_flags could be changed to new flag in mprotect_fixup(), so we introduce a new vma flag VM_DMEM and check this flag in mprotect_fixup() to avoid changing vma->vm_flags. We also check it in vma_to_resize() to disable mremap() for dmemfs vma. Signed-off-by: Chen Zhuo Signed-off-by: Yulei Zhang --- fs/dmemfs/inode.c | 2 +- include/linux/mm.h | 7 +++++++ mm/gup.c | 7 +++++-- mm/mincore.c | 8 ++++++-- mm/mprotect.c | 5 ++++- mm/mremap.c | 3 +++ 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/fs/dmemfs/inode.c b/fs/dmemfs/inode.c index ab6a492..b165bd3 100644 --- a/fs/dmemfs/inode.c +++ b/fs/dmemfs/inode.c @@ -507,7 +507,7 @@ int dmemfs_file_mmap(struct file *file, struct vm_are= a_struct *vma) if (!(vma->vm_flags & VM_SHARED)) return -EINVAL; =20 - vma->vm_flags |=3D VM_PFNMAP; + vma->vm_flags |=3D VM_PFNMAP | VM_DMEM | VM_IO; =20 file_accessed(file); vma->vm_ops =3D &dmemfs_vm_ops; diff --git a/include/linux/mm.h b/include/linux/mm.h index db6ae4d..2f3135fe 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -311,6 +311,8 @@ int overcommit_policy_handler(struct ctl_table *, int= , void *, size_t *, #define VM_HIGH_ARCH_4 BIT(VM_HIGH_ARCH_BIT_4) #endif /* CONFIG_ARCH_USES_HIGH_VMA_FLAGS */ =20 +#define VM_DMEM BIT(38) /* Dmem page VM */ + #ifdef CONFIG_ARCH_HAS_PKEYS # define VM_PKEY_SHIFT VM_HIGH_ARCH_BIT_0 # define VM_PKEY_BIT0 VM_HIGH_ARCH_0 /* A protection key is a 4-bit valu= e */ @@ -666,6 +668,11 @@ static inline bool vma_is_accessible(struct vm_area_= struct *vma) return vma->vm_flags & VM_ACCESS_FLAGS; } =20 +static inline bool vma_is_dmem(struct vm_area_struct *vma) +{ + return !!(vma->vm_flags & VM_DMEM); +} + #ifdef CONFIG_SHMEM /* * The vma_is_shmem is not inline because it is used only by slow diff --git a/mm/gup.c b/mm/gup.c index 47c8197..0ea9071 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -492,8 +492,11 @@ static struct page *follow_page_pte(struct vm_area_s= truct *vma, goto no_page; } else if (unlikely(!page)) { if (flags & FOLL_DUMP) { - /* Avoid special (like zero) pages in core dumps */ - page =3D ERR_PTR(-EFAULT); + if (vma_is_dmem(vma)) + page =3D ERR_PTR(-EEXIST); + else + /* Avoid special (like zero) pages in core dumps */ + page =3D ERR_PTR(-EFAULT); goto out; } =20 diff --git a/mm/mincore.c b/mm/mincore.c index 02db1a8..f8d10e4 100644 --- a/mm/mincore.c +++ b/mm/mincore.c @@ -78,8 +78,12 @@ static int __mincore_unmapped_range(unsigned long addr= , unsigned long end, pgoff_t pgoff; =20 pgoff =3D linear_page_index(vma, addr); - for (i =3D 0; i < nr; i++, pgoff++) - vec[i] =3D mincore_page(vma->vm_file->f_mapping, pgoff); + for (i =3D 0; i < nr; i++, pgoff++) { + if (vma_is_dmem(vma)) + vec[i] =3D 1; + else + vec[i] =3D mincore_page(vma->vm_file->f_mapping, pgoff); + } } else { for (i =3D 0; i < nr; i++) vec[i] =3D 0; diff --git a/mm/mprotect.c b/mm/mprotect.c index 56c02be..b1650b5 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -236,7 +236,7 @@ static inline unsigned long change_pmd_range(struct v= m_area_struct *vma, * for all the checks. */ if (!is_swap_pmd(*pmd) && !pmd_devmap(*pmd) && - pmd_none_or_clear_bad_unless_trans_huge(pmd)) + pmd_none_or_clear_bad_unless_trans_huge(pmd) && !pmd_special(*pmd= )) goto next; =20 /* invoke the mmu notifier if the pmd is populated */ @@ -412,6 +412,9 @@ static int prot_none_test(unsigned long addr, unsigne= d long next, return 0; } =20 + if (vma_is_dmem(vma)) + return -EINVAL; + /* * Do PROT_NONE PFN permission checks here when we can still * bail out without undoing a lot of state. This is a rather diff --git a/mm/mremap.c b/mm/mremap.c index 138abba..598e681 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -482,6 +482,9 @@ static struct vm_area_struct *vma_to_resize(unsigned = long addr, if (!vma || vma->vm_start > addr) return ERR_PTR(-EFAULT); =20 + if (vma_is_dmem(vma)) + return ERR_PTR(-EINVAL); + /* * !old_len is a special case where an attempt is made to 'duplicate' * a mapping. This makes no sense for private mappings as it will --=20 1.8.3.1