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 38C47C76195 for ; Tue, 21 Mar 2023 20:46:30 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 757116B007D; Tue, 21 Mar 2023 16:46:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6E198900003; Tue, 21 Mar 2023 16:46:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 55A10900002; Tue, 21 Mar 2023 16:46:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 3E3D46B007D for ; Tue, 21 Mar 2023 16:46:28 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id F1DD6140216 for ; Tue, 21 Mar 2023 20:46:27 +0000 (UTC) X-FDA: 80594088414.01.CEF92EB Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by imf04.hostedemail.com (Postfix) with ESMTP id 0655E40018 for ; Tue, 21 Mar 2023 20:46:25 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=Xthyp8pN; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf04.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1679431586; 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=MfsZBuYgS6pqJ3Am6jGw1RAqKs9VHOoqJ2PWKKositw=; b=EOvl2o4fflJT01jbvWtn0YbeL99chH5qBI5KaRGAXhgyvuuWjhG4hn7Xv4lBAy8UfeSxdD rz6y2Eix5p+HoByifJgGGThtRehjnygMGooGkQmx5EhaaX3ldwJFK236IcJklFZmbc9bGe B7BK0maY1NnLmGACv8FLFuNKU9ixUAc= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=Xthyp8pN; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf04.hostedemail.com: domain of lstoakes@gmail.com designates 209.85.221.46 as permitted sender) smtp.mailfrom=lstoakes@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1679431586; a=rsa-sha256; cv=none; b=kKl/fsXNVgBE0Weni8l0kfyvE0CD1n4UBEnzz+hZP2+fp3e3J6+ixRMqa7UdA09uqrmzzA wJ6s43xlGGjJYv4oKv0LLGcqFkl5iMaLPoTIzYdpDzJhiWg1BZkUEqAf3ASk0oW41BP+DH a2m7W7FOtXmm1dJ4rfNtLReamqHV4g8= Received: by mail-wr1-f46.google.com with SMTP id v1so8931070wrv.1 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=hAkIk14rIOCYoxsEAVTHjmDm/EqGcvgwgQ6YWcyUxID3mIzTDTqbuuWV1+ki4+eMp+ pAp4RCcEgiJqhFyzRbL9p/uaRAW3W049AEU2OJc7DxanLj1u4JbQEJ3YQwWYZZOJMP1g NaaLKKgfKglQKFzv1JsLtbfSfx3lAIO8zl0Ef8azaSBpKLgLJyjs2VrCt+ryK3zIB1Xz x72JOmNCCeo8wFDBgsAnN3PIxRb+pbKZHquaWPO9SarjkSzHozADaEMbbzoVuqcfZ5TD 5IZpzSgFLeY0BgYY/RG7eiksG2XGOS7iTcZIA+ZKDCPTaUpJ6tAsC1jk6p2WeYulGTug I7bg== X-Gm-Message-State: AO0yUKUF37yHkOQ5q8gfDH7N9rfydEJswxaRO7vrp2TF+L4JzGnMazo1 PSigh3/An59uX6dEdrSlSlPQUsISbB4= 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: 8bit X-Rspamd-Queue-Id: 0655E40018 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: 5xohrg475ki4p8g9j1n5jcubxgjzzy4e X-HE-Tag: 1679431585-569775 X-HE-Meta: U2FsdGVkX1+jar39WDFCkRGyOXZq35EZphF8Rfvmzf7XEUFtbOyjrD9Ty16DVt20THrXgT4HLUBe5d4/hdBGy/p5OFWQZ0uKM1JQh/AYvPJiTyyEUzIwJsILpgEG8OC8PEzu7IuUD6MK1rAtb2rrRy5u+PqOdA8hdC8RXU8hRGT/8KenGkUcyUmFC38Ajq76n65IXvWO8ITzyPang97BFwickCxZBAdAvJj1Tb3Wk1ZKCl/N5FcVkJynQqsMlfPvfzoQjcJHO9s9OND3vPpeSdb+gqvsFFHWxNaWsOaRTmcSr/L72wkmYZ7NuPziU9uoEHsohnqGmO0Q/YuOgNbN78l6gUchpzj82mMWzNoJrFZyd9B8XH7aw7fhPMAZMO+MEEs6luKWaymlfReqb3LJx4vAIegUGnqZSWg9jaVVijYGmFnRtqNNvmuBVO0BNBQcw26M4DhDgCcW5IGUoIAv4W7/IP/O7dQLETSin+HAACADttMmfXPZ/sVY+FwtlTZsZzgDwJdji0PxmBazZxohfM6o5fXi/IZfKW1WzVzXJy8P4X0mL3IB7B+e9ehKQq0CuE+bn1i0cMPM3vbfD7gi67DA4TPQ+3hVOKWk0IOrYoQW67WM50V2V3bMha7D2Ch1+VZCPG+bj5fiSD2lKelc3ZZ3HFqbidvX1cvBXaRj4/vA1ftfjIfF6DgvASIvdlOQhNCMT7OK8f2+ekekO37wNeXoc6TRu/+ZjfesoU30XTOCInKQ2xM7ZCeCTSG3RVff+5yyOoQE4t3tGFvMT4OKDMcx/zzzJaMBkpUdBdekRqUYRS83BxmEItcgxbdnn8CeD+GzC2imrux5zW5QOGiFY4e6KNxMCnYFaPa58La1DNwHqNoGifqDwZO2LsUm7qApAF/On74yjnqD+GVksgNX8ozpPISM8UEeGsSVLvam0QUX2KH/RdA/tYxsXz+qbBZX0cA6dp5jsmRopoIJSMH ldtwEXoL UdjtLV3haLFsX/rvW8aBDMTUXQKMe0atbNHfOO1lciJzDKTepOVLImeE+N+zYLXygQajhWa9eVBsNuPJPTzotWVNRJDOllaCV60ZnViExEsYPI47a/2O8aJa5/nyzgCeI7jVx+bWWMX7ioqdk6+GqgOwIcou0hqqXmYSC0nmnZ1yUs3Xbuh31O0pd2Y1nYGeBZrMx42hakDlNOqsBdXTSuTYL8oX5Dceh4z6Ojk8dDznyzoQ/clRoE2SHbkCRT1Dmtk190EJthcrYDUcdLpYpyu7gt/s7ZAFMY3lsdJzlSiKunvEW2cQhD6daT4dUe0qw4wKvne/b9uLApy/qS2ZH4Ncyl1TQfa0EKOUQXyXhlDbo/pewvMNa6qQwyr6iS6wb5ewvb9tAuG/0qGEEifQIufIEJUOGC3wgrloAmNzMEZd1qXjSeG4xCL5ITuh+hPwPwO14fSimryU2WTcXpCDI7revvXygpN2Y0w1r8jRsnctNUyc4kjsbNxCcGfVap00AsPse 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: 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 == curr->vm_start should curr exist, so assert as much. Signed-off-by: Lorenzo Stoakes --- 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 *vmi, struct mm_struct *mm, { pgoff_t pglen = (end - addr) >> PAGE_SHIFT; pgoff_t vma_pgoff; - struct vm_area_struct *curr, *next, *res = NULL; + struct vm_area_struct *curr, *next, *res; struct vm_area_struct *vma, *adjust, *remove, *remove2; int err = -1; bool merge_prev = 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 = vma_lookup(mm, end); - /* 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 = vma = prev; + + /* Verify some invariant that must be enforced by the caller. */ VM_WARN_ON(prev && addr <= prev->vm_start); - VM_WARN_ON(curr && end > curr->vm_end); + VM_WARN_ON(curr && (addr != curr->vm_start || end > curr->vm_end)); VM_WARN_ON(addr >= end); if (prev) { - res = prev; - vma = prev; vma_start = prev->vm_start; vma_pgoff = prev->vm_pgoff; /* Can we merge the predecessor? */ @@ -958,6 +962,7 @@ struct vm_area_struct *vma_merge(struct vma_iterator *vmi, 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 = -(prev->vm_end - addr); err = 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 = next; /* case 3 */ vma_start = addr; vma_end = next->vm_end; -- 2.39.2