[ovs-dev] [PATCH v3 1/3] netdev-dpdk: Remove dpdk watchdog thread
Ciara Loftus
ciara.loftus at intel.com
Wed May 11 15:30:50 UTC 2016
Instead of continuously polling for link status changes on 'dpdk'
ports, register a callback function that will be triggered when DPDK
detects that the link status of that port has changed.
Signed-off-by: Ciara Loftus <ciara.loftus at intel.com>
Suggested-by: Kevin Traynor <kevin.traynor at intel.com>
---
lib/netdev-dpdk.c | 55 ++++++++++++++++++++++++++++++-------------------------
1 file changed, 30 insertions(+), 25 deletions(-)
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index af86d19..89d783a 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -62,8 +62,6 @@
VLOG_DEFINE_THIS_MODULE(dpdk);
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20);
-#define DPDK_PORT_WATCHDOG_INTERVAL 5
-
#define OVS_CACHE_LINE_SIZE CACHE_LINE_SIZE
#define OVS_VPORT_DPDK "ovs_dpdk"
@@ -386,6 +384,9 @@ static int netdev_dpdk_construct(struct netdev *);
struct virtio_net * netdev_dpdk_get_virtio(const struct netdev_dpdk *dev);
+void link_status_changed_callback(uint8_t port_id,
+ enum rte_eth_event_type type OVS_UNUSED, void *param OVS_UNUSED);
+
static bool
is_dpdk_class(const struct netdev_class *class)
{
@@ -536,27 +537,6 @@ check_link_status(struct netdev_dpdk *dev)
}
}
-static void *
-dpdk_watchdog(void *dummy OVS_UNUSED)
-{
- struct netdev_dpdk *dev;
-
- pthread_detach(pthread_self());
-
- for (;;) {
- ovs_mutex_lock(&dpdk_mutex);
- LIST_FOR_EACH (dev, list_node, &dpdk_list) {
- ovs_mutex_lock(&dev->mutex);
- check_link_status(dev);
- ovs_mutex_unlock(&dev->mutex);
- }
- ovs_mutex_unlock(&dpdk_mutex);
- xsleep(DPDK_PORT_WATCHDOG_INTERVAL);
- }
-
- return NULL;
-}
-
static int
dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev, int n_rxq, int n_txq)
{
@@ -717,6 +697,27 @@ netdev_dpdk_alloc_txq(struct netdev_dpdk *dev, unsigned int n_txqs)
}
}
+void
+link_status_changed_callback(uint8_t port_id,
+ enum rte_eth_event_type type OVS_UNUSED,
+ void *param OVS_UNUSED)
+{
+ struct netdev_dpdk *dev;
+
+ ovs_mutex_lock(&dpdk_mutex);
+ LIST_FOR_EACH (dev, list_node, &dpdk_list) {
+ if (port_id == dev->port_id) {
+ ovs_mutex_lock(&dev->mutex);
+ check_link_status(dev);
+ ovs_mutex_unlock(&dev->mutex);
+ break;
+ }
+ }
+ ovs_mutex_unlock(&dpdk_mutex);
+
+ return;
+}
+
static int
netdev_dpdk_init(struct netdev *netdev, unsigned int port_no,
enum dpdk_dev_type type)
@@ -774,6 +775,12 @@ netdev_dpdk_init(struct netdev *netdev, unsigned int port_no,
netdev_dpdk_alloc_txq(dev, OVS_VHOST_MAX_QUEUE_NUM);
}
+ if (type == DPDK_DEV_ETH) {
+ rte_eth_dev_callback_register(port_no, RTE_ETH_EVENT_INTR_LSC,
+ (void*)link_status_changed_callback,
+ NULL);
+ }
+
ovs_list_push_back(&dpdk_list, &dev->list_node);
unlock:
@@ -3207,8 +3214,6 @@ dpdk_init__(const struct smap *ovs_other_config)
/* We are called from the main thread here */
RTE_PER_LCORE(_lcore_id) = NON_PMD_CORE_ID;
- ovs_thread_create("dpdk_watchdog", dpdk_watchdog, NULL);
-
#ifdef VHOST_CUSE
/* Register CUSE device to handle IOCTLs.
* Unless otherwise specified, cuse_dev_name is set to vhost-net.
--
2.4.3
More information about the dev
mailing list