From nobody Wed Feb 11 03:51:31 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 A899BC6FD1D for ; Tue, 21 Mar 2023 20:46:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229891AbjCUUqc (ORCPT ); Tue, 21 Mar 2023 16:46:32 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41174 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229861AbjCUUq2 (ORCPT ); Tue, 21 Mar 2023 16:46:28 -0400 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D17A52F60 for ; Tue, 21 Mar 2023 13:46:23 -0700 (PDT) Received: by mail-wr1-x435.google.com with SMTP id o7so15041633wrg.5 for ; Tue, 21 Mar 2023 13:46:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679431581; 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=rtTyPgAyyTCsuj6xg05jXpazWd4/Ojg4wA/2tNBdu1s=; b=FNfoY1JZqKacVO45/DDOogtTW4PW0fxKgBlLXtoiWkvTUfS6IQ/FQnbJJ1CFoPs0b5 /1h8esRSWXRteL8326UpIcdEO/vAxUnsB2isAMecO/hT8OeEfGvKMWOJEuP8g0X75MGE zxz0EHrS/YMqvpJ5j+Vt9TNN+z2FWaady0aFglC5LJB3F2JeohyRkNpOf7t3jeBsJptx eQXpN1UQY8fja8NW4R6y0uTgYuN58Cw2fGTVXz/zYzDc5FfMd7xFVLzkQktNvY257Lp5 A7PUORfPoYfC1KBNoGCr4oDKeV/9AqZt1oGH5A6SfKMOpGg+Qx5yGymyuwcPoEapxVrQ lQWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679431581; 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=rtTyPgAyyTCsuj6xg05jXpazWd4/Ojg4wA/2tNBdu1s=; b=hAyvc88jGxXdwHFtfsgCUcCFiNrXZ0OQXOP3oMLdAAkH7ImwyYdpMJ/yCLY2n0Or2m wp/faFx1EJgJPjCZbiNBhDPxGo+Rekdl6AbFDhRF7ZyVV5traKSelkVpK9OGKr9MFqrU sasOnDdEh1RtcdAO3AkwNch5CotUptnITTfnDABiUv+sLgBlZnXTseITUep0V0/Q32s6 IjTVD56vRoTQ+D8gCjIxc0bHqNnwUKMU7p5UHN5RxLjrolVqCKtmWzHdeBCCPnkGa+aE U/j0oCafpKBVsoSYSw5Azi3rtl+L1C5IWH3CSvaW+VYBTB4bSORl1+8NEKYR7oD5/30P D1XQ== X-Gm-Message-State: AO0yUKURHdiwIkpQtzFh8KVzUdL1nPrRt32anxjQLmpT4faAw0dFqb27 yz97A3Bj0S9cZJMjuFRtakY= X-Google-Smtp-Source: AK7set9BnZ4bM/xxg7ypwfZc8P2cRwJfe18HibEQw4HhoYPbGmd/BqiU8iQBnCtCF4L78CAscq6zRQ== X-Received: by 2002:a05:6000:136d:b0:2ce:a828:b248 with SMTP id q13-20020a056000136d00b002cea828b248mr3169695wrz.71.1679431581454; Tue, 21 Mar 2023 13:46:21 -0700 (PDT) Received: from lucifer.home (host86-146-209-214.range86-146.btcentralplus.com. [86.146.209.214]) by smtp.googlemail.com with ESMTPSA id a4-20020adffb84000000b002d322b9a7f5sm12142491wrr.88.2023.03.21.13.46.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 13:46:20 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: David Hildenbrand , Matthew Wilcox , Vlastimil Babka , "Liam R . Howlett" , maple-tree@lists.infradead.org, Vernon Yang , Lorenzo Stoakes Subject: [PATCH v2 1/4] mm/mmap/vma_merge: further improve prev/next VMA naming Date: Tue, 21 Mar 2023 20:45:55 +0000 Message-Id: <6001e08fa7e119470cbb1d2b6275ad8d742ff9a7.1679431180.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Previously the ASCII diagram above vma_merge() and the accompanying variable naming was rather confusing, however recent efforts by Liam Howlett and Vlastimil Babka have significantly improved matters. This patch goes a little further - replacing 'X' with 'N' which feels a lot more natural and replacing what was 'N' with 'C' which stands for 'concurrent' VMA. No word quite describes a VMA that has coincident start as the input span, concurrent, abbreviated to 'curr' (and which can be thought of also as 'current') however fits intuitions well alongside prev and next. This has no functional impact. Signed-off-by: Lorenzo Stoakes --- mm/mmap.c | 86 +++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 042d22e63528..c9834364ac98 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -861,44 +861,44 @@ can_vma_merge_after(struct vm_area_struct *vma, unsig= ned long vm_flags, * this area are about to be changed to vm_flags - and the no-change * case has already been eliminated. * - * The following mprotect cases have to be considered, where AAAA is + * The following mprotect cases have to be considered, where **** is * the area passed down from mprotect_fixup, never extending beyond one - * vma, PPPP is the previous vma, NNNN is a vma that starts at the same - * address as AAAA and is of the same or larger span, and XXXX the next - * vma after AAAA: + * vma, PPPP is the previous vma, CCCC is a concurrent vma that starts + * at the same address as **** and is of the same or larger span, and + * NNNN the next vma after ****: * - * AAAA AAAA AAAA - * PPPPPPXXXXXX PPPPPPXXXXXX PPPPPPNNNNNN + * **** **** **** + * PPPPPPNNNNNN PPPPPPNNNNNN PPPPPPCCCCCC * cannot merge might become might become - * PPXXXXXXXXXX PPPPPPPPPPNN + * PPNNNNNNNNNN PPPPPPPPPPCC * mmap, brk or case 4 below case 5 below * mremap move: - * AAAA AAAA - * PPPP XXXX PPPPNNNNXXXX + * **** **** + * PPPP NNNN PPPPCCCCNNNN * might become might become * PPPPPPPPPPPP 1 or PPPPPPPPPPPP 6 or - * PPPPPPPPXXXX 2 or PPPPPPPPXXXX 7 or - * PPPPXXXXXXXX 3 PPPPXXXXXXXX 8 + * PPPPPPPPNNNN 2 or PPPPPPPPNNNN 7 or + * PPPPNNNNNNNN 3 PPPPNNNNNNNN 8 * - * It is important for case 8 that the vma NNNN overlapping the - * region AAAA is never going to extended over XXXX. Instead XXXX must - * be extended in region AAAA and NNNN must be removed. This way in + * It is important for case 8 that the vma CCCC overlapping the + * region **** is never going to extended over NNNN. Instead NNNN must + * be extended in region **** and CCCC must be removed. This way in * all cases where vma_merge succeeds, the moment vma_merge drops the * rmap_locks, the properties of the merged vma will be already * correct for the whole merged range. Some of those properties like * vm_page_prot/vm_flags may be accessed by rmap_walks and they must * be correct for the whole merged range immediately after the - * rmap_locks are released. Otherwise if XXXX would be removed and - * NNNN would be extended over the XXXX range, remove_migration_ptes + * rmap_locks are released. Otherwise if NNNN would be removed and + * CCCC would be extended over the NNNN range, remove_migration_ptes * or other rmap walkers (if working on addresses beyond the "end" - * parameter) may establish ptes with the wrong permissions of NNNN - * instead of the right permissions of XXXX. + * parameter) may establish ptes with the wrong permissions of CCCC + * instead of the right permissions of NNNN. * * In the code below: * PPPP is represented by *prev - * NNNN is represented by *mid or not represented at all (NULL) - * XXXX is represented by *next or not represented at all (NULL) - * AAAA is not represented - it will be merged and the vma containing the + * CCCC is represented by *curr or not represented at all (NULL) + * NNNN is represented by *next or not represented at all (NULL) + * **** is not represented - it will be merged and the vma containing the * area is returned, or the function will return NULL */ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struc= t *mm, @@ -911,7 +911,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, { pgoff_t pglen =3D (end - addr) >> PAGE_SHIFT; pgoff_t vma_pgoff; - struct vm_area_struct *mid, *next, *res =3D NULL; + struct vm_area_struct *curr, *next, *res =3D NULL; struct vm_area_struct *vma, *adjust, *remove, *remove2; int err =3D -1; bool merge_prev =3D false; @@ -930,19 +930,19 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, if (vm_flags & VM_SPECIAL) return NULL; =20 - mid =3D find_vma(mm, prev ? prev->vm_end : 0); - if (mid && mid->vm_end =3D=3D end) /* cases 6, 7, 8 */ - next =3D find_vma(mm, mid->vm_end); + curr =3D find_vma(mm, prev ? prev->vm_end : 0); + if (curr && curr->vm_end =3D=3D end) /* cases 6, 7, 8 */ + next =3D find_vma(mm, curr->vm_end); else - next =3D mid; + next =3D curr; =20 - /* In cases 1 - 4 there's no NNNN vma */ - if (mid && end <=3D mid->vm_start) - mid =3D NULL; + /* In cases 1 - 4 there's no CCCC vma */ + if (curr && end <=3D curr->vm_start) + curr =3D NULL; =20 /* verify some invariant that must be enforced by the caller */ VM_WARN_ON(prev && addr <=3D prev->vm_start); - VM_WARN_ON(mid && end > mid->vm_end); + VM_WARN_ON(curr && end > curr->vm_end); VM_WARN_ON(addr >=3D end); =20 if (prev) { @@ -974,21 +974,21 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, remove =3D next; /* case 1 */ vma_end =3D next->vm_end; err =3D dup_anon_vma(prev, next); - if (mid) { /* case 6 */ - remove =3D mid; + if (curr) { /* case 6 */ + remove =3D curr; remove2 =3D next; if (!next->anon_vma) - err =3D dup_anon_vma(prev, mid); + err =3D dup_anon_vma(prev, curr); } } else if (merge_prev) { err =3D 0; /* case 2 */ - if (mid) { - err =3D dup_anon_vma(prev, mid); - if (end =3D=3D mid->vm_end) { /* case 7 */ - remove =3D mid; + if (curr) { + err =3D dup_anon_vma(prev, curr); + if (end =3D=3D curr->vm_end) { /* case 7 */ + remove =3D curr; } else { /* case 5 */ - adjust =3D mid; - adj_start =3D (end - mid->vm_start); + adjust =3D curr; + adj_start =3D (end - curr->vm_start); } } } else if (merge_next) { @@ -1004,10 +1004,10 @@ struct vm_area_struct *vma_merge(struct vma_iterato= r *vmi, struct mm_struct *mm, vma_end =3D next->vm_end; vma_pgoff =3D next->vm_pgoff; err =3D 0; - if (mid) { /* case 8 */ - vma_pgoff =3D mid->vm_pgoff; - remove =3D mid; - err =3D dup_anon_vma(next, mid); + if (curr) { /* case 8 */ + vma_pgoff =3D curr->vm_pgoff; + remove =3D curr; + err =3D dup_anon_vma(next, curr); } } } --=20 2.39.2 From nobody Wed Feb 11 03:51:31 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 1690FC6FD1D for ; Tue, 21 Mar 2023 20:46:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229896AbjCUUqe (ORCPT ); Tue, 21 Mar 2023 16:46:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229876AbjCUUq3 (ORCPT ); Tue, 21 Mar 2023 16:46:29 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BF8DF53D9C for ; Tue, 21 Mar 2023 13:46:24 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id o7so15041704wrg.5 for ; Tue, 21 Mar 2023 13:46:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679431583; 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=M+P4r5ohjfdtTt/Mfa4qHdLtxtbZQxPh6y+eJBbFwbQ=; b=Z7Gjn1KMJVHvSI9APFNDg5uxS4keAM8LnCBQVHmEJD6yDXb22mgga2nC+Rwzpa3IcL RxnTpVHSK77c6WZjwYzcArWUEA11ZTfmBWGOCiHBjlXCKMRLXbs81gxYbP0IC48tal5g WRJExwimKVuHKEA3MMDUsaZEbLPRcUotIfTZpvdQWzQTIqaBDRVsGhmIY5eQjn/HmVY+ XB0ATW0xXz0JuaP839CKl/ExxesBCdeUyAjy45Hh+FiqMp4s1wi7/fmRN5+bjFdvP5ZS rvnko07nNRULJxK6AZtA4g7ZSCwxAA7z/iW+KMHwVR1NYBWCtfQtc4ZIRSNP4n/KeGhS c2IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679431583; 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=M+P4r5ohjfdtTt/Mfa4qHdLtxtbZQxPh6y+eJBbFwbQ=; b=XCqocn1SzgWCULom/C8J6PkWlTi4GzzKWBPOt5IfuBYcVB0fTBjGosiM2fc4lrxGSK HI7fOM+Cx5orhTCUC0/XRZO6iIOLy05bB5dqgxrh/gnW9W4fcBZIc11D3uDr1O4d5IoD RhcdOvaLNAIGdD7w3rDFhOmFlmh1yEEe1Do0nIcft8moqqblt/GE8tkica1oI9r3DsnG uTlQ2Vcf8GAu7GtigfrW2k/vup/BHwd09PC4vAt5jHoaGKy+W2uFXsyr8hfO94N5iTAh fk052SYamCOj30ofZauewmBnxkJxeLJN7hCSTZM+z8u6+7SyVv28HHYDFXOLC4mc00NR +aLA== X-Gm-Message-State: AO0yUKXxNLuJIcEgGr/+dUraEKARTib1n8Yrd55Gi4pQvbzqt5LqfOzo wrV5r/84e/oeXOEfQOXR+Go= X-Google-Smtp-Source: AK7set9qKf2MHVF0+P2hb8JkRBr8OZ1hgZ3RUsK5mnnQG8b6+tURR09MpVh1Xlja767sSCFdhoOAuA== X-Received: by 2002:adf:e242:0:b0:2ce:ad40:7705 with SMTP id bl2-20020adfe242000000b002cead407705mr3296806wrb.25.1679431582801; Tue, 21 Mar 2023 13:46:22 -0700 (PDT) Received: from lucifer.home (host86-146-209-214.range86-146.btcentralplus.com. [86.146.209.214]) by smtp.googlemail.com with ESMTPSA id a4-20020adffb84000000b002d322b9a7f5sm12142491wrr.88.2023.03.21.13.46.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 13:46:21 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: David Hildenbrand , Matthew Wilcox , Vlastimil Babka , "Liam R . Howlett" , maple-tree@lists.infradead.org, Vernon Yang , Lorenzo Stoakes Subject: [PATCH v2 2/4] mm/mmap/vma_merge: set next to NULL if not applicable Date: Tue, 21 Mar 2023 20:45:56 +0000 Message-Id: <3506997a8146a287ec13ee7a53cf916707537bf8.1679431180.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We are only interested in next if end =3D=3D next->vm_start (in which case = we check to see if we can set merge_next), so perform this check alongside checking whether curr should be set. This groups all of the simple range checks together and establishes the invariant that, if prev, curr or next are non-NULL then their positions are as expected. This has no functional impact. Signed-off-by: Lorenzo Stoakes --- mm/mmap.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index c9834364ac98..6361baf75601 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -930,15 +930,15 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, if (vm_flags & VM_SPECIAL) return NULL; =20 - curr =3D find_vma(mm, prev ? prev->vm_end : 0); - if (curr && curr->vm_end =3D=3D end) /* cases 6, 7, 8 */ - next =3D find_vma(mm, curr->vm_end); - else - next =3D curr; + /* Does the input range span an existing VMA? (cases 5 - 8) */ + curr =3D find_vma_intersection(mm, prev ? prev->vm_end : 0, end); =20 - /* In cases 1 - 4 there's no CCCC vma */ - if (curr && end <=3D curr->vm_start) - curr =3D NULL; + if (curr && end =3D=3D curr->vm_end) + /* Is there is a VMA immediately adjacent (cases 6 - 8)? */ + next =3D vma_lookup(mm, curr->vm_end); + else if (!curr) + /* Is there a VMA next to a hole (case 1 - 3) or prev (4)? */ + next =3D vma_lookup(mm, end); =20 /* verify some invariant that must be enforced by the caller */ VM_WARN_ON(prev && addr <=3D prev->vm_start); @@ -959,11 +959,10 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, } } /* Can we merge the successor? */ - if (next && end =3D=3D next->vm_start && - mpol_equal(policy, vma_policy(next)) && - can_vma_merge_before(next, vm_flags, - anon_vma, file, pgoff+pglen, - vm_userfaultfd_ctx, anon_name)) { + if (next && mpol_equal(policy, vma_policy(next)) && + can_vma_merge_before(next, vm_flags, + anon_vma, file, pgoff+pglen, + vm_userfaultfd_ctx, anon_name)) { merge_next =3D true; } =20 --=20 2.39.2 From nobody Wed Feb 11 03:51:31 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 F093BC6FD1D for ; Tue, 21 Mar 2023 20:46:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229984AbjCUUqp (ORCPT ); Tue, 21 Mar 2023 16:46:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41340 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229865AbjCUUqc (ORCPT ); Tue, 21 Mar 2023 16:46:32 -0400 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DB02F54C8F for ; Tue, 21 Mar 2023 13:46:25 -0700 (PDT) Received: by mail-wr1-x435.google.com with SMTP id i9so15026101wrp.3 for ; Tue, 21 Mar 2023 13:46:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679431584; 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=MfsZBuYgS6pqJ3Am6jGw1RAqKs9VHOoqJ2PWKKositw=; b=Xthyp8pNRedrgpz+v7r1SoXbmc6FhAaRO0rPX1lWRJx0A6HaV08XrfWC3LBKRr1v4J VVJn5sFjSfzpbAaBIECALfN2ebHT0JfzrX1GnPa4bT8W0hFFyOdyhRLCYjL9viRXVCzW l8Lz43DLOTRm3mkbFemM/Ofmh4JH89aCXl1jKSNyU4vhKGd9FSFAaRKFmKYTcaaNMWae kU9h111gk9jlfYE1r8tSyq65aKuuJ9TgN6Jm2xuLTJ/VsMbqA9+nRWd5HiO03wrPX5Kz yuAd9nbzdzKyHs0L2r/tAw9etDrdkFR9dao7pQuZoWZ9Ht3Mr6j88Cgqyd0Q6+GrsfnO Uwew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679431584; 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=MfsZBuYgS6pqJ3Am6jGw1RAqKs9VHOoqJ2PWKKositw=; b=bfgLgmsdlOe5AMbXO7YmvF+MoV4N5MxOigEh463wxYWD2o7C8ncfyQkIimXT4pfo9q PD0OW90k/xq5+ER9qszsQYYmutpKV/L4tAwHNATX4QJR2iN3PKdf4Mwk2DDDNQRAtDSd WmNx2ELgnKm66y58y1k3c07WUGZ9BgtHMWI0g9m6oKJRMCTIWKIyvBHMbN8HwytbPISG ne+vFE0tlUuI/opmNMnKbloXHUW2+FVJar7PSWyO85SgpjZ5sTEgl696nvhwY4NcNbCe GkOhVx3ite5GoJ3GDQCDLGInVspAF8k2KBz4WVLT8KDf1UlUDJe9CA6HT9IyUfk7UIAQ VJwg== X-Gm-Message-State: AO0yUKUzTtupYnbOqS9q+7auLUJnpm9a1kb999LzbDoY6zPzSssAAuaY 7x+/azvFl4LyqQtvOM/wkio= X-Google-Smtp-Source: AK7set8vgB48KSqkTfNA3yVmqhUDD2V9Hf3XxSaQnFm8ZDXG7nS4tj0A/4peODTUrzQZWqI5gVVA0w== X-Received: by 2002:a5d:4535:0:b0:2c7:e5f:e0e0 with SMTP id j21-20020a5d4535000000b002c70e5fe0e0mr3542607wra.65.1679431584097; Tue, 21 Mar 2023 13:46:24 -0700 (PDT) Received: from lucifer.home (host86-146-209-214.range86-146.btcentralplus.com. [86.146.209.214]) by smtp.googlemail.com with ESMTPSA id a4-20020adffb84000000b002d322b9a7f5sm12142491wrr.88.2023.03.21.13.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 13:46:23 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: David Hildenbrand , Matthew Wilcox , Vlastimil Babka , "Liam R . Howlett" , maple-tree@lists.infradead.org, Vernon Yang , Lorenzo Stoakes Subject: [PATCH v2 3/4] mm/mmap/vma_merge: extend invariants, avoid invalid res, vma Date: Tue, 21 Mar 2023 20:45:57 +0000 Message-Id: <17b6fc3edc46c4b33aa93b9ef17a63a3a76f4b5f.1679431180.git.lstoakes@gmail.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Previously, vma was an uninitialised variable which was only definitely assigned as a result of the logic covering all possible input cases - for it to have remained uninitialised, prev would have to be NULL, and next would _have_ to be mergeable. We now reuse vma to assign curr and next, so to be absolutely explicit, ensure this variable is _always_ assigned, and while we're at it remove the redundant assignment of both res and vma (if prev is NULL then we simply assign to NULL). In addition, we absolutely do rely on addr =3D=3D curr->vm_start should curr exist, so assert as much. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- mm/mmap.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 6361baf75601..7aec49c3bc74 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -911,7 +911,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, { pgoff_t pglen =3D (end - addr) >> PAGE_SHIFT; pgoff_t vma_pgoff; - struct vm_area_struct *curr, *next, *res =3D NULL; + struct vm_area_struct *curr, *next, *res; struct vm_area_struct *vma, *adjust, *remove, *remove2; int err =3D -1; bool merge_prev =3D false; @@ -940,14 +940,18 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, /* Is there a VMA next to a hole (case 1 - 3) or prev (4)? */ next =3D vma_lookup(mm, end); =20 - /* verify some invariant that must be enforced by the caller */ + /* + * By default, we return prev. Cases 3, 4, 8 will instead return next + * and cases 3, 8 will also update vma to point at next. + */ + res =3D vma =3D prev; + + /* Verify some invariant that must be enforced by the caller. */ VM_WARN_ON(prev && addr <=3D prev->vm_start); - VM_WARN_ON(curr && end > curr->vm_end); + VM_WARN_ON(curr && (addr !=3D curr->vm_start || end > curr->vm_end)); VM_WARN_ON(addr >=3D end); =20 if (prev) { - res =3D prev; - vma =3D prev; vma_start =3D prev->vm_start; vma_pgoff =3D prev->vm_pgoff; /* Can we merge the predecessor? */ @@ -958,6 +962,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, vma_prev(vmi); } } + /* Can we merge the successor? */ if (next && mpol_equal(policy, vma_policy(next)) && can_vma_merge_before(next, vm_flags, @@ -998,6 +1003,10 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, adj_start =3D -(prev->vm_end - addr); err =3D dup_anon_vma(next, prev); } else { + /* + * Note that cases 3 and 8 are the ONLY ones where prev + * is permitted to be (but is not necessarily) NULL. + */ vma =3D next; /* case 3 */ vma_start =3D addr; vma_end =3D next->vm_end; --=20 2.39.2 From nobody Wed Feb 11 03:51:31 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 DD35BC6FD1D for ; Tue, 21 Mar 2023 20:46:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230001AbjCUUqs (ORCPT ); Tue, 21 Mar 2023 16:46:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41930 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229734AbjCUUql (ORCPT ); Tue, 21 Mar 2023 16:46:41 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1A80E52F5F for ; Tue, 21 Mar 2023 13:46:27 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id i9so15026153wrp.3 for ; Tue, 21 Mar 2023 13:46:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679431585; 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=b3A7zhEdmBF2TYjJBu5Iah25JwVoEB2AzBhKfUOeukc=; b=Si1QRuxn5Wu2XpFAVHrpMm1EIBmuD13xyfMdQ3T0gsrkBCvpixAW/BB8wP+A+sV7n3 raxCrwZ/uVQ6B/Yr02ncqpG5sVrOxxR9G9eX1kO2NJx0UwhhMJ56+9mcSAwx5KmHhhrx OmvKgHySY1tnqYuaI483mHiNOomaeG/w7rcfgzX41Rh8GYzd9Oc4+UW0T+HCJ4dXnj0R x0eQLjTkQezRhA2mi6Kl+ZSZi/X6ar/jV+W/jamlBwfbBchWUS60IORb7tbIO6YoP35p fgIcKI2i54YcmMelvTnmdF0RW8x5EXzwMNZaCLICviJ1bDe4404u2iJKJuHMMOf/N4mP jeWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679431585; 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=b3A7zhEdmBF2TYjJBu5Iah25JwVoEB2AzBhKfUOeukc=; b=D0qPba9W4Sn7XWSE+gulf3ve1ReKkdOpWHUUtc1d5RZeDwowvsOjK9vd9OMnXgV0yn K9w7A2OHP7ZJB2pS0HCyOvy0v9C004EeYdo0jur8AbD4PUSwp7R1bYi8TOtBJcRAL4qV 9GTQii9TFYwXaY4KydEasLkgEdGkI6yaHIDi3lk0UMgj9/zrgyjGb3QbtdfkeVOnz9c1 9J6px9sAYW5XR7sfSaXjXbgxpRdtB5726lmF6GGtJi3gx858JFJT+Cnu4AyJxUMgcgdP UdBqIQNt++xvbs8bHzz9TUIYJmMeXsjBlm0ZNQuu+BOjlplJgKdULdD3VkQCptM7pYQP NRRg== X-Gm-Message-State: AO0yUKV5zEFJKM7ewuUWTqmmQp26Foa9Il2wwyT2RQGDCAJxq1SAGhpA mE6f3aW1htUWl3dg4FufM8U= X-Google-Smtp-Source: AK7set9W3aHUuRXYHcQuSsj9Z5fSBCLJOdxD6jMlO9xE5od0fFzPTWifeNMKlIUHmt3vnU5vOUODNw== X-Received: by 2002:a05:6000:152:b0:2cf:e3a9:c189 with SMTP id r18-20020a056000015200b002cfe3a9c189mr3835805wrx.3.1679431585581; Tue, 21 Mar 2023 13:46:25 -0700 (PDT) Received: from lucifer.home (host86-146-209-214.range86-146.btcentralplus.com. [86.146.209.214]) by smtp.googlemail.com with ESMTPSA id a4-20020adffb84000000b002d322b9a7f5sm12142491wrr.88.2023.03.21.13.46.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 13:46:24 -0700 (PDT) From: Lorenzo Stoakes To: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrew Morton Cc: David Hildenbrand , Matthew Wilcox , Vlastimil Babka , "Liam R . Howlett" , maple-tree@lists.infradead.org, Vernon Yang , Lorenzo Stoakes Subject: [PATCH v2 4/4] mm/mmap/vma_merge: init cleanup, be explicit about the non-mergeable case Date: Tue, 21 Mar 2023 20:45:58 +0000 Message-Id: X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Reorder the initial variables sensibly and set vma_start and vm_pgoff there rather than later so all initial values are set at the same time meaning we don't have to set these later. Rather than setting err =3D -1 and only resetting if we hit merge cases, explicitly check the non-mergeable case to make it abundantly clear that we only proceed with the rest if something is mergeable, default err to 0 and only update if an error might occur. Move the merge_prev, merge_next cases closer to the logic determining curr, next. This has no functional impact. Signed-off-by: Lorenzo Stoakes --- mm/mmap.c | 55 ++++++++++++++++++++++++++----------------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 7aec49c3bc74..d60cb0b7ae15 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -909,18 +909,18 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, struct vm_userfaultfd_ctx vm_userfaultfd_ctx, struct anon_vma_name *anon_name) { - pgoff_t pglen =3D (end - addr) >> PAGE_SHIFT; - pgoff_t vma_pgoff; struct vm_area_struct *curr, *next, *res; struct vm_area_struct *vma, *adjust, *remove, *remove2; - int err =3D -1; + struct vma_prepare vp; + int err =3D 0; bool merge_prev =3D false; bool merge_next =3D false; bool vma_expanded =3D false; - struct vma_prepare vp; + unsigned long vma_start =3D prev ? prev->vm_start : addr; unsigned long vma_end =3D end; + pgoff_t vma_pgoff =3D prev ? prev->vm_pgoff : 0; + pgoff_t pglen =3D (end - addr) >> PAGE_SHIFT; long adj_start =3D 0; - unsigned long vma_start =3D addr; =20 validate_mm(mm); /* @@ -940,6 +940,23 @@ struct vm_area_struct *vma_merge(struct vma_iterator *= vmi, struct mm_struct *mm, /* Is there a VMA next to a hole (case 1 - 3) or prev (4)? */ next =3D vma_lookup(mm, end); =20 + /* Can we merge the predecessor? */ + if (prev && addr =3D=3D prev->vm_end && mpol_equal(vma_policy(prev), poli= cy) + && can_vma_merge_after(prev, vm_flags, anon_vma, file, + pgoff, vm_userfaultfd_ctx, anon_name)) { + merge_prev =3D true; + vma_prev(vmi); + } + + /* Can we merge the successor? */ + merge_next =3D next && mpol_equal(policy, vma_policy(next)) && + can_vma_merge_before(next, vm_flags, + anon_vma, file, pgoff+pglen, + vm_userfaultfd_ctx, anon_name); + + if (!merge_prev && !merge_next) + return NULL; /* Not mergeable. */ + /* * By default, we return prev. Cases 3, 4, 8 will instead return next * and cases 3, 8 will also update vma to point at next. @@ -951,26 +968,6 @@ struct vm_area_struct *vma_merge(struct vma_iterator *= vmi, struct mm_struct *mm, VM_WARN_ON(curr && (addr !=3D curr->vm_start || end > curr->vm_end)); VM_WARN_ON(addr >=3D end); =20 - if (prev) { - vma_start =3D prev->vm_start; - vma_pgoff =3D prev->vm_pgoff; - /* Can we merge the predecessor? */ - if (prev->vm_end =3D=3D addr && mpol_equal(vma_policy(prev), policy) - && can_vma_merge_after(prev, vm_flags, anon_vma, file, - pgoff, vm_userfaultfd_ctx, anon_name)) { - merge_prev =3D true; - vma_prev(vmi); - } - } - - /* Can we merge the successor? */ - if (next && mpol_equal(policy, vma_policy(next)) && - can_vma_merge_before(next, vm_flags, - anon_vma, file, pgoff+pglen, - vm_userfaultfd_ctx, anon_name)) { - merge_next =3D true; - } - remove =3D remove2 =3D adjust =3D NULL; /* Can we merge both the predecessor and the successor? */ if (merge_prev && merge_next && @@ -985,7 +982,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, err =3D dup_anon_vma(prev, curr); } } else if (merge_prev) { - err =3D 0; /* case 2 */ + /* case 2 */ if (curr) { err =3D dup_anon_vma(prev, curr); if (end =3D=3D curr->vm_end) { /* case 7 */ @@ -995,7 +992,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, adj_start =3D (end - curr->vm_start); } } - } else if (merge_next) { + } else { /* merge_next */ res =3D next; if (prev && addr < prev->vm_end) { /* case 4 */ vma_end =3D addr; @@ -1011,7 +1008,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, vma_start =3D addr; vma_end =3D next->vm_end; vma_pgoff =3D next->vm_pgoff; - err =3D 0; + if (curr) { /* case 8 */ vma_pgoff =3D curr->vm_pgoff; remove =3D curr; @@ -1020,7 +1017,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, } } =20 - /* Cannot merge or error in anon_vma clone */ + /* Error in anon_vma clone. */ if (err) return NULL; =20 --=20 2.39.2