get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2194777/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2194777,
    "url": "http://patchwork.ozlabs.org/api/patches/2194777/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260209220849.2126486-1-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": "<20260209220849.2126486-1-surenb@google.com>",
    "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260209220849.2126486-1-surenb@google.com/",
    "date": "2026-02-09T22:08:49",
    "name": "[1/1] mm: replace vma_start_write() with vma_start_write_killable()",
    "commit_ref": null,
    "pull_url": null,
    "state": "handled-elsewhere",
    "archived": false,
    "hash": "eec242ae1ae0be9521dffa9a651c54883998e1ac",
    "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/20260209220849.2126486-1-surenb@google.com/mbox/",
    "series": [
        {
            "id": 491572,
            "url": "http://patchwork.ozlabs.org/api/series/491572/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=491572",
            "date": "2026-02-09T22:08:49",
            "name": "[1/1] mm: replace vma_start_write() with vma_start_write_killable()",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/491572/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2194777/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2194777/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linuxppc-dev+bounces-16754-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=20230601 header.b=PRMx6paF;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-16754-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=20230601 header.b=PRMx6paF;\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=39vqkaqykdcgwyvirfksskpi.gsqpmrybttg-hizpmwxw.sdpefw.svk@flex--surenb.bounces.google.com;\n receiver=lists.ozlabs.org)"
        ],
        "Received": [
            "from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1 raw public key)\n server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f8zPF0tTHz1xvb\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Feb 2026 09:09:04 +1100 (AEDT)",
            "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4f8zP669ftz2ydq;\n\tTue, 10 Feb 2026 09:08:58 +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 4f8zP51KcMz2xqL\n\tfor <linuxppc-dev@lists.ozlabs.org>; Tue, 10 Feb 2026 09:08:56 +1100 (AEDT)",
            "by mail-dy1-x134a.google.com with SMTP id\n 5a478bee46e88-2ba8a461dd9so244772eec.1\n        for <linuxppc-dev@lists.ozlabs.org>;\n Mon, 09 Feb 2026 14:08:56 -0800 (PST)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1770674938;\n\tcv=none;\n b=mcMu6lDOzb+q1yIN/TOHMdOWwqZlsqJJpmjNXVUB12hEs9kclZ1lH7BOHuzTATOQTqBq1xWMpJKRawATVBz+FQ41WhCcyavA0dx/+1FeyyvndXD1Z5cpFURZVPuXOzF5w44x6IXR/eXZvmbrOTsifxL3uOROLC7xDEo93DCo8jt0uA9g0zOB9/5ZF+36HCoCHV3MjyZMRIoKL00mWJDEwKFMPeqBjEnDhhirdKO+P1PxACeE4Cw05J2StMmIduaZ9evBZJnX0wbfAcs51Gg5gzI1e7STwVWDZ17+wNwY1nrW9AX0PX9c73OtGidGa08zBpEIf9Ch7PdReIuhRdyW6A==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1770674938; c=relaxed/relaxed;\n\tbh=JnRS/eBggwfyKbmgq76fGd1D8MW17NObeJngFpCnif0=;\n\th=Date:Mime-Version:Message-ID:Subject:From:To:Cc:Content-Type;\n b=NoDQW7TUua7lqJHqkXy5VU1KQqb5biiwmOmYogLFuD3RiFoKAeEj6AVO+YhJVYnva7ONU08HyM7Z6tPnMunp8chljZre2X+C7pfQb+cOGwSQT+KHmf1RATvybNyI4Ow5jbbXN4It/oNa6OBMb4EZN9pX5xFoaoG3d5Ysdx9ZqeOk8BVUF/mCxf+aU++DZ0LR8IkxUZj0jVc3Cel9fHH/+77Yva+A8Qf9MHtVoDvKzLZsfIXTlkOZwAXVsV8Jyzbe8G1jbAFaWD74wd9n6Q/QvIvycd6y6r3+eDe0cIIeDCup8aVitXF/SfGi0J24buKBM+BreWILuXJrhWP/rowxGQ==",
        "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=20230601 header.b=PRMx6paF; dkim-atps=neutral;\n spf=pass (client-ip=2607:f8b0:4864:20::134a; helo=mail-dy1-x134a.google.com;\n envelope-from=39vqkaqykdcgwyvirfksskpi.gsqpmrybttg-hizpmwxw.sdpefw.svk@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=20230601; t=1770674933; x=1771279733;\n darn=lists.ozlabs.org;\n        h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject\n         :date:message-id:reply-to;\n        bh=JnRS/eBggwfyKbmgq76fGd1D8MW17NObeJngFpCnif0=;\n        b=PRMx6paFhKxI8gW2VgSkdpxAIC8AYL5uNGU7qphiyYTLPsLg+RHc6Gw7i7X8RFc7Qo\n         LUJRU7mNSgCUcsFv+95FW+zyrmIis1TsXTGJJ87DL1dJm35Tz18kUlsM8WeTVKeGkQXH\n         S0cRsDjKUIeI67dIYy9eGVR7fqig8ayaY286RU6FrTDWjMPILZwwEv2/EBjI4dTvEaKn\n         OLyE3W13a6GsldGFXBcg9f+bPQWLP/ThfSXhyc7/3k3JViX3jPcDLFuk5sgIIVD8WwZX\n         qI5OX8z4iLRf40g/FlFAJPbeW58PMyp6sLtoqAnJIiZ2LFabE2aKbs1q/KK4Kwn6UlBn\n         Mf+A==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20230601; t=1770674933; x=1771279733;\n        h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state\n         :from:to:cc:subject:date:message-id:reply-to;\n        bh=JnRS/eBggwfyKbmgq76fGd1D8MW17NObeJngFpCnif0=;\n        b=CNBvAbHLAedm5vg/kOjmzvi7BO5xub0ZR9Oq15/Yn26ONbsVQASi8srRb8IcCbZzrw\n         yg4oZHS9DeZ47M1Zrl767YbIskoIy9YwO4Y3jVgKCZEXgLL0g2J0objaPRXlEcrAP6SW\n         x2b442IZm5MBKHWm5QGySclbaT+VXSv2qrTEP9D/3UIoryRN+VSraOoOnk7w3kb2OHlK\n         jwOZZsHC+3l6fWnZM34lxVxByHVikOUmNbodxNK7ruZiszUyOKkum1XnsoaVfClzHj8M\n         uJY9ovtQ6pMR3+YqWHp8tiP5dIHiD4Dd2ViwPRmenP6nWMIUxD7SC/NHQTiYgoIWclNM\n         mKKQ==",
        "X-Forwarded-Encrypted": "i=1;\n AJvYcCUpNzuj8lb5hV4of2PDEGEUngKi0q1LSqRPRxiCFiqepU8u2WqFe8pDVZXjXjGd5+KshNkEEjtMX03wwxM=@lists.ozlabs.org",
        "X-Gm-Message-State": "AOJu0Yw+1F7BPrihjwcGFMjmhzNoWQ9LQPKmlomNYPumgOemHccZCq4w\n\twOqI+MRAQetAonOvgRmHWlzfKzzOBN81ZjI4nmqv+CW7YnY1vPYYOliOtiIioodl6Hks7FtHW+Z\n\tIs9y8Dw==",
        "X-Received": "from dlbrb16.prod.google.com\n ([2002:a05:7022:f010:b0:123:3409:1518])\n (user=surenb job=prod-delivery.src-stubby-dispatcher) by\n 2002:a05:7301:1687:b0:2ba:7717:2bdd\n with SMTP id 5a478bee46e88-2ba771732a0mr1454182eec.27.1770674933227; Mon, 09\n Feb 2026 14:08:53 -0800 (PST)",
        "Date": "Mon,  9 Feb 2026 14:08:49 -0800",
        "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",
        "X-Mailer": "git-send-email 2.53.0.rc2.204.g2597b5adb4-goog",
        "Message-ID": "<20260209220849.2126486-1-surenb@google.com>",
        "Subject": "[PATCH 1/1] mm: replace vma_start_write() with\n vma_start_write_killable()",
        "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, lorenzo.stoakes@oracle.com,\n 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, linux-mm@kvack.org, linuxppc-dev@lists.ozlabs.org,\n\tkvm@vger.kernel.org, linux-kernel@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": "Now that we have vma_start_write_killable() we can replace most of the\nvma_start_write() calls with it, improving reaction time to the kill\nsignal.\n\nThere are several places which are left untouched by this patch:\n\n1. free_pgtables() because function should free page tables even if a\nfatal signal is pending.\n\n2. userfaultd code, where some paths calling vma_start_write() can\nhandle EINTR and some can't without a deeper code refactoring.\n\n3. vm_flags_{set|mod|clear} require refactoring that involves moving\nvma_start_write() out of these functions and replacing it with\nvma_assert_write_locked(), then callers of these functions should\nlock the vma themselves using vma_start_write_killable() whenever\npossible.\n\nSuggested-by: Matthew Wilcox <willy@infradead.org>\nSigned-off-by: Suren Baghdasaryan <surenb@google.com>\n---\n arch/powerpc/kvm/book3s_hv_uvmem.c |  5 +-\n include/linux/mempolicy.h          |  5 +-\n mm/khugepaged.c                    |  5 +-\n mm/madvise.c                       |  4 +-\n mm/memory.c                        |  2 +\n mm/mempolicy.c                     | 23 ++++++--\n mm/mlock.c                         | 20 +++++--\n mm/mprotect.c                      |  4 +-\n mm/mremap.c                        |  4 +-\n mm/pagewalk.c                      | 20 +++++--\n mm/vma.c                           | 94 +++++++++++++++++++++---------\n mm/vma_exec.c                      |  6 +-\n 12 files changed, 139 insertions(+), 53 deletions(-)\n\n\nbase-commit: a1a876489abcc1e75b03bd3b2f6739ceeaaec8c5",
    "diff": "diff --git a/arch/powerpc/kvm/book3s_hv_uvmem.c b/arch/powerpc/kvm/book3s_hv_uvmem.c\nindex 7cf9310de0ec..69750edcf8d5 100644\n--- a/arch/powerpc/kvm/book3s_hv_uvmem.c\n+++ b/arch/powerpc/kvm/book3s_hv_uvmem.c\n@@ -410,7 +410,10 @@ static int kvmppc_memslot_page_merge(struct kvm *kvm,\n \t\t\tret = H_STATE;\n \t\t\tbreak;\n \t\t}\n-\t\tvma_start_write(vma);\n+\t\tif (vma_start_write_killable(vma)) {\n+\t\t\tret = H_STATE;\n+\t\t\tbreak;\n+\t\t}\n \t\t/* Copy vm_flags to avoid partial modifications in ksm_madvise */\n \t\tvm_flags = vma->vm_flags;\n \t\tret = ksm_madvise(vma, vma->vm_start, vma->vm_end,\ndiff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h\nindex 0fe96f3ab3ef..762930edde5a 100644\n--- a/include/linux/mempolicy.h\n+++ b/include/linux/mempolicy.h\n@@ -137,7 +137,7 @@ bool vma_policy_mof(struct vm_area_struct *vma);\n extern void numa_default_policy(void);\n extern void numa_policy_init(void);\n extern void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new);\n-extern void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new);\n+extern int mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new);\n \n extern int huge_node(struct vm_area_struct *vma,\n \t\t\t\tunsigned long addr, gfp_t gfp_flags,\n@@ -251,8 +251,9 @@ static inline void mpol_rebind_task(struct task_struct *tsk,\n {\n }\n \n-static inline void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)\n+static inline int mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)\n {\n+\treturn 0;\n }\n \n static inline int huge_node(struct vm_area_struct *vma,\ndiff --git a/mm/khugepaged.c b/mm/khugepaged.c\nindex fa1e57fd2c46..392dde66fa86 100644\n--- a/mm/khugepaged.c\n+++ b/mm/khugepaged.c\n@@ -1150,7 +1150,10 @@ static enum scan_result collapse_huge_page(struct mm_struct *mm, unsigned long a\n \tif (result != SCAN_SUCCEED)\n \t\tgoto out_up_write;\n \t/* check if the pmd is still valid */\n-\tvma_start_write(vma);\n+\tif (vma_start_write_killable(vma)) {\n+\t\tresult = SCAN_FAIL;\n+\t\tgoto out_up_write;\n+\t}\n \tresult = check_pmd_still_valid(mm, address, pmd);\n \tif (result != SCAN_SUCCEED)\n \t\tgoto out_up_write;\ndiff --git a/mm/madvise.c b/mm/madvise.c\nindex 8debb2d434aa..b41e64231c31 100644\n--- a/mm/madvise.c\n+++ b/mm/madvise.c\n@@ -173,7 +173,9 @@ static int madvise_update_vma(vm_flags_t new_flags,\n \tmadv_behavior->vma = vma;\n \n \t/* vm_flags is protected by the mmap_lock held in write mode. */\n-\tvma_start_write(vma);\n+\tif (vma_start_write_killable(vma))\n+\t\treturn -EINTR;\n+\n \tvm_flags_reset(vma, new_flags);\n \tif (set_new_anon_name)\n \t\treturn replace_anon_vma_name(vma, anon_name);\ndiff --git a/mm/memory.c b/mm/memory.c\nindex d6d273eb2189..3831e3026615 100644\n--- a/mm/memory.c\n+++ b/mm/memory.c\n@@ -379,6 +379,8 @@ void free_pgd_range(struct mmu_gather *tlb,\n  * page tables that should be removed.  This can differ from the vma mappings on\n  * some archs that may have mappings that need to be removed outside the vmas.\n  * Note that the prev->vm_end and next->vm_start are often used.\n+ * Note: we don't use vma_start_write_killable() because page tables should be\n+ * freed even if the task is being killed.\n  *\n  * The vma_end differs from the pg_end when a dup_mmap() failed and the tree has\n  * unrelated data to the mm_struct being torn down.\ndiff --git a/mm/mempolicy.c b/mm/mempolicy.c\nindex dbd48502ac24..3de7ab4f4cee 100644\n--- a/mm/mempolicy.c\n+++ b/mm/mempolicy.c\n@@ -556,17 +556,25 @@ void mpol_rebind_task(struct task_struct *tsk, const nodemask_t *new)\n  *\n  * Call holding a reference to mm.  Takes mm->mmap_lock during call.\n  */\n-void mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)\n+int mpol_rebind_mm(struct mm_struct *mm, nodemask_t *new)\n {\n \tstruct vm_area_struct *vma;\n \tVMA_ITERATOR(vmi, mm, 0);\n+\tint ret = 0;\n+\n+\tif (mmap_write_lock_killable(mm))\n+\t\treturn -EINTR;\n \n-\tmmap_write_lock(mm);\n \tfor_each_vma(vmi, vma) {\n-\t\tvma_start_write(vma);\n+\t\tif (vma_start_write_killable(vma)) {\n+\t\t\tret = -EINTR;\n+\t\t\tbreak;\n+\t\t}\n \t\tmpol_rebind_policy(vma->vm_policy, new);\n \t}\n \tmmap_write_unlock(mm);\n+\n+\treturn ret;\n }\n \n static const struct mempolicy_operations mpol_ops[MPOL_MAX] = {\n@@ -1785,7 +1793,8 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le\n \t\treturn -EINVAL;\n \tif (end == start)\n \t\treturn 0;\n-\tmmap_write_lock(mm);\n+\tif (mmap_write_lock_killable(mm))\n+\t\treturn -EINTR;\n \tprev = vma_prev(&vmi);\n \tfor_each_vma_range(vmi, vma, end) {\n \t\t/*\n@@ -1808,7 +1817,11 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le\n \t\t\tbreak;\n \t\t}\n \n-\t\tvma_start_write(vma);\n+\t\tif (vma_start_write_killable(vma)) {\n+\t\t\terr = -EINTR;\n+\t\t\tbreak;\n+\t\t}\n+\n \t\tnew->home_node = home_node;\n \t\terr = mbind_range(&vmi, vma, &prev, start, end, new);\n \t\tmpol_put(new);\ndiff --git a/mm/mlock.c b/mm/mlock.c\nindex 2f699c3497a5..2885b858aa0f 100644\n--- a/mm/mlock.c\n+++ b/mm/mlock.c\n@@ -420,7 +420,7 @@ static int mlock_pte_range(pmd_t *pmd, unsigned long addr,\n  * Called for mlock(), mlock2() and mlockall(), to set @vma VM_LOCKED;\n  * called for munlock() and munlockall(), to clear VM_LOCKED from @vma.\n  */\n-static void mlock_vma_pages_range(struct vm_area_struct *vma,\n+static int mlock_vma_pages_range(struct vm_area_struct *vma,\n \tunsigned long start, unsigned long end, vm_flags_t newflags)\n {\n \tstatic const struct mm_walk_ops mlock_walk_ops = {\n@@ -441,7 +441,9 @@ static void mlock_vma_pages_range(struct vm_area_struct *vma,\n \t */\n \tif (newflags & VM_LOCKED)\n \t\tnewflags |= VM_IO;\n-\tvma_start_write(vma);\n+\tif (vma_start_write_killable(vma))\n+\t\treturn -EINTR;\n+\n \tvm_flags_reset_once(vma, newflags);\n \n \tlru_add_drain();\n@@ -452,6 +454,7 @@ static void mlock_vma_pages_range(struct vm_area_struct *vma,\n \t\tnewflags &= ~VM_IO;\n \t\tvm_flags_reset_once(vma, newflags);\n \t}\n+\treturn 0;\n }\n \n /*\n@@ -501,10 +504,12 @@ static int mlock_fixup(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \t */\n \tif ((newflags & VM_LOCKED) && (oldflags & VM_LOCKED)) {\n \t\t/* No work to do, and mlocking twice would be wrong */\n-\t\tvma_start_write(vma);\n+\t\tret = vma_start_write_killable(vma);\n+\t\tif (ret)\n+\t\t\tgoto out;\n \t\tvm_flags_reset(vma, newflags);\n \t} else {\n-\t\tmlock_vma_pages_range(vma, start, end, newflags);\n+\t\tret = mlock_vma_pages_range(vma, start, end, newflags);\n \t}\n out:\n \t*prev = vma;\n@@ -733,9 +738,12 @@ static int apply_mlockall_flags(int flags)\n \n \t\terror = mlock_fixup(&vmi, vma, &prev, vma->vm_start, vma->vm_end,\n \t\t\t\t    newflags);\n-\t\t/* Ignore errors, but prev needs fixing up. */\n-\t\tif (error)\n+\t\t/* Ignore errors except EINTR, but prev needs fixing up. */\n+\t\tif (error) {\n+\t\t\tif (error == -EINTR)\n+\t\t\t\tbreak;\n \t\t\tprev = vma;\n+\t\t}\n \t\tcond_resched();\n \t}\n out:\ndiff --git a/mm/mprotect.c b/mm/mprotect.c\nindex c0571445bef7..49dbb7156936 100644\n--- a/mm/mprotect.c\n+++ b/mm/mprotect.c\n@@ -765,7 +765,9 @@ mprotect_fixup(struct vma_iterator *vmi, struct mmu_gather *tlb,\n \t * vm_flags and vm_page_prot are protected by the mmap_lock\n \t * held in write mode.\n \t */\n-\tvma_start_write(vma);\n+\terror = vma_start_write_killable(vma);\n+\tif (error < 0)\n+\t\tgoto fail;\n \tvm_flags_reset_once(vma, newflags);\n \tif (vma_wants_manual_pte_write_upgrade(vma))\n \t\tmm_cp_flags |= MM_CP_TRY_CHANGE_WRITABLE;\ndiff --git a/mm/mremap.c b/mm/mremap.c\nindex 2be876a70cc0..aef1e5f373c7 100644\n--- a/mm/mremap.c\n+++ b/mm/mremap.c\n@@ -1286,7 +1286,9 @@ static unsigned long move_vma(struct vma_remap_struct *vrm)\n \t\treturn -ENOMEM;\n \n \t/* We don't want racing faults. */\n-\tvma_start_write(vrm->vma);\n+\terr = vma_start_write_killable(vrm->vma);\n+\tif (err)\n+\t\treturn err;\n \n \t/* Perform copy step. */\n \terr = copy_vma_and_data(vrm, &new_vma);\ndiff --git a/mm/pagewalk.c b/mm/pagewalk.c\nindex a94c401ab2cf..dc9f7a7709c6 100644\n--- a/mm/pagewalk.c\n+++ b/mm/pagewalk.c\n@@ -425,14 +425,13 @@ static inline void process_mm_walk_lock(struct mm_struct *mm,\n \t\tmmap_assert_write_locked(mm);\n }\n \n-static inline void process_vma_walk_lock(struct vm_area_struct *vma,\n+static inline int process_vma_walk_lock(struct vm_area_struct *vma,\n \t\t\t\t\t enum page_walk_lock walk_lock)\n {\n #ifdef CONFIG_PER_VMA_LOCK\n \tswitch (walk_lock) {\n \tcase PGWALK_WRLOCK:\n-\t\tvma_start_write(vma);\n-\t\tbreak;\n+\t\treturn vma_start_write_killable(vma);\n \tcase PGWALK_WRLOCK_VERIFY:\n \t\tvma_assert_write_locked(vma);\n \t\tbreak;\n@@ -444,6 +443,7 @@ static inline void process_vma_walk_lock(struct vm_area_struct *vma,\n \t\tbreak;\n \t}\n #endif\n+\treturn 0;\n }\n \n /*\n@@ -487,7 +487,9 @@ int walk_page_range_mm_unsafe(struct mm_struct *mm, unsigned long start,\n \t\t\tif (ops->pte_hole)\n \t\t\t\terr = ops->pte_hole(start, next, -1, &walk);\n \t\t} else { /* inside vma */\n-\t\t\tprocess_vma_walk_lock(vma, ops->walk_lock);\n+\t\t\terr = process_vma_walk_lock(vma, ops->walk_lock);\n+\t\t\tif (err)\n+\t\t\t\tbreak;\n \t\t\twalk.vma = vma;\n \t\t\tnext = min(end, vma->vm_end);\n \t\t\tvma = find_vma(mm, vma->vm_end);\n@@ -704,6 +706,7 @@ int walk_page_range_vma_unsafe(struct vm_area_struct *vma, unsigned long start,\n \t\t.vma\t\t= vma,\n \t\t.private\t= private,\n \t};\n+\tint err;\n \n \tif (start >= end || !walk.mm)\n \t\treturn -EINVAL;\n@@ -711,7 +714,9 @@ int walk_page_range_vma_unsafe(struct vm_area_struct *vma, unsigned long start,\n \t\treturn -EINVAL;\n \n \tprocess_mm_walk_lock(walk.mm, ops->walk_lock);\n-\tprocess_vma_walk_lock(vma, ops->walk_lock);\n+\terr = process_vma_walk_lock(vma, ops->walk_lock);\n+\tif (err)\n+\t\treturn err;\n \treturn __walk_page_range(start, end, &walk);\n }\n \n@@ -734,6 +739,7 @@ int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,\n \t\t.vma\t\t= vma,\n \t\t.private\t= private,\n \t};\n+\tint err;\n \n \tif (!walk.mm)\n \t\treturn -EINVAL;\n@@ -741,7 +747,9 @@ int walk_page_vma(struct vm_area_struct *vma, const struct mm_walk_ops *ops,\n \t\treturn -EINVAL;\n \n \tprocess_mm_walk_lock(walk.mm, ops->walk_lock);\n-\tprocess_vma_walk_lock(vma, ops->walk_lock);\n+\terr = process_vma_walk_lock(vma, ops->walk_lock);\n+\tif (err)\n+\t\treturn err;\n \treturn __walk_page_range(vma->vm_start, vma->vm_end, &walk);\n }\n \ndiff --git a/mm/vma.c b/mm/vma.c\nindex be64f781a3aa..3cfb81b3b7cf 100644\n--- a/mm/vma.c\n+++ b/mm/vma.c\n@@ -540,8 +540,12 @@ __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+\terr = vma_start_write_killable(vma);\n+\tif (err)\n+\t\tgoto out_fput;\n+\terr = vma_start_write_killable(new);\n+\tif (err)\n+\t\tgoto out_fput;\n \n \tinit_vma_prep(&vp, vma);\n \tvp.insert = new;\n@@ -574,6 +578,9 @@ __split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \n \treturn 0;\n \n+out_fput:\n+\tif (new->vm_file)\n+\t\tfput(new->vm_file);\n out_free_mpol:\n \tmpol_put(vma_policy(new));\n out_free_vmi:\n@@ -895,16 +902,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\tgoto abort;\n \n \tif (merge_right) {\n-\t\tvma_start_write(next);\n+\t\terr = vma_start_write_killable(next);\n+\t\tif (err)\n+\t\t\tgoto abort;\n \t\tvmg->target = next;\n \t\tsticky_flags |= (next->vm_flags & VM_STICKY);\n \t}\n \n \tif (merge_left) {\n-\t\tvma_start_write(prev);\n+\t\terr = vma_start_write_killable(prev);\n+\t\tif (err)\n+\t\t\tgoto abort;\n \t\tvmg->target = prev;\n \t\tsticky_flags |= (prev->vm_flags & VM_STICKY);\n \t}\n@@ -1155,10 +1168,12 @@ int vma_expand(struct vma_merge_struct *vmg)\n \tstruct vm_area_struct *next = vmg->next;\n \tbool remove_next = false;\n \tvm_flags_t sticky_flags;\n-\tint ret = 0;\n+\tint ret;\n \n \tmmap_assert_write_locked(vmg->mm);\n-\tvma_start_write(target);\n+\tret = vma_start_write_killable(target);\n+\tif (ret)\n+\t\treturn ret;\n \n \tif (next && target != next && vmg->end == next->vm_end)\n \t\tremove_next = true;\n@@ -1186,17 +1201,19 @@ int vma_expand(struct vma_merge_struct *vmg)\n \t * Note that, by convention, callers ignore OOM for this case, so\n \t * we don't need to account for vmg->give_up_on_mm here.\n \t */\n-\tif (remove_next)\n+\tif (remove_next) {\n+\t\tret = vma_start_write_killable(next);\n+\t\tif (ret)\n+\t\t\treturn ret;\n \t\tret = dup_anon_vma(target, next, &anon_dup);\n+\t}\n \tif (!ret && vmg->copied_from)\n \t\tret = dup_anon_vma(target, vmg->copied_from, &anon_dup);\n \tif (ret)\n \t\treturn ret;\n \n-\tif (remove_next) {\n-\t\tvma_start_write(next);\n+\tif (remove_next)\n \t\tvmg->__remove_next = true;\n-\t}\n \tif (commit_merge(vmg))\n \t\tgoto nomem;\n \n@@ -1229,6 +1246,7 @@ 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@@ -1240,7 +1258,11 @@ 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+\terr = vma_start_write_killable(vma);\n+\tif (err) {\n+\t\tvma_iter_free(vmi);\n+\t\treturn err;\n+\t}\n \n \tinit_vma_prep(&vp, vma);\n \tvma_prepare(&vp);\n@@ -1430,7 +1452,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@@ -1824,12 +1848,17 @@ 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 \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+\terr = vma_start_write_killable(vma);\n+\tif (err) {\n+\t\tvma_iter_free(&vmi);\n+\t\treturn err;\n+\t}\n \tvma_iter_store_new(&vmi, vma);\n \tvma_link_file(vma, /* hold_rmap_lock= */false);\n \tmm->map_count++;\n@@ -2211,9 +2240,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 (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@@ -2549,7 +2577,9 @@ static int __mmap_new_vma(struct mmap_state *map, struct vm_area_struct **vmap)\n #endif\n \n \t/* Lock the VMA since it is modified after insertion into VMA tree */\n-\tvma_start_write(vma);\n+\terror = vma_start_write_killable(vma);\n+\tif (error)\n+\t\tgoto free_iter_vma;\n \tvma_iter_store_new(vmi, vma);\n \tmap->mm->map_count++;\n \tvma_link_file(vma, map->hold_file_rmap_lock);\n@@ -2860,6 +2890,7 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \t\t unsigned long addr, unsigned long len, vm_flags_t vm_flags)\n {\n \tstruct mm_struct *mm = current->mm;\n+\tint err = -ENOMEM;\n \n \t/*\n \t * Check against address space limits by the changed size\n@@ -2904,7 +2935,10 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\n \tvma_set_range(vma, addr, addr + len, addr >> PAGE_SHIFT);\n \tvm_flags_init(vma, vm_flags);\n \tvma->vm_page_prot = vm_get_page_prot(vm_flags);\n-\tvma_start_write(vma);\n+\tif (vma_start_write_killable(vma)) {\n+\t\terr = -EINTR;\n+\t\tgoto mas_store_fail;\n+\t}\n \tif (vma_iter_store_gfp(vmi, vma, GFP_KERNEL))\n \t\tgoto mas_store_fail;\n \n@@ -2924,7 +2958,7 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_area_struct *vma,\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@@ -3085,7 +3119,7 @@ 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+\tint error;\n \tVMA_ITERATOR(vmi, mm, vma->vm_start);\n \n \tif (!(vma->vm_flags & VM_GROWSUP))\n@@ -3122,12 +3156,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 free;\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 free;\n \t/* We update the anon VMA tree. */\n \tanon_vma_lock_write(vma->anon_vma);\n \n@@ -3156,6 +3192,7 @@ 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+free:\n \tvma_iter_free(&vmi);\n \tvalidate_mm(mm);\n \treturn error;\n@@ -3170,7 +3207,7 @@ 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+\tint error;\n \tVMA_ITERATOR(vmi, mm, vma->vm_start);\n \n \tif (!(vma->vm_flags & VM_GROWSDOWN))\n@@ -3201,12 +3238,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 free;\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 free;\n \t/* We update the anon VMA tree. */\n \tanon_vma_lock_write(vma->anon_vma);\n \n@@ -3236,6 +3275,7 @@ 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+free:\n \tvma_iter_free(&vmi);\n \tvalidate_mm(mm);\n \treturn error;\ndiff --git a/mm/vma_exec.c b/mm/vma_exec.c\nindex 8134e1afca68..a4addc2a8480 100644\n--- a/mm/vma_exec.c\n+++ b/mm/vma_exec.c\n@@ -40,6 +40,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@@ -55,8 +56,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": [
        "1/1"
    ]
}