From patchwork Wed Oct 11 17:04:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 13417647 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 C8554CDB467 for ; Wed, 11 Oct 2023 17:04:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 69A0B8D0111; Wed, 11 Oct 2023 13:04:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 64C268D0050; Wed, 11 Oct 2023 13:04:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4C2A78D0111; Wed, 11 Oct 2023 13:04:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 37F548D0050 for ; Wed, 11 Oct 2023 13:04:44 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id DBA9F140148 for ; Wed, 11 Oct 2023 17:04:43 +0000 (UTC) X-FDA: 81333804846.03.2E6A92C Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by imf20.hostedemail.com (Postfix) with ESMTP id E8C9B1C0017 for ; Wed, 11 Oct 2023 17:04:41 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="m0AeNt/H"; spf=pass (imf20.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.45 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1697043882; a=rsa-sha256; cv=none; b=s5SNA5ccGKWitNkArPM6hKPEwphr5bV/gUrpXFbM9qzyA0PXE6CwF77bIsmBde5ix41R+d Iwj/IuadKdWeb9o8g+I3yUH3rcIqdZsVKjpQLWWs091eImevvg+VbHiGSJy6uawLK0h3vA FqrGV07Ok6NMw0ncJazLFmVfMmY6840= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="m0AeNt/H"; spf=pass (imf20.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.45 as permitted sender) smtp.mailfrom=lstoakes@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1697043882; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=BbhnCY2fikQ1AinIqQxLBb8QCAx728H2FEqV7zZ9MYo=; b=ctsIvukNUVYLjYgsl49NpLNEX0bFgN7Ovj72FHGM0cnxHVAwxXaSJA/glkdc7P9hRLfmq6 YTLju1HnyKmq/EElKKhe3YWl0DNL0AmeN0yH13A8EIY6qpabPLnP8Erh6X41jB+VYQp42X iptLHWSBIFT0GcNe406buXpBJnGfkKc= Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3226cc3e324so20732f8f.3 for ; Wed, 11 Oct 2023 10:04:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697043880; x=1697648680; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BbhnCY2fikQ1AinIqQxLBb8QCAx728H2FEqV7zZ9MYo=; b=m0AeNt/Hv0NziLo9vaXeXZUQW575rJoPEKmTU3lipO7nOgvqXv+m1gO7OKJmpmKNth oKvQQU/TprFV+4UHA8DcrIX+tjWuGJOugeA+LFhaGd/N/ixVN38NiQpmmQ8re4YlWIEX Ztar7rUPJJ2R/x7xESKntPO+4kPb/8OBGwGWfan4duxYT/zDps0U/Vr0xZ7pwoG7Tfpc 6mHWnqXkBZZAz/KCiJaXChv8QwHuhop0DQL5QQ/JJFoyDVY0Ba2G6+LA2Fg0CCIadqoh Iu5ZQSE/ZNQeeiScguSgdboNIfA5Dq6cHH2bDuxB+NeBY58EikDxDpr2NqNUcN5yH94j r/HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697043880; x=1697648680; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BbhnCY2fikQ1AinIqQxLBb8QCAx728H2FEqV7zZ9MYo=; b=pnfWGgIUYquJkS0BJGwymGmdR7LOvoCIhbGmHb5oCMezRROx+GrLyq6+jcfTkhCCbb a1SswHxakagiuziqirV7x0wv1xgoqjyktDNPwLSSsI96qUqTYPfl5xCP7JzVnHjrUlXr rrDHSA5Ra+ysv/fKJO3uMWIcSFzMn+UL93Jv4dTWRHcJDKOFKHOk41V7ViquJZNdQbDY mXm6EroYBiwz6dsznu0t09WAkKDN+HNiwiDi6ne3HkKwGJ7RGcCemDhrR7fH3QqvIFHM GFdbEtuRYkuZEcVE64N0pPOs+AchalEMAq33BQ4kGOVu4Zbfa5W34DHIEUUGnLrkRePj aBvQ== X-Gm-Message-State: AOJu0Yxr9BInrQEpY6VLERduwrgUe8OYw320VeIgDhydDsVRDLwzMJ5t hxcYLpezI/t5lFdmhMhSMML5m/dvPls= X-Google-Smtp-Source: AGHT+IEZR2imRCe8uWt+o6P/wYTRJDWFEcZxMj9hpzpBcSeF+EKooItwoY41EIhLesMznrp4x8QUKQ== X-Received: by 2002:a5d:62c6:0:b0:31f:d52a:82b3 with SMTP id o6-20020a5d62c6000000b0031fd52a82b3mr17821191wrv.46.1697043880104; Wed, 11 Oct 2023 10:04:40 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id y19-20020a05600c20d300b004075b3ce03asm3834495wmm.6.2023.10.11.10.04.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Oct 2023 10:04:39 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton , Alexander Viro , Christian Brauner Cc: "=Liam R . Howlett" , Vlastimil Babka , linux-fsdevel@vger.kernel.org, Lorenzo Stoakes Subject: [PATCH v4 4/5] mm: abstract merge for new VMAs into vma_merge_new_vma() Date: Wed, 11 Oct 2023 18:04:30 +0100 Message-ID: <3dc71d17e307756a54781d4a4ce7315cf8b18bea.1697043508.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: E8C9B1C0017 X-Stat-Signature: tb1knu5mjsxz7niu6pidt1gyspfqoefd X-Rspam-User: X-HE-Tag: 1697043881-738908 X-HE-Meta: U2FsdGVkX19aOUo1t/9s+DeOw9ifbUARyVF7aY0+Be9BmovUFwE4JrrcH2j/xLbFPqCbzt/Li+xv1Oc+1ZZXGGnTb6g5SvuT9IJFfiTx2iMw18ujb2YeX/fxn8AUX/kiumgVS1fR9L3fdDHw4u9tAUJNnb3vuYPJx+ZxBzVMYfsBiUVsGb7a4J4elNI1hgimxhvdUiBehaeu5cwPnYimLmV2JjtMMnBTUXMrJLRJtOEDw93VKECktZZD764Pf4GxveaQaoyViXLK7xdVmJdlhMZpm1+QN8Z7DttwQXuFZEUz1ccBtHucl36xNmyee3ApunP319zJUJLN04LJ29dHYs4GzJUbxCXd+5Kke4Bkrd3LRWrHh27py41Tlo8qxy+bdwYHddWETS7M37fV7aCeuck1oJvr6KsmDEQT24f/89yJM9k/h3hMZjAR4qChDAlMDB8dzb7k3ZxzkHvRt/PGsPRAcixRQFe3QA4R7ZWKg4N/3cib0S30Nc/kNNHV2mExx3eWYsxSGhyodqxRS9uMAL3pRnZdelMAWnxU7YbS8ersLS7vyHQ728dghMw6bzSyvVKAgJDHCoG6ORPYW+6exUNLv0knf2uJbhQIkVeiZJukO2AWLM7+bHKek/w1zK6f0BSMZE+n5arr2GRF6GgIVbcvPIJYtn53IJE1lwgFREKUyuBawdcRS0TgiSRSRLQZcrgR4KaYHZL0YAF3uklj7w/RhVVAC5caAibKdIr8IXJA7tNa2l1wL8K4OJUtOZm3hcaFyQ6oCAqg1KGrIUk1z39tUyB37MIHJGhAtCXpDtU+HvoX6ZoxDZnLg+LokcRI9EHHfdQrBjXoDm9+I27dzI58Y+8FXfwgx//MoAgG2UTv/w6gd7juXLNCJHnk3aLvZPvrv7gHzsYU7bellon7B0rmvaxVn8whSakoIEAOt5CqoQrJ/ywGM7MUX6ZRSajVXTQKB2ZFeG09MM9jDq8 9T6UEKyF 8pEwPKv2qU3D3fOTVSM5UedK9E54xA2sRNLw6aCn7EmAop90k5Ask00nYPOVr5S1THhdzxeghS41T7d1wH0WxWKnITXsYVs9w998jrdjWdQH4UeW94OzZJ2E+HW2N8xY2qGBpD88FcPNR8AG4JYqhArJfqhQmds2a2Az8GxMIEntDRT6WQvQ4BqWB6E2+opDWy+Cjqpl7Y5at+coKUY5W0var6yDzzAjH5fHDZnM7ADx4IhzBW3FtQUzEwGmmEa+jZ1FLL2sLX3Rq5rfAw9g38YFGegaOmEOG/q4ZatKUwSnuCyczAgxy3AHuEwwpE4azxNQGO3LFteVgh1xLClmkzwB4AL+VZArNYbUJuVyTETJjZBX4EP48a31ErxN7/f/2WHkYMMxaP4djImWlnAjBnbWgo9xIVXf5sIBc+JIjTiD3++Ki5pEUwW+TaSbK0HAhjqztif5gQkeF5Goanz8rx6r+acFd3WZUkGxvnUdnmvdIhdhNkucd6wr4bhvqcjiTbKaK 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: Only in mmap_region() and copy_vma() do we attempt to merge VMAs which occupy entirely new regions of virtual memory. We can abstract this logic and make the intent of this invocations of it completely explicit, rather than invoking vma_merge() with an inscrutable wall of parameters. This also paves the way for a simplification of the core vma_merge() implementation, as we seek to make it entirely an implementation detail. The VMA merge call in mmap_region() occurs only for file-backed mappings, where each of the parameters previously specified as NULL are defaulted to NULL in vma_init() (called by vm_area_alloc()). This matches the previous behaviour of specifying NULL for a number of fields, however note that prior to this call we pass the VMA to the file system driver via call_mmap(), which may in theory adjust fields that we pass in to vma_merge_new_vma(). Therefore we actually resolve an oversight here by allowing for the fact that the driver may have done this. Reviewed-by: Vlastimil Babka Signed-off-by: Lorenzo Stoakes --- mm/mmap.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index a516f2412f79..e5e50e547ebf 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2485,6 +2485,20 @@ struct vm_area_struct *vma_modify(struct vma_iterator *vmi, return vma; } +/* + * Attempt to merge a newly mapped VMA with those adjacent to it. The caller + * must ensure that [start, end) does not overlap any existing VMA. + */ +static struct vm_area_struct +*vma_merge_new_vma(struct vma_iterator *vmi, struct vm_area_struct *prev, + struct vm_area_struct *vma, unsigned long start, + unsigned long end, pgoff_t pgoff) +{ + return vma_merge(vmi, vma->vm_mm, prev, start, end, vma->vm_flags, + vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma), + vma->vm_userfaultfd_ctx, anon_vma_name(vma)); +} + /* * do_vmi_align_munmap() - munmap the aligned region from @start to @end. * @vmi: The vma iterator @@ -2840,10 +2854,9 @@ unsigned long mmap_region(struct file *file, unsigned long addr, * vma again as we may succeed this time. */ if (unlikely(vm_flags != vma->vm_flags && prev)) { - merge = vma_merge(&vmi, mm, prev, vma->vm_start, - vma->vm_end, vma->vm_flags, NULL, - vma->vm_file, vma->vm_pgoff, NULL, - NULL_VM_UFFD_CTX, NULL); + merge = vma_merge_new_vma(&vmi, prev, vma, + vma->vm_start, vma->vm_end, + vma->vm_pgoff); if (merge) { /* * ->mmap() can change vma->vm_file and fput @@ -3385,9 +3398,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, if (new_vma && new_vma->vm_start < addr + len) return NULL; /* should never get here */ - new_vma = vma_merge(&vmi, mm, prev, addr, addr + len, vma->vm_flags, - vma->anon_vma, vma->vm_file, pgoff, vma_policy(vma), - vma->vm_userfaultfd_ctx, anon_vma_name(vma)); + new_vma = vma_merge_new_vma(&vmi, prev, vma, addr, addr + len, pgoff); if (new_vma) { /* * Source vma may have been merged into new_vma