net/sfc: make sure that stats name is nul-terminated
[dpdk.git] / drivers / net / failsafe / failsafe_private.h
index f3be152..7e6a3f8 100644 (file)
@@ -1,12 +1,13 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright 2017 6WIND S.A.
- * Copyright 2017 Mellanox.
+ * Copyright 2017 Mellanox Technologies, Ltd
  */
 
 #ifndef _RTE_ETH_FAILSAFE_PRIVATE_H_
 #define _RTE_ETH_FAILSAFE_PRIVATE_H_
 
 #include <sys/queue.h>
+#include <pthread.h>
 
 #include <rte_atomic.h>
 #include <rte_dev.h>
@@ -161,6 +162,9 @@ struct fs_priv {
         * appropriate failsafe Rx queue.
         */
        struct rx_proxy rxp;
+       pthread_mutex_t hotplug_mutex;
+       /* Hot-plug mutex is locked by the alarm mechanism. */
+       volatile unsigned int alarm_lock:1;
        unsigned int pending_alarm:1; /* An alarm is pending */
        /* flow isolation state */
        int flow_isolated:1;
@@ -216,6 +220,9 @@ int failsafe_eth_rmv_event_callback(uint16_t port_id,
 int failsafe_eth_lsc_event_callback(uint16_t port_id,
                                    enum rte_eth_event_type event,
                                    void *cb_arg, void *out);
+int failsafe_eth_new_event_callback(uint16_t port_id,
+                                   enum rte_eth_event_type event,
+                                   void *cb_arg, void *out);
 
 /* GLOBALS */
 
@@ -314,8 +321,20 @@ extern int mac_from_arg;
         &((struct txq *)((s)->fs_dev->data->tx_queues[i]))->refcnt[(s)->sid] \
        )
 
-#define LOG__(level, m, ...) \
-       RTE_LOG(level, PMD, "net_failsafe: " m "%c", __VA_ARGS__)
+#ifdef RTE_EXEC_ENV_BSDAPP
+#define FS_THREADID_TYPE void*
+#define FS_THREADID_FMT  "p"
+#else
+#define FS_THREADID_TYPE unsigned long
+#define FS_THREADID_FMT  "lu"
+#endif
+
+extern int failsafe_logtype;
+
+#define LOG__(l, m, ...) \
+       rte_log(RTE_LOG_ ## l, failsafe_logtype, \
+               "net_failsafe: " m "%c", __VA_ARGS__)
+
 #define LOG_(level, ...) LOG__(level, __VA_ARGS__, '\n')
 #define DEBUG(...) LOG_(DEBUG, __VA_ARGS__)
 #define INFO(...) LOG_(INFO, __VA_ARGS__)
@@ -346,6 +365,59 @@ fs_find_next(struct rte_eth_dev *dev,
        return &subs[sid];
 }
 
+/*
+ * Lock hot-plug mutex.
+ * is_alarm means that the caller is, for sure, the hot-plug alarm mechanism.
+ */
+static inline int
+fs_lock(struct rte_eth_dev *dev, unsigned int is_alarm)
+{
+       int ret;
+
+       if (is_alarm) {
+               ret = pthread_mutex_trylock(&PRIV(dev)->hotplug_mutex);
+               if (ret) {
+                       DEBUG("Hot-plug mutex lock trying failed(%s), will try"
+                             " again later...", strerror(ret));
+                       return ret;
+               }
+               PRIV(dev)->alarm_lock = 1;
+       } else {
+               ret = pthread_mutex_lock(&PRIV(dev)->hotplug_mutex);
+               if (ret) {
+                       ERROR("Cannot lock mutex(%s)", strerror(ret));
+                       return ret;
+               }
+       }
+       DEBUG("Hot-plug mutex was locked by thread %" FS_THREADID_FMT "%s",
+             (FS_THREADID_TYPE)pthread_self(),
+             PRIV(dev)->alarm_lock ? " by the hot-plug alarm" : "");
+       return ret;
+}
+
+/*
+ * Unlock hot-plug mutex.
+ * is_alarm means that the caller is, for sure, the hot-plug alarm mechanism.
+ */
+static inline void
+fs_unlock(struct rte_eth_dev *dev, unsigned int is_alarm)
+{
+       int ret;
+       unsigned int prev_alarm_lock = PRIV(dev)->alarm_lock;
+
+       if (is_alarm) {
+               RTE_ASSERT(PRIV(dev)->alarm_lock == 1);
+               PRIV(dev)->alarm_lock = 0;
+       }
+       ret = pthread_mutex_unlock(&PRIV(dev)->hotplug_mutex);
+       if (ret)
+               ERROR("Cannot unlock hot-plug mutex(%s)", strerror(ret));
+       else
+               DEBUG("Hot-plug mutex was unlocked by thread %" FS_THREADID_FMT "%s",
+                     (FS_THREADID_TYPE)pthread_self(),
+                     prev_alarm_lock ? " by the hot-plug alarm" : "");
+}
+
 /*
  * Switch emitting device.
  * If banned is set, banned must not be considered for