This patch fixes an issue of application crash because of vhost iotlb not initialized when virtio has multiqueue enabled.
iotlb messages will be sent when some queues are not enabled. If we initialize iotlb in vhost_user_set_vring_num, it could happen that iotlb update comes when iotlb pool of disabled queues are not initialized. Fixes: 968bbc7e2e50 ("vhost: avoid IOTLB mempool allocation while IOMMU disabled") Signed-off-by: Chenbo Xia <chenbo....@intel.com> --- lib/vhost/vhost_user.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 611ff209e3..ae4df8eb69 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -311,6 +311,7 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg, uint64_t features = msg->payload.u64; uint64_t vhost_features = 0; struct rte_vdpa_device *vdpa_dev; + uint32_t i; if (validate_msg_fds(msg, 0) != 0) return RTE_VHOST_MSG_RESULT_ERR; @@ -389,6 +390,14 @@ vhost_user_set_features(struct virtio_net **pdev, struct VhostUserMsg *msg, vdpa_dev->ops->set_features(dev->vid); dev->flags &= ~VIRTIO_DEV_FEATURES_FAILED; + + if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { + for (i = 0; i < dev->nr_vring; i++) { + if (vhost_user_iotlb_init(dev, i)) + return RTE_VHOST_MSG_RESULT_ERR; + } + } + return RTE_VHOST_MSG_RESULT_OK; } @@ -469,10 +478,6 @@ vhost_user_set_vring_num(struct virtio_net **pdev, return RTE_VHOST_MSG_RESULT_ERR; } - if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { - if (vhost_user_iotlb_init(dev, msg->payload.state.index)) - return RTE_VHOST_MSG_RESULT_ERR; - } return RTE_VHOST_MSG_RESULT_OK; } -- 2.17.1