From mboxrd@z Thu Jan 1 00:00:00 1970 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 24C7CC7619A for ; Wed, 22 Mar 2023 20:09:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9F8986B007E; Wed, 22 Mar 2023 16:09:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9A9836B0080; Wed, 22 Mar 2023 16:09:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 786B46B0081; Wed, 22 Mar 2023 16:09:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 6AEE26B007E for ; Wed, 22 Mar 2023 16:09:36 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 37C55160617 for ; Wed, 22 Mar 2023 20:09:36 +0000 (UTC) X-FDA: 80597624352.08.A65DFAD Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by imf17.hostedemail.com (Postfix) with ESMTP id 5598B4001C for ; Wed, 22 Mar 2023 20:09:34 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=WYImK1R1; spf=pass (imf17.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.51 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=1679515774; 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=Y03ABEGM1iKLlme/gXEiM5NZEzoEuVUqbJDwPp/dx0w=; b=63owh08LAzNtkACjHJI3f2ugitE21Lxzdd5/lzMP5yf41ZCB/FmfzgcGckzvjOFJFZ+Oyg 0sierSAm1XTKWpZNfPJKaHfyP8JojQIBwECdMguHi8Q+tixrM7pj3BygBQ9UKDKZYiaTIF OnBjYDTBpJbZHpd4tvS4Ex/xfLJ3zOs= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=WYImK1R1; spf=pass (imf17.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.128.51 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=1679515774; a=rsa-sha256; cv=none; b=lqz0KD8V/zacfqElUXUrl0RSsbII76HuAcKiPX7OvFquNInvToBTH7jo0iXkiQyHLpoDjb dDVIaywpfW76fahbdALH9VtbdJCrNKg3RjIFYjgbHyrg6rkLqO8Mc1OhFxsbdcgaYnwSwl QAnsawePF2nenP9lxysKmrPVwXPC5i4= Received: by mail-wm1-f51.google.com with SMTP id m35so12250590wms.4 for ; Wed, 22 Mar 2023 13:09:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679515772; 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=WYImK1R1ns9OiTq59LItEnCbU92OzqapU8YEGUbqZaU1uDcO0cN7dgFDrwIB7PDV28 LnM41ZbIhxVQbVV68azVbPtMA2LvizaixaJ3/0t+fx1+t2IHJi6nJDtYFZpxcU4Ad1lm aFXHJe2BZpttFnlhyaTZYhrZvtCq9Teyn+77ZDDSF7pw4OB+JXbUpCEIcsxsx0tq/nXL N9VNMrkbO+0utRSm5Tb5eZ5/hcEUJCkgWjSa8zSZD3bLSkZcLoPWiEbU9v8y4wVjisQd qIvrdx3YBLuPzE/OXPiPjUUDuFNjQv87sXnwnWZsa8a4oyADGMJkCdpj8OAlX5e1T+// JT6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679515772; 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=8BIDHY+H5JJ8rQ3S2NZVJhGU91nWZ/SiuT+H/aNMscYwR9xcg9Rcz1KA5IICML4Y+R IfSpWlEytwqHtncRxsqJA9OV9xY622wxDWF5Mn+JdwXMpCv52PwFR8C90fnG1u3Gg1LK P2fkrRI/5bLy3x8eAaNAcc2HCdiQfXOq171SltBzDIFu0I2BfNBwaDlD+9U58LPod5Zx tPbSFKU30ROpu3pldGRfwKZ3xVorS5B5CWCp4z0odshdeMMQ2Jc3XUAhzH8wLTgZ48sv cgujTawt6yBgW9haxLiy4H5LvStlqeS5ufDtaU5DN14oPIBuYmnqBzm3gp1V2u2h27hs +7fQ== X-Gm-Message-State: AO0yUKW4JUspWOE5Vl1hOu6pD8cc3BdS/SobDYrQ6nu9vjxdnRxjJ4no /HGE7fOqu7MXTI1fK1TZUn8M2M4vunM= X-Google-Smtp-Source: AK7set+ATbzj/eQLxtCrE9dHPBKvwKXL3pNhGaIh1/xzV/CmmQiXekthknCewslVcVuOxIMnzPtpcQ== X-Received: by 2002:a1c:6a08:0:b0:3ed:8780:f265 with SMTP id f8-20020a1c6a08000000b003ed8780f265mr561473wmc.21.1679515772745; Wed, 22 Mar 2023 13:09:32 -0700 (PDT) Received: from lucifer.home ([2a00:23c5:dc8c:8701:1663:9a35:5a7b:1d76]) by smtp.googlemail.com with ESMTPSA id a7-20020adff7c7000000b002c70ce264bfsm14664342wrq.76.2023.03.22.13.09.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Mar 2023 13:09:31 -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 v4 4/4] mm/mmap/vma_merge: init cleanup, be explicit about the non-mergeable case Date: Wed, 22 Mar 2023 20:09:22 +0000 Message-Id: X-Mailer: git-send-email 2.39.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam03 X-Stat-Signature: akr17h8xod7n4ps5yr5hdqpi6kdg8tb9 X-Rspamd-Queue-Id: 5598B4001C X-HE-Tag: 1679515774-889554 X-HE-Meta: U2FsdGVkX1+PiIJ4NMC40FMxyHy/3tQL/zn86pM5nizYKP8GYzyvT2ySx0LdpU9CYsal26Ntq1aPREw6/2EouMCEpXs0kP9amfcUYgiI5NR/QALvMvKOMZPFW8vxITOE35MllT+ppZbLGHQYypS7AbHLsjoVORbrxir58c9ADflo4IlaJvRdfpPQx9c1U4gZiZVlsvhxtluRg+/NDTjanFMpsG6bsbU5T/8AgPZJLXTlaKWmsqyc16xD0r0PLboIX06mHyFOTsCbB83E8rSjGxsNNXru67vLeQp71vHm1fVuZ0q2AHLWINeIXCyoWYABCrmmdT/Ezv3jQyZnmWXiswZA/MNiJ6EVARt0l79d2AdEnpD2ss4qa9htPWJFGuLiWWj6XXMr/wiqyAUQcQoIywrHgRSZ6/q+R762RRIpmjITDxGc3lX7lwbaHaeunSpHbCxlTmJPQrvP+u+OV03NG0F8RyEqAFA8qja2wQICp9mnfogI3dcxw1xO+Xmtjbd76j0WDcPIUFNI643Pi7JfjTBMLBFQOysyV/iiNS422Tf3BOGD9xCBoNaiVtFzbxVtzABuK8bBdH7LdENVBiGpFiX3snIWDTO/sNXvPapSG70XeTGvEOOp/0SjdMPl9TMDofs/E/kzlAfOliTTJPDeEWdJADJ42CUOAAe40KgtuzAomvnCNRIZvMfJ/kW5twYpuHTSawrQeYuVEmUDGEEOS7tAl5GeEyaKVRJkz/Ar2kPkCNaNMujlc45P1DGLE60DVlP9Z5W8BvXrXGldG8PiTDZ/JO1pP3L8DNYoIS4/6lBcUOtL69ZXE2rqYszGjk2e9TQZiFE6Kwlx/ly/FkG7SMffV8NHOm5Xs3AdaejlxaZEt/kYF+nzCmbjXHwUBxhI547o4RO6GkInaaz8DcPtc1YFv2+50XamCOw6oLZFjUEgZAEZz1F90+qE58J1Evl2gylN25DdKPwHy99h8GU ygwWVk7A ksMwJl4iZyqE0390wD0/LPI2a7mZ0uel37IfJtjAlhrAS0wpt6yT+eDU2dsvM0OUipbYZe5B/eKaX0AXsxe9VGoLei6oxEDSFhyrsCjX/d390pQ8Q6Hp2xy8tyksm36sq2JFY0mPhaGwdh5X0SbntTRzBn9SOGceGaewcyhQrqnZaHSBLcXyjbxOvZnTXnULfnLkZjSzLwuQ50gaByvh+V4hIsT0LAJtGwL2NXYd6Uev+yvJa1suru/LU+tu8TkzQd+JHWIW0w8yZqjFzzKUO+yFLJ962HdJ3CRHYH4ov8b3EI1MJ3JqSeOe1gzWFWNcCXzDm2aB/GFzoS+1XCOapDl/XXXLEIbBd6L8XSVSe0QUFsOV+Si6FscFapmKykCQJrW5mAfa/krUmo7G7tefZlp7yNlboXJfY1oIDT3DjfI3NAZVhHqwLYcIkV/Kw+jfsQSxzm0Ko00bbF1lV3UzzshPhcuqPmTZqh1XQ2dp/1ri7ync= 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: Rather than setting err = -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 = (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 = -1; + struct vma_prepare vp; + pgoff_t vma_pgoff; + int err = 0; bool merge_prev = false; bool merge_next = false; bool vma_expanded = false; - struct vma_prepare vp; + unsigned long vma_start = addr; unsigned long vma_end = end; + pgoff_t pglen = (end - addr) >> PAGE_SHIFT; long adj_start = 0; - unsigned long vma_start = addr; validate_mm(mm); /* @@ -939,24 +939,14 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm, else next = NULL; /* case 5 */ - /* - * 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 = vma = prev; - - /* Verify some invariant that must be enforced by the caller. */ - VM_WARN_ON(prev && addr <= prev->vm_start); - VM_WARN_ON(curr && (addr != curr->vm_start || end > curr->vm_end)); - VM_WARN_ON(addr >= end); - if (prev) { vma_start = prev->vm_start; vma_pgoff = prev->vm_pgoff; + /* Can we merge the predecessor? */ - if (prev->vm_end == addr && mpol_equal(vma_policy(prev), policy) + if (addr == 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 = true; vma_prev(vmi); } @@ -964,13 +954,22 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm, /* 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 = true; } + if (!merge_prev && !merge_next) + return NULL; /* Not mergeable. */ + + res = vma = prev; remove = remove2 = adjust = NULL; + + /* Verify some invariant that must be enforced by the caller. */ + VM_WARN_ON(prev && addr <= prev->vm_start); + VM_WARN_ON(curr && (addr != curr->vm_start || end > curr->vm_end)); + VM_WARN_ON(addr >= 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 *vmi, struct mm_struct *mm, if (!next->anon_vma) err = dup_anon_vma(prev, curr); } - } else if (merge_prev) { - err = 0; /* case 2 */ + } else if (merge_prev) { /* case 2 */ if (curr) { err = dup_anon_vma(prev, curr); if (end == curr->vm_end) { /* case 7 */ @@ -994,7 +992,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm, adj_start = (end - curr->vm_start); } } - } else if (merge_next) { + } else { /* merge_next */ res = next; if (prev && addr < prev->vm_end) { /* case 4 */ vma_end = addr; @@ -1010,7 +1008,6 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm, vma_start = addr; vma_end = next->vm_end; vma_pgoff = next->vm_pgoff; - err = 0; if (curr) { /* case 8 */ vma_pgoff = curr->vm_pgoff; remove = curr; @@ -1019,7 +1016,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, struct mm_struct *mm, } } - /* Cannot merge or error in anon_vma clone */ + /* Error in anon_vma clone. */ if (err) return NULL; -- 2.39.2