From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f174.google.com (mail-pf0-f174.google.com [209.85.192.174]) by dpdk.org (Postfix) with ESMTP id A2A89376E for ; Wed, 9 Mar 2016 09:33:59 +0100 (CET) Received: by mail-pf0-f174.google.com with SMTP id x188so34686215pfb.2 for ; Wed, 09 Mar 2016 00:33:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=igel-co-jp.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=Sucvn8hM8jcS+ZM4BZ73JKIiUikDG93pijUnXXs8XZg=; b=0rJBMNC30mowmfMnGXRmpB6xS/93JzYEH2PxO22NMRsbbyLlZt7rmhT+SQ++MoE/hO VHCD8nQ/CrnHIvMZC5MJZJU0AUOZvEApk3tVtpx6lBXcXvlKl+BYftrKy3EP8WQPY22L P+hVoRNYBmpPbLRkD6eIvwhgsRI2VYiAF6vmZO0OoToeA9bdgXJGJ9aO+7GPfEXvm7l9 ejAUnN+KeOk4RBUaeF39+m/hzu9UqjeP8y26BX2fLZptREyHbl43rUR85vKI85NjbU+Z kNjFsBSji16AegRJfiG3pSd9i03SOG5ygiF8VuKGWI956EoyfKHFk0NH8FB77TI1mlLs X7Zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=Sucvn8hM8jcS+ZM4BZ73JKIiUikDG93pijUnXXs8XZg=; b=L8ApcgZWgJ6CXODy3U64z3sFNmppA7aNenjuEiJc9kSFvS4WLEt5VY86sqebLVxMFk xsh/g+9ryW12YYhXvLEntxSKW4+zfjCq1852u1MoVo49u0GJwbMTE4ctBT+0YKBAnoBQ JeEMRZe+++qgd+qD+9RSH3Laq17v+2+3ojB9BVw0SXSt1gcWSwtJOCh3v2GdUxfcTGC9 An5LK9aE/PCq8n2jIPjv5CABBT5s93m6JXY5TDWxI33JFdSnsZ+GCWqq8eAeUS06SSNM UIePCWNbwxqTmIptWPXNY5OsQ0Wj7eAF/xXxmfawYISFgCrI5/rN+x/1sHFFVZKAxfL4 TiJw== X-Gm-Message-State: AD7BkJLyFn//0TjG5vnZqOh8OKK8adKWulPlzfv50i1jGOPaRk9MjRyBGJffbG0kDx5r9g== X-Received: by 10.98.12.83 with SMTP id u80mr42762468pfi.116.1457512439086; Wed, 09 Mar 2016 00:33:59 -0800 (PST) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by smtp.gmail.com with ESMTPSA id qh8sm10350238pac.40.2016.03.09.00.33.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 09 Mar 2016 00:33:58 -0800 (PST) From: Tetsuya Mukawa To: dev@dpdk.org, jianfeng.tan@intel.com, huawei.xie@intel.com, yuanhan.liu@linux.intel.com Date: Wed, 9 Mar 2016 17:33:24 +0900 Message-Id: <1457512409-24403-8-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1457512409-24403-1-git-send-email-mukawa@igel.co.jp> References: <1457512409-24403-1-git-send-email-mukawa@igel.co.jp> In-Reply-To: <1456129075-14909-4-git-send-email-mukawa@igel.co.jp> References: <1456129075-14909-4-git-send-email-mukawa@igel.co.jp> Subject: [dpdk-dev] [PATCH v4 07/12] virtio, qtest: Add functionality to share memory between QTest guest X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Mar 2016 08:34:00 -0000 The patch adds functionality to share memory between QTest guest and DPDK application using ivshmem device. The shared memory will be all EAL memory on hugepages. This memory will be accessed by QEMU vcpu and DPDK application using same address. Signed-off-by: Tetsuya Mukawa --- drivers/net/virtio/qtest_utils.c | 106 ++++++++++++++++++++++++++++++++++++++- drivers/net/virtio/qtest_utils.h | 4 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio/qtest_utils.c b/drivers/net/virtio/qtest_utils.c index 000c7e8..338224a 100644 --- a/drivers/net/virtio/qtest_utils.c +++ b/drivers/net/virtio/qtest_utils.c @@ -43,6 +43,9 @@ #include "virtio_ethdev.h" #include "qtest_utils.h" +/* ivshmem configuration */ +#define IVSHMEM_PROTOCOL_VERSION 0 + #define PCI_CONFIG_ADDR(_bus, _device, _function, _offset) ( \ (1 << 31) | ((_bus) & 0xff) << 16 | ((_device) & 0x1f) << 11 | \ ((_function) & 0x7) << 8 | ((_offset) & 0xfc)) @@ -59,6 +62,7 @@ union qtest_pipefds { struct qtest_session { int qtest_socket; + int ivshmem_socket; pthread_mutex_t qtest_session_lock; struct qtest_pci_device_list head; @@ -411,6 +415,7 @@ qtest_close_sockets(struct qtest_session *s) qtest_close_one_socket(&s->qtest_socket); qtest_close_one_socket(&s->msgfds.readfd); qtest_close_one_socket(&s->msgfds.writefd); + qtest_close_one_socket(&s->ivshmem_socket); } static void @@ -716,6 +721,93 @@ qtest_register_target_devices(struct qtest_session *s, } static int +qtest_send_message_to_ivshmem(int sock_fd, uint64_t client_id, int shm_fd) +{ + struct iovec iov; + struct msghdr msgh; + size_t fdsize = sizeof(int); + char control[CMSG_SPACE(fdsize)]; + struct cmsghdr *cmsg; + int ret; + + memset(&msgh, 0, sizeof(msgh)); + iov.iov_base = &client_id; + iov.iov_len = sizeof(client_id); + + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + + if (shm_fd >= 0) { + msgh.msg_control = &control; + msgh.msg_controllen = sizeof(control); + cmsg = CMSG_FIRSTHDR(&msgh); + cmsg->cmsg_len = CMSG_LEN(fdsize); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + memcpy(CMSG_DATA(cmsg), &shm_fd, fdsize); + } + + do { + ret = sendmsg(sock_fd, &msgh, 0); + } while (ret < 0 && errno == EINTR); + + if (ret < 0) { + PMD_DRV_LOG(ERR, "sendmsg error\n"); + return ret; + } + + return ret; +} + +static int +qtest_setup_shared_memory(struct qtest_session *s) +{ + int shm_fd, num, ret; + struct back_file *huges; + + num = rte_eal_get_backfile_info(&huges); + if (num != 1) { + PMD_DRV_LOG(ERR, + "Not supported memory configuration\n"); + return -1; + } + + shm_fd = open(huges[0].filepath, O_RDWR); + if (shm_fd < 0) { + PMD_DRV_LOG(ERR, + "Cannot open file: %s\n", huges[0].filepath); + return -1; + } + + /* send our protocol version first */ + ret = qtest_send_message_to_ivshmem(s->ivshmem_socket, + IVSHMEM_PROTOCOL_VERSION, -1); + if (ret < 0) { + PMD_DRV_LOG(ERR, + "Failed to send protocol version to ivshmem\n"); + return -1; + } + + /* send client id */ + ret = qtest_send_message_to_ivshmem(s->ivshmem_socket, 0, -1); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to send VMID to ivshmem\n"); + return -1; + } + + /* send message to ivshmem */ + ret = qtest_send_message_to_ivshmem(s->ivshmem_socket, -1, shm_fd); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to file descriptor to ivshmem\n"); + return -1; + } + + close(shm_fd); + + return 0; +} + +static int qtest_open_socket(char *path) { struct sockaddr_un sa = {0}; @@ -769,7 +861,7 @@ qtest_vdev_uninit(struct qtest_session *s) } struct qtest_session * -qtest_vdev_init(char *qtest_path, +qtest_vdev_init(char *qtest_path, char *ivshmem_path, struct qtest_pci_device *devices, int devnum) { struct qtest_session *s; @@ -800,6 +892,12 @@ qtest_vdev_init(char *qtest_path, goto error; } + s->ivshmem_socket = qtest_open_socket(ivshmem_path); + if (s->ivshmem_socket < 0) { + PMD_DRV_LOG(ERR, "Failed to open %s\n", ivshmem_path); + goto error; + } + s->qtest_socket = qtest_open_socket(qtest_path); if (s->qtest_socket < 0) { PMD_DRV_LOG(ERR, "Failed to open %s\n", qtest_path); @@ -813,6 +911,12 @@ qtest_vdev_init(char *qtest_path, } s->event_th_started = 1; + ret = qtest_setup_shared_memory(s); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed to setup shared memory\n"); + goto error; + } + ret = qtest_init_pci_devices(s, devices, devnum); if (ret != 0) { PMD_DRV_LOG(ERR, "Failed to initialize devices\n"); diff --git a/drivers/net/virtio/qtest_utils.h b/drivers/net/virtio/qtest_utils.h index ba70754..26994b1 100644 --- a/drivers/net/virtio/qtest_utils.h +++ b/drivers/net/virtio/qtest_utils.h @@ -132,6 +132,8 @@ struct qtest_pci_device { * * @param qtest_path * Path of qtest socket. + * @param ivshmem_path + * Path of ivshmem socket. * @param devices * Array of device information. It should contain piix3, ivshmem and target * device(virtio-net device). @@ -140,7 +142,7 @@ struct qtest_pci_device { * @return * The pointer to qtest session structure. */ -struct qtest_session *qtest_vdev_init(char *qtest_path, +struct qtest_session *qtest_vdev_init(char *qtest_path, char *ivshmem_path, struct qtest_pci_device *devices, int devnum); /** -- 2.1.4