vhost: avoid IOTLB mempool allocation while IOMMU disabled
authorJunjie Wan <wanjunjie@bytedance.com>
Tue, 2 Feb 2021 08:38:45 +0000 (16:38 +0800)
committerChenbo Xia <chenbo.xia@intel.com>
Wed, 7 Apr 2021 06:54:05 +0000 (08:54 +0200)
If vhost device's IOMMU feature is disabled, IOTLB mempool allocation
is unnecessary.

Reported-by: Peng He <hepeng.0320@bytedance.com>
Signed-off-by: Junjie Wan <wanjunjie@bytedance.com>
Reviewed-by: Zhihong Wang <wangzhihong.wzh@bytedance.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_vhost/vhost.c
lib/librte_vhost/vhost_user.c

index c9d1371..a70fe01 100644 (file)
@@ -365,7 +365,8 @@ free_vq(struct virtio_net *dev, struct vhost_virtqueue *vq)
                vhost_free_async_mem(vq);
        }
        rte_free(vq->batch_copy_elems);
-       rte_mempool_free(vq->iotlb_pool);
+       if (vq->iotlb_pool)
+               rte_mempool_free(vq->iotlb_pool);
        rte_free(vq->log_cache);
        rte_free(vq);
 }
@@ -569,8 +570,6 @@ init_vring_queue(struct virtio_net *dev, uint32_t vring_idx)
        vq->kickfd = VIRTIO_UNINITIALIZED_EVENTFD;
        vq->callfd = VIRTIO_UNINITIALIZED_EVENTFD;
        vq->notif_enable = VIRTIO_UNINITIALIZED_NOTIF;
-
-       vhost_user_iotlb_init(dev, vring_idx);
 }
 
 static void
index 2f4f89a..cdd46a0 100644 (file)
@@ -469,6 +469,10 @@ 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;
 }
 
@@ -574,7 +578,7 @@ out:
        dev->virtqueue[index] = vq;
        vhost_devices[dev->vid] = dev;
 
-       if (old_vq != vq)
+       if (old_vq != vq && (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)))
                vhost_user_iotlb_init(dev, index);
 
        return dev;