From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 20242A0547; Wed, 29 Sep 2021 12:19:02 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 019FC410D7; Wed, 29 Sep 2021 12:19:02 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id A631240685 for ; Wed, 29 Sep 2021 12:19:00 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10121"; a="288565815" X-IronPort-AV: E=Sophos;i="5.85,332,1624345200"; d="scan'208";a="288565815" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Sep 2021 03:18:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,332,1624345200"; d="scan'208";a="554728454" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by FMSMGA003.fm.intel.com with ESMTP; 29 Sep 2021 03:18:59 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Wed, 29 Sep 2021 03:18:59 -0700 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Wed, 29 Sep 2021 03:18:58 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12 via Frontend Transport; Wed, 29 Sep 2021 03:18:58 -0700 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (104.47.58.108) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.12; Wed, 29 Sep 2021 03:18:58 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RQK5WCCLJlHC4YZ3swcfx7Z/xWem00riIR6WlrM/2jxLFSOXvxnNBJa8420mGhbSa25Vm2jHOJXVVbmMEj+mK/af1csDb7qvgYQBZtkoZPRc2GAs4EHxuylkTt3vwlsab5GgsDlYS/6Z2eXvG+hpLZH36WMh20mgzDmeRCz9cKpY5UERA/G1G44CBg12Jbr4wqFSG7FJ1CEVaTDwRh8P52pp0JC/tJA5PeE2EqORNVloUxnOz9/pe99ZCnBKVvxAfe7TQXNUjOFCEUMmGCfdiGxHCVekByYaclrjkGZ/qjlQP8WaFM7g4xrYATgej+1JxEUgeFER0d4ARQkqHBqozQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=hJrYdqqwHP4fAaPe5KjnuJc2wPJBOOghxelPmKFxz2M=; b=ZKAIBknTFvdY6Vwle4/n8yJnDg31uGnJa1RjZnwDulh19nNlNYziJNHh07HjaQKzblamO1MAh5qetvZgSamvtr2rSepwB8H6WFlYDNHgPpIvvY59XFeq+dUEvaQFG2LKMyfblIIlv3R5vMgKvPDxV+Ad+Uvvb13PBhaAUzQEbPfj/mnmxHIu4x+a1RoRIR68JLFtBoBi/7qkJqhyYDFntyObrnE7LmGlHRFZrsDm+Z8hX3wkMJ30G5ojcWcLtTCVyEsvrJ5A0jvCgSa5lnWY/BaemTwaTJs3k+ZR3Owaq4UtBjDwR3EeAcUS84Nju0rkUNUmAk5WnDz7igUgNyl61w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hJrYdqqwHP4fAaPe5KjnuJc2wPJBOOghxelPmKFxz2M=; b=wwVal0Qdv/ApkLW+LAqieT/u6HyVqfIuPbu/FNqOsU+Yf6k0XOKYOFwUDzrp/THFxOsMVzHM4kVIAN1bVAdSz/YGHQYKsAFKvemPeJzFlaZJHip70w6qcvsLfziWFfzpeR7zpBwCO7EgXDB7rzleIvavZJKxp75Wrjdb9IlyCck= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; Received: from PH0PR11MB5093.namprd11.prod.outlook.com (2603:10b6:510:3e::23) by PH0PR11MB4886.namprd11.prod.outlook.com (2603:10b6:510:33::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4544.15; Wed, 29 Sep 2021 10:18:55 +0000 Received: from PH0PR11MB5093.namprd11.prod.outlook.com ([fe80::d145:710a:1bac:7e91]) by PH0PR11MB5093.namprd11.prod.outlook.com ([fe80::d145:710a:1bac:7e91%9]) with mapi id 15.20.4566.014; Wed, 29 Sep 2021 10:18:55 +0000 From: "Burakov, Anatoly" To: , Bruce Richardson , "Ray Kinsella" , Dmitry Kozlyuk , Narcisa Ana Maria Vasile , Dmitry Malloy , Pallavi Kadam CC: , References: <043fc2d53770da8248b9cd0214775f9d41f2e0fb.1631273229.git.anatoly.burakov@intel.com> Message-ID: <9972054c-c68f-5b8c-d8cd-2330fce82369@intel.com> Date: Wed, 29 Sep 2021 11:18:49 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.14.0 In-Reply-To: <043fc2d53770da8248b9cd0214775f9d41f2e0fb.1631273229.git.anatoly.burakov@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-ClientProxiedBy: DB6PR0801CA0058.eurprd08.prod.outlook.com (2603:10a6:4:2b::26) To PH0PR11MB5093.namprd11.prod.outlook.com (2603:10b6:510:3e::23) MIME-Version: 1.0 Received: from [192.168.1.10] (212.17.34.161) by DB6PR0801CA0058.eurprd08.prod.outlook.com (2603:10a6:4:2b::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4566.15 via Frontend Transport; Wed, 29 Sep 2021 10:18:53 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 71f8845e-fd07-46bc-c86c-08d983328ae9 X-MS-TrafficTypeDiagnostic: PH0PR11MB4886: X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6790; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Fr7F2HYj50R2tPE4wQEjjolTo3WJAZ3D4+rpdKo6E/nfry7qbop7h8h9oirVR11l0lRTj3ofqkFfmJTdxOkEMpIMlGW9PVTPFK8Snojg+CfJ5yxT2ltmbzCdmE3OkT6WQnZtP36/kjUwsLSW14S8ssBa0U0o4JRbzOOlfL2ZIZcgaVN9oozwzZqntgMlgdGPpt8siz09XmemqaResNZXvny8XUtFPX1IDBZ48McGxsC0meUUUny9/PUbEBg+crqyrcwNAgQm1oAy/7kX51ejbyQZz05iucMictjhx/C/shBLUa9NdTziEZX8sKtdtNfPzJvdQd5aJaOT2UGD+fpwPt5u3E2BxSN1aKYpv2DQlj85UhhzmQqaeuDxJ5Clk6HiptiZVLOh4zQMsBY/xkGC5xUe3eRsCLeev/w0skvPQVrhkOvGnx0hNmZpGRipk5tzWakHvOQB6fciUUqzL+990aa+idQEZwdlCeA3mrDdvoDpMfTEiDvO+8gO+rd1smvWunu4dPEsc6aZrLFu6wL+PJRayYth7XfJqpTlOmX01KLJAf49WL2IAa7TQjhiodoL4FUEbDefREaj/DD5lBHHp7PMlyk93H4aiGS36dEPTFyLtQj2wi+WoCI0VFMqLzysWtZIVhEmtgsaW3uzzLrQEOzSdG4VWVvBmSRVsELd7+OhCmyj3MXQC3xaNrNEwoLqRkX84Usde+/s/DHyPsmLLBbqm6jeUkXfi7EL1se9wKvj5lrnIZa0/RQLDlua9ZiP X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR11MB5093.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(316002)(31686004)(16576012)(8936002)(6636002)(107886003)(2906002)(2616005)(110136005)(31696002)(5660300002)(53546011)(8676002)(86362001)(4326008)(508600001)(6666004)(956004)(66946007)(38100700002)(66476007)(66556008)(83380400001)(6486002)(26005)(36756003)(186003)(45980500001)(43740500002); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bS92NkRvRjliaU1ncDE4WEVGVE1zaEdSVzlOSDNtU3E1ekxBMmZGL3ZnWXV4?= =?utf-8?B?QUhjSGkrc28zdUQzTTBsYisvRzJ1bzVqTTRoMmZ5aWdackRUSUtLZmdPRmk5?= =?utf-8?B?NjhETzB5MUs0REgxL0xlbnd4RmV4WS9odDJoV0VWNndielBzTU1HRmIySk5y?= =?utf-8?B?Z2R0eVZoWnhUR2k3ZG1rVGxZU0s1V3NyUVczVlIybVlZeVIxVFhpeDJDRTZk?= =?utf-8?B?S2QrZ1ZPanJwSWVIV2J0UkxzMEkrQU1iTXk1S2tqcGlUTlNhN2U1K1NOTDNh?= =?utf-8?B?RFp3YjB0bUs1Sk1qL2VJY255dmt6SGtKVkE5dHZqQXRiL3cxc3JsUjYrU3VF?= =?utf-8?B?YXFaK2NGSHQ0UFd4d3N4cXhqY3EyZm5yVFFoS1FRbUJiZVg2RUhhUGdtOTJq?= =?utf-8?B?YnpFOTc3RVV6TGJEK04zUE5NZVNGYW5tQWRhTHpIZnQvNThxbmU1aC9nTFlV?= =?utf-8?B?OGJJS3ZNRlFZU29pQ1RNUFdnVDdRc3hmY1hqR2RscUtoQ09lbG1RZnZmU0xq?= =?utf-8?B?M0k2UkQwbkg0NjhEUU9FaGloNnY0UnJrd1FmU2FadEpFVWd4U1VmSUE2ZXFs?= =?utf-8?B?eGxwY3ZVTmhZYnlXWDdvczFiNDBuNFNmMDRoVWY0ZVc0TDlUVkl2Vm9lM2xH?= =?utf-8?B?bkd2c1RmTUV1S2pGajhyQ1VPeUxFeG1ZUG4rYkdrTm1yT21kMWlwRVJqMUZF?= =?utf-8?B?MjQ3eUFqNHQ1UFhpQTZXY2xOckorQWtHZ3FQTkNCczJPZnZ0aEpkcUphMkhI?= =?utf-8?B?QlE4SUp4c2x5Z0RWb09KaWVDNWZrazA1ZWJuZ0J1YkpGbTZ3VTcxaDhkaWsr?= =?utf-8?B?MzdCUCtyZmM3ZmJrRFNIdkdLUlloSnQrVWkxNUE5dFdqdlMwNTV3WDlVRGxF?= =?utf-8?B?TmRieXRDM2Jmb01QWTNJeVdpZy8wUU1Qb3lHQ0lDbmtseUlHNGJqTFJkWkJW?= =?utf-8?B?Z3JxVGhIL21zR1FoSUdoSXAxV1RGTGg4cmFpUEM2NS9ZQzFIMHVsQ2ZXNGpJ?= =?utf-8?B?NXdQalcvWFc4QmVXZ0RSVGcvdlhRZGd0bFo4UUE5OUZ0ZlRNaTJ0VW9YeWli?= =?utf-8?B?ZHMrMTY5SVhYNS9KbVpuQ1lHcC8wOUlDaE5qRmVOeGFnUzc5QkhXbElleUU5?= =?utf-8?B?d21iWFJNbVZEQTNjbVNwUWozZ3dNS1pHQ1I1MHNBZStTMVphMmVhK1BwY2pw?= =?utf-8?B?b0dFano4bWJjaDV4bmgwakVEMjJHUEo2WkVjQzIrdjBkb0tGRjlXbktsYnNw?= =?utf-8?B?d3duU1BEcHNndlZpaTloZmkwMnJvVDhDZHE3NURzeW8zb3VJWEJ3NmdXenJ3?= =?utf-8?B?YXNJTHJXR0o5cFUxRzI4eEFqcVZXVlpiQ1BGUWQvSXhsYWdXR1h6elQ2OENw?= =?utf-8?B?WmpHTE85d0IxTGlOWkxJZnNNRERKSEQ1NjkvMGlGMGlzYS94ZmNkRlBYR1Vo?= =?utf-8?B?Z0VuS1FsMmJYZjRpbGlzNUMzM3JUTDRTZ0dtcUZGTVJjYkJMN2NnVisrZ0Vy?= =?utf-8?B?L3VYUGxSV21tU3VlS282eExKWnZDNVNzSHlDZlowTXBSRWNZL1BLYnp1ODht?= =?utf-8?B?VzFnckRvT3FiREp2ZjU5Z2cydWQ3SXpidGpxYnBFY1MwTWVlUkpmbndaS1dt?= =?utf-8?B?Rk1mcUZwQTZ6YjlMSUhyeGVudkZhZGp5cVNIUFJFcUFya3Bka1VhdmVRMGJX?= =?utf-8?B?NWhWdjJMTzBMOFRjeWJPV0NsSW9BRkg3N0pxdG5vODNOcjJOcTF1RDhwTVBX?= =?utf-8?Q?7qUxZdbF89rygaZW8Bu1FhwF4HiZD/f5iu6M7ot?= X-MS-Exchange-CrossTenant-Network-Message-Id: 71f8845e-fd07-46bc-c86c-08d983328ae9 X-MS-Exchange-CrossTenant-AuthSource: PH0PR11MB5093.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2021 10:18:55.3767 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lkN2+LObY8Ep9MGsPLbdkFtLqW1VB8MEuLfpDrk/DscVH7i9WrcXRm2XeuzzQe2RPFt+OEYSwOUnrtx50Me7jvI0jPJIlBfa2Mje1sU9B+Y= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR11MB4886 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v1 1/1] vfio: add page-by-page mapping API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 10-Sep-21 12:27 PM, Anatoly Burakov wrote: > Currently, there is no way to map memory for DMA in a way that allows > unmapping it partially later, because some IOMMU's do not support > partial unmapping. There is a workaround of mapping all of these > segments separately, but this is inconvenient and silly, so this > commit adds a proper API that does it. > > This commit relies on earlier infrastructure that was built out to > support "chunking", as the concept of "chunks" is essentially the same > as page size. > > Signed-off-by: Anatoly Burakov > --- > lib/eal/freebsd/eal.c | 10 ++++ > lib/eal/include/rte_vfio.h | 33 ++++++++++++++ > lib/eal/linux/eal_vfio.c | 93 +++++++++++++++++++++++++++++++------- > lib/eal/version.map | 3 ++ > lib/eal/windows/eal.c | 10 ++++ > 5 files changed, 133 insertions(+), 16 deletions(-) > > diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c > index 6cee5ae369..78e18f9765 100644 > --- a/lib/eal/freebsd/eal.c > +++ b/lib/eal/freebsd/eal.c > @@ -1085,6 +1085,16 @@ rte_vfio_container_dma_map(__rte_unused int container_fd, > return -1; > } > > +int > +rte_vfio_container_dma_map_paged(__rte_unused int container_fd, > + __rte_unused uint64_t vaddr, > + __rte_unused uint64_t iova, > + __rte_unused uint64_t len, > + __rte_unused uint64_t pagesz) > +{ > + return -1; > +} > + > int > rte_vfio_container_dma_unmap(__rte_unused int container_fd, > __rte_unused uint64_t vaddr, > diff --git a/lib/eal/include/rte_vfio.h b/lib/eal/include/rte_vfio.h > index 2d90b36480..6afae2ccce 100644 > --- a/lib/eal/include/rte_vfio.h > +++ b/lib/eal/include/rte_vfio.h > @@ -17,6 +17,8 @@ extern "C" { > #include > #include > > +#include > + > /* > * determine if VFIO is present on the system > */ > @@ -331,6 +333,37 @@ int > rte_vfio_container_dma_map(int container_fd, uint64_t vaddr, > uint64_t iova, uint64_t len); > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change, or be removed, without prior notice > + * > + * Perform DMA mapping for devices in a container, mapping memory page-by-page. > + * > + * @param container_fd > + * the specified container fd. Use RTE_VFIO_DEFAULT_CONTAINER_FD to > + * use the default container. > + * > + * @param vaddr > + * Starting virtual address of memory to be mapped. > + * > + * @param iova > + * Starting IOVA address of memory to be mapped. > + * > + * @param len > + * Length of memory segment being mapped. > + * > + * @param pagesz > + * Page size of the underlying memory. > + * > + * @return > + * 0 if successful > + * <0 if failed > + */ > +__rte_experimental > +int > +rte_vfio_container_dma_map_paged(int container_fd, uint64_t vaddr, > + uint64_t iova, uint64_t len, uint64_t pagesz); > + > /** > * Perform DMA unmapping for devices in a container. > * > diff --git a/lib/eal/linux/eal_vfio.c b/lib/eal/linux/eal_vfio.c > index 657c89ca58..c791730251 100644 > --- a/lib/eal/linux/eal_vfio.c > +++ b/lib/eal/linux/eal_vfio.c > @@ -1872,11 +1872,12 @@ vfio_dma_mem_map(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova, > > static int > container_dma_map(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova, > - uint64_t len) > + uint64_t len, uint64_t pagesz) > { > struct user_mem_map *new_map; > struct user_mem_maps *user_mem_maps; > bool has_partial_unmap; > + uint64_t chunk_size; > int ret = 0; > > user_mem_maps = &vfio_cfg->mem_maps; > @@ -1887,19 +1888,37 @@ container_dma_map(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova, > ret = -1; > goto out; > } > - /* map the entry */ > - if (vfio_dma_mem_map(vfio_cfg, vaddr, iova, len, 1)) { > - /* technically, this will fail if there are currently no devices > - * plugged in, even if a device were added later, this mapping > - * might have succeeded. however, since we cannot verify if this > - * is a valid mapping without having a device attached, consider > - * this to be unsupported, because we can't just store any old > - * mapping and pollute list of active mappings willy-nilly. > - */ > - RTE_LOG(ERR, EAL, "Couldn't map new region for DMA\n"); > - ret = -1; > - goto out; > + > + /* technically, mapping will fail if there are currently no devices > + * plugged in, even if a device were added later, this mapping might > + * have succeeded. however, since we cannot verify if this is a valid > + * mapping without having a device attached, consider this to be > + * unsupported, because we can't just store any old mapping and pollute > + * list of active mappings willy-nilly. > + */ > + > + /* if page size was not specified, map the entire segment in one go */ > + if (pagesz == 0) { > + if (vfio_dma_mem_map(vfio_cfg, vaddr, iova, len, 1)) { > + RTE_LOG(ERR, EAL, "Couldn't map new region for DMA\n"); > + ret = -1; > + goto out; > + } > + } else { > + /* otherwise, do mappings page-by-page */ > + uint64_t offset; > + > + for (offset = 0; offset < len; offset += pagesz) { > + uint64_t va = vaddr + offset; > + uint64_t io = iova + offset; > + if (vfio_dma_mem_map(vfio_cfg, va, io, pagesz, 1)) { > + RTE_LOG(ERR, EAL, "Couldn't map new region for DMA\n"); > + ret = -1; > + goto out; > + } > + } > } > + > /* do we have partial unmap support? */ > has_partial_unmap = vfio_cfg->vfio_iommu_type->partial_unmap; > > @@ -1908,8 +1927,18 @@ container_dma_map(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova, > new_map->addr = vaddr; > new_map->iova = iova; > new_map->len = len; > - /* for IOMMU types supporting partial unmap, we don't need chunking */ > - new_map->chunk = has_partial_unmap ? 0 : len; > + > + /* > + * Chunking essentially serves largely the same purpose as page sizes, > + * so for the purposes of this calculation, we treat them as the same. > + * The reason we have page sizes is because we want to map things in a > + * way that allows us to partially unmap later. Therefore, when IOMMU > + * supports partial unmap, page size is irrelevant and can be ignored. > + * For IOMMU that don't support partial unmap, page size is equivalent > + * to chunk size. > + */ > + chunk_size = pagesz == 0 ? len : pagesz; > + new_map->chunk = has_partial_unmap ? 0 : chunk_size; > > compact_user_maps(user_mem_maps); > out: > @@ -2179,7 +2208,29 @@ rte_vfio_container_dma_map(int container_fd, uint64_t vaddr, uint64_t iova, > return -1; > } > > - return container_dma_map(vfio_cfg, vaddr, iova, len); > + /* not having page size means we map entire segment */ > + return container_dma_map(vfio_cfg, vaddr, iova, len, 0); > +} > + > +int > +rte_vfio_container_dma_map_paged(int container_fd, uint64_t vaddr, > + uint64_t iova, uint64_t len, uint64_t pagesz) > +{ > + struct vfio_config *vfio_cfg; > + > + if (len == 0 || pagesz == 0 || !rte_is_power_of_2(pagesz) || > + (len % pagesz) != 0) { This should also check if VA/IOVA is page-aligned. Will fix in v2. > + rte_errno = EINVAL; > + return -1; > + } > + > + vfio_cfg = get_vfio_cfg_by_container_fd(container_fd); > + if (vfio_cfg == NULL) { > + RTE_LOG(ERR, EAL, "Invalid VFIO container fd\n"); > + return -1; > + } > + > + return container_dma_map(vfio_cfg, vaddr, iova, len, pagesz); > } > > int > @@ -2299,6 +2350,16 @@ rte_vfio_container_dma_map(__rte_unused int container_fd, > return -1; > } > > +int > +rte_vfio_container_dma_map_paged(__rte_unused int container_fd, > + __rte_unused uint64_t vaddr, > + __rte_unused uint64_t iova, > + __rte_unused uint64_t len, > + __rte_unused uint64_t pagesz) > +{ > + return -1; > +} > + > int > rte_vfio_container_dma_unmap(__rte_unused int container_fd, > __rte_unused uint64_t vaddr, > diff --git a/lib/eal/version.map b/lib/eal/version.map > index beeb986adc..eaa6b0bedf 100644 > --- a/lib/eal/version.map > +++ b/lib/eal/version.map > @@ -426,6 +426,9 @@ EXPERIMENTAL { > > # added in 21.08 > rte_power_monitor_multi; # WINDOWS_NO_EXPORT > + > + # added in 21.11 > + rte_vfio_container_dma_map_paged; > }; > > INTERNAL { > diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c > index 3d8c520412..fcd6bc1894 100644 > --- a/lib/eal/windows/eal.c > +++ b/lib/eal/windows/eal.c > @@ -459,6 +459,16 @@ rte_vfio_container_dma_map(__rte_unused int container_fd, > return -1; > } > > +int > +rte_vfio_container_dma_map_paged(__rte_unused int container_fd, > + __rte_unused uint64_t vaddr, > + __rte_unused uint64_t iova, > + __rte_unused uint64_t len, > + __rte_unused uint64_t pagesz) > +{ > + return -1; > +} > + > int > rte_vfio_container_dma_unmap(__rte_unused int container_fd, > __rte_unused uint64_t vaddr, > -- Thanks, Anatoly