From nobody Wed Nov 27 13:00:03 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; 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=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1699531470; cv=none; d=zohomail.com; s=zohoarc; b=dV7w1e/zplpB4duajVCC3hicL2KNMDEZN5Vw88JqUpu0FsF2fLNKw53ohrlKBBoag6J6AdpnhmC0bmGZH7ModETnvHgJ65Hi82itNwsyQr3+OORgBj2iMMRuJDzbU0X4wcpYOP6cn4zOhx42gW8a4y/uE4hJppuicoHxJUAqoZc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1699531470; 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=LmNO9nCH/f7C8dkldCoQwjBvcfvoViTuFEqfwFeyv3A=; b=a9Xt5er4SvA9Ih+KfC0WcyX8lCh14AG/2Vwhrx0yh/SmZbvmMomaolcO/t90/4CJoyvboWeDLwnvQeSWCOWjFoxLJigazLPLZAAKa+rbMA25BbrNPpzbbxfl+ySouSx+GDEZ0dsGZgdoKiZFLrxoIGghGH10L9YRFeLxDP1mglw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; 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 1699531470320762.8787874262717; Thu, 9 Nov 2023 04:04:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r13iv-0001re-Bn; Thu, 09 Nov 2023 07:01:25 -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 1r13it-0001rB-5w for qemu-devel@nongnu.org; Thu, 09 Nov 2023 07:01:23 -0500 Received: from mgamail.intel.com ([192.55.52.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r13iq-0001a4-MW for qemu-devel@nongnu.org; Thu, 09 Nov 2023 07:01:22 -0500 Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Nov 2023 04:01:16 -0800 Received: from duan-server-s2600bt.bj.intel.com ([10.240.192.147]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Nov 2023 04:01:12 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699531280; x=1731067280; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=rytyz8Fzz3g/DCRqLnp/ASJ9aH0+cH73LB9Px/8LGu4=; b=E1UvGKgmOnGtgwi96vBQywdvxVntLio7rBuKGuRlcL2B4obcAT9orP2A 2gLbWLMi0NlkMpZ+P9S5ZWbg5r2ZA7q1p7LeKM7OHGgTrus42kJcQa6+Q Lj3K1Nmy6xrN/yEaakijsl5qlnOdr4eL2NOKOymfuFCa0sPIxRCg3HRCW d5V/9i1/yYf7u16JwgQ7FrVWQCOWLggat7jpk+kSafEmf+7j2WEi+F/0n 8wMYFlHj/wfVvshuXHn0wUOhyj9flgG9o1faIgcRXmgT7SFaiwriiFFJV FpVKGDeBN0atvAA6IN3zZOp56hic25e43GPzjhu4rNHxdV5O4lBPfv0oq A==; X-IronPort-AV: E=McAfee;i="6600,9927,10888"; a="369305366" X-IronPort-AV: E=Sophos;i="6.03,289,1694761200"; d="scan'208";a="369305366" X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.03,289,1694761200"; d="scan'208";a="11515624" From: Zhenzhong Duan To: qemu-devel@nongnu.org Cc: alex.williamson@redhat.com, clg@redhat.com, jgg@nvidia.com, nicolinc@nvidia.com, joao.m.martins@oracle.com, eric.auger@redhat.com, peterx@redhat.com, jasowang@redhat.com, kevin.tian@intel.com, yi.l.liu@intel.com, yi.y.sun@intel.com, chao.p.peng@intel.com, Zhenzhong Duan Subject: [PATCH v5 05/20] vfio/iommufd: Add support for iova_ranges and pgsizes Date: Thu, 9 Nov 2023 19:45:14 +0800 Message-Id: <20231109114529.1904193-6-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231109114529.1904193-1-zhenzhong.duan@intel.com> References: <20231109114529.1904193-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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=192.55.52.136; envelope-from=zhenzhong.duan@intel.com; helo=mgamail.intel.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, 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 @intel.com) X-ZM-MESSAGEID: 1699531471023100007 Content-Type: text/plain; charset="utf-8" Some vIOMMU such as virtio-iommu use iova ranges from host side to setup reserved ranges for passthrough device, so that guest will not use an iova range beyond host support. Use an uAPI of IOMMUFD to get iova ranges of host side and pass to vIOMMU just like the legacy backend. Also use out_iova_alignment returned from uAPI as pgsizes instead of qemu_real_host_page_size() as a fallback. Signed-off-by: Zhenzhong Duan --- v5: Add missed pgsizes initialization in vfio_get_info_iova_range hw/vfio/iommufd.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index ea4e23f4ec..958c3e794f 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -267,6 +267,53 @@ static int iommufd_ram_block_discard_disable(bool stat= e) return ram_block_uncoordinated_discard_disable(state); } =20 +static int vfio_get_info_iova_range(VFIOIOMMUFDContainer *container, + uint32_t ioas_id) +{ + VFIOContainerBase *bcontainer =3D &container->bcontainer; + struct iommu_ioas_iova_ranges *info; + struct iommu_iova_range *iova_ranges; + int ret, sz, fd =3D container->be->fd; + + info =3D g_malloc0(sizeof(*info)); + info->size =3D sizeof(*info); + info->ioas_id =3D ioas_id; + + ret =3D ioctl(fd, IOMMU_IOAS_IOVA_RANGES, info); + if (ret && errno !=3D EMSGSIZE) { + goto error; + } + + sz =3D info->num_iovas * sizeof(struct iommu_iova_range); + info =3D g_realloc(info, sizeof(*info) + sz); + info->allowed_iovas =3D (uintptr_t)(info + 1); + + ret =3D ioctl(fd, IOMMU_IOAS_IOVA_RANGES, info); + if (ret) { + goto error; + } + + iova_ranges =3D (struct iommu_iova_range *)(uintptr_t)info->allowed_io= vas; + + for (int i =3D 0; i < info->num_iovas; i++) { + Range *range =3D g_new(Range, 1); + + range_set_bounds(range, iova_ranges[i].start, iova_ranges[i].last); + bcontainer->iova_ranges =3D + range_list_insert(bcontainer->iova_ranges, range); + } + bcontainer->pgsizes =3D info->out_iova_alignment; + + g_free(info); + return 0; + +error: + ret =3D -errno; + g_free(info); + error_report("vfio/iommufd: Cannot get iova ranges: %m"); + return ret; +} + static int iommufd_attach_device(const char *name, VFIODevice *vbasedev, AddressSpace *as, Error **errp) { @@ -343,6 +390,7 @@ static int iommufd_attach_device(const char *name, VFIO= Device *vbasedev, } =20 bcontainer->pgsizes =3D qemu_real_host_page_size(); + vfio_get_info_iova_range(container, ioas_id); =20 bcontainer->listener =3D vfio_memory_listener; memory_listener_register(&bcontainer->listener, bcontainer->space->as); --=20 2.34.1