get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2226039,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/2226039/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260422023239.1171963-13-mrathor@linux.microsoft.com/",
    "project": {
        "id": 28,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/28/?format=api",
        "name": "Linux PCI development",
        "link_name": "linux-pci",
        "list_id": "linux-pci.vger.kernel.org",
        "list_email": "linux-pci@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260422023239.1171963-13-mrathor@linux.microsoft.com>",
    "list_archive_url": null,
    "date": "2026-04-22T02:32:38",
    "name": "[V1,12/13] mshv: Populate mmio mappings for PCI passthru",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "b5ea5fa93a5aba009075ba8a6f62a2944b988a26",
    "submitter": {
        "id": 91512,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/91512/?format=api",
        "name": "Mukesh R",
        "email": "mrathor@linux.microsoft.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260422023239.1171963-13-mrathor@linux.microsoft.com/mbox/",
    "series": [
        {
            "id": 500915,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/500915/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-pci/list/?series=500915",
            "date": "2026-04-22T02:32:26",
            "name": "PCI passthru on Hyper-V (Part I)",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/500915/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2226039/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2226039/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-pci+bounces-52906-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linux-pci@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=linux.microsoft.com header.i=@linux.microsoft.com\n header.a=rsa-sha256 header.s=default header.b=YViEiMXm;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-52906-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=linux.microsoft.com\n header.i=@linux.microsoft.com header.b=\"YViEiMXm\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=13.77.154.182",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.microsoft.com",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=linux.microsoft.com"
        ],
        "Received": [
            "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\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 4g0kDz25PTz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 12:48:35 +1000 (AEST)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id DD07B30A61A9\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 02:35:47 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 7046838947E;\n\tWed, 22 Apr 2026 02:34:17 +0000 (UTC)",
            "from linux.microsoft.com (linux.microsoft.com [13.77.154.182])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 769D338AC7E;\n\tWed, 22 Apr 2026 02:34:00 +0000 (UTC)",
            "from mrdev.corp.microsoft.com\n (192-184-212-33.fiber.dynamic.sonic.net [192.184.212.33])\n\tby linux.microsoft.com (Postfix) with ESMTPSA id CB81720B6F08;\n\tTue, 21 Apr 2026 19:33:57 -0700 (PDT)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776825253; cv=none;\n b=N5SacK5SaWWHaAs+E4J2UK0Mwd8ZWiiYiNAUpCbUwZJJH17ske5Dcx/2Hwh18Xc1HQ6jRRwFiyWYBzWhY3skyvkXmxjDVGWNgaC/hiXiluu1imbJc34eQPTsoaGUKB3kpqxTwwZRtNiEXT6ZXaCFayhuk8beAme2N0Rwsm6p1Fg=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776825253; c=relaxed/simple;\n\tbh=3TNU4EMnv17LluIqrnkhvD8xOvL+YdsPt3gnwRHpmUc=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=kTUqVjg/NXv0brKByuOWEFH/ohnfMAiBuTbIZFUCxUgxde3JelU8C4wNXvH9geMOR0mxGTQWEswvHy2BfGI+VW+4jercaq5050ZFq+M1rNe/X/smlfImoxsKADf1LIz6QJp81hkMh3QFkfZEuVGHY1ONk2zl3tIL6kEqpn94Mgw=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.microsoft.com;\n spf=pass smtp.mailfrom=linux.microsoft.com;\n dkim=pass (1024-bit key) header.d=linux.microsoft.com\n header.i=@linux.microsoft.com header.b=YViEiMXm;\n arc=none smtp.client-ip=13.77.154.182",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 linux.microsoft.com CB81720B6F08",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com;\n\ts=default; t=1776825238;\n\tbh=84awl3Z2Kbawc6FZaMJAbg5OX/GvsOXiTuFqfIzdbWs=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=YViEiMXm980dK9+OXkB0Jxegh6wk9Bxkhn8VP0IxBr0DaR7ZjYCu90PMX7OVW6hbF\n\t ixwXK4YlP+caCujsCD3EdpL2Lqb+QNfYsnV1w1SZtBZIbILsTmhuU1Mrh2APSmKAcL\n\t J0vXWvQm+zFvJ+7eTv+aJ0j+7Zb4sAp9lzfAKkKA=",
        "From": "Mukesh R <mrathor@linux.microsoft.com>",
        "To": "hpa@zytor.com,\n\trobin.murphy@arm.com,\n\trobh@kernel.org,\n\twei.liu@kernel.org,\n\tmrathor@linux.microsoft.com,\n\tmhklinux@outlook.com,\n\tmuislam@microsoft.com,\n\tnamjain@linux.microsoft.com,\n\tmagnuskulke@linux.microsoft.com,\n\tanbelski@linux.microsoft.com,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-hyperv@vger.kernel.org,\n\tiommu@lists.linux.dev,\n\tlinux-pci@vger.kernel.org,\n\tlinux-arch@vger.kernel.org",
        "Cc": "kys@microsoft.com,\n\thaiyangz@microsoft.com,\n\tdecui@microsoft.com,\n\tlongli@microsoft.com,\n\ttglx@kernel.org,\n\tmingo@redhat.com,\n\tbp@alien8.de,\n\tdave.hansen@linux.intel.com,\n\tx86@kernel.org,\n\tjoro@8bytes.org,\n\twill@kernel.org,\n\tlpieralisi@kernel.org,\n\tkwilczynski@kernel.org,\n\tbhelgaas@google.com,\n\tarnd@arndb.de",
        "Subject": "[PATCH V1 12/13] mshv: Populate mmio mappings for PCI passthru",
        "Date": "Tue, 21 Apr 2026 19:32:38 -0700",
        "Message-ID": "<20260422023239.1171963-13-mrathor@linux.microsoft.com>",
        "X-Mailer": "git-send-email 2.51.2.vfs.0.1",
        "In-Reply-To": "<20260422023239.1171963-1-mrathor@linux.microsoft.com>",
        "References": "<20260422023239.1171963-1-mrathor@linux.microsoft.com>",
        "Precedence": "bulk",
        "X-Mailing-List": "linux-pci@vger.kernel.org",
        "List-Id": "<linux-pci.vger.kernel.org>",
        "List-Subscribe": "<mailto:linux-pci+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:linux-pci+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit"
    },
    "content": "Upon guest access, in case of missing mmio mapping, the hypervisor\ngenerates an unmapped gpa intercept. In this path, lookup the PCI\nresource pfn for the guest gpa, and ask the hypervisor to map it\nvia hypercall. The PCI resource pfn is maintained by the VFIO driver,\nand obtained via fixup_user_fault call (similar to KVM).\n\nAlso, VFIO no longer puts the mmio pfn in vma->vm_pgoff. So, remove\ncode that is using it to map mmio space. It is broken and will cause\npanic.\n\nSigned-off-by: Mukesh R <mrathor@linux.microsoft.com>\n---\n drivers/hv/mshv_root_main.c | 113 ++++++++++++++++++++++++++++++------\n 1 file changed, 96 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c\nindex 6ceb5f608589..a7864463961b 100644\n--- a/drivers/hv/mshv_root_main.c\n+++ b/drivers/hv/mshv_root_main.c\n@@ -46,6 +46,9 @@ MODULE_DESCRIPTION(\"Microsoft Hyper-V root partition VMM interface /dev/mshv\");\n #define HV_VP_COUNTER_ROOT_DISPATCH_THREAD_BLOCKED 95\n #endif\n \n+static bool hv_nofull_mmio;\t/* don't map entire mmio region upon fault */\n+module_param(hv_nofull_mmio, bool, 0644);\n+\n struct mshv_root mshv_root;\n \n enum hv_scheduler_type hv_scheduler_type;\n@@ -641,6 +644,94 @@ mshv_partition_region_by_gfn_get(struct mshv_partition *p, u64 gfn)\n \treturn region;\n }\n \n+/*\n+ * Check if uaddr is for mmio range. If yes, return 0 with mmio_pfn filled in\n+ * else just return -errno.\n+ */\n+static int mshv_chk_get_mmio_start_pfn(u64 uaddr, u64 *mmio_pfnp)\n+{\n+\tstruct vm_area_struct *vma;\n+\tbool is_mmio;\n+\tstruct follow_pfnmap_args pfnmap_args;\n+\tint rc = -EINVAL;\n+\n+\tmmap_read_lock(current->mm);\n+\tvma = vma_lookup(current->mm, uaddr);\n+\tis_mmio = vma ? !!(vma->vm_flags & (VM_IO | VM_PFNMAP)) : 0;\n+\tif (!is_mmio)\n+\t\tgoto unlock_mmap_out;\n+\n+\tpfnmap_args.vma = vma;\n+\tpfnmap_args.address = uaddr;\n+\n+\trc = follow_pfnmap_start(&pfnmap_args);\n+\tif (rc) {\n+\t\trc = fixup_user_fault(current->mm, uaddr, FAULT_FLAG_WRITE,\n+\t\t\t\t      NULL);\n+\t\tif (rc)\n+\t\t\tgoto unlock_mmap_out;\n+\n+\t\trc = follow_pfnmap_start(&pfnmap_args);\n+\t\tif (rc)\n+\t\t\tgoto unlock_mmap_out;\n+\t}\n+\n+\t*mmio_pfnp = pfnmap_args.pfn;\n+\tfollow_pfnmap_end(&pfnmap_args);\n+\n+unlock_mmap_out:\n+\tmmap_read_unlock(current->mm);\n+\treturn rc;\n+}\n+\n+/*\n+ * Check if the unmapped gpa belongs to mmio space. If yes, resolve it.\n+ *\n+ * Returns: True if valid mmio intercept and handled, else false.\n+ */\n+static bool mshv_handle_unmapped_gpa(struct mshv_vp *vp)\n+{\n+\tstruct hv_message *hvmsg = vp->vp_intercept_msg_page;\n+\tu64 gfn, uaddr, mmio_spa, numpgs;\n+\tstruct mshv_mem_region *rg;\n+\tint rc = -EINVAL;\n+\tstruct mshv_partition *pt = vp->vp_partition;\n+#if defined(CONFIG_X86_64)\n+\tstruct hv_x64_memory_intercept_message *msg =\n+\t\t(struct hv_x64_memory_intercept_message *)hvmsg->u.payload;\n+#elif defined(CONFIG_ARM64)\n+\tstruct hv_arm64_memory_intercept_message *msg =\n+\t\t(struct hv_arm64_memory_intercept_message *)hvmsg->u.payload;\n+#endif\n+\n+\tgfn = msg->guest_physical_address >> HV_HYP_PAGE_SHIFT;\n+\n+\trg = mshv_partition_region_by_gfn_get(pt, gfn);\n+\tif (rg == NULL)\n+\t\treturn false;\n+\tif (rg->mreg_type != MSHV_REGION_TYPE_MMIO)\n+\t\tgoto put_rg_out;\n+\n+\tuaddr = rg->start_uaddr + ((gfn - rg->start_gfn) << HV_HYP_PAGE_SHIFT);\n+\n+\trc = mshv_chk_get_mmio_start_pfn(uaddr, &mmio_spa);\n+\tif (rc)\n+\t\tgoto put_rg_out;\n+\n+\tif (!hv_nofull_mmio) {\t\t/* default case */\n+\t\tmmio_spa = mmio_spa - (gfn - rg->start_gfn);\n+\t\tgfn = rg->start_gfn;\n+\t\tnumpgs = rg->nr_pages;\n+\t} else\n+\t\tnumpgs = 1;\n+\n+\trc = hv_call_map_mmio_pages(pt->pt_id, gfn, mmio_spa, numpgs);\n+\n+put_rg_out:\n+\tmshv_region_put(rg);\n+\treturn rc == 0;\n+}\n+\n /**\n  * mshv_handle_gpa_intercept - Handle GPA (Guest Physical Address) intercepts.\n  * @vp: Pointer to the virtual processor structure.\n@@ -699,6 +790,8 @@ static bool mshv_handle_gpa_intercept(struct mshv_vp *vp)\n static bool mshv_vp_handle_intercept(struct mshv_vp *vp)\n {\n \tswitch (vp->vp_intercept_msg_page->header.message_type) {\n+\tcase HVMSG_UNMAPPED_GPA:\n+\t\treturn mshv_handle_unmapped_gpa(vp);\n \tcase HVMSG_GPA_INTERCEPT:\n \t\treturn mshv_handle_gpa_intercept(vp);\n \t}\n@@ -1322,16 +1415,8 @@ static int mshv_prepare_pinned_region(struct mshv_mem_region *region)\n }\n \n /*\n- * This maps two things: guest RAM and for pci passthru mmio space.\n- *\n- * mmio:\n- *  - vfio overloads vm_pgoff to store the mmio start pfn/spa.\n- *  - Two things need to happen for mapping mmio range:\n- *\t1. mapped in the uaddr so VMM can access it.\n- *\t2. mapped in the hwpt (gfn <-> mmio phys addr) so guest can access it.\n- *\n- *   This function takes care of the second. The first one is managed by vfio,\n- *   and hence is taken care of via vfio_pci_mmap_fault().\n+ * This is called for both user ram and mmio space. The mmio space is not\n+ * mapped here, but later during intercept on demand.\n  */\n static long\n mshv_map_user_memory(struct mshv_partition *partition,\n@@ -1340,7 +1425,6 @@ mshv_map_user_memory(struct mshv_partition *partition,\n \tstruct mshv_mem_region *region;\n \tstruct vm_area_struct *vma;\n \tbool is_mmio;\n-\tulong mmio_pfn;\n \tlong ret;\n \n \tif (mem->flags & BIT(MSHV_SET_MEM_BIT_UNMAP) ||\n@@ -1350,7 +1434,6 @@ mshv_map_user_memory(struct mshv_partition *partition,\n \tmmap_read_lock(current->mm);\n \tvma = vma_lookup(current->mm, mem->userspace_addr);\n \tis_mmio = vma ? !!(vma->vm_flags & (VM_IO | VM_PFNMAP)) : 0;\n-\tmmio_pfn = is_mmio ? vma->vm_pgoff : 0;\n \tmmap_read_unlock(current->mm);\n \n \tif (!vma)\n@@ -1376,11 +1459,7 @@ mshv_map_user_memory(struct mshv_partition *partition,\n \t\t\t\t\t    region->nr_pages,\n \t\t\t\t\t    HV_MAP_GPA_NO_ACCESS, NULL);\n \t\tbreak;\n-\tcase MSHV_REGION_TYPE_MMIO:\n-\t\tret = hv_call_map_mmio_pages(partition->pt_id,\n-\t\t\t\t\t     region->start_gfn,\n-\t\t\t\t\t     mmio_pfn,\n-\t\t\t\t\t     region->nr_pages);\n+\tdefault:\n \t\tbreak;\n \t}\n \n",
    "prefixes": [
        "V1",
        "12/13"
    ]
}