From nobody Sat Feb 7 08:14:00 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BE70EC433EF for ; Thu, 10 Mar 2022 14:10:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242768AbiCJOLc (ORCPT ); Thu, 10 Mar 2022 09:11:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49200 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242737AbiCJOLK (ORCPT ); Thu, 10 Mar 2022 09:11:10 -0500 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D66E68F637; Thu, 10 Mar 2022 06:10:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1646921408; x=1678457408; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=s3KeBsvI7L7pbUPmXrVsTjDsdOJOMmhGXQWiylgk8+Q=; b=Tyo/fwpvW4j2fqABwXK8nR0supuYn55ZCaw6lMNcrUJ//0q8eMGoDpiS l5+DsVjkv8kBNzuirDO2SeaxKfYXldV17NwY9hpU3sG6uzgCBUvG3cGWZ h9fxIX8qh6xqZ2ej/cCZ+AxKxMWoeqQmX9Uv6HuPT+FkVaVMdlf9APVsJ GGVUTzuKjWaOWA15vKy/+Xg+Eptb0N/Oi75WXYObe+zi+wfDgZ1fLDkkf to7zEWJzW/jQHggGunowEwrkai/ii15KqXTH7irLWcf9X2HJzlg1oGzt4 w/Hp4ZWCpzE4Zs964bqxLCoIkbsd496wjqUJwXd40Q+U9Xd6n6678relI w==; X-IronPort-AV: E=McAfee;i="6200,9189,10281"; a="254084871" X-IronPort-AV: E=Sophos;i="5.90,170,1643702400"; d="scan'208";a="254084871" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Mar 2022 06:10:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,170,1643702400"; d="scan'208";a="554654936" Received: from chaop.bj.intel.com ([10.240.192.101]) by orsmga008.jf.intel.com with ESMTP; 10 Mar 2022 06:10:00 -0800 From: Chao Peng To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, qemu-devel@nongnu.org Cc: Paolo Bonzini , Jonathan Corbet , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Thomas Gleixner , Ingo Molnar , Borislav Petkov , x86@kernel.org, "H . Peter Anvin" , Hugh Dickins , Jeff Layton , "J . Bruce Fields" , Andrew Morton , Mike Rapoport , Steven Price , "Maciej S . Szmigiero" , Vlastimil Babka , Vishal Annapurve , Yu Zhang , Chao Peng , "Kirill A . Shutemov" , luto@kernel.org, jun.nakajima@intel.com, dave.hansen@intel.com, ak@linux.intel.com, david@redhat.com Subject: [PATCH v5 04/13] mm/shmem: Restrict MFD_INACCESSIBLE memory against RLIMIT_MEMLOCK Date: Thu, 10 Mar 2022 22:09:02 +0800 Message-Id: <20220310140911.50924-5-chao.p.peng@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220310140911.50924-1-chao.p.peng@linux.intel.com> References: <20220310140911.50924-1-chao.p.peng@linux.intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Since page migration / swapping is not supported yet, MFD_INACCESSIBLE memory behave like longterm pinned pages and thus should be accounted to mm->pinned_vm and be restricted by RLIMIT_MEMLOCK. Signed-off-by: Chao Peng --- mm/shmem.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/mm/shmem.c b/mm/shmem.c index 7b43e274c9a2..ae46fb96494b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -915,14 +915,17 @@ static void notify_fallocate(struct inode *inode, pgo= ff_t start, pgoff_t end) static void notify_invalidate_page(struct inode *inode, struct folio *foli= o, pgoff_t start, pgoff_t end) { -#ifdef CONFIG_MEMFILE_NOTIFIER struct shmem_inode_info *info =3D SHMEM_I(inode); =20 +#ifdef CONFIG_MEMFILE_NOTIFIER start =3D max(start, folio->index); end =3D min(end, folio->index + folio_nr_pages(folio)); =20 memfile_notifier_invalidate(&info->memfile_notifiers, start, end); #endif + + if (info->xflags & SHM_F_INACCESSIBLE) + atomic64_sub(end - start, ¤t->mm->pinned_vm); } =20 /* @@ -2680,6 +2683,20 @@ static loff_t shmem_file_llseek(struct file *file, l= off_t offset, int whence) return offset; } =20 +static bool memlock_limited(unsigned long npages) +{ + unsigned long lock_limit; + unsigned long pinned; + + lock_limit =3D rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; + pinned =3D atomic64_add_return(npages, ¤t->mm->pinned_vm); + if (pinned > lock_limit && !capable(CAP_IPC_LOCK)) { + atomic64_sub(npages, ¤t->mm->pinned_vm); + return true; + } + return false; +} + static long shmem_fallocate(struct file *file, int mode, loff_t offset, loff_t len) { @@ -2753,6 +2770,12 @@ static long shmem_fallocate(struct file *file, int m= ode, loff_t offset, goto out; } =20 + if ((info->xflags & SHM_F_INACCESSIBLE) && + memlock_limited(end - start)) { + error =3D -ENOMEM; + goto out; + } + shmem_falloc.waitq =3D NULL; shmem_falloc.start =3D start; shmem_falloc.next =3D start; --=20 2.17.1