[dpdk-dev] [PATCH 41/56] net/sfc: periodic management EVQ polling using alarm

Andrew Rybchenko arybchenko at solarflare.com
Mon Nov 21 16:00:55 CET 2016


Timers cannot be used to implement periodic polling, since it implies
requirement on application to process timers in the main loop.

Reviewed-by: Andy Moreton <amoreton at solarflare.com>
Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
---
 drivers/net/sfc/efx/sfc_ev.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/drivers/net/sfc/efx/sfc_ev.c b/drivers/net/sfc/efx/sfc_ev.c
index 1734b1e..1cb9771 100644
--- a/drivers/net/sfc/efx/sfc_ev.c
+++ b/drivers/net/sfc/efx/sfc_ev.c
@@ -29,6 +29,7 @@
 
 #include <rte_debug.h>
 #include <rte_cycles.h>
+#include <rte_alarm.h>
 
 #include "efx.h"
 
@@ -45,6 +46,9 @@
 /* Event queue init approx timeout */
 #define	SFC_EVQ_INIT_TIMEOUT_US		(2 * US_PER_S)
 
+/* Management event queue polling period in microseconds */
+#define	SFC_MGMT_EV_QPOLL_PERIOD_US	(US_PER_S)
+
 
 static boolean_t
 sfc_ev_initialized(void *arg)
@@ -326,6 +330,34 @@ sfc_ev_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	efx_ev_qdestroy(evq->common);
 }
 
+static void
+sfc_ev_mgmt_periodic_qpoll(void *arg)
+{
+	struct sfc_adapter *sa = arg;
+	int rc;
+
+	sfc_ev_mgmt_qpoll(sa);
+
+	rc = rte_eal_alarm_set(SFC_MGMT_EV_QPOLL_PERIOD_US,
+			       sfc_ev_mgmt_periodic_qpoll, sa);
+	if (rc != 0)
+		sfc_panic(sa,
+			  "cannot rearm management EVQ polling alarm (rc=%d)",
+			  rc);
+}
+
+static void
+sfc_ev_mgmt_periodic_qpoll_start(struct sfc_adapter *sa)
+{
+	sfc_ev_mgmt_periodic_qpoll(sa);
+}
+
+static void
+sfc_ev_mgmt_periodic_qpoll_stop(struct sfc_adapter *sa)
+{
+	rte_eal_alarm_cancel(sfc_ev_mgmt_periodic_qpoll, sa);
+}
+
 int
 sfc_ev_start(struct sfc_adapter *sa)
 {
@@ -347,6 +379,14 @@ sfc_ev_start(struct sfc_adapter *sa)
 	rte_spinlock_unlock(&sa->mgmt_evq_lock);
 
 	/*
+	 * Start management EVQ polling. If interrupts are disabled
+	 * (not used), it is required to process link status change
+	 * and other device level events to avoid unrecoverable
+	 * error because the event queue overflow.
+	 */
+	sfc_ev_mgmt_periodic_qpoll_start(sa);
+
+	/*
 	 * Rx/Tx event queues are started/stopped when corresponding
 	 * Rx/Tx queue is started/stopped.
 	 */
@@ -369,6 +409,8 @@ sfc_ev_stop(struct sfc_adapter *sa)
 
 	sfc_log_init(sa, "entry");
 
+	sfc_ev_mgmt_periodic_qpoll_stop(sa);
+
 	/* Make sure that all event queues are stopped */
 	sw_index = sa->evq_count;
 	while (--sw_index >= 0) {
-- 
2.5.5



More information about the dev mailing list