Thread (8 messages) 8 messages, 2 authors, 2019-09-12

Re: [dpdk-dev] [Suspected-Phishing][PATCH] net/vhost: add an API for get queue status

From: Noa Ezra <hidden>
Date: 2019-09-12 10:04:59

Hi Maxime,
For me, the solution you suggested is good enough:
"call rte_eth_vhost_get_queue_event() in loop at startup until you get -1 and build the states based on that"
Getting the state on a direct way can be good and easier than reading it in a loop, but I'm not sure that your suggestion will solve the problem of getting queue state for requested queue directly in the application.

Thanks,
Noa.
-----Original Message-----
From: Maxime Coquelin [mailto:maxime.coquelin@redhat.com]
Sent: Friday, August 30, 2019 11:56 AM
To: Noa Ezra <redacted>; tiwei.bie@intel.com;
zhihong.wang@intel.com
Cc: Matan Azrad <redacted>; dev@dpdk.org
Subject: Re: [Suspected-Phishing][PATCH] net/vhost: add an API for get
queue status

Hi Noa,

I was thinking about an alternative that would avoid adding an API.
What about the Vhost-user library to replay the queue status for all
configured queues when the device is ready (i.e. after it has called its
.new_device() callback)?

On 6/24/19 1:08 PM, Noa Ezra wrote:
quoted
Hi,
What do you say about this patch?

Thanks,
Noa.
quoted
-----Original Message-----
From: Noa Ezra [mailto:noae@mellanox.com]
Sent: Wednesday, June 19, 2019 9:15 AM
To: maxime.coquelin@redhat.com
Cc: Matan Azrad <redacted>; dev@dpdk.org; Noa Ezra
[off-list ref]
Subject: [Suspected-Phishing][PATCH] net/vhost: add an API for get
queue status

Add an API that returns queue status for requested queue in the port.
The queue's status can be changed before the user has signed for the
queue state event interrupt. In this case the user can't know the
current queue's status. This API returns the current status.

Signed-off-by: Noa Ezra <redacted>
Reviewed-by: Matan Azrad <redacted>
---
 drivers/net/vhost/rte_eth_vhost.c           | 47
+++++++++++++++++++++++++++++
 drivers/net/vhost/rte_eth_vhost.h           | 18 +++++++++++
 drivers/net/vhost/rte_pmd_vhost_version.map |  6 ++++
 3 files changed, 71 insertions(+)
diff --git a/drivers/net/vhost/rte_eth_vhost.c
b/drivers/net/vhost/rte_eth_vhost.c
index 9a54020..cad1e5c 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -855,6 +855,7 @@ struct vhost_xstats_name_off {
 	/* won't be NULL */
 	state = vring_states[eth_dev->data->port_id];
 	rte_spinlock_lock(&state->lock);
+
 	state->cur[vring] = enable;
 	state->max_vring = RTE_MAX(vring, state->max_vring);
 	rte_spinlock_unlock(&state->lock);
@@ -874,6 +875,52 @@ struct vhost_xstats_name_off {  };

 int
+rte_eth_vhost_get_queue_status(uint16_t port_id, bool rx, uint16_t
queue_id,
+		bool *queue_status)
+{
+	struct rte_vhost_vring_state *state;
+	struct internal_list *list;
+	struct rte_eth_dev *eth_dev;
+	int found = 0;
+	uint16_t nb_q = 0;
+
+	if (port_id >= RTE_MAX_ETHPORTS) {
+		VHOST_LOG(ERR, "Invalid port id\n");
+		return -1;
+	}
+	TAILQ_FOREACH(list, &internal_list, next) {
+		eth_dev = list->eth_dev;
+		if (eth_dev->data->port_id == port_id) {
+			nb_q = rx ? eth_dev->data->nb_rx_queues :
+					eth_dev->data->nb_tx_queues;
+			found = 1;
+			break;
+		}
+	}
+	if (!found) {
+		VHOST_LOG(ERR, "No device found for port id %u\n",
port_id);
+		return -1;
+	}
+	if (queue_id >= nb_q) {
+		VHOST_LOG(ERR, "Invalid queue id\n");
+		return -1;
+	}
+
+	state = vring_states[port_id];
+	if (!state) {
+		VHOST_LOG(ERR, "Unused port\n");
+		return -1;
+	}
+
+	rte_spinlock_lock(&state->lock);
+	*queue_status = rx ? state->cur[queue_id * 2 + 1] :
+			state->cur[queue_id * 2];
+	rte_spinlock_unlock(&state->lock);
+
+	return 0;
+}
+
+int
 rte_eth_vhost_get_queue_event(uint16_t port_id,
 		struct rte_eth_vhost_queue_event *event)  { diff --git
a/drivers/net/vhost/rte_eth_vhost.h
b/drivers/net/vhost/rte_eth_vhost.h
index 0e68b9f..1e65c69 100644
--- a/drivers/net/vhost/rte_eth_vhost.h
+++ b/drivers/net/vhost/rte_eth_vhost.h
@@ -44,6 +44,24 @@ int rte_eth_vhost_get_queue_event(uint16_t
port_id,
quoted
quoted
 		struct rte_eth_vhost_queue_event *event);

 /**
+ * Get queue status for specific queue in the port.
+ *
+ * @param[in] port_id
+ *  Port id.
+ * @param[in] rx
+ *  True is rx, False if tx
+ * @paran[in] queue_id
+ *  Queue_id
+ * @param[out] queue_status
+ *  Pointer to a boolean, True is enable, False if disable.
+ * @return
+ *  - On success, zero, queue_status is updated.
+ *  - On failure, a negative value, queue_status is not updated.
+ */
+int rte_eth_vhost_get_queue_status(uint16_t port_id, bool rx,
+uint16_t
queue_id,
+		bool *queue_status);
+
+/**
  * Get the 'vid' value associated with the specified port.
  *
  * @return
diff --git a/drivers/net/vhost/rte_pmd_vhost_version.map
b/drivers/net/vhost/rte_pmd_vhost_version.map
index 695db85..1eabfd2 100644
--- a/drivers/net/vhost/rte_pmd_vhost_version.map
+++ b/drivers/net/vhost/rte_pmd_vhost_version.map
@@ -11,3 +11,9 @@ DPDK_16.11 {

 	rte_eth_vhost_get_vid_from_port_id;
 };
+
+DPDK_19.08 {
+	global:
+
+	rte_eth_vhost_get_queue_status;
+};
--
1.8.3.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help