From patchwork Thu Oct 11 09:24:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 46551 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AB6AB1B181; Thu, 11 Oct 2018 11:25:39 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id DBA339B67; Thu, 11 Oct 2018 11:25:37 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 04783356D5; Thu, 11 Oct 2018 09:25:37 +0000 (UTC) Received: from localhost.localdomain (ovpn-112-55.ams2.redhat.com [10.36.112.55]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F1BB60472; Thu, 11 Oct 2018 09:25:24 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, tiwei.bie@intel.com, zhihong.wang@intel.com, jfreimann@redhat.com, nicknickolaev@gmail.com, i.maximets@samsung.com, bruce.richardson@intel.com, alejandro.lucero@netronome.com Cc: dgilbert@redhat.com, stable@dpdk.org, Maxime Coquelin Date: Thu, 11 Oct 2018 11:24:21 +0200 Message-Id: <20181011092432.22275-9-maxime.coquelin@redhat.com> In-Reply-To: <20181011092432.22275-1-maxime.coquelin@redhat.com> References: <20181011092432.22275-1-maxime.coquelin@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 11 Oct 2018 09:25:37 +0000 (UTC) Subject: [dpdk-dev] [PATCH v6 08/19] vhost: pass socket fd to message handling callbacks 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This is not used for now, but will be needed for the special handling of VHOST_USER_SET_MEM_TABLE message once postcopy will be supported. Signed-off-by: Maxime Coquelin --- lib/librte_vhost/vhost_user.c | 71 +++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index c1c5f35ff..bce2395a3 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -128,14 +128,16 @@ vhost_backend_cleanup(struct virtio_net *dev) */ static int vhost_user_set_owner(struct virtio_net **pdev __rte_unused, - struct VhostUserMsg *msg __rte_unused) + struct VhostUserMsg *msg __rte_unused, + int main_fd __rte_unused) { return VH_RESULT_OK; } static int vhost_user_reset_owner(struct virtio_net **pdev, - struct VhostUserMsg *msg __rte_unused) + struct VhostUserMsg *msg __rte_unused, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; vhost_destroy_device_notify(dev); @@ -149,7 +151,8 @@ vhost_user_reset_owner(struct virtio_net **pdev, * The features that we support are requested. */ static int -vhost_user_get_features(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_get_features(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint64_t features = 0; @@ -166,7 +169,8 @@ vhost_user_get_features(struct virtio_net **pdev, struct VhostUserMsg *msg) * The queue number that we support are requested. */ static int -vhost_user_get_queue_num(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_get_queue_num(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint32_t queue_num = 0; @@ -183,7 +187,8 @@ vhost_user_get_queue_num(struct virtio_net **pdev, struct VhostUserMsg *msg) * We receive the negotiated features supported by us and the virtio device. */ static int -vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint64_t features = msg->payload.u64; @@ -265,7 +270,8 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg) */ static int vhost_user_set_vring_num(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; @@ -627,7 +633,8 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index) * This function then converts these to our address space. */ static int -vhost_user_set_vring_addr(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_vring_addr(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_virtqueue *vq; @@ -664,7 +671,8 @@ vhost_user_set_vring_addr(struct virtio_net **pdev, struct VhostUserMsg *msg) */ static int vhost_user_set_vring_base(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; dev->virtqueue[msg->payload.state.index]->last_used_idx = @@ -797,7 +805,8 @@ vhost_memory_changed(struct VhostUserMemory *new, } static int -vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct VhostUserMemory memory = msg->payload.memory; @@ -1013,7 +1022,8 @@ virtio_is_ready(struct virtio_net *dev) } static int -vhost_user_set_vring_call(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_vring_call(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_vring_file file; @@ -1037,7 +1047,8 @@ vhost_user_set_vring_call(struct virtio_net **pdev, struct VhostUserMsg *msg) } static int vhost_user_set_vring_err(struct virtio_net **pdev __rte_unused, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { if (!(msg->payload.u64 & VHOST_USER_VRING_NOFD_MASK)) close(msg->fds[0]); @@ -1047,7 +1058,8 @@ static int vhost_user_set_vring_err(struct virtio_net **pdev __rte_unused, } static int -vhost_user_set_vring_kick(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_vring_kick(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_vring_file file; @@ -1106,7 +1118,8 @@ free_zmbufs(struct vhost_virtqueue *vq) */ static int vhost_user_get_vring_base(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; @@ -1162,7 +1175,8 @@ vhost_user_get_vring_base(struct virtio_net **pdev, */ static int vhost_user_set_vring_enable(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; int enable = (int)msg->payload.state.num; @@ -1190,7 +1204,8 @@ vhost_user_set_vring_enable(struct virtio_net **pdev, static int vhost_user_get_protocol_features(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint64_t features, protocol_features; @@ -1215,7 +1230,8 @@ vhost_user_get_protocol_features(struct virtio_net **pdev, static int vhost_user_set_protocol_features(struct virtio_net **pdev, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint64_t protocol_features = msg->payload.u64; @@ -1232,7 +1248,8 @@ vhost_user_set_protocol_features(struct virtio_net **pdev, } static int -vhost_user_set_log_base(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_log_base(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; int fd = msg->fds[0]; @@ -1298,7 +1315,8 @@ vhost_user_set_log_base(struct virtio_net **pdev, struct VhostUserMsg *msg) } static int vhost_user_set_log_fd(struct virtio_net **pdev __rte_unused, - struct VhostUserMsg *msg) + struct VhostUserMsg *msg, + int main_fd __rte_unused) { close(msg->fds[0]); RTE_LOG(INFO, VHOST_CONFIG, "not implemented.\n"); @@ -1315,7 +1333,8 @@ static int vhost_user_set_log_fd(struct virtio_net **pdev __rte_unused, * a flag 'broadcast_rarp' to let rte_vhost_dequeue_burst() inject it. */ static int -vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; uint8_t *mac = (uint8_t *)&msg->payload.u64; @@ -1345,7 +1364,8 @@ vhost_user_send_rarp(struct virtio_net **pdev, struct VhostUserMsg *msg) } static int -vhost_user_net_set_mtu(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_net_set_mtu(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; if (msg->payload.u64 < VIRTIO_MIN_MTU || @@ -1362,7 +1382,8 @@ vhost_user_net_set_mtu(struct virtio_net **pdev, struct VhostUserMsg *msg) } static int -vhost_user_set_req_fd(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_set_req_fd(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; int fd = msg->fds[0]; @@ -1429,7 +1450,8 @@ is_vring_iotlb_invalidate(struct vhost_virtqueue *vq, } static int -vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg) +vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) { struct virtio_net *dev = *pdev; struct vhost_iotlb_msg *imsg = &msg->payload.iotlb; @@ -1474,7 +1496,8 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg) } typedef int (*vhost_message_handler_t)(struct virtio_net **pdev, - struct VhostUserMsg *msg); + struct VhostUserMsg *msg, + int main_fd); static vhost_message_handler_t vhost_message_handlers[VHOST_USER_MAX] = { [VHOST_USER_NONE] = NULL, [VHOST_USER_GET_FEATURES] = vhost_user_get_features, @@ -1749,7 +1772,7 @@ vhost_user_msg_handler(int vid, int fd) if (request > VHOST_USER_NONE && request < VHOST_USER_MAX) { if (!vhost_message_handlers[request]) goto skip_to_post_handle; - ret = vhost_message_handlers[request](&dev, &msg); + ret = vhost_message_handlers[request](&dev, &msg, fd); switch (ret) { case VH_RESULT_ERR: