get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 93683,
    "url": "https://patches.dpdk.org/api/patches/93683/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210601030644.3318-7-chenbo.xia@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210601030644.3318-7-chenbo.xia@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210601030644.3318-7-chenbo.xia@intel.com",
    "date": "2021-06-01T03:06:44",
    "name": "[RFC,v3,6/6] bus/pci: add sparse mmap support for mediated PCI devices",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "454b2720a16fd723860cad8930c48384ba78c633",
    "submitter": {
        "id": 1276,
        "url": "https://patches.dpdk.org/api/people/1276/?format=api",
        "name": "Chenbo Xia",
        "email": "chenbo.xia@intel.com"
    },
    "delegate": {
        "id": 24651,
        "url": "https://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210601030644.3318-7-chenbo.xia@intel.com/mbox/",
    "series": [
        {
            "id": 17176,
            "url": "https://patches.dpdk.org/api/series/17176/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=17176",
            "date": "2021-06-01T03:06:38",
            "name": "Add mdev (Mediated device) support in DPDK",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/17176/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/93683/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/93683/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 1F64BA0A0A;\n\tTue,  1 Jun 2021 05:18:17 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A4419410E5;\n\tTue,  1 Jun 2021 05:18:13 +0200 (CEST)",
            "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by mails.dpdk.org (Postfix) with ESMTP id A3B8A410EE\n for <dev@dpdk.org>; Tue,  1 Jun 2021 05:18:11 +0200 (CEST)",
            "from fmsmga002.fm.intel.com ([10.253.24.26])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 31 May 2021 20:18:11 -0700",
            "from npg-dpdk-virtio-xiachenbo-nw.sh.intel.com ([10.67.118.250])\n by fmsmga002.fm.intel.com with ESMTP; 31 May 2021 20:18:08 -0700"
        ],
        "IronPort-SDR": [
            "\n nP9u7NetYl16hQLvN96+M9ximiHxyS+6vVvZFikmYj7PcyDf71xVNu51dFLAcZXTPPSj5wuizs\n sBimBbvppGcg==",
            "\n kNcKM3TR6UPpXjqzmAelTAkLEEO0fNA7llkCYtkn+3Id/gBK5MxaYdkCF48oEQ1XN/0XCHGbL+\n GIeaAG3XxpxA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10001\"; a=\"201593048\"",
            "E=Sophos;i=\"5.83,239,1616482800\"; d=\"scan'208\";a=\"201593048\"",
            "E=Sophos;i=\"5.83,239,1616482800\"; d=\"scan'208\";a=\"482315504\""
        ],
        "X-ExtLoop1": "1",
        "From": "Chenbo Xia <chenbo.xia@intel.com>",
        "To": "dev@dpdk.org, thomas@monjalon.net, cunming.liang@intel.com,\n jingjing.wu@intel.com",
        "Cc": "anatoly.burakov@intel.com, ferruh.yigit@intel.com, mdr@ashroe.eu,\n nhorman@tuxdriver.com, bruce.richardson@intel.com,\n david.marchand@redhat.com, stephen@networkplumber.org,\n konstantin.ananyev@intel.com",
        "Date": "Tue,  1 Jun 2021 11:06:44 +0800",
        "Message-Id": "<20210601030644.3318-7-chenbo.xia@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210601030644.3318-1-chenbo.xia@intel.com>",
        "References": "<20190715075214.16616-6-tiwei.bie@intel.com>\n <20210601030644.3318-1-chenbo.xia@intel.com>",
        "Subject": "[dpdk-dev] [RFC v3 6/6] bus/pci: add sparse mmap support for\n mediated PCI devices",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patch adds sparse mmap support in PCI bus. Sparse mmap is a\ncapability defined in VFIO which allows multiple mmap areas in one\nVFIO region. Mediated pci devices could use this capability to let\nmdev parent driver have control over access of non-mmapable part\nof regions.\n\nSigned-off-by: Chenbo Xia <chenbo.xia@intel.com>\n---\n drivers/bus/pci/linux/pci_vfio.c | 229 +++++++++++++++++++++++++++----\n drivers/bus/pci/private.h        |   2 +\n drivers/bus/pci/rte_bus_pci.h    |  18 ++-\n 3 files changed, 218 insertions(+), 31 deletions(-)",
    "diff": "diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c\nindex 00ba5db03a..e68eccb63f 100644\n--- a/drivers/bus/pci/linux/pci_vfio.c\n+++ b/drivers/bus/pci/linux/pci_vfio.c\n@@ -654,6 +654,82 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,\n \treturn 0;\n }\n \n+static int\n+pci_vfio_sparse_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,\n+\t\tstruct vfio_region_sparse_mmap_area *vfio_areas,\n+\t\tuint32_t nr_areas, int bar_index, int additional_flags,\n+\t\tint numa_node)\n+{\n+\tstruct pci_map *map = &vfio_res->maps[bar_index];\n+\tstruct rte_mem_map_area *area;\n+\tstruct vfio_region_sparse_mmap_area *sparse;\n+\tvoid *bar_addr;\n+\tuint32_t i, j;\n+\n+\tmap->nr_areas = nr_areas;\n+\n+\tif (map->size == 0) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Bar size is 0, skip BAR%d\\n\", bar_index);\n+\t\treturn 0;\n+\t}\n+\n+\tif (!map->nr_areas) {\n+\t\tRTE_LOG(DEBUG, EAL, \"Skip bar %d with no sparse mmap areas\\n\",\n+\t\t\tbar_index);\n+\t\tmap->areas = NULL;\n+\t\treturn 0;\n+\t}\n+\n+\tif (map->areas == NULL) {\n+\t\tmap->areas = rte_zmalloc_socket(NULL,\n+\t\t\t\tsizeof(*map->areas) * nr_areas,\n+\t\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n+\t\tif (map->areas == NULL) {\n+\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\"Cannot alloc memory for sparse map areas\\n\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < map->nr_areas; i++) {\n+\t\tarea = &map->areas[i];\n+\t\tsparse = &vfio_areas[i];\n+\n+\t\tbar_addr = mmap(map->addr, sparse->size, 0, MAP_PRIVATE |\n+\t\t\t\tMAP_ANONYMOUS | additional_flags, -1, 0);\n+\t\tif (bar_addr != MAP_FAILED) {\n+\t\t\tarea->addr = pci_map_resource(bar_addr, vfio_dev_fd,\n+\t\t\t\tmap->offset + sparse->offset, sparse->size,\n+\t\t\t\tRTE_MAP_FORCE_ADDRESS);\n+\t\t\tif (area->addr == NULL) {\n+\t\t\t\tmunmap(bar_addr, sparse->size);\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Failed to map pci BAR%d\\n\",\n+\t\t\t\t\tbar_index);\n+\t\t\t\tgoto err_map;\n+\t\t\t}\n+\n+\t\t\tarea->offset = sparse->offset;\n+\t\t\tarea->size = sparse->size;\n+\t\t} else {\n+\t\t\tRTE_LOG(ERR, EAL, \"Failed to create inaccessible mapping for BAR%d\\n\",\n+\t\t\t\tbar_index);\n+\t\t\tgoto err_map;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+\n+err_map:\n+\tfor (j = 0; j < i; j++) {\n+\t\tpci_unmap_resource(map->areas[j].addr, map->areas[j].size);\n+\t\tmap->areas[j].offset = 0;\n+\t\tmap->areas[j].size = 0;\n+\t}\n+\trte_free(map->areas);\n+\tmap->nr_areas = 0;\n+\treturn -1;\n+}\n+\n /*\n  * region info may contain capability headers, so we need to keep reallocating\n  * the memory until we match allocated memory size with argsz.\n@@ -770,6 +846,31 @@ pci_vfio_fill_regions(struct rte_pci_device *dev, int vfio_dev_fd,\n \treturn 0;\n }\n \n+static void\n+clean_up_pci_resource(struct mapped_pci_resource *vfio_res)\n+{\n+\tstruct pci_map *map;\n+\tuint32_t i, j;\n+\n+\tfor (i = 0; i < PCI_MAX_RESOURCE; i++) {\n+\t\tmap = &vfio_res->maps[i];\n+\t\tif (map->nr_areas > 1) {\n+\t\t\tfor (j = 0; j < map->nr_areas; j++)\n+\t\t\t\tpci_unmap_resource(map->areas[j].addr,\n+\t\t\t\t\tmap->areas[j].size);\n+\t\t} else {\n+\t\t\t/*\n+\t\t\t * We do not need to be aware of MSI-X BAR mappings.\n+\t\t\t * Using current maps array is enough.\n+\t\t\t */\n+\t\t\tif (map->addr)\n+\t\t\t\tpci_unmap_resource(map->addr, map->size);\n+\t\t}\n+\t}\n+\n+\trte_free(map->areas);\n+}\n+\n static int\n pci_vfio_map_resource_primary(struct rte_pci_device *dev)\n {\n@@ -866,6 +967,8 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev)\n \n \tfor (i = 0; i < vfio_res->nb_maps; i++) {\n \t\tvoid *bar_addr;\n+\t\tstruct vfio_info_cap_header *hdr;\n+\t\tstruct vfio_region_info_cap_sparse_mmap *sparse;\n \n \t\tret = pci_vfio_get_region_info(vfio_dev_fd, &reg, i);\n \t\tif (ret < 0) {\n@@ -911,15 +1014,59 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev)\n \t\tmaps[i].size = reg->size;\n \t\tmaps[i].path = NULL; /* vfio doesn't have per-resource paths */\n \n-\t\tret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, 0);\n-\t\tif (ret < 0) {\n-\t\t\tRTE_LOG(ERR, EAL, \"%s mapping BAR%i failed: %s\\n\",\n-\t\t\t\t\tpci_addr, i, strerror(errno));\n-\t\t\tfree(reg);\n-\t\t\tgoto err_vfio_res;\n-\t\t}\n+\t\thdr = pci_vfio_info_cap(reg, VFIO_REGION_INFO_CAP_SPARSE_MMAP);\n+\n+\t\tif (dev->is_mdev && hdr != NULL) {\n+\t\t\tsparse = container_of(hdr,\n+\t\t\t\tstruct vfio_region_info_cap_sparse_mmap,\n+\t\t\t\theader);\n+\n+\t\t\tret = pci_vfio_sparse_mmap_bar(vfio_dev_fd, vfio_res,\n+\t\t\t\tsparse->areas, sparse->nr_areas, i, 0,\n+\t\t\t\tdev->device.numa_node);\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"%s sparse mapping BAR%i failed: %s\\n\",\n+\t\t\t\t\t\tpci_addr, i, strerror(errno));\n+\t\t\t\tfree(reg);\n+\t\t\t\tgoto err_vfio_res;\n+\t\t\t}\n \n-\t\tdev->mem_resource[i].addr = maps[i].addr;\n+\t\t\tdev->sparse_mem[i].size = reg->size;\n+\t\t\tdev->sparse_mem[i].nr_maps = vfio_res->maps[i].nr_areas;\n+\t\t\tdev->sparse_mem[i].areas = vfio_res->maps[i].areas;\n+\t\t} else {\n+\t\t\tret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, 0);\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"%s mapping BAR%i failed: %s\\n\",\n+\t\t\t\t\t\tpci_addr, i, strerror(errno));\n+\t\t\t\tfree(reg);\n+\t\t\t\tgoto err_vfio_res;\n+\t\t\t}\n+\n+\t\t\tif (dev->is_mdev) {\n+\t\t\t\tstruct pci_map *mdev_map = &maps[i];\n+\t\t\t\tmdev_map->nr_areas = 1;\n+\t\t\t\tmdev_map->areas = rte_zmalloc_socket(NULL,\n+\t\t\t\t\tsizeof(*mdev_map->areas),\n+\t\t\t\t\tRTE_CACHE_LINE_SIZE,\n+\t\t\t\t\tdev->device.numa_node);\n+\t\t\t\tif (maps[i].areas == NULL) {\n+\t\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\t\"Cannot allocate memory for sparse map areas\\n\");\n+\t\t\t\t\tgoto err_vfio_res;\n+\t\t\t\t}\n+\t\t\t\tmdev_map->areas[0].addr = maps[i].addr;\n+\t\t\t\tmdev_map->areas[0].offset = 0;\n+\t\t\t\tmdev_map->areas[0].size = reg->size;\n+\t\t\t\tdev->sparse_mem[i].size = reg->size;\n+\t\t\t\tdev->sparse_mem[i].nr_maps = 1;\n+\t\t\t\tdev->sparse_mem[i].areas = mdev_map->areas;\n+\t\t\t} else {\n+\t\t\t\tmaps[i].nr_areas = 0;\n+\t\t\t\tmaps[i].areas = NULL;\n+\t\t\t\tdev->mem_resource[i].addr = maps[i].addr;\n+\t\t\t}\n+\t\t}\n \n \t\tfree(reg);\n \t}\n@@ -940,6 +1087,7 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev)\n \n \treturn 0;\n err_vfio_res:\n+\tclean_up_pci_resource(vfio_res);\n \trte_free(vfio_res);\n err_vfio_dev_fd:\n \trte_vfio_release_device(rte_pci_get_sysfs_path(),\n@@ -960,7 +1108,7 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev)\n \tstruct mapped_pci_res_list *vfio_res_list =\n \t\tRTE_TAILQ_CAST(rte_vfio_tailq.head, mapped_pci_res_list);\n \n-\tstruct pci_map *maps;\n+\tstruct pci_map *maps, *cur;\n \n \tdev->intr_handle.fd = -1;\n #ifdef HAVE_VFIO_DEV_REQ_INTERFACE\n@@ -1012,14 +1160,49 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev)\n \tmaps = vfio_res->maps;\n \n \tfor (i = 0; i < vfio_res->nb_maps; i++) {\n-\t\tret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res, i, MAP_FIXED);\n-\t\tif (ret < 0) {\n-\t\t\tRTE_LOG(ERR, EAL, \"%s mapping BAR%i failed: %s\\n\",\n-\t\t\t\t\tpci_addr, i, strerror(errno));\n-\t\t\tgoto err_vfio_dev_fd;\n+\t\tcur = &maps[i];\n+\t\tif (cur->nr_areas > 1) {\n+\t\t\tstruct vfio_region_sparse_mmap_area *areas;\n+\t\t\tuint32_t i;\n+\n+\t\t\tareas = malloc(sizeof(*areas) * cur->nr_areas);\n+\t\t\tif (areas == NULL) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Failed to alloc vfio areas for %s\\n\",\n+\t\t\t\t\tpci_addr);\n+\t\t\t\tgoto err_vfio_dev_fd;\n+\t\t\t}\n+\n+\t\t\tfor (i = 0; i < cur->nr_areas; i++) {\n+\t\t\t\tareas[i].offset = cur->areas[i].offset;\n+\t\t\t\tareas[i].size = cur->areas[i].size;\n+\t\t\t}\n+\n+\t\t\tret = pci_vfio_sparse_mmap_bar(vfio_dev_fd, vfio_res,\n+\t\t\t\tareas, cur->nr_areas, i, MAP_FIXED,\n+\t\t\t\tdev->device.numa_node);\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"%s sparse mapping BAR%i failed: %s\\n\",\n+\t\t\t\t\t\tpci_addr, i, strerror(errno));\n+\t\t\t\tfree(areas);\n+\t\t\t\tgoto err_vfio_dev_fd;\n+\t\t\t}\n+\n+\t\t\tfree(areas);\n+\t\t} else {\n+\t\t\tret = pci_vfio_mmap_bar(vfio_dev_fd, vfio_res,\n+\t\t\t\ti, MAP_FIXED);\n+\t\t\tif (ret < 0) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"%s mapping BAR%i failed: %s\\n\",\n+\t\t\t\t\t\tpci_addr, i, strerror(errno));\n+\t\t\t\tgoto err_vfio_dev_fd;\n+\t\t\t}\n+\n+\t\t\tif (dev->is_mdev)\n+\t\t\t\tcur->areas[0].addr = cur->addr;\n+\t\t\telse\n+\t\t\t\tdev->mem_resource[i].addr = cur->addr;\n \t\t}\n \n-\t\tdev->mem_resource[i].addr = maps[i].addr;\n \t}\n \n \t/* we need save vfio_dev_fd, so it can be used during release */\n@@ -1054,8 +1237,6 @@ find_and_unmap_vfio_resource(struct mapped_pci_res_list *vfio_res_list,\n \t\t\tconst char *pci_addr)\n {\n \tstruct mapped_pci_resource *vfio_res = NULL;\n-\tstruct pci_map *maps;\n-\tint i;\n \n \t/* Get vfio_res */\n \tTAILQ_FOREACH(vfio_res, vfio_res_list, next) {\n@@ -1079,19 +1260,7 @@ find_and_unmap_vfio_resource(struct mapped_pci_res_list *vfio_res_list,\n \tRTE_LOG(INFO, EAL, \"Releasing PCI mapped resource for %s\\n\",\n \t\tpci_addr);\n \n-\tmaps = vfio_res->maps;\n-\tfor (i = 0; i < vfio_res->nb_maps; i++) {\n-\n-\t\t/*\n-\t\t * We do not need to be aware of MSI-X table BAR mappings as\n-\t\t * when mapping. Just using current maps array is enough\n-\t\t */\n-\t\tif (maps[i].addr) {\n-\t\t\tRTE_LOG(INFO, EAL, \"Calling pci_unmap_resource for %s at %p\\n\",\n-\t\t\t\tpci_addr, maps[i].addr);\n-\t\t\tpci_unmap_resource(maps[i].addr, maps[i].size);\n-\t\t}\n-\t}\n+\tclean_up_pci_resource(vfio_res);\n \n \treturn vfio_res;\n }\ndiff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h\nindex 3515c086aa..8d94d8acf8 100644\n--- a/drivers/bus/pci/private.h\n+++ b/drivers/bus/pci/private.h\n@@ -110,6 +110,8 @@ struct pci_map {\n \tuint64_t offset;\n \tuint64_t size;\n \tuint64_t phaddr;\n+\tuint32_t nr_areas;\n+\tstruct rte_mem_map_area *areas;\n };\n \n struct pci_msix_table {\ndiff --git a/drivers/bus/pci/rte_bus_pci.h b/drivers/bus/pci/rte_bus_pci.h\nindex fb7d934bd0..ddc913f121 100644\n--- a/drivers/bus/pci/rte_bus_pci.h\n+++ b/drivers/bus/pci/rte_bus_pci.h\n@@ -70,6 +70,18 @@ enum rte_pci_kernel_driver {\n \tRTE_PCI_KDRV_NET_UIO,      /* NetUIO for Windows */\n };\n \n+struct rte_mem_map_area {\n+\tvoid *addr;\n+\tuint64_t offset;\n+\tuint64_t size;\n+};\n+\n+struct rte_sparse_mem_map {\n+\tuint64_t size;\n+\tuint32_t nr_maps;\n+\tstruct rte_mem_map_area *areas;\n+};\n+\n /**\n  * A structure describing a PCI device.\n  */\n@@ -82,8 +94,12 @@ struct rte_pci_device {\n \t};\n \tuint8_t is_mdev;                    /**< True for mediated PCI device */\n \tstruct rte_pci_id id;               /**< PCI ID. */\n-\tstruct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];\n+\tunion {\n+\t\tstruct rte_mem_resource mem_resource[PCI_MAX_RESOURCE];\n \t\t\t\t\t    /**< PCI Memory Resource */\n+\t\tstruct rte_sparse_mem_map sparse_mem[PCI_MAX_RESOURCE];\n+\t\t\t\t\t    /**< Sparse Memory Map for Mdev */\n+\t};\n \tstruct rte_intr_handle intr_handle; /**< Interrupt handle */\n \tstruct rte_pci_driver *driver;      /**< PCI driver used in probing */\n \tuint16_t max_vfs;                   /**< sriov enable if not zero */\n",
    "prefixes": [
        "RFC",
        "v3",
        "6/6"
    ]
}