From nobody Tue Dec 16 03:19:50 2025 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 2308FC6FD1F for ; Wed, 22 Mar 2023 20:43:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231435AbjCVUnu (ORCPT ); Wed, 22 Mar 2023 16:43:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34236 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231781AbjCVUnM (ORCPT ); Wed, 22 Mar 2023 16:43:12 -0400 Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BC41693137 for ; Wed, 22 Mar 2023 13:35:50 -0700 (PDT) Received: by mail-ed1-x531.google.com with SMTP id ew6so15074011edb.7 for ; Wed, 22 Mar 2023 13:35:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679517349; 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=K8Aesu5vvORZ6WL09YL+5IVo5FSwXDwhTdstOAf0sjY=; b=Gg5ZcObAHlJvGaCbpLwUzetA5+NHQs6BycCsLMoBZl6joElfip0bipdpM2WgW2LkxS IhP76tzkKx7vU3pM4Hz6vbbL8H21u6Hd23aLFQLSElsiIK/YzU2ALEtLz+sunfDfHBZq a52EP+1ZO5ujrwHZj5VyzTmELogEYXJkBt/q+GPJ0eRztuLGKaheji40U2xud6DS9pwx C+QT+/ua9HaTWCf+/m9AxOBaq42Ot8I/Gqt2Yuba0K9bEdTp1G6ubNhn7OqFX3sU8k7/ URA668qFTEe92JlfvL10X37VUNPl5XfHhGs1IAzFa0xU/ITrrVFlk2WnKvofFIRUv2BT PmdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679517349; 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=K8Aesu5vvORZ6WL09YL+5IVo5FSwXDwhTdstOAf0sjY=; b=YNr8Xl6gQYGtnPMxcKvBNGI24JgagY5YQ6PRSQftOnbSbr9hpTejGTR7voN+RPa8e/ zyLgok66CTqWlTkVgfs2FO3ECvrjWQy/aEZn9QKvxM20TvC+JU3rxwgfkI6W2tAFRvjS SyKDYKy9IpWXLztxFXc82wn/SvNGZF6ROldfuaWjib92Sa2MD4MOkaezPFxPGLoRRU0R Gi3gyVeO1kaQPKQoD5SmGhgE1rp5WjajOKhACxjclJU96HyuUMj5QiLNLaS8KTLMcqbS QSRyuiB7rC/u0m2Jnjd+0+nMK/d6o3QZ5x7YPFdVSq8mysKLMg/ftfd6De6XRfkmw+Z2 uxQw== X-Gm-Message-State: AO0yUKUfeXdMgdux+4qqqKvBEmIxOyL7EKRu28I6gFOTnmQlL80lHtvC /DGhUovMN5SswMULb7InunM0HOVguW8= X-Google-Smtp-Source: AKy350b6/PNGrU1z3zYstiHHWJmoHdwvwf1iQoFh6VemNDWFUaJZcr26zbVOFOfyXdBIoZKtBW1zTA== X-Received: by 2002:adf:ee02:0:b0:2cf:f279:378f with SMTP id y2-20020adfee02000000b002cff279378fmr727274wrn.44.1679516344797; Wed, 22 Mar 2023 13:19:04 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id e4-20020a5d4e84000000b002ceac2ccc4asm14570690wru.23.2023.03.22.13.19.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 13:19:04 -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 v5 1/4] mm/mmap/vma_merge: further improve prev/next VMA naming Date: Wed, 22 Mar 2023 20:18:57 +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 'A' with '*' as it is clearer, 'X' with 'N', which feels more natural as this represents the _next_ VMA and finally '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: Vlastimil Babka Reviewed-by: Liam R. Howlett --- 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 Tue Dec 16 03:19:50 2025 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 65704C6FD1F for ; Wed, 22 Mar 2023 20:40:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231433AbjCVUkv (ORCPT ); Wed, 22 Mar 2023 16:40:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230385AbjCVUka (ORCPT ); Wed, 22 Mar 2023 16:40:30 -0400 Received: from mail-lj1-x231.google.com (mail-lj1-x231.google.com [IPv6:2a00:1450:4864:20::231]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBBD72B291 for ; Wed, 22 Mar 2023 13:32:42 -0700 (PDT) Received: by mail-lj1-x231.google.com with SMTP id e21so7692641ljn.7 for ; Wed, 22 Mar 2023 13:32:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679517160; 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=GO8gjHQRXv2Un29P2Y8lUFkK9dWM8KuuH6aA4Tbj+3k=; b=EeQFWNrkiOs4TCDOHiEpuRynMUPCBEsj6uhBA2gbY9LlfsEkkbvugaMZHbMAHfwg91 B+Rjy8B+OvnQCRORQ6wEu4auDzSxFBTCuCCwEr2W+bQCrn6icNih/3vVbkkQ1pYkiGj5 Uk5G5ACj135Y4xqeAUVUYoqCmDjvqIqAkuLlxh74fMM72kHbwHdc+Y1AQ8Xtkx84WrR1 tSeTJn35S530JA9o1tnCVMDHlOanv+Fgsb3904IP2ruzhU/kWx8Zm/S889kTL3/Dcdk2 KQ6IvjkhRIZE/JN0rb7ax9KdguTDufb7MdNwdBQB2m/SLRKOHI63qiBlTn5dciegqJoI Y9dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679517160; 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=GO8gjHQRXv2Un29P2Y8lUFkK9dWM8KuuH6aA4Tbj+3k=; b=dVPlZcdr+PG69WP5TGoIGykeQSL75mKFw7Wdbc5lrnHZgOjw+ev73qfucAtt6Ggw/b Rt+HINRgVfXT9cShcaSVlsf1AQDxirHB6S/yf3L9upHR4lLhC0hd2gotj54EAoqbdExM OHpeyjShZPm67NbxZikK1e905vecG9dSHksZqwm+miJgwQkb7vjzANuSOQM56MP5k/Fn eTd/h8Ou47FCyEjo2uI74aBSxKSEu/YE9m5qfwZUH6aVRXpBpK+Okj3Wwx/5akQEOU7J rmsXf0y7yd8Z6r9fBrH1co7LmzlhnsyOtVYxm5+ycD4cRlSqbvhjzMrp+wwp0TzMAYWA tieA== X-Gm-Message-State: AO0yUKWbI+PHyXLLdnF5IAGpNzWNBDPUznm+PS72HU7jB1kknKd71IR9 ydxvmN84bXp33LIUCPiT2BRMK4oxHKQ= X-Google-Smtp-Source: AKy350ZLTIGfCV6fdBxFd0X0dP8OaZ/Cl+FnHq0weu4JUEjS5hyROEdcB6yDw7AwuS5EnTjGfz8ewA== X-Received: by 2002:adf:f552:0:b0:2cf:f0c3:79ba with SMTP id j18-20020adff552000000b002cff0c379bamr770127wrp.67.1679516346246; Wed, 22 Mar 2023 13:19:06 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id e4-20020a5d4e84000000b002ceac2ccc4asm14570690wru.23.2023.03.22.13.19.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 13:19:05 -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 v5 2/4] mm/mmap/vma_merge: fold curr, next assignment logic Date: Wed, 22 Mar 2023 20:18: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" 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: Vlastimil Babka Reviewed-by: Liam R. Howlett --- 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; =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 || /* 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 */ =20 /* 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; } =20 --=20 2.39.2 From nobody Tue Dec 16 03:19:50 2025 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 3CFAFC6FD1C for ; Wed, 22 Mar 2023 20:29:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232057AbjCVU3f (ORCPT ); Wed, 22 Mar 2023 16:29:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231192AbjCVU3T (ORCPT ); Wed, 22 Mar 2023 16:29:19 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D75297B43 for ; Wed, 22 Mar 2023 13:20:03 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id j24so9453250wrd.0 for ; Wed, 22 Mar 2023 13:20:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679516347; 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=RY15Fh9kVTomLumjnxR3TB6ZLQ5YugEBgBi/gOE3sug=; b=ZQ6PceejuylFAZeuWprGOFSoRDVt0Iwj0nUsFklSXWKCRwXvK1cUrXL/yzWQmnjwIn UsqZpRbd5923H0NMAm7+A7U5N6kHp3t2BXNw8SC9cJEQWD0gkcM97TQhZKCfKYSUQn1T wG0MZXb9BHtfKctHehr2f7LcZKeCGruNh2Gm6/YXFUgPkOlg9dTJqo6TMayiqyAl5u+v f1To7VuIkEMcA4pUamUWWXEcuo8STCn8hIgVWmXUSBiOclE1dhsVfHjCADWsqYePiNOm AGA0+B349DQV2hdKN8o9a+dDst5P/Aqo1cRaXKsmKd4vlsFJnsOh7RvrWkbEFd7Q7iIj dg5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679516347; 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=RY15Fh9kVTomLumjnxR3TB6ZLQ5YugEBgBi/gOE3sug=; b=hOm2VKZDsAEKQFqVCGY5iNEB5EJPtA44ASKaHafgxYNdVttMKkiwH1Q+d0ywGu+UrH YQvvdDjpT0cmsGUviwf0oPaQb5h0KdPqrvzP74JXjhkrAVh4zP8h28RvmuR0lTmER+fY 8pxEhfV3Em5Rbp1TEKapv2XyHKgxAdxYuxklZedi+qT+7nhboWhnxyb6RQ7WN+afbdFo R5hIj//KbfkTXJid0MhjP/JKCfyDbHsuUHqU2zrJDJU++zXI8hR7pUiOnrn7Vi0oA2il RXJ6agHSxukg+iIkGObnxRkwTtuMr75pVxJR8Jgs7U0N+nVYbQkAtKfdG4A8+zxjKmKH GXUw== X-Gm-Message-State: AAQBX9dfsRR5AXqgo5T9N3dxS8DQ4k2R5DjB0h2vBaQBo41PqXqE8mi2 QdyrdrUJCr97G9GKd99se5Y= X-Google-Smtp-Source: AKy350Z5g0xenT3KiCNPHUDl44KA69rJ6VJV0MowkeC8iAVBhljpy06Ixf24x7DC4V2Tem2gpJYoOA== X-Received: by 2002:a5d:5083:0:b0:2ce:a0e1:f2bb with SMTP id a3-20020a5d5083000000b002cea0e1f2bbmr810767wrt.22.1679516347721; Wed, 22 Mar 2023 13:19:07 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id e4-20020a5d4e84000000b002ceac2ccc4asm14570690wru.23.2023.03.22.13.19.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 13:19:06 -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 v5 3/4] mm/mmap/vma_merge: explicitly assign res, vma, extend invariants Date: Wed, 22 Mar 2023 20:18:59 +0000 Message-Id: <83938bed24422cbe5954bbf491341674becfe567.1679516210.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. 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: Vlastimil Babka Reviewed-by: Liam R. Howlett --- 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 Tue Dec 16 03:19:50 2025 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 B88F8C6FD1C for ; Wed, 22 Mar 2023 20:29:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231445AbjCVU3y (ORCPT ); Wed, 22 Mar 2023 16:29:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231879AbjCVU3c (ORCPT ); Wed, 22 Mar 2023 16:29:32 -0400 Received: from mail-wr1-x42f.google.com (mail-wr1-x42f.google.com [IPv6:2a00:1450:4864:20::42f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B98397FF2 for ; Wed, 22 Mar 2023 13:20:18 -0700 (PDT) Received: by mail-wr1-x42f.google.com with SMTP id v1so12247684wrv.1 for ; Wed, 22 Mar 2023 13:20:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679516349; 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=Y03ABEGM1iKLlme/gXEiM5NZEzoEuVUqbJDwPp/dx0w=; b=JuadwNsIZE2z/zJh7KttoUHsZSOV64bXHf0wYV3NZRNw5P46APeVp2CD4NtQ/UNFTD lXrA+LRbhk9k2I23hap3SdJ90UMtx27o1hpcOQ+E0v8OsA6ztAd10VE7wDFuG1PnVb8J OyEMM8C0lVxo86bSnXgbpTyxmeTW34oOYu6U5MhfG0xdl7V7x16YSoIGdkFexrHIp1Dy kDv1lJ6sWMoFMZIYcBvT07cPXsPHRZ5utbgYPAdba1yjeP3JSnWVG548i+FYJI0YDVSz BWK9c4xb0xohwyvPbD/QU6s1alH+WhC112pmLlMbykAMnICx14EfTpYTP5tYgXQFrbDT GsMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679516349; 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=Y03ABEGM1iKLlme/gXEiM5NZEzoEuVUqbJDwPp/dx0w=; b=c2ALxr4BMSArcce01mwN3RvNGo1hvkUQh/lVPcxZevhFuv/Ag28gJndNptkw4268gc YonZNXD282J5woSzU8yTjT7N/vmlGTo63y2HNi+XOvwn0ka3e7HaY0JCqBVmesd36Xgq j4oX1gKGyfSGgfSf/1Y6oZO9EpupT8xn+OiT53Slr/gZDvwOIdnWp35TfTY0ZMTHzS1D CxFqSAnoE30KrBC/aTiFqFtytpuhJHl2FpmwVo9Yipc58Vc/Z+deNW97REZbwWdq/US6 TLb/PVOfEOaewNJhkVDjnzs+dZ2kmoTE4xxqzyy29AVKtTIaRhxiDf4qCR/cVpOcCbU4 c7Rw== X-Gm-Message-State: AAQBX9fokiu9LWqBeRifVNsmXxwatzFAYz4nSM1w5MRxp8fjA9eK67Xc NWJmLH0sSiAYKc1CoAhQaYo= X-Google-Smtp-Source: AKy350YjSXpKJOG/me9kHcIbf3a1DDS+FBHwNhe1vy7I5CQPb9fmUP37fZXOYz52TdKxRyZGjr1yuQ== X-Received: by 2002:a5d:640b:0:b0:2cf:ee9d:ce2f with SMTP id z11-20020a5d640b000000b002cfee9dce2fmr923855wru.19.1679516349137; Wed, 22 Mar 2023 13:19:09 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id e4-20020a5d4e84000000b002ceac2ccc4asm14570690wru.23.2023.03.22.13.19.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 13:19: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 v5 4/4] mm/mmap/vma_merge: init cleanup, be explicit about the non-mergeable case Date: Wed, 22 Mar 2023 20:19:00 +0000 Message-Id: <99259fbc6403e80e270e1cc4612abbc8620b121b.1679516210.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" 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 | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 2a4f63716231..1064e6341a7a 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,24 +939,14 @@ 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); } @@ -964,13 +954,22 @@ struct vm_area_struct *vma_merge(struct vma_iterator = *vmi, struct mm_struct *mm, =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, + can_vma_merge_before(next, vm_flags, anon_vma, file, pgoff+pglen, vm_userfaultfd_ctx, anon_name)) { merge_next =3D true; } =20 + if (!merge_prev && !merge_next) + return NULL; /* Not mergeable. */ + + res =3D vma =3D prev; remove =3D remove2 =3D adjust =3D NULL; + + /* 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); + /* Can we merge both the predecessor and the successor? */ if (merge_prev && merge_next && is_mergeable_anon_vma(prev->anon_vma, next->anon_vma, NULL)) { @@ -983,8 +982,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *v= mi, struct mm_struct *mm, if (!next->anon_vma) err =3D dup_anon_vma(prev, curr); } - } else if (merge_prev) { - err =3D 0; /* case 2 */ + } else if (merge_prev) { /* case 2 */ if (curr) { err =3D dup_anon_vma(prev, curr); if (end =3D=3D curr->vm_end) { /* case 7 */ @@ -994,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; @@ -1010,7 +1008,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 +1016,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