@@ -125,6 +125,9 @@ API Changes
* ``rte_page_sizes`` enumeration is replaced with ``RTE_PGSIZE_xxx`` defines.
+* vhost: The API of ``rte_vhost_host_notifier_ctrl`` was changed to be per
+ queue and not per device, a qid parameter was added to the arguments list.
+
ABI Changes
-----------
@@ -839,7 +839,7 @@ struct internal_list {
vdpa_ifcvf_stop(internal);
vdpa_disable_vfio_intr(internal);
- ret = rte_vhost_host_notifier_ctrl(vid, false);
+ ret = rte_vhost_host_notifier_ctrl(vid, RTE_VHOST_QUEUE_ALL, false);
if (ret && ret != -ENOTSUP)
goto error;
@@ -858,7 +858,7 @@ struct internal_list {
if (ret)
goto stop_vf;
- rte_vhost_host_notifier_ctrl(vid, true);
+ rte_vhost_host_notifier_ctrl(vid, RTE_VHOST_QUEUE_ALL, true);
internal->sw_fallback_running = true;
@@ -893,7 +893,7 @@ struct internal_list {
rte_atomic32_set(&internal->dev_attached, 1);
update_datapath(internal);
- if (rte_vhost_host_notifier_ctrl(vid, true) != 0)
+ if (rte_vhost_host_notifier_ctrl(vid, RTE_VHOST_QUEUE_ALL, true) != 0)
DRV_LOG(NOTICE, "vDPA (%d): software relay is used.", did);
return 0;
@@ -146,7 +146,8 @@
int ret;
if (priv->direct_notifier) {
- ret = rte_vhost_host_notifier_ctrl(priv->vid, false);
+ ret = rte_vhost_host_notifier_ctrl(priv->vid,
+ RTE_VHOST_QUEUE_ALL, false);
if (ret != 0) {
DRV_LOG(INFO, "Direct HW notifier FD cannot be "
"destroyed for device %d: %d.", priv->vid, ret);
@@ -154,7 +155,8 @@
}
priv->direct_notifier = 0;
}
- ret = rte_vhost_host_notifier_ctrl(priv->vid, true);
+ ret = rte_vhost_host_notifier_ctrl(priv->vid, RTE_VHOST_QUEUE_ALL,
+ true);
if (ret != 0)
DRV_LOG(INFO, "Direct HW notifier FD cannot be configured for"
" device %d: %d.", priv->vid, ret);
@@ -202,22 +202,26 @@ struct rte_vdpa_device *
int
rte_vdpa_get_device_num(void);
+#define RTE_VHOST_QUEUE_ALL UINT16_MAX
+
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
- * Enable/Disable host notifier mapping for a vdpa port.
+ * Enable/Disable host notifier mapping for a vdpa queue.
*
* @param vid
* vhost device id
* @param enable
* true for host notifier map, false for host notifier unmap
+ * @param qid
+ * vhost queue id, RTE_VHOST_QUEUE_ALL to configure all the device queues
* @return
* 0 on success, -1 on failure
*/
__rte_experimental
int
-rte_vhost_host_notifier_ctrl(int vid, bool enable);
+rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable);
/**
* @warning
@@ -107,7 +107,6 @@
#define VHOST_USER_F_PROTOCOL_FEATURES 30
#endif
-
/**
* Information relating to memory regions including offsets to
* addresses in QEMUs memory file.
@@ -2951,13 +2951,13 @@ static int vhost_user_slave_set_vring_host_notifier(struct virtio_net *dev,
return process_slave_message_reply(dev, &msg);
}
-int rte_vhost_host_notifier_ctrl(int vid, bool enable)
+int rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable)
{
struct virtio_net *dev;
struct rte_vdpa_device *vdpa_dev;
int vfio_device_fd, did, ret = 0;
uint64_t offset, size;
- unsigned int i;
+ unsigned int i, q_start, q_last;
dev = get_device(vid);
if (!dev)
@@ -2981,6 +2981,16 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
if (!vdpa_dev)
return -ENODEV;
+ if (qid == RTE_VHOST_QUEUE_ALL) {
+ q_start = 0;
+ q_last = dev->nr_vring - 1;
+ } else {
+ if (qid >= dev->nr_vring)
+ return -EINVAL;
+ q_start = qid;
+ q_last = qid;
+ }
+
RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_vfio_device_fd, -ENOTSUP);
RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_notify_area, -ENOTSUP);
@@ -2989,7 +2999,7 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
return -ENOTSUP;
if (enable) {
- for (i = 0; i < dev->nr_vring; i++) {
+ for (i = q_start; i <= q_last; i++) {
if (vdpa_dev->ops->get_notify_area(vid, i, &offset,
&size) < 0) {
ret = -ENOTSUP;
@@ -3004,7 +3014,7 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable)
}
} else {
disable:
- for (i = 0; i < dev->nr_vring; i++) {
+ for (i = q_start; i <= q_last; i++) {
vhost_user_slave_set_vring_host_notifier(dev, i, -1,
0, 0);
}