From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 186571B2C6 for ; Fri, 19 Jan 2018 14:44:57 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6F5A380478; Fri, 19 Jan 2018 13:44:56 +0000 (UTC) Received: from localhost (ovpn-116-254.ams2.redhat.com [10.36.116.254]) by smtp.corp.redhat.com (Postfix) with ESMTP id EFBD160A9D; Fri, 19 Jan 2018 13:44:55 +0000 (UTC) From: Stefan Hajnoczi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, Yuanhan Liu , wei.w.wang@intel.com, mst@redhat.com, zhiyong.yang@intel.com, jasowang@redhat.com, Stefan Hajnoczi Date: Fri, 19 Jan 2018 13:44:21 +0000 Message-Id: <20180119134444.24927-2-stefanha@redhat.com> In-Reply-To: <20180119134444.24927-1-stefanha@redhat.com> References: <20180119134444.24927-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 19 Jan 2018 13:44:56 +0000 (UTC) Subject: [dpdk-dev] [RFC 01/24] vhost: move vring_call() into trans_af_unix.c X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jan 2018 13:44:57 -0000 File descriptor passing is specific to the AF_UNIX vhost-user protocol transport. In order to add support for additional transports it is necessary to extract transport-specific code from the main vhost-user code. This patch introduces struct vhost_transport_ops and associates each device with a transport. Core vhost-user code calls into vhost_transport_ops to perform transport-specific operations. Notifying callfd is a transport-specific operation so it belongs in trans_af_unix.c. Several more patches follow this one to complete the task of moving AF_UNIX transport code out of core vhost-user code. Signed-off-by: Stefan Hajnoczi --- lib/librte_vhost/Makefile | 2 +- lib/librte_vhost/vhost.h | 35 +++++++++++++++++++++++----- lib/librte_vhost/trans_af_unix.c | 49 ++++++++++++++++++++++++++++++++++++++++ lib/librte_vhost/vhost.c | 1 + 4 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 lib/librte_vhost/trans_af_unix.c diff --git a/lib/librte_vhost/Makefile b/lib/librte_vhost/Makefile index 065d5c469..ccbbce3af 100644 --- a/lib/librte_vhost/Makefile +++ b/lib/librte_vhost/Makefile @@ -21,7 +21,7 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_mbuf -lrte_ethdev -lrte_net # all source are stored in SRCS-y SRCS-$(CONFIG_RTE_LIBRTE_VHOST) := fd_man.c iotlb.c socket.c vhost.c \ - vhost_user.c virtio_net.c + vhost_user.c virtio_net.c trans_af_unix.c # install includes SYMLINK-$(CONFIG_RTE_LIBRTE_VHOST)-include += rte_vhost.h diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index b2bf0e833..53811a8b1 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -200,6 +200,30 @@ struct guest_page { uint64_t size; }; +struct virtio_net; + +/** + * A structure containing function pointers for transport-specific operations. + */ +struct vhost_transport_ops { + /** + * Notify the guest that used descriptors have been added to the vring. + * The VRING_AVAIL_F_NO_INTERRUPT flag has already been checked so this + * function just needs to perform the notification. + * + * @param dev + * vhost device + * @param vq + * vhost virtqueue + * @return + * 0 on success, -1 on failure + */ + int (*vring_call)(struct virtio_net *dev, struct vhost_virtqueue *vq); +}; + +/** The traditional AF_UNIX vhost-user protocol transport. */ +extern const struct vhost_transport_ops af_unix_trans_ops; + /** * Device structure contains all configuration information relating * to the device. @@ -226,6 +250,7 @@ struct virtio_net { uint16_t mtu; struct vhost_device_ops const *notify_ops; + struct vhost_transport_ops const *trans_ops; uint32_t nr_guest_pages; uint32_t max_guest_pages; @@ -405,16 +430,14 @@ vhost_vring_call(struct virtio_net *dev, struct vhost_virtqueue *vq) __func__, vhost_used_event(vq), old, new); - if (vhost_need_event(vhost_used_event(vq), new, old) - && (vq->callfd >= 0)) { + if (vhost_need_event(vhost_used_event(vq), new, old)) { vq->signalled_used = vq->last_used_idx; - eventfd_write(vq->callfd, (eventfd_t) 1); + dev->trans_ops->vring_call(dev, vq); } } else { /* Kick the guest if necessary. */ - if (!(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT) - && (vq->callfd >= 0)) - eventfd_write(vq->callfd, (eventfd_t)1); + if (!(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) + dev->trans_ops->vring_call(dev, vq); } } diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c new file mode 100644 index 000000000..9ed04b7eb --- /dev/null +++ b/lib/librte_vhost/trans_af_unix.c @@ -0,0 +1,49 @@ +/*- + * BSD LICENSE + * + * Copyright(c) 2010-2016 Intel Corporation. All rights reserved. + * All rights reserved. + * + * Copyright (C) 2017 Red Hat, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "vhost.h" + +static int +af_unix_vring_call(struct virtio_net *dev __rte_unused, + struct vhost_virtqueue *vq) +{ + if (vq->callfd >= 0) + eventfd_write(vq->callfd, (eventfd_t)1); + return 0; +} + +const struct vhost_transport_ops af_unix_trans_ops = { + .vring_call = af_unix_vring_call, +}; diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index 6789ccce5..630dbd014 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -287,6 +287,7 @@ vhost_new_device(void) vhost_devices[i] = dev; dev->vid = i; dev->slave_req_fd = -1; + dev->trans_ops = &af_unix_trans_ops; return i; } -- 2.14.3