From nobody Fri Oct 18 09:17:56 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1707746316; cv=none; d=zohomail.com; s=zohoarc; b=oE/GSQ/F3eaG7jDE3lLhcs5W7a0pH/w8weAjz+KfY/ANg5TYVBY9Qenz8OFrK/W2u+fVSSEnTteuwq2wih6AwQn45ShCLTvEd9/RLjcoxCIjav1K4/LmxTe2RhBuqA7aDRv7sfLAZK0RaJjclSfR20bY5NPmCOSwPz/DNjk63Ms= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1707746316; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NKYw2KnbG7Z3DMtUsjDy0vLuRffYtT6VEU5hwHoz/To=; b=XM9MziYRdy5QYFoETC2QPggGooQVImK5DV6aY+ZyAtm2zDMpVB6iu/ajmb4hCNkhAj9YhQmFtMg786VpuSuuuFhugsjb2wFygrgBHnh7QFRS/q1TLDzXGh0x4M26GrodjLtupBDjYlFkRBtbDXg1wxMvWKE+weyklfoiYXkpnsA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1707746316377438.92275365519606; Mon, 12 Feb 2024 05:58:36 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rZWom-0006zF-F6; Mon, 12 Feb 2024 08:57:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rZWo8-0006XF-59 for qemu-devel@nongnu.org; Mon, 12 Feb 2024 08:57:16 -0500 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rZWo3-0007ER-6B for qemu-devel@nongnu.org; Mon, 12 Feb 2024 08:57:13 -0500 Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 41CDo2xU000440; Mon, 12 Feb 2024 13:57:06 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3w7mj2g0h6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 12 Feb 2024 13:57:06 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 41CCrK38024602; Mon, 12 Feb 2024 13:57:06 GMT Received: from pps.reinject (localhost [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3w5ykc2103-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 12 Feb 2024 13:57:06 +0000 Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 41CDuqiB026744; Mon, 12 Feb 2024 13:57:05 GMT Received: from joaomart-mac.nl.oracle.com (dhcp-10-175-27-30.vpn.oracle.com [10.175.27.30]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTP id 3w5ykc20rs-5; Mon, 12 Feb 2024 13:57:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=corp-2023-11-20; bh=NKYw2KnbG7Z3DMtUsjDy0vLuRffYtT6VEU5hwHoz/To=; b=R2a4wCixrkFccEU2MwY2CeNB6advwdYxwk9/GtBsATDZ29qsfg444qnORCFXgER3/nTo Sl1OyF7TMS6lSRUlrHyvm5TioSzrB+TBrcfcPDCa0QvlP4JJFi0QfwepZke593gsoEXp TRU5c3LUJG+SVmQ5DNSLi99bSMniGA3yAwBbbnEi+N7oyTG455nFaAbHgYATIw0INyTe lnFPkYyLZuZI+48T8fd+IrYWyP0soHubCr40x3yDOPuOKuDKfWT3vKUCC0CZ+KM82URG AqhkgyhEqRa5gnT86rP0c+7EhczYdwfbR54PxxlaX3f9ePw6kKZ2E5LIsMZ0G55MsKqU 4Q== From: Joao Martins To: qemu-devel@nongnu.org Cc: Yi Liu , Eric Auger , Zhenzhong Duan , Alex Williamson , Cedric Le Goater , Paolo Bonzini , "Daniel P . Berrange" , Eduardo Habkost , Eric Blake , Markus Armbruster , Jason Gunthorpe , Avihai Horon , Joao Martins Subject: [PATCH RFCv2 4/8] vfio/iommufd: Implement VFIOIOMMUClass::set_dirty_tracking support Date: Mon, 12 Feb 2024 13:56:39 +0000 Message-Id: <20240212135643.5858-5-joao.m.martins@oracle.com> In-Reply-To: <20240212135643.5858-1-joao.m.martins@oracle.com> References: <20240212135643.5858-1-joao.m.martins@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-02-12_10,2024-02-12_03,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 bulkscore=0 mlxlogscore=999 malwarescore=0 mlxscore=0 spamscore=0 suspectscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2311290000 definitions=main-2402120105 X-Proofpoint-GUID: tYafEM4yiwjKW6zarmRoeruJwAz6VQ2W X-Proofpoint-ORIG-GUID: tYafEM4yiwjKW6zarmRoeruJwAz6VQ2W Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=joao.m.martins@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.com) X-ZM-MESSAGEID: 1707746317508100003 Content-Type: text/plain; charset="utf-8" ioctl(iommufd, IOMMU_HWPT_SET_DIRTY_TRACKING, arg) is the UAPI that enables or disables dirty page tracking. It is called on the whole list of iommu domains it is are tracking, and on failure it rolls it back. Signed-off-by: Joao Martins --- backends/iommufd.c | 19 +++++++++++++++++++ backends/trace-events | 1 + hw/vfio/common.c | 7 ++++++- hw/vfio/iommufd.c | 28 ++++++++++++++++++++++++++++ include/sysemu/iommufd.h | 3 +++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/backends/iommufd.c b/backends/iommufd.c index 2970135af4b9..954de61c2da0 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -240,6 +240,25 @@ int iommufd_backend_alloc_hwpt(int iommufd, uint32_t d= ev_id, return !ret ? 0 : -errno; } =20 +int iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t hwpt_i= d, + bool start) +{ + int ret; + struct iommu_hwpt_set_dirty_tracking set_dirty =3D { + .size =3D sizeof(set_dirty), + .hwpt_id =3D hwpt_id, + .flags =3D !start ? 0 : IOMMU_HWPT_DIRTY_TRACKING_ENABLE, + }; + + ret =3D ioctl(be->fd, IOMMU_HWPT_SET_DIRTY_TRACKING, &set_dirty); + trace_iommufd_backend_set_dirty(be->fd, hwpt_id, start, ret); + if (ret) { + error_report("IOMMU_HWPT_SET_DIRTY_TRACKING failed: %s", + strerror(errno)); + } + return !ret ? 0 : -errno; +} + static const TypeInfo iommufd_backend_info =3D { .name =3D TYPE_IOMMUFD_BACKEND, .parent =3D TYPE_OBJECT, diff --git a/backends/trace-events b/backends/trace-events index f83a276a4253..feba2baca5f7 100644 --- a/backends/trace-events +++ b/backends/trace-events @@ -16,3 +16,4 @@ iommufd_backend_unmap_dma(int iommufd, uint32_t ioas, uin= t64_t iova, uint64_t si iommufd_backend_alloc_hwpt(int iommufd, uint32_t dev_id, uint32_t pt_id, u= int32_t flags, uint32_t hwpt_type, uint32_t len, uint64_t data_ptr, uint32_= t out_hwpt_id, int ret) " iommufd=3D%d dev_id=3D%u pt_id=3D%u flags=3D0x%x = hwpt_type=3D%u len=3D%u data_ptr=3D0x%"PRIx64" out_hwpt=3D%u (%d)" iommufd_backend_alloc_ioas(int iommufd, uint32_t ioas, int ret) " iommufd= =3D%d ioas=3D%d (%d)" iommufd_backend_free_id(int iommufd, uint32_t id, int ret) " iommufd=3D%d = id=3D%d (%d)" +iommufd_backend_set_dirty(int iommufd, uint32_t hwpt_id, bool start, int r= et) " iommufd=3D%d hwpt=3D%d enable=3D%d (%d)" diff --git a/hw/vfio/common.c b/hw/vfio/common.c index d8fc7077f839..a940c0b6ede8 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -190,7 +190,7 @@ static bool vfio_devices_all_dirty_tracking(VFIOContain= erBase *bcontainer) QLIST_FOREACH(vbasedev, &bcontainer->device_list, container_next) { VFIOMigration *migration =3D vbasedev->migration; =20 - if (!migration) { + if (!migration && !vbasedev->iommufd_dev.iommufd) { return false; } =20 @@ -199,6 +199,11 @@ static bool vfio_devices_all_dirty_tracking(VFIOContai= nerBase *bcontainer) vfio_device_state_is_precopy(vbasedev))) { return false; } + + if (vbasedev->iommufd_dev.iommufd && + !bcontainer->dirty_pages_supported) { + return false; + } } return true; } diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index edacb6d72748..361e659288fd 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -25,6 +25,7 @@ #include "qemu/cutils.h" #include "qemu/chardev_open.h" #include "pci.h" +#include "migration/migration.h" =20 static int iommufd_cdev_map(const VFIOContainerBase *bcontainer, hwaddr io= va, ram_addr_t size, void *vaddr, bool readonly) @@ -115,6 +116,32 @@ static void iommufd_cdev_unbind_and_disconnect(VFIODev= ice *vbasedev) iommufd_backend_disconnect(vbasedev->iommufd_dev.iommufd); } =20 +static int iommufd_set_dirty_page_tracking(const VFIOContainerBase *bconta= iner, + bool start) +{ + const VFIOIOMMUFDContainer *container =3D + container_of(bcontainer, VFIOIOMMUFDContainer, bcontainer); + int ret; + VFIOIOASHwpt *hwpt; + + QLIST_FOREACH(hwpt, &container->hwpt_list, next) { + ret =3D iommufd_backend_set_dirty_tracking(container->be, + hwpt->hwpt_id, start); + if (ret) { + goto err; + } + } + + return 0; + +err: + QLIST_FOREACH(hwpt, &container->hwpt_list, next) { + iommufd_backend_set_dirty_tracking(container->be, + hwpt->hwpt_id, !start); + } + return ret; +} + static int iommufd_cdev_getfd(const char *sysfs_path, Error **errp) { long int ret =3D -ENOTTY; @@ -737,6 +764,7 @@ static void vfio_iommu_iommufd_class_init(ObjectClass *= klass, void *data) vioc->detach_device =3D iommufd_cdev_detach; vioc->pci_hot_reset =3D iommufd_cdev_pci_hot_reset; vioc->host_iommu_device_init =3D vfio_cdev_host_iommu_device_init; + vioc->set_dirty_page_tracking =3D iommufd_set_dirty_page_tracking; }; =20 static const TypeInfo types[] =3D { diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h index 1966b75caae2..562c189dd92c 100644 --- a/include/sysemu/iommufd.h +++ b/include/sysemu/iommufd.h @@ -53,4 +53,7 @@ int iommufd_backend_alloc_hwpt(int iommufd, uint32_t dev_= id, uint32_t pt_id, uint32_t flags, uint32_t data_type, uint32_t data_len, void *data_ptr, uint32_t *out_hwpt); +int iommufd_backend_set_dirty_tracking(IOMMUFDBackend *be, uint32_t hwpt_i= d, + bool start); + #endif --=20 2.39.3