get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 75550,
    "url": "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"
    ]
}