{"id":2219463,"url":"http://patchwork.ozlabs.org/api/1.0/covers/2219463/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260403035541.18355-1-zhenzhong.duan@intel.com>","date":"2026-04-03T03:55:24","name":"[v3,00/14] intel_iommu: Enable PASID support for passthrough device","submitter":{"id":81636,"url":"http://patchwork.ozlabs.org/api/1.0/people/81636/?format=json","name":"Duan, Zhenzhong","email":"zhenzhong.duan@intel.com"},"series":[{"id":498583,"url":"http://patchwork.ozlabs.org/api/1.0/series/498583/?format=json","date":"2026-04-03T03:55:36","name":"intel_iommu: Enable PASID support for passthrough device","version":3,"mbox":"http://patchwork.ozlabs.org/series/498583/mbox/"}],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256\n header.s=Intel header.b=eom7OKgE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fn4g86MW3z1yDH\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 03 Apr 2026 14:57:23 +1100 (AEDT)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w8VdW-00017r-Cf; Thu, 02 Apr 2026 23:55:58 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhenzhong.duan@intel.com>)\n id 1w8VdV-00017T-CA\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 23:55:57 -0400","from mgamail.intel.com ([198.175.65.19])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhenzhong.duan@intel.com>)\n id 1w8VdS-0004Lm-VJ\n for qemu-devel@nongnu.org; Thu, 02 Apr 2026 23:55:57 -0400","from fmviesa007.fm.intel.com ([10.60.135.147])\n by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Apr 2026 20:55:51 -0700","from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.230.229])\n by fmviesa007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Apr 2026 20:55:47 -0700"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1775188555; x=1806724555;\n h=from:to:cc:subject:date:message-id:mime-version:\n content-transfer-encoding;\n bh=jOwDZNiv3rXwaq0VyZB7EzAimt8Z4rFDS752mFczAag=;\n b=eom7OKgETJWG68AsbsuMYXQai5r1WiBGDk5rY8bQ8SjehuG3eI1GlqXT\n w/I8Skg9Mxjl1bLzDfrSj3bVV4eiSPyQsQWC30eFDbZ2LTJXehkd1rReQ\n nA9m8cxU65xKuF5xm6iDIzb+MkT0oZjHQ/O5TJX19K9mpDosjk1gX0GF/\n fwIE/cwX9vgNfGhVwYwUCNY+eaL6TYXitytlfPnqesWPv0KZC1U3VL95k\n NLt/OO33pthY3sZNxcgpzc/wqTIEAMyDscOyP8Joo4tN4kuIewsAYhsbh\n 7p7uxJoYycp6o+d99ziAnagx+gEtJaqNfwabJ7gylpz9o8fdLSsUYZ2+v Q==;","X-CSE-ConnectionGUID":["DRu4BsMOSquSRjDintG5zA==","I9OR+30+TVepDExXbRvusQ=="],"X-CSE-MsgGUID":["IQKO8xweSGK1NbUYYpi/aA==","tlOIz54tRBawo7Mn2iqftg=="],"X-IronPort-AV":["E=McAfee;i=\"6800,10657,11747\"; a=\"76140582\"","E=Sophos;i=\"6.23,157,1770624000\"; d=\"scan'208\";a=\"76140582\"","E=Sophos;i=\"6.23,157,1770624000\"; d=\"scan'208\";a=\"223884840\""],"X-ExtLoop1":"1","From":"Zhenzhong Duan <zhenzhong.duan@intel.com>","To":"qemu-devel@nongnu.org","Cc":"alex@shazbot.org, clg@redhat.com, eric.auger@redhat.com, mst@redhat.com,\n jasowang@redhat.com, jgg@nvidia.com, nicolinc@nvidia.com,\n skolothumtho@nvidia.com, joao.m.martins@oracle.com,\n clement.mathieu--drif@bull.com, kevin.tian@intel.com, yi.l.liu@intel.com,\n xudong.hao@intel.com, Zhenzhong Duan <zhenzhong.duan@intel.com>","Subject":"[PATCH v3 00/14] intel_iommu: Enable PASID support for passthrough\n device","Date":"Thu,  2 Apr 2026 23:55:24 -0400","Message-ID":"<20260403035541.18355-1-zhenzhong.duan@intel.com>","X-Mailer":"git-send-email 2.47.3","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=198.175.65.19;\n envelope-from=zhenzhong.duan@intel.com; helo=mgamail.intel.com","X-Spam_score_int":"-48","X-Spam_score":"-4.9","X-Spam_bar":"----","X-Spam_report":"(-4.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.542,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Hi,\n\nNow we already support first stage translation with passthrough device\nbacked by nested translation in host, but only for IOMMU_NO_PASID.\n\nStructure VTDAddressSpace includes some elements suitable for emulated\ndevice and passthrough device without PASID, e.g., address space,\ndifferent memory regions, etc, it is also protected by vtd iommu lock,\nall these are useless and become a burden for passthrough device with\nPASID.\n\nWhen there are lots of PASIDs used in one device, the AS and MRs are\nall registered to memory core and impact the whole system performance.\n\nSo instead of using VTDAddressSpace to cache pasid entry for each pasid\nof a passthrough device, we define a light weight structure\nVTDAccelPASIDCacheEntry with only necessary elements for each pasid. We\nwill use this struct as a parameter to conduct binding/unbinding to\nnested hwpt, to record the current binded nested hwpt and even future\nPRQ support. It's also designed to support IOMMU_NO_PASID.\n\nThe potential full definition of VTDAccelPASIDCacheEntry may like:\n\n  typedef struct VTDAccelPASIDCacheEntry {\n      VTDHostIOMMUDevice *vtd_hiod;\n      VTDPASIDEntry pasid_entry;\n      uint32_t pasid;\n      uint32_t fs_hwpt_id;\n      uint32_t fault_id;\n      int fault_fd;\n      QLIST_HEAD(, VTDPRQEntry) vtd_prq_list;\n      IOMMUPRINotifier pri_notifier_entry;\n      IOMMUPRINotifier *pri_notifier;\n      QLIST_ENTRY(VTDAccelPASIDCacheEntry) next;\n  } VTDAccelPASIDCacheEntry;\n\nBased on vfio-next.\nGIT branch: https://github.com/yiliu1765/qemu/tree/zhenzhong/iommufd_pasid.v3\n\nPATCH01-07: Some preparing work\nPATCH08-12: Handle PASID entry addition/removal and bind/unbind\nPATCH13-14: Add PASID related check and enable PASID for passthrough device\n\nThis patchset depends on a kernel feature enhancement[1] to work.\n\nTests:\nTested with DSA device which driver uses 2 PASIDs by default.\n\nThanks\nZhenzhong\n\n[1] https://lore.kernel.org/all/20260330101108.12594-1-zhenzhong.duan@intel.com/\n\nChangelog:\nv3:\n- fix @Pasid parameter's comment (Liuyi)\n- introduce a wrapper vtd_accel_delete_pc() (Liuyi)\n- drop patch12 in v2 to avoid a race condition (Clement)\n- s/PASID_0/IOMMU_NO_PASID s/gloal/global s/as_it/hiod_it (Liuyi)\n- make trace_vtd_device_at/detach_hwpt use IOMMU_NO_PASID (Liuyi)\n- change _accel subfix style naming to vtd_accel_ prefix style (Liuyi)\n- drop unnecessary parameter vtd_hiod* from vtd_destroy_old_fs_hwpt() (Liuyi)\n- introduce a new flag VIOMMU_FLAG_WANT_PASID_ATTACH for pasid attach (Nicolin)\n\nv2:\n- move the check \"s->pasid > PCI_EXT_CAP_PASID_MAX_WIDTH\" to patch5 (Clement)\n- move #include \"hw/core/iommu.h\" before #include \"hw/core/qdev.h\" (Liuyi)\n- polish the comment about @Pasid parameter (Liuyi)\n- s/pe/pasid_entry, s/as_it/hiod_it, s/vtd_find_add_pc/vtd_accel_fill_pc (Liuyi)\n- s/VTDACCELPASIDCacheEntry/VTDAccelPASIDCacheEntry (Liuyi)\n- add explanation in code about PASID removal before addition (Liuyi)\n- polish the comment about scope of VTDAccelPASIDCacheEntry vs VTDPASIDCacheEntry (Liuyi)\n- add an optimization to bypass PASID entry addition for PASID selective pv_inv_dsc (Liuyi)\n\nv1:\n- use naming pattern \"XXX_SET_THENAME\" same as smmu (Clement)\n- fix s->pasid check (Clement)\n\nRFCv2:\n- extend attach/detach_hwpt() instead of introducing new callbacks (Shammer)\n- Define IOMMU_NO_PASID for device attachment without pasid (Nicolin)\n- update vtd_destroy_old_fs_hwpt()'s parameter for naming consistency (Clement)\n- check pasid bits size to be no more than 20 bits (Clement)\n- initialize local variable max_pasid_log2 to 0 (Cédric)\n\n\nZhenzhong Duan (14):\n  vfio/iommufd: Extend attach/detach_hwpt callback implementations with\n    pasid\n  iommufd: Extend attach/detach_hwpt callbacks to support pasid\n  vfio/iommufd: Create nesting parent hwpt with IOMMU_HWPT_ALLOC_PASID\n    flag\n  intel_iommu: Create the nested hwpt with IOMMU_HWPT_ALLOC_PASID flag\n  intel_iommu: Change pasid property from bool to uint8\n  intel_iommu: Export some functions\n  intel_iommu: Use IOMMU_NO_PASID and delete PASID_0\n  intel_iommu_accel: Handle PASID entry addition for pc_inv_dsc request\n  intel_iommu_accel: Handle PASID entry removal for pc_inv_dsc request\n  intel_iommu_accel: Bypass PASID entry addition for just deleted entry\n  intel_iommu_accel: Handle PASID entry removal for system reset\n  intel_iommu_accel: Switch to VTDAccelPASIDCacheEntry for PASID\n    bind/unbind and PIOTLB invalidation\n  intel_iommu_accel: Add pasid bits size check\n  intel_iommu: Expose flag VIOMMU_FLAG_PASID_SUPPORTED when configured\n\n hw/i386/intel_iommu_accel.h    |  20 +-\n hw/i386/intel_iommu_internal.h |  44 +++-\n include/hw/core/iommu.h        |   3 +\n include/hw/i386/intel_iommu.h  |   4 +-\n include/hw/vfio/vfio-device.h  |   1 +\n include/system/iommufd.h       |  16 +-\n backends/iommufd.c             |   9 +-\n hw/arm/smmuv3-accel.c          |  12 +-\n hw/i386/intel_iommu.c          |  94 +++-----\n hw/i386/intel_iommu_accel.c    | 425 +++++++++++++++++++++++++++------\n hw/vfio/device.c               |  11 +\n hw/vfio/iommufd.c              |  56 +++--\n hw/vfio/trace-events           |   4 +-\n 13 files changed, 528 insertions(+), 171 deletions(-)\n\n\nbase-commit: 976837a32b9fefea630dbe3e7c53e7479e614130"}