Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2217294/?format=api
{ "id": 2217294, "url": "http://patchwork.ozlabs.org/api/patches/2217294/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260327205457.604224-5-surenb@google.com/", "project": { "id": 2, "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api", "name": "Linux PPC development", "link_name": "linuxppc-dev", "list_id": "linuxppc-dev.lists.ozlabs.org", "list_email": "linuxppc-dev@lists.ozlabs.org", "web_url": "https://github.com/linuxppc/wiki/wiki", "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git", "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/", "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/", "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}" }, "msgid": "<20260327205457.604224-5-surenb@google.com>", "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260327205457.604224-5-surenb@google.com/", "date": "2026-03-27T20:54:55", "name": "[v6,4/6] mm/vma: use vma_start_write_killable() in vma operations", "commit_ref": null, "pull_url": null, "state": "handled-elsewhere", "archived": false, "hash": "7759a5613641c9adc3d075f6982059e43d3a1e24", "submitter": { "id": 74729, "url": "http://patchwork.ozlabs.org/api/people/74729/?format=api", "name": "Suren Baghdasaryan", "email": "surenb@google.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260327205457.604224-5-surenb@google.com/mbox/", "series": [ { "id": 497828, "url": "http://patchwork.ozlabs.org/api/series/497828/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=497828", "date": "2026-03-27T20:54:51", "name": "Use killable vma write locking in most places", "version": 6, "mbox": "http://patchwork.ozlabs.org/series/497828/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2217294/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2217294/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linuxppc-dev+bounces-18942-incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linuxppc-dev@lists.ozlabs.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256\n header.s=20251104 header.b=mBYUENlI;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=112.213.38.117; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-18942-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=\"2607:f8b0:4864:20::134a\"", "lists.ozlabs.org;\n dmarc=pass (p=reject dis=none) header.from=google.com", "lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256\n header.s=20251104 header.b=mBYUENlI;\n\tdkim-atps=neutral", "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=flex--surenb.bounces.google.com\n (client-ip=2607:f8b0:4864:20::134a; helo=mail-dy1-x134a.google.com;\n envelope-from=3ru7gaqykdpsvxuhqejrrjoh.frpolqx0ssf-ghyolvwv.r2odev.ruj@flex--surenb.bounces.google.com;\n receiver=lists.ozlabs.org)" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fjCbH6213z1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 28 Mar 2026 07:55:39 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fjCZn2Q0Zz2ytJ;\n\tSat, 28 Mar 2026 07:55:13 +1100 (AEDT)", "from mail-dy1-x134a.google.com (mail-dy1-x134a.google.com\n [IPv6:2607:f8b0:4864:20::134a])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4fjCZm2H9rz2ysZ\n\tfor <linuxppc-dev@lists.ozlabs.org>; Sat, 28 Mar 2026 07:55:12 +1100 (AEDT)", "by mail-dy1-x134a.google.com with SMTP id\n 5a478bee46e88-2c16233ee11so2440010eec.1\n for <linuxppc-dev@lists.ozlabs.org>;\n Fri, 27 Mar 2026 13:55:12 -0700 (PDT)" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1774644913;\n\tcv=none;\n b=P1uS8xrghRl5bsfEM/6/D9nXLycZ2dGNas87gB/Xzssc37il6gK8v6QR9YjFx+AClreMaXjhSsyCipLQ+Lh1lFRdsmIOSSmRtOqNjYVeZjB+nLz+ru+VFt+0ntNlL6ETqHe/mDK0cJf/pftaEYLT835nua1uoKkjRv8T7pMPz5zi8KZOWmQHlEril9ZGsRfj81wO/G6diQzL4w91p4JiZwny/14rCQuHdmt5IUs1XFd4O915kSzT30e6RCl/Qn2Q71lxmuuwfq2wZIMbGsGPoOkwAIBYjPGCQrK2OAfuJbTAApfyHRdBK/hxiq1KvYKGcGKQf65+BNKj0EX3XwQHQg==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1774644913; c=relaxed/relaxed;\n\tbh=6skjtd7OxVmiwFu5TmEIQZKDuU+5vel5eIP7VGPQHkg=;\n\th=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From:\n\t To:Cc:Content-Type;\n b=McTk6z6GPvGiqEbqCISSZRtpa2t+VO8ppXBB4F5uJ1BGqWqR3Z4pObu+wTSnOaYy/KaW0OUhnCjP85a7pKZ1fIW1cgWE9yH00PxyAYZCDx3AWii9wyvgc+t7iNEbqEbsIDk8MLJCo8o9I0Sn6ompy6HQuPMtyfPnGC+GEcR70oZT4cHerq0EpGdxuSUHzSiu53RHEHVa1s2EwwWnIBpL/bx8+gaBMHpM3RZZDF0jJxW47RQ0uh+72vojrgTIFMYfLTl8VEDLnOFzFjIVnvO1V+igfHBGKB26hoi28O5lQqZapELC9ieX7xd7ex9D0FDqWjCw8oJjXrgK/JCwJz9BGQ==", "ARC-Authentication-Results": "i=1; lists.ozlabs.org;\n dmarc=pass (p=reject dis=none) header.from=google.com;\n dkim=pass (2048-bit key;\n unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256\n header.s=20251104 header.b=mBYUENlI; dkim-atps=neutral;\n spf=pass (client-ip=2607:f8b0:4864:20::134a; helo=mail-dy1-x134a.google.com;\n envelope-from=3ru7gaqykdpsvxuhqejrrjoh.frpolqx0ssf-ghyolvwv.r2odev.ruj@flex--surenb.bounces.google.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=flex--surenb.bounces.google.com", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=google.com; s=20251104; t=1774644911; x=1775249711;\n darn=lists.ozlabs.org;\n h=cc:to:from:subject:message-id:references:mime-version:in-reply-to\n :date:from:to:cc:subject:date:message-id:reply-to;\n bh=6skjtd7OxVmiwFu5TmEIQZKDuU+5vel5eIP7VGPQHkg=;\n b=mBYUENlIRvA0k77k+aXF2GBTgX9BE+WCkqm4kOgwkKjGeClIZR1J1+hQk7SdgF3hXX\n VpFFHwoc01wq4grLycgKn+vBK+UH2LchUzbjlz27JY09JuP41NtfYVdF41J1sK714wEw\n FlkYXtuaLsiKwY5va0qkvdKuPohtiEIabwszZ2WOQAodC1CJnhO/YPXftt/thudHisjA\n ZPRJAP9JHPMHgYsljty6uwSMMy4stk8g4IgTijmA/b+kC/ugMHXvc/y/lCglaTSEtJP4\n WZVv9VfsA3ryvlAjcMHdnWkgpPr8b0i/xBEMNUoM8QlNrNWQ8Px+7gSG1XuiWYPOMxVf\n qMTw==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774644911; x=1775249711;\n h=cc:to:from:subject:message-id:references:mime-version:in-reply-to\n :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=6skjtd7OxVmiwFu5TmEIQZKDuU+5vel5eIP7VGPQHkg=;\n b=smUKOwDKxqdFYEsueVBQH6nnPU6hsl+0xqD9xAKeimT5RA/dBVMLItiivvonYN2sfv\n b1S1diJvkXK2huKLDQcDOY2A4Ktd/8Zcij/ZB/irBjsU2G1IIGozvO7xI7vns8DHiUnw\n HN+1KVDO5EYay6iQxrTR1gyAJRYJTK6zHnZTRIibP54zPu3cvTqPxpNZwx26aKxu+lxs\n p9NTJzG9X+d0etugpDcyfKh5zHd4N2oS+81QLAEqvQq2XrM0W7hWvEMcwaS17ps+Oc6z\n 6JX6P4Kbcg7xvQumAo/E4WVk10t5ItS4toFBUTrSFLaTi75v7q877OaetASXawpUW6VU\n s/7g==", "X-Forwarded-Encrypted": "i=1;\n AJvYcCVt8rz8hYB/9/ZWz9oENpcxaY3tAaXSPOVlR37DWwv9iPoPLLgTEg9ZLQJBB56+FiF8MKf2Gx+LlSvFujQ=@lists.ozlabs.org", "X-Gm-Message-State": "AOJu0YzYlg3uZ/eURr0xidW6+OynnQoItjoORC5v4FYCK55hKmOoUBoq\n\tc/B/HALp2sBnGnebFqzi2s07uhD84zc5qPaG0DREQ8Jua/XYWKKczcwpRRdfcRuA9jd/IoKGMDR\n\tC+bUNrQ==", "X-Received": "from dybrq15.prod.google.com\n ([2002:a05:7301:468f:b0:2c3:adf7:d755])\n (user=surenb job=prod-delivery.src-stubby-dispatcher) by\n 2002:a05:7300:5b89:b0:2c1:1dea:c443\n with SMTP id 5a478bee46e88-2c185e460a2mr2052736eec.19.1774644910254; Fri, 27\n Mar 2026 13:55:10 -0700 (PDT)", "Date": "Fri, 27 Mar 2026 13:54:55 -0700", "In-Reply-To": "<20260327205457.604224-1-surenb@google.com>", "X-Mailing-List": "linuxppc-dev@lists.ozlabs.org", "List-Id": "<linuxppc-dev.lists.ozlabs.org>", "List-Help": "<mailto:linuxppc-dev+help@lists.ozlabs.org>", "List-Owner": "<mailto:linuxppc-dev+owner@lists.ozlabs.org>", "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>", "List-Archive": "<https://lore.kernel.org/linuxppc-dev/>,\n <https://lists.ozlabs.org/pipermail/linuxppc-dev/>", "List-Subscribe": "<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>", "List-Unsubscribe": "<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>", "Precedence": "list", "Mime-Version": "1.0", "References": "<20260327205457.604224-1-surenb@google.com>", "X-Mailer": "git-send-email 2.53.0.1018.g2bb0e51243-goog", "Message-ID": "<20260327205457.604224-5-surenb@google.com>", "Subject": "[PATCH v6 4/6] mm/vma: use vma_start_write_killable() in vma\n operations", "From": "Suren Baghdasaryan <surenb@google.com>", "To": "akpm@linux-foundation.org", "Cc": "willy@infradead.org, david@kernel.org, ziy@nvidia.com,\n\tmatthew.brost@intel.com, joshua.hahnjy@gmail.com, rakie.kim@sk.com,\n\tbyungchul@sk.com, gourry@gourry.net, ying.huang@linux.alibaba.com,\n\tapopple@nvidia.com, ljs@kernel.org, baolin.wang@linux.alibaba.com,\n\tLiam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com,\n\tdev.jain@arm.com, baohua@kernel.org, lance.yang@linux.dev, vbabka@suse.cz,\n\tjannh@google.com, rppt@kernel.org, mhocko@suse.com, pfalcato@suse.de,\n\tkees@kernel.org, maddy@linux.ibm.com, npiggin@gmail.com, mpe@ellerman.id.au,\n\tchleroy@kernel.org, borntraeger@linux.ibm.com, frankja@linux.ibm.com,\n\timbrenda@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com,\n\tagordeev@linux.ibm.com, svens@linux.ibm.com, gerald.schaefer@linux.ibm.com,\n\tlinux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, linux-s390@vger.kernel.org, surenb@google.com", "Content-Type": "text/plain; charset=\"UTF-8\"", "X-Spam-Status": "No, score=-7.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED,\n\tDKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,\n\tUSER_IN_DEF_DKIM_WL autolearn=disabled version=4.0.1 OzLabs 8", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org" }, "content": "Replace vma_start_write() with vma_start_write_killable(), improving\nreaction time to the kill signal.\nReplace vma_start_write() calls when we operate on VMAs.\n\nTo propagate errors from vma_merge_existing_range() and vma_expand()\nwe fake an ENOMEM error when we fail due to a pending fatal signal.\nThis is a temporary workaround. Fixing this requires some refactoring\nand will be done separately in the future.\n\nIn a number of places we now lock VMA earlier than before to avoid\ndoing work and undoing it later if a fatal signal is pending. This\nis safe because the moves are happening within sections where we\nalready hold the mmap_write_lock, so the moves do not change the\nlocking order relative to other kernel locks.\n\nSuggested-by: Matthew Wilcox <willy@infradead.org>\nSigned-off-by: Suren Baghdasaryan <surenb@google.com>\n---\n mm/vma.c | 146 ++++++++++++++++++++++++++++++++++++++------------\n mm/vma_exec.c | 6 ++-\n 2 files changed, 117 insertions(+), 35 deletions(-)", "diff": "diff --git a/mm/vma.c b/mm/vma.c\nindex ba78ab1f397a..cc382217f730 100644\n--- a/mm/vma.c\n+++ b/mm/vma.c\n@@ -524,6 +524,21 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \t\tnew->vm_pgoff += ((addr - vma->vm_start) >> PAGE_SHIFT);\n \t}\n \n+\t/*\n+\t * Lock VMAs before cloning to avoid extra work if fatal signal\n+\t * is pending.\n+\t */\n+\terr = vma_start_write_killable(vma);\n+\tif (err)\n+\t\tgoto out_free_vma;\n+\t/*\n+\t * Locking a new detached VMA will always succeed but it's just a\n+\t * detail of the current implementation, so handle it all the same.\n+\t */\n+\terr = vma_start_write_killable(new);\n+\tif (err)\n+\t\tgoto out_free_vma;\n+\n \terr = -ENOMEM;\n \tvma_iter_config(vmi, new->vm_start, new->vm_end);\n \tif (vma_iter_prealloc(vmi, new))\n@@ -543,9 +558,6 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \tif (new->vm_ops && new->vm_ops->open)\n \t\tnew->vm_ops->open(new);\n \n-\tvma_start_write(vma);\n-\tvma_start_write(new);\n-\n \tinit_vma_prep(&vp, vma);\n \tvp.insert = new;\n \tvma_prepare(&vp);\n@@ -900,12 +912,22 @@ static __must_check struct vm_area_struct *vma_merge_existing_range(\n \t}\n \n \t/* No matter what happens, we will be adjusting middle. */\n-\tvma_start_write(middle);\n+\terr = vma_start_write_killable(middle);\n+\tif (err) {\n+\t\t/* Ensure error propagates. */\n+\t\tvmg->give_up_on_oom = false;\n+\t\tgoto abort;\n+\t}\n \n \tif (merge_right) {\n \t\tvma_flags_t next_sticky;\n \n-\t\tvma_start_write(next);\n+\t\terr = vma_start_write_killable(next);\n+\t\tif (err) {\n+\t\t\t/* Ensure error propagates. */\n+\t\t\tvmg->give_up_on_oom = false;\n+\t\t\tgoto abort;\n+\t\t}\n \t\tvmg->target = next;\n \t\tnext_sticky = vma_flags_and_mask(&next->flags, VMA_STICKY_FLAGS);\n \t\tvma_flags_set_mask(&sticky_flags, next_sticky);\n@@ -914,7 +936,12 @@ static __must_check struct vm_area_struct *vma_merge_existing_range(\n \tif (merge_left) {\n \t\tvma_flags_t prev_sticky;\n \n-\t\tvma_start_write(prev);\n+\t\terr = vma_start_write_killable(prev);\n+\t\tif (err) {\n+\t\t\t/* Ensure error propagates. */\n+\t\t\tvmg->give_up_on_oom = false;\n+\t\t\tgoto abort;\n+\t\t}\n \t\tvmg->target = prev;\n \n \t\tprev_sticky = vma_flags_and_mask(&prev->flags, VMA_STICKY_FLAGS);\n@@ -1170,10 +1197,18 @@ int vma_expand(struct vma_merge_struct *vmg)\n \tvma_flags_t sticky_flags =\n \t\tvma_flags_and_mask(&vmg->vma_flags, VMA_STICKY_FLAGS);\n \tvma_flags_t target_sticky;\n-\tint err = 0;\n+\tint err;\n \n \tmmap_assert_write_locked(vmg->mm);\n-\tvma_start_write(target);\n+\terr = vma_start_write_killable(target);\n+\tif (err) {\n+\t\t/*\n+\t\t * Override VMA_MERGE_NOMERGE to prevent callers from\n+\t\t * falling back to a new VMA allocation.\n+\t\t */\n+\t\tvmg->state = VMA_MERGE_ERROR_NOMEM;\n+\t\treturn err;\n+\t}\n \n \ttarget_sticky = vma_flags_and_mask(&target->flags, VMA_STICKY_FLAGS);\n \n@@ -1201,6 +1236,19 @@ int vma_expand(struct vma_merge_struct *vmg)\n \t * we don't need to account for vmg->give_up_on_mm here.\n \t */\n \tif (remove_next) {\n+\t\t/*\n+\t\t * Lock the VMA early to avoid extra work if fatal signal\n+\t\t * is pending.\n+\t\t */\n+\t\terr = vma_start_write_killable(next);\n+\t\tif (err) {\n+\t\t\t/*\n+\t\t\t * Override VMA_MERGE_NOMERGE to prevent callers from\n+\t\t\t * falling back to a new VMA allocation.\n+\t\t\t */\n+\t\t\tvmg->state = VMA_MERGE_ERROR_NOMEM;\n+\t\t\treturn err;\n+\t\t}\n \t\terr = dup_anon_vma(target, next, &anon_dup);\n \t\tif (err)\n \t\t\treturn err;\n@@ -1214,7 +1262,6 @@ int vma_expand(struct vma_merge_struct *vmg)\n \tif (remove_next) {\n \t\tvma_flags_t next_sticky;\n \n-\t\tvma_start_write(next);\n \t\tvmg->__remove_next = true;\n \n \t\tnext_sticky = vma_flags_and_mask(&next->flags, VMA_STICKY_FLAGS);\n@@ -1252,9 +1299,14 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \t unsigned long start, unsigned long end, pgoff_t pgoff)\n {\n \tstruct vma_prepare vp;\n+\tint err;\n \n \tWARN_ON((vma->vm_start != start) && (vma->vm_end != end));\n \n+\terr = vma_start_write_killable(vma);\n+\tif (err)\n+\t\treturn err;\n+\n \tif (vma->vm_start < start)\n \t\tvma_iter_config(vmi, vma->vm_start, start);\n \telse\n@@ -1263,8 +1315,6 @@ int vma_shrink(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \tif (vma_iter_prealloc(vmi, NULL))\n \t\treturn -ENOMEM;\n \n-\tvma_start_write(vma);\n-\n \tinit_vma_prep(&vp, vma);\n \tvma_prepare(&vp);\n \tvma_adjust_trans_huge(vma, start, end, NULL);\n@@ -1453,7 +1503,9 @@ static int vms_gather_munmap_vmas(struct vma_munmap_struct *vms,\n \t\t\tif (error)\n \t\t\t\tgoto end_split_failed;\n \t\t}\n-\t\tvma_start_write(next);\n+\t\terror = vma_start_write_killable(next);\n+\t\tif (error)\n+\t\t\tgoto munmap_gather_failed;\n \t\tmas_set(mas_detach, vms->vma_count++);\n \t\terror = mas_store_gfp(mas_detach, next, GFP_KERNEL);\n \t\tif (error)\n@@ -1848,12 +1900,16 @@ static void vma_link_file(struct vm_area_struct *vma, bool hold_rmap_lock)\n static int vma_link(struct mm_struct *mm, struct vm_area_struct *vma)\n {\n \tVMA_ITERATOR(vmi, mm, 0);\n+\tint err;\n+\n+\terr = vma_start_write_killable(vma);\n+\tif (err)\n+\t\treturn err;\n \n \tvma_iter_config(&vmi, vma->vm_start, vma->vm_end);\n \tif (vma_iter_prealloc(&vmi, vma))\n \t\treturn -ENOMEM;\n \n-\tvma_start_write(vma);\n \tvma_iter_store_new(&vmi, vma);\n \tvma_link_file(vma, /* hold_rmap_lock= */false);\n \tmm->map_count++;\n@@ -2239,9 +2295,8 @@ int mm_take_all_locks(struct mm_struct *mm)\n \t * is reached.\n \t */\n \tfor_each_vma(vmi, vma) {\n-\t\tif (signal_pending(current))\n+\t\tif (signal_pending(current) || vma_start_write_killable(vma))\n \t\t\tgoto out_unlock;\n-\t\tvma_start_write(vma);\n \t}\n \n \tvma_iter_init(&vmi, mm, 0);\n@@ -2540,8 +2595,8 @@ static int __mmap_new_vma(struct mmap_state *map, struct vm_area_struct **vmap,\n \tstruct mmap_action *action)\n {\n \tstruct vma_iterator *vmi = map->vmi;\n-\tint error = 0;\n \tstruct vm_area_struct *vma;\n+\tint error;\n \n \t/*\n \t * Determine the object being mapped and call the appropriate\n@@ -2552,6 +2607,14 @@ static int __mmap_new_vma(struct mmap_state *map, struct vm_area_struct **vmap,\n \tif (!vma)\n \t\treturn -ENOMEM;\n \n+\t/*\n+\t * Lock the VMA early to avoid extra work if fatal signal\n+\t * is pending.\n+\t */\n+\terror = vma_start_write_killable(vma);\n+\tif (error)\n+\t\tgoto free_vma;\n+\n \tvma_iter_config(vmi, map->addr, map->end);\n \tvma_set_range(vma, map->addr, map->end, map->pgoff);\n \tvma->flags = map->vma_flags;\n@@ -2582,8 +2645,6 @@ static int __mmap_new_vma(struct mmap_state *map, struct vm_area_struct **vmap,\n \tWARN_ON_ONCE(!arch_validate_flags(map->vm_flags));\n #endif\n \n-\t/* Lock the VMA since it is modified after insertion into VMA tree */\n-\tvma_start_write(vma);\n \tvma_iter_store_new(vmi, vma);\n \tmap->mm->map_count++;\n \tvma_link_file(vma, action->hide_from_rmap_until_complete);\n@@ -2878,6 +2939,7 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \t\t unsigned long addr, unsigned long len, vma_flags_t vma_flags)\n {\n \tstruct mm_struct *mm = current->mm;\n+\tint err;\n \n \t/*\n \t * Check against address space limits by the changed size\n@@ -2910,24 +2972,33 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \n \t\tif (vma_merge_new_range(&vmg))\n \t\t\tgoto out;\n-\t\telse if (vmg_nomem(&vmg))\n+\t\tif (vmg_nomem(&vmg)) {\n+\t\t\terr = -ENOMEM;\n \t\t\tgoto unacct_fail;\n+\t\t}\n \t}\n \n \tif (vma)\n \t\tvma_iter_next_range(vmi);\n \t/* create a vma struct for an anonymous mapping */\n \tvma = vm_area_alloc(mm);\n-\tif (!vma)\n+\tif (!vma) {\n+\t\terr = -ENOMEM;\n \t\tgoto unacct_fail;\n+\t}\n \n \tvma_set_anonymous(vma);\n \tvma_set_range(vma, addr, addr + len, addr >> PAGE_SHIFT);\n \tvma->flags = vma_flags;\n \tvma->vm_page_prot = vm_get_page_prot(vma_flags_to_legacy(vma_flags));\n-\tvma_start_write(vma);\n-\tif (vma_iter_store_gfp(vmi, vma, GFP_KERNEL))\n+\tif (vma_start_write_killable(vma)) {\n+\t\terr = -EINTR;\n+\t\tgoto vma_lock_fail;\n+\t}\n+\tif (vma_iter_store_gfp(vmi, vma, GFP_KERNEL)) {\n+\t\terr = -ENOMEM;\n \t\tgoto mas_store_fail;\n+\t}\n \n \tmm->map_count++;\n \tvalidate_mm(mm);\n@@ -2942,10 +3013,11 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \treturn 0;\n \n mas_store_fail:\n+vma_lock_fail:\n \tvm_area_free(vma);\n unacct_fail:\n \tvm_unacct_memory(len >> PAGE_SHIFT);\n-\treturn -ENOMEM;\n+\treturn err;\n }\n \n /**\n@@ -3112,8 +3184,8 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)\n \tstruct mm_struct *mm = vma->vm_mm;\n \tstruct vm_area_struct *next;\n \tunsigned long gap_addr;\n-\tint error = 0;\n \tVMA_ITERATOR(vmi, mm, vma->vm_start);\n+\tint error;\n \n \tif (!vma_test(vma, VMA_GROWSUP_BIT))\n \t\treturn -EFAULT;\n@@ -3149,12 +3221,14 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)\n \n \t/* We must make sure the anon_vma is allocated. */\n \tif (unlikely(anon_vma_prepare(vma))) {\n-\t\tvma_iter_free(&vmi);\n-\t\treturn -ENOMEM;\n+\t\terror = -ENOMEM;\n+\t\tgoto vma_prep_fail;\n \t}\n \n \t/* Lock the VMA before expanding to prevent concurrent page faults */\n-\tvma_start_write(vma);\n+\terror = vma_start_write_killable(vma);\n+\tif (error)\n+\t\tgoto vma_lock_fail;\n \t/* We update the anon VMA tree. */\n \tanon_vma_lock_write(vma->anon_vma);\n \n@@ -3183,8 +3257,10 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)\n \t\t}\n \t}\n \tanon_vma_unlock_write(vma->anon_vma);\n-\tvma_iter_free(&vmi);\n \tvalidate_mm(mm);\n+vma_lock_fail:\n+vma_prep_fail:\n+\tvma_iter_free(&vmi);\n \treturn error;\n }\n #endif /* CONFIG_STACK_GROWSUP */\n@@ -3197,8 +3273,8 @@ int expand_downwards(struct vm_area_struct *vma, unsigned long address)\n {\n \tstruct mm_struct *mm = vma->vm_mm;\n \tstruct vm_area_struct *prev;\n-\tint error = 0;\n \tVMA_ITERATOR(vmi, mm, vma->vm_start);\n+\tint error;\n \n \tif (!vma_test(vma, VMA_GROWSDOWN_BIT))\n \t\treturn -EFAULT;\n@@ -3228,12 +3304,14 @@ int expand_downwards(struct vm_area_struct *vma, unsigned long address)\n \n \t/* We must make sure the anon_vma is allocated. */\n \tif (unlikely(anon_vma_prepare(vma))) {\n-\t\tvma_iter_free(&vmi);\n-\t\treturn -ENOMEM;\n+\t\terror = -ENOMEM;\n+\t\tgoto vma_prep_fail;\n \t}\n \n \t/* Lock the VMA before expanding to prevent concurrent page faults */\n-\tvma_start_write(vma);\n+\terror = vma_start_write_killable(vma);\n+\tif (error)\n+\t\tgoto vma_lock_fail;\n \t/* We update the anon VMA tree. */\n \tanon_vma_lock_write(vma->anon_vma);\n \n@@ -3263,8 +3341,10 @@ int expand_downwards(struct vm_area_struct *vma, unsigned long address)\n \t\t}\n \t}\n \tanon_vma_unlock_write(vma->anon_vma);\n-\tvma_iter_free(&vmi);\n \tvalidate_mm(mm);\n+vma_lock_fail:\n+vma_prep_fail:\n+\tvma_iter_free(&vmi);\n \treturn error;\n }\n \ndiff --git a/mm/vma_exec.c b/mm/vma_exec.c\nindex 5cee8b7efa0f..8ddcc791d828 100644\n--- a/mm/vma_exec.c\n+++ b/mm/vma_exec.c\n@@ -41,6 +41,7 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift)\n \tstruct vm_area_struct *next;\n \tstruct mmu_gather tlb;\n \tPAGETABLE_MOVE(pmc, vma, vma, old_start, new_start, length);\n+\tint err;\n \n \tBUG_ON(new_start > new_end);\n \n@@ -56,8 +57,9 @@ int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift)\n \t * cover the whole range: [new_start, old_end)\n \t */\n \tvmg.target = vma;\n-\tif (vma_expand(&vmg))\n-\t\treturn -ENOMEM;\n+\terr = vma_expand(&vmg);\n+\tif (err)\n+\t\treturn err;\n \n \t/*\n \t * move the page tables downwards, on failure we rely on\n", "prefixes": [ "v6", "4/6" ] }