From 8fb53eb167cea13c30f6674f7b6ff600930c1ed0 Mon Sep 17 00:00:00 2001 From: Arafatms Date: Mon, 26 Jul 2021 11:20:06 +0800 Subject: [PATCH] virtio-devices: vhost-user: Send set_vring_num before setup inflight I/O tracking backend like SPDK required to know how many virt queues to be handled before gets VHOST_USER_SET_INFLIGHT_FD message. fix dpdk core dump while processing vhost_user_set_inflight_fd: #0 0x00007fffef47c347 in vhost_user_set_inflight_fd (pdev=0x7fffe2895998, msg=0x7fffe28956f0, main_fd=545) at ../lib/librte_vhost/vhost_user.c:1570 #1 0x00007fffef47e7b9 in vhost_user_msg_handler (vid=0, fd=545) at ../lib/librte_vhost/vhost_user.c:2735 #2 0x00007fffef46bac0 in vhost_user_read_cb (connfd=545, dat=0x7fffdc0008c0, remove=0x7fffe2895a64) at ../lib/librte_vhost/socket.c:309 #3 0x00007fffef45b3f6 in fdset_event_dispatch (arg=0x7fffef6dc2e0 ) at ../lib/librte_vhost/fd_man.c:286 #4 0x00007ffff09926f3 in rte_thread_init (arg=0x15ee180) at ../lib/librte_eal/common/eal_common_thread.c:175 Signed-off-by: Arafatms --- virtio-devices/src/vhost_user/blk.rs | 10 ---------- virtio-devices/src/vhost_user/vu_common_ctrl.rs | 13 +++++++++---- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/virtio-devices/src/vhost_user/blk.rs b/virtio-devices/src/vhost_user/blk.rs index f3f8cacd3..77f7a5c72 100644 --- a/virtio-devices/src/vhost_user/blk.rs +++ b/virtio-devices/src/vhost_user/blk.rs @@ -24,7 +24,6 @@ use vhost::vhost_user::message::VhostUserConfigFlags; use vhost::vhost_user::message::VHOST_USER_CONFIG_OFFSET; use vhost::vhost_user::message::{VhostUserProtocolFeatures, VhostUserVirtioFeatures}; use vhost::vhost_user::{MasterReqHandler, VhostUserMaster, VhostUserMasterReqHandler}; -use vhost::VhostBackend; use virtio_bindings::bindings::virtio_blk::{ VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_CONFIG_WCE, VIRTIO_BLK_F_DISCARD, VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_MQ, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_SEG_MAX, @@ -128,15 +127,6 @@ impl Blk { config.num_queues = num_queues as u16; } - // Send set_vring_base here, since it could tell backends, like SPDK, - // how many virt queues to be handled, which backend required to know - // at early stage. - for i in 0..num_queues { - vu.socket_handle() - .set_vring_base(i, 0) - .map_err(Error::VhostUserSetVringBase)?; - } - Ok(Blk { common: VirtioCommon { device_type: VirtioDeviceType::Block as u32, diff --git a/virtio-devices/src/vhost_user/vu_common_ctrl.rs b/virtio-devices/src/vhost_user/vu_common_ctrl.rs index 41b9ab8d7..a8317d137 100644 --- a/virtio-devices/src/vhost_user/vu_common_ctrl.rs +++ b/virtio-devices/src/vhost_user/vu_common_ctrl.rs @@ -141,6 +141,15 @@ impl VhostUserHandle { // Let's first provide the memory table to the backend. self.update_mem_table(mem)?; + // Send set_vring_num here, since it could tell backends, like SPDK, + // how many virt queues to be handled, which backend required to know + // at early stage. + for (queue_index, queue) in queues.iter().enumerate() { + self.vu + .set_vring_num(queue_index, queue.actual_size()) + .map_err(Error::VhostUserSetVringNum)?; + } + // Setup for inflight I/O tracking shared memory. if let Some(inflight) = inflight { if inflight.fd.is_none() { @@ -168,10 +177,6 @@ impl VhostUserHandle { for (queue_index, queue) in queues.into_iter().enumerate() { let actual_size: usize = queue.actual_size().try_into().unwrap(); - self.vu - .set_vring_num(queue_index, queue.actual_size()) - .map_err(Error::VhostUserSetVringNum)?; - let config_data = VringConfigData { queue_max_size: queue.get_max_size(), queue_size: queue.actual_size(),