From nobody Wed Feb 11 03:42:06 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 B19DBC76195 for ; Wed, 22 Mar 2023 07:13:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229459AbjCVHNU (ORCPT ); Wed, 22 Mar 2023 03:13:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37252 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229757AbjCVHNN (ORCPT ); Wed, 22 Mar 2023 03:13:13 -0400 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1965F974E for ; Wed, 22 Mar 2023 00:13:11 -0700 (PDT) Received: by mail-wm1-x333.google.com with SMTP id fm20-20020a05600c0c1400b003ead37e6588so12371083wmb.5 for ; Wed, 22 Mar 2023 00:13:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679469189; 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=TzbyGhvLZi9NdvR9qLzRGr9CkBr431wgVaStXlIqo9A=; b=iztqSobcddwbnuUtBHhFE9WjYOulPGHfY2DbngPzSP8ELao2sG7kXGWD4oTEaMVGxw J3TEIypuIQkDidGDCmKMHo7mLEqz9eIf97TUEkPbzrGSd9ZtZJ7PBbjFgJ4/gpXDv1hR 85GHppxR57d+bBqJQRAmvms4vGqrLeUCgckhv9sW/s6r/NIh7QCQsrrGCzCiVptZz1tS bcJUGH/TbdL+vYLJm+MzaG3uYb3pJs6MgJpIGhMoZjw+bxvJyzEiZelTUYNjYehNq1oJ 5WIv/1H67N7bucq4y6KjIlyNRlnyp8E8pZYbHs0rNWbn1McyKBCkB88UyGnoWuKRe1og Ac5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679469189; 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=TzbyGhvLZi9NdvR9qLzRGr9CkBr431wgVaStXlIqo9A=; b=6owbyBKyVKgfByk5HcvyqaK/PXkNy84RAcRVpiR+5m1EbbHWw7kgJipvs39Vxd7uF8 3cGGoJLcaGyMzIu/DC5D1DpC2sXxVw0KdP5C90+kUAOEVMarZZxhVuPk7T8Jzt7bC1+m H8kgBMTzdNSmRe9BSoGbcTNNhdeOO9KxS8IC3nA2DfufDEHYT6bGZUJ1oq45K2VcvyHg Gio69fdQ0pdl7paeN3Pyjk35yBaC+SYzdE8FqNJr992kYOxDg6Lp4G+gvSFGglQ47p5T DF8N0kbUGP+c2p7O0Nqbnt4C8JAdsp6HjFDF55dYJP8KtdsKJXjUyRoofQFjAejxnzxK mZpQ== X-Gm-Message-State: AO0yUKUPhpdzf7ZCMJZVwVmCGy46eDl/KdneA4xxYOb2VgOzWaiSy1XO NOJCg9YYLt6tm5Q6a8L4iG4= X-Google-Smtp-Source: AK7set8wLvBkCl/46e1zzwcPlr72JTjzxGtGYyojohBR7ImjPCisXXFah/R8nrkwC/f3egE0wbe6Cw== X-Received: by 2002:a1c:740b:0:b0:3ee:126b:4a11 with SMTP id p11-20020a1c740b000000b003ee126b4a11mr4145903wmc.6.1679469189479; Wed, 22 Mar 2023 00:13:09 -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 u4-20020a5d4344000000b002c5526234d2sm13290279wrr.8.2023.03.22.00.13.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 00:13:08 -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 v3 1/4] mm/mmap/vma_merge: further improve prev/next VMA naming Date: Wed, 22 Mar 2023 07:13:01 +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" 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 more natural as this represents the _next_ VMA and replacing what was 'N' with 'C' which represents the current VMA. No word quite describes a VMA that has coincident start as the input span, however 'concurrent' (or more simply 'current') abbreviated to 'curr' fits intuitions well alongside prev and next. This has no functional impact. Signed-off-by: Lorenzo Stoakes Reviewed-by: Liam R. Howlett Reviewed-by: Vlastimil Babka --- 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:42:06 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 034B1C6FD1F for ; Wed, 22 Mar 2023 07:13:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229549AbjCVHNX (ORCPT ); Wed, 22 Mar 2023 03:13:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229668AbjCVHNO (ORCPT ); Wed, 22 Mar 2023 03:13:14 -0400 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B3C68CDCA for ; Wed, 22 Mar 2023 00:13:12 -0700 (PDT) Received: by mail-wr1-x431.google.com with SMTP id j24so7046568wrd.0 for ; Wed, 22 Mar 2023 00:13:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679469191; 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=E3VXMKh/lkCWPY1Nds8D2UzOeCpT3iiYlHjzEEB942A=; b=GIm+f8mi9fCweTMKzPk05Ys0YPYQIbGyytB0E1s9AR5+K+Ct2WQ0mJk9QUvfse58Ke rhDYYMkdWV8HmemOs3SeLkyrp47xRYkpI7kZsEjAWP/kSJOKRQzKaKBxOh1UDBKDMaKu zjGQK7NHAQBWGDjfYXWqpfXwkmjBviXhjAjKwvNKiJGl4aejpEQNXQ5bwWY6DA/ZP3Ou wxYsSTtHKka7IcCBslj7pMM6+tR6pn6YDide1uess0h+JuyvPLw8lPfszQmfF/EEJXaj Cf8qYi0yEKfpCGjyb7sSLMjDog7fekwpVzaFfbb1a1GsIotHP73gRECeCJlUtWgcv4T1 E9/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679469191; 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=E3VXMKh/lkCWPY1Nds8D2UzOeCpT3iiYlHjzEEB942A=; b=UywN6bZkyLy9VohFitpjdoSkXERA5eM6UkIJSPh0DqCGLCVYXdnUUnAJJWZZ8IyaMV QNxaDyrK+LGpFYWaGvLWSUiZnPObiiveJV8GoFd+g4td24KX+f3zDENuViw9JQVQcOPi aHGdL3N9NmEDj9D75NZ/sPQlbEEn05d1e642Y93QdXlqos31J3HCA292dYzICdsxDBr9 oW56lqox3bhU05qj3Q5buQJtCqm+g8hlrDKlLo/CI8YsOgm4hnYo/KNQBVQ0PZysOIDE cQayMhpdZzKeOPHewC5vnUfkGNMh0MP4GYp2RMxqnJnHRtRt8H7WDQlC8oQ9njmhpfwW dvvQ== X-Gm-Message-State: AO0yUKWS9oi02StVZfKEJHUllcr9h1GliNt5CF8M6yyShw7H0KapPrCr tXTXx5A6M/uYUhXjqOzrFwU= X-Google-Smtp-Source: AK7set8l06vQUVZgYZZr43xezu2O1WbwUwuF5+5hPlxdDocLJ0+tvB7JHfxQq0H/QQBq80ZfOxmCcw== X-Received: by 2002:a05:6000:100f:b0:2d5:b6a9:772a with SMTP id a15-20020a056000100f00b002d5b6a9772amr4821063wrx.17.1679469190963; Wed, 22 Mar 2023 00:13:10 -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 u4-20020a5d4344000000b002c5526234d2sm13290279wrr.8.2023.03.22.00.13.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 00:13:10 -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 v3 2/4] mm/mmap/vma_merge: fold curr, next assignment logic Date: Wed, 22 Mar 2023 07:13:02 +0000 Message-Id: <36399b6cdc843eb7fe243488ea9b29464f699170.1679468982.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" Use find_vma_intersection() and vma_lookup() to both simplify the logic and to fold the end =3D=3D next->vm_start condition into one block. 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 Reviewed-by: Liam R. Howlett Reviewed-by: Vlastimil Babka --- mm/mmap.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index c9834364ac98..dbdbb92493b2 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -930,15 +930,14 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, if (vm_flags & VM_SPECIAL) return NULL; - 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); - /* In cases 1 - 4 there's no CCCC vma */ - if (curr && end <=3D curr->vm_start) - curr =3D NULL; + if (!curr || /* cases 1 - 4 */ + end =3D=3D curr->vm_end) /* cases 6 - 8, adjacent VMA */ + next =3D vma_lookup(mm, end); + else + next =3D NULL; /* case 5 */ /* verify some invariant that must be enforced by the caller */ VM_WARN_ON(prev && addr <=3D prev->vm_start); @@ -959,11 +958,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; } -- 2.39.2 From nobody Wed Feb 11 03:42:06 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 8FB38C76195 for ; Wed, 22 Mar 2023 07:13:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229869AbjCVHN0 (ORCPT ); Wed, 22 Mar 2023 03:13:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229782AbjCVHNQ (ORCPT ); Wed, 22 Mar 2023 03:13:16 -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 5B22F10406 for ; Wed, 22 Mar 2023 00:13:14 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id m2so15951758wrh.6 for ; Wed, 22 Mar 2023 00:13:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679469192; 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=6V65cLUX2xeh+2N2Uvy0EZnP8d1je6ufa1jMbqVjM6A=; b=eYs5xqSPmMEgQfGjpDiC1O/TEI4F34/TS+CptIoVWwDLTmFaX5Gi6zYIBTkFYVfEs7 jnUiYNwbuhtlc3ihu+38eZchK6OG0cemBxMeBLRyanu92lnJCAQz8B4jQYmxzUyZK9Bd FFAFR6inDRSQJTpm+swOqW8zwKIX+ADzuMFM5z1y/QY01xETXhhx1mnV5cuG0X/0txzZ E0MHtIyQ7HYYHLosQ5EdXJiufL2l1Bsj8jRyi3p51RHqLbx2HGZHpplcCkf7GDAyiY+b n0QM3WehGKxUcxJ0FW24k6a55Ubg9UcQVWtmO8/TBTBacp+ynOkr9/rBPbmP/6jswVfb 7JPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679469192; 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=6V65cLUX2xeh+2N2Uvy0EZnP8d1je6ufa1jMbqVjM6A=; b=YFcal5GkcpOt5LFzNY9i3eZF3/YM+5PgZhZCsUjomQ0RlKJoEhu2mOEfXY5MpWC6GR B/71SooZwCRD02LWDC7acu0BY3VbeXINzF1hi79+EYQgDx5hw7/XW/bQWuJOrzKa1Ccn D+FToaNG8i8/qAaEzpZQmFXM5exWNm4PcKsSW4tlx3F8qinkc87K24orkLVYAX+5JjZ/ 9AgVDn6B9ui7H54OAPvzR44Cqe0OFBdpwh3jxVgIiV4YF/fRxfdYDSyZTjmw8XX+eGTw 94lQ2tgdCMUwodyVWXodcZybWGLWEvFPl86gcd3k/Kk08h98abYAN22D1yAFtVFBPK7B foYw== X-Gm-Message-State: AO0yUKVCXmoX3T4Aztdl7fmcsQbcdqkx7wiPphczApSBte8OcT/P7w5i N4jgTouRrkueUeOAVpHMRRo= X-Google-Smtp-Source: AK7set+SUkTDrSR7EEwrLnc4ekdxQxI6HDvm9VBHUhBXpanAcTysAjoFazHussT1sGpTaf1Hni0UbA== X-Received: by 2002:a5d:61ce:0:b0:2cf:3a99:9c1e with SMTP id q14-20020a5d61ce000000b002cf3a999c1emr4275633wrv.49.1679469192544; Wed, 22 Mar 2023 00:13:12 -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 u4-20020a5d4344000000b002c5526234d2sm13290279wrr.8.2023.03.22.00.13.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 00:13:11 -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 v3 3/4] mm/mmap/vma_merge: explicitly assign res, vma, extend invariants Date: Wed, 22 Mar 2023 07:13:03 +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" 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. The value of res defaults to NULL, so we can neatly eliminate the assignment to res and vma in the if (prev) block and ensure that both res and vma are both explicitly assigned, by just setting both to prev. In addition we add an explanation as to under what circumstances both might change, and since we absolutely do rely on addr =3D=3D curr->vm_start should curr exist, assert that this is the case. Signed-off-by: Lorenzo Stoakes Reviewed-by: Liam R. Howlett 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 dbdbb92493b2..2a4f63716231 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; @@ -939,14 +939,18 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, else next =3D NULL; /* case 5 */ =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? */ @@ -957,6 +961,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, @@ -997,6 +1002,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:42:06 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 157A6C6FD1F for ; Wed, 22 Mar 2023 07:13:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229794AbjCVHNa (ORCPT ); Wed, 22 Mar 2023 03:13:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37578 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229783AbjCVHNR (ORCPT ); Wed, 22 Mar 2023 03:13:17 -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 83812C15D for ; Wed, 22 Mar 2023 00:13:15 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id l27so7627366wrb.2 for ; Wed, 22 Mar 2023 00:13:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679469194; 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=TvFBIxJBVhEXBKtp0GyumQnQIP5EEIPfuNuIT/IqlfQ=; b=WU0Up1Atx5XiF6ihkQphvxLDKelfbEV7zI44fcBWhRcywxkEM9D8YFzEkjv/AuAiSE MqLuw8erhiWW04wTbEzZ5evEJmnIRqwxU+3w13Ww3I7m9FvHsLxWUnw3Ov4P8s6axbpS khizdR1MTgf1kxPKJXIUZHB77i2iQ5h5xK/dm92xIu/Qx/DY25UH356zxAK+dROABkAD 9ZxBYOeCn5YByRWL4dodJBXu8gUviS1Gp+OJnEAl3x64LdrGo2FvpKPZRZHeSN2OgXlj 8rA0dDPLB0PeBAO2AlSTcBXL8xQNquF2RiUOYf3qq/qFE1MvTSOLwzhUlhHQHyT8EsyR Aszg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679469194; 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=TvFBIxJBVhEXBKtp0GyumQnQIP5EEIPfuNuIT/IqlfQ=; b=wKk+MnzFsXgwB5Wo1xwWMkEFw5xXKIu4z27tsI/xuUT7Sr0ECGTdwXUN7FLnRDy9WB pCC5halqEzEfZxY3pgxyoNigA82W/StvQdt03Rrj70asX/UWHIB1y7xpvRDRHZWLOerV oZ8AvlkPI5KLGGEXYnduBgJBZa/1CbsbHHdmMdwIC23iOvH7B+WjMH/g6jyXT79Zkbrg BGBOtOVLY93t6plLxgdB7wPOYkojeZHcRGBdvLrVMeDmITTnL6p4ydWTVjYbYm141ltO M2cgHfdLYnlMYyQ0wbqcqqww903yVsk5tIZBbJTdv248Sg0MfFpUsITZLbeXMeDH0WB0 dq3g== X-Gm-Message-State: AO0yUKWLUwX/KjTCopU67msgirUr39mkSItHP1gFwrxqMwWUckeaAHkV u9UXu0l0JxLy2SZCqTdzFf8= X-Google-Smtp-Source: AK7set8jNLy29ur/RroRVTTwctIeW0rEOeiVjYe/lX9TZQAL5pa7DOsvlPVneVSIl0I9sWTIMHaTFg== X-Received: by 2002:a5d:4c84:0:b0:2da:45b6:a1d5 with SMTP id z4-20020a5d4c84000000b002da45b6a1d5mr1025831wrs.3.1679469194044; Wed, 22 Mar 2023 00:13:14 -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 u4-20020a5d4344000000b002c5526234d2sm13290279wrr.8.2023.03.22.00.13.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 00:13:13 -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 v3 4/4] mm/mmap/vma_merge: init cleanup, be explicit about the non-mergeable case Date: Wed, 22 Mar 2023 07:13:04 +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" 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 and reorder initial variables so they are more logically grouped. This has no functional impact. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- mm/mmap.c | 57 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 2a4f63716231..642f3d063be1 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; + pgoff_t vma_pgoff; + 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 addr; unsigned long vma_end =3D end; + pgoff_t pglen =3D (end - addr) >> PAGE_SHIFT; long adj_start =3D 0; - unsigned long vma_start =3D addr; =20 validate_mm(mm); /* @@ -939,36 +939,38 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, else next =3D NULL; /* case 5 */ =20 - /* - * 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 && (addr !=3D curr->vm_start || end > curr->vm_end)); - VM_WARN_ON(addr >=3D end); - 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) + if (addr =3D=3D prev->vm_end && mpol_equal(vma_policy(prev), policy) && can_vma_merge_after(prev, vm_flags, anon_vma, file, - pgoff, vm_userfaultfd_ctx, anon_name)) { + pgoff, vm_userfaultfd_ctx, anon_name)) { merge_prev =3D true; vma_prev(vmi); } } =20 /* 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; - } + 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. + */ + 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 && (addr !=3D curr->vm_start || end > curr->vm_end)); + VM_WARN_ON(addr >=3D end); =20 remove =3D remove2 =3D adjust =3D NULL; /* Can we merge both the predecessor and the successor? */ @@ -984,7 +986,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 */ @@ -994,7 +996,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; @@ -1010,7 +1012,6 @@ 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; @@ -1019,7 +1020,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