Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/75550/?format=api
http://patches.dpdk.org/api/patches/75550/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200814191606.26312-2-chenbo.xia@intel.com/", "project": { "id": 1, "url": "http://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": "<20200814191606.26312-2-chenbo.xia@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20200814191606.26312-2-chenbo.xia@intel.com", "date": "2020-08-14T19:16:05", "name": "[RFC,v1,1/2] vfio_user: Add library for vfio over socket", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "292210228477bd70451f006fa2f2e17f22305ad5", "submitter": { "id": 1276, "url": "http://patches.dpdk.org/api/people/1276/?format=api", "name": "Chenbo Xia", "email": "chenbo.xia@intel.com" }, "delegate": { "id": 24651, "url": "http://patches.dpdk.org/api/users/24651/?format=api", "username": "dmarchand", "first_name": "David", "last_name": "Marchand", "email": "david.marchand@redhat.com" }, "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200814191606.26312-2-chenbo.xia@intel.com/mbox/", "series": [ { "id": 11653, "url": "http://patches.dpdk.org/api/series/11653/?format=api", "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11653", "date": "2020-08-14T19:16:04", "name": "Add device emulation support in DPDK", "version": 1, "mbox": "http://patches.dpdk.org/series/11653/mbox/" } ], "comments": "http://patches.dpdk.org/api/patches/75550/comments/", "check": "warning", "checks": "http://patches.dpdk.org/api/patches/75550/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id DBF73A04B0;\n\tFri, 14 Aug 2020 12:27:00 +0200 (CEST)", "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 91FDF1C0CD;\n\tFri, 14 Aug 2020 12:27:00 +0200 (CEST)", "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by dpdk.org (Postfix) with ESMTP id 84CE61BFF3\n for <dev@dpdk.org>; Fri, 14 Aug 2020 12:26:58 +0200 (CEST)", "from orsmga006.jf.intel.com ([10.7.209.51])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 14 Aug 2020 03:26:57 -0700", "from npg-dpdk-virtio-xiachenbo-nw.sh.intel.com ([10.67.119.123])\n by orsmga006.jf.intel.com with ESMTP; 14 Aug 2020 03:26:55 -0700" ], "IronPort-SDR": [ "\n BfrwfCz+eRa8TSTdCwnkniXqOTDof2ax0ZVXQC0dctqpoBKbV6Wd8SqSNlPraeCOM/ly3qJiz3\n ouu4H0ODF2qw==", "\n wkAtHW1JUuVVqdU/trdsjxvFHxqEjP6ySsWHVB0D6J1yZFmWqcSxJr/kFS7PS+By1SAAlDfJiS\n AygfW600Tu/Q==" ], "X-IronPort-AV": [ "E=McAfee;i=\"6000,8403,9712\"; a=\"153616444\"", "E=Sophos;i=\"5.76,312,1592895600\"; d=\"scan'208\";a=\"153616444\"", "E=Sophos;i=\"5.76,312,1592895600\"; d=\"scan'208\";a=\"295717594\"" ], "X-Amp-Result": "SKIPPED(no attachment in message)", "X-Amp-File-Uploaded": "False", "X-ExtLoop1": "1", "From": "Chenbo Xia <chenbo.xia@intel.com>", "To": "dev@dpdk.org, thomas@monjalon.net, xuan.ding@intel.com,\n xiuchun.lu@intel.com, cunming.liang@intel.com, changpeng.liu@intel.com", "Cc": "zhihong.wang@intel.com", "Date": "Fri, 14 Aug 2020 19:16:05 +0000", "Message-Id": "<20200814191606.26312-2-chenbo.xia@intel.com>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20200814191606.26312-1-chenbo.xia@intel.com>", "References": "<20200814191606.26312-1-chenbo.xia@intel.com>", "Subject": "[dpdk-dev] [RFC v1 1/2] vfio_user: Add library for vfio over socket", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.15", "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": "Vfio-over-socket, also named as vfio-user, is a protocol for\nemulating devices in a separate process outside of QEMU. The\nmain difference between APP using vfio-user and vfio kernel\nmodule is that device manipulation is based on socket messages\nfor vfio-user but system calls for vfio kernel module.\n\nThis protocol has a server/client model and for now QEMU plays\nthe role of client. This patch implements vfio-user server of the\nprotocol in DPDK.\n\nSigned-off-by: Chenbo Xia <chenbo.xia@intel.com>\nSigned-off-by: Xiuchun Lu <xiuchun.lu@intel.com>\n---\n lib/librte_vfio_user/rte_vfio_user.h | 335 +++++++++++++++++++++++++++\n 1 file changed, 335 insertions(+)\n create mode 100644 lib/librte_vfio_user/rte_vfio_user.h", "diff": "diff --git a/lib/librte_vfio_user/rte_vfio_user.h b/lib/librte_vfio_user/rte_vfio_user.h\nnew file mode 100644\nindex 000000000..d36516084\n--- /dev/null\n+++ b/lib/librte_vfio_user/rte_vfio_user.h\n@@ -0,0 +1,335 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Intel Corporation\n+ */\n+\n+#ifndef _VFIO_USER_H\n+#define _VFIO_USER_H\n+\n+#include <stdint.h>\n+#include <stddef.h>\n+#include <linux/vfio.h>\n+#include <net/if.h>\n+#include <sys/queue.h>\n+#include <sys/un.h>\n+\n+#define VFIO_USER_MSG_MAX_NREGIONS 8\n+#define VFIO_USER_MAX_MEM_REGIONS 256\n+#define VFIO_MAX_RW_DATA 256\n+#define VFIO_USER_MAX_FD 64\n+#define VFIO_USER_IRQ_MAX_DATA 64\n+#define VFIO_USER_MAX_IRQ_FD 64\n+\n+typedef enum VFIO_USER_CMD_TYPE {\n+\tVFIO_USER_NONE = 0,\n+\tVFIO_USER_VERSION = 1,\n+\tVFIO_USER_DMA_MAP = 2,\n+\tVFIO_USER_DMA_UNMAP = 3,\n+\tVFIO_USER_DEVICE_GET_INFO = 4,\n+\tVFIO_USER_DEVICE_GET_REGION_INFO = 5,\n+\tVFIO_USER_DEVICE_GET_IRQ_INFO = 6,\n+\tVFIO_USER_DEVICE_SET_IRQS = 7,\n+\tVFIO_USER_REGION_READ = 8,\n+\tVFIO_USER_REGION_WRITE = 9,\n+\tVFIO_USER_DMA_READ = 10,\n+\tVFIO_USER_DMA_WRITE = 11,\n+\tVFIO_USER_VM_INTERRUPT = 12,\n+\tVFIO_USER_DEVICE_RESET = 13,\n+\tVFIO_USER_MAX = 14,\n+} VFIO_USER_CMD_TYPE;\n+\n+struct vfio_user_mem_reg {\n+\tuint64_t gpa;\n+\tuint64_t size;\n+\tuint64_t fd_offset;\n+\tuint32_t protection;\t/* attributes in <sys/mman.h> */\n+#define VFIO_USER_MEM_MAPPABLE\t(0x1 << 0)\n+\tuint32_t flags;\n+};\n+\n+struct vfio_user_dev_info {\n+\tuint32_t argsz;\t\t/* Reserved in vfio-user */\n+\tuint32_t flags;\n+\tuint32_t num_regions;\n+\tuint32_t num_irqs;\n+};\n+\n+struct vfio_user_reg_rw {\n+\tuint64_t reg_offset;\n+\tuint32_t reg_idx;\n+\tuint32_t size;\n+\tchar data[VFIO_MAX_RW_DATA];\n+};\n+\n+struct vfio_user_dma_rw {\n+\tuint64_t addr;\n+\tuint32_t size;\n+\tchar data[VFIO_MAX_RW_DATA];\n+};\n+\n+struct vfio_user_intr {\n+\tuint32_t type;\n+\tuint32_t vector;\n+};\n+\n+typedef struct vfio_user_msg {\n+\tuint16_t dev_id;\n+\tuint16_t msg_id;\n+\tuint32_t cmd;\n+\tuint32_t size;\n+#define VFIO_USER_REPLY_MASK\t(0x1 << 0)\n+#define VFIO_USER_NEED_NO_RP\t(0x1 << 1)\n+\tuint32_t flags;\n+\tunion {\n+\t\tstruct vfio_user_mem_reg memory[VFIO_USER_MSG_MAX_NREGIONS];\n+\t\tstruct vfio_user_dev_info dev_info;\n+\t\tstruct vfio_region_info reg_info;\n+\t\tstruct vfio_irq_info irq_info;\n+\t\tstruct vfio_irq_set irq_set;\n+\t\tstruct vfio_user_reg_rw reg_rw;\n+\t\tstruct vfio_user_dma_rw dma_rw;\n+\t\tstruct vfio_user_intr intr;\n+\t} payload;\n+\tint fds[VFIO_USER_MAX_FD];\n+\tint fd_num;\n+} __attribute((packed)) VFIO_USER_MSG;\n+\n+#define VFIO_USER_MSG_HDR_SIZE offsetof(VFIO_USER_MSG, payload.dev_info)\n+\n+enum vfio_user_msg_handle_result {\n+\tVFIO_USER_MSG_HANDLE_ERR = -1,\n+\tVFIO_USER_MSG_HANDLE_OK = 0,\n+\tVFIO_USER_MSG_HANDLE_REPLY = 1,\n+};\n+\n+struct vfio_user_mem_table_entry {\n+\tstruct vfio_user_mem_reg region;\n+\tuint64_t host_user_addr;\n+\tvoid\t *mmap_addr;\n+\tuint64_t mmap_size;\n+\tint fd;\n+};\n+\n+struct vfio_user_mem {\n+\tuint32_t entry_num;\n+\tstruct vfio_user_mem_table_entry entry[VFIO_USER_MAX_MEM_REGIONS];\n+};\n+\n+struct vfio_user_regions {\n+\tuint32_t reg_num;\n+\tstruct vfio_region_info **reg_info;\n+};\n+\n+struct vfio_user_irq_info {\n+\tuint32_t irq_num;\n+\tstruct vfio_irq_info *irq_info;\n+};\n+\n+struct vfio_user_irq_set {\n+\tuint32_t set_num;\n+\tstruct vfio_irq_set **irq;\n+\tint fds[VFIO_USER_MAX_IRQ_FD];\n+};\n+\n+struct vfio_user_irqs {\n+\tstruct vfio_user_irq_info *info;\n+\tstruct vfio_user_irq_set *set;\n+};\n+\n+struct vfio_user_region_resource {\n+\tvoid *base;\n+\tuint32_t size;\n+\tint fd;\n+};\n+\n+struct vfio_user_resource {\n+\tuint16_t resource_num;\n+\tstruct vfio_user_region_resource res[];\n+};\n+\n+struct vfio_user {\n+\tint dev_id;\n+\tint is_ready;\n+#define IF_NAME_SZ (IFNAMSIZ > PATH_MAX ? IFNAMSIZ : PATH_MAX)\n+\tchar sock_addr[IF_NAME_SZ];\n+\tconst struct vfio_user_notify_ops *ops;\n+\tstruct vfio_user_mem *mem;\n+\tstruct vfio_user_dev_info *dev_info;\n+\tstruct vfio_user_regions *reg;\n+\tstruct vfio_user_irqs *irq;\n+\tstruct vfio_user_resource *res;\n+};\n+\n+struct vfio_user_notify_ops {\n+\tint (*new_device)(int dev_id);\t\t/* Add device */\n+\tvoid (*destroy_device)(int dev_id);\t/* Remove device */\n+\tint (*update_status)(int dev_id);\t/* Update device status */\n+};\n+\n+typedef void (*vfio_user_log)(const char *format, ...);\n+\n+typedef int (*event_handler)(int fd, void *data);\n+\n+typedef struct listen_fd_info {\n+\tint fd;\n+\tuint32_t event;\n+\tevent_handler ev_handle;\n+\tvoid *data;\n+} FD_INFO;\n+\n+struct vfio_user_epoll {\n+\tint epfd;\n+\tFD_INFO fdinfo[VFIO_USER_MAX_FD];\n+\tuint32_t fd_num;\t/* Current num of listen_fd */\n+\tstruct epoll_event *events;\n+\tpthread_mutex_t fd_mutex;\n+};\n+\n+struct vfio_user_socket {\n+\tchar *sock_addr;\n+\tstruct sockaddr_un un;\n+\tint sock_fd;\n+\tint dev_id;\n+};\n+\n+struct vfio_user_ep_sock {\n+\tstruct vfio_user_epoll ep;\n+\tstruct vfio_user_socket *sock[VFIO_USER_MAX_FD];\n+\tuint32_t sock_num;\n+\tpthread_mutex_t mutex;\n+};\n+\n+/**\n+ * Register a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @param ops\n+ * Notify ops for the device\n+ * @param log\n+ * Log callback for the device\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_register(const char *sock_addr,\n+\tconst struct vfio_user_notify_ops *ops,\n+\tvfio_user_log log);\n+\n+/**\n+ * Unregister a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_unregister(const char *sock_addr);\n+\n+/**\n+ * Start vfio-user handling for the device.\n+ *\n+ * This function triggers vfio-user message handling.\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_start(const char *sock_addr);\n+\n+/**\n+ * Stop vfio-user handling for the device.\n+ *\n+ * This function stops vfio-user message handling.\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_stop(const char *sock_addr);\n+\n+/**\n+ * Get the socket address for a vfio-user device.\n+ *\n+ * @param dev_id\n+ * Vfio-user device ID\n+ * @param buf\n+ * Buffer to store socket address\n+ * @param len\n+ * The len of buf\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_get_sock_addr(int dev_id, char *buf, size_t len);\n+\n+/**\n+ * Get the memory table of a vfio-user device.\n+ *\n+ * @param dev_id\n+ * Vfio-user device ID\n+ * @return\n+ * Pointer to memory table on success, NULL on failure\n+ */\n+struct vfio_user_mem *rte_vfio_user_get_mem_table(int dev_id);\n+\n+/**\n+ * Get the irq set of a vfio-user device.\n+ *\n+ * @param dev_id\n+ * Vfio-user device ID\n+ * @return\n+ * Pointer to irq set on success, NULL on failure\n+ */\n+struct vfio_user_irq_set *rte_vfio_user_get_irq(int dev_id);\n+\n+/**\n+ * Set the device info for a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @param dev_info\n+ * Device info for the vfio-user device\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_set_dev_info(const char *sock_addr,\n+\tstruct vfio_user_dev_info *dev_info);\n+\n+/**\n+ * Set the region info for a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @param reg\n+ * Region info for the vfio-user device\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_set_reg_info(const char *sock_addr,\n+\tstruct vfio_user_regions *reg);\n+\n+/**\n+ * Set the irq info for a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @param irq\n+ * IRQ info for the vfio-user device\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_set_irq_info(const char *sock_addr,\n+\tstruct vfio_user_irq_info *irq);\n+\n+/**\n+ * Set the device resource for a vfio-user device.\n+ *\n+ * @param sock_addr\n+ * Unix domain socket address\n+ * @param res\n+ * Resource info for the vfio-user device\n+ * @return\n+ * 0 on success, -1 on failure\n+ */\n+int rte_vfio_user_set_resource(const char *sock_addr,\n+\tstruct vfio_user_resource *res);\n+\n+#endif\n", "prefixes": [ "RFC", "v1", "1/2" ] }{ "id": 75550, "url": "