X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Ffailsafe%2Ffailsafe_private.h;h=231b89edd90344558e031e39e192c95475499184;hb=6d13ea8e8e49ab957deae2bba5ecf4a4bfe747d1;hp=5b84db9056aa0c7e036933b3afedc17938baef64;hpb=655fcd68c7d282dcd5a414696c3d93d6ccac75da;p=dpdk.git diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h index 5b84db9056..231b89edd9 100644 --- a/drivers/net/failsafe/failsafe_private.h +++ b/drivers/net/failsafe/failsafe_private.h @@ -1,11 +1,12 @@ /* 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 #include #include @@ -13,6 +14,7 @@ #include #include #include +#include #include #define FAILSAFE_DRIVER_NAME "Fail-safe PMD" @@ -81,7 +83,8 @@ struct rte_flow { /* sub_flows */ struct rte_flow *flows[FAILSAFE_MAX_ETHPORTS]; /* flow description for synchronization */ - struct rte_flow_desc *fd; + struct rte_flow_conv_rule rule; + uint8_t rule_data[]; }; enum dev_state { @@ -97,13 +100,15 @@ struct fs_stats { uint64_t timestamp; }; +/* + * Allocated in shared memory. + */ struct sub_device { /* Exhaustive DPDK device description */ struct sub_device *next; struct rte_devargs devargs; - struct rte_bus *bus; - struct rte_device *dev; - struct rte_eth_dev *edev; + struct rte_bus *bus; /* for primary process only. */ + struct rte_device *dev; /* for primary process only. */ uint8_t sid; /* Device state machine */ enum dev_state state; @@ -114,21 +119,31 @@ struct sub_device { /* Others are retrieved through a file descriptor */ char *fd_str; /* fail-safe device backreference */ - struct rte_eth_dev *fs_dev; + uint16_t fs_port_id; /* shared between processes */ + /* sub device port id*/ + uint16_t sdev_port_id; /* shared between processes */ /* flag calling for recollection */ volatile unsigned int remove:1; /* flow isolation state */ int flow_isolated:1; + /* RMV callback registration state */ + unsigned int rmv_callback:1; + /* LSC callback registration state */ + unsigned int lsc_callback:1; }; +/* + * This is referenced by eth_dev->data->dev_private + * This is shared between processes. + */ struct fs_priv { - struct rte_eth_dev *dev; + struct rte_eth_dev_data *data; /* backreference to shared data. */ /* * Set of sub_devices. * subs[0] is the preferred device * any other is just another slave */ - struct sub_device *subs; + struct sub_device *subs; /* shared between processes */ uint8_t subs_head; /* if head == tail, no subs */ uint8_t subs_tail; /* first invalid */ uint8_t subs_tx; /* current emitting device */ @@ -137,8 +152,10 @@ struct fs_priv { TAILQ_HEAD(sub_flows, rte_flow) flow_list; /* current number of mac_addr slots allocated. */ uint32_t nb_mac_addr; - struct ether_addr mac_addrs[FAILSAFE_MAX_ETHADDR]; + struct rte_ether_addr mac_addrs[FAILSAFE_MAX_ETHADDR]; uint32_t mac_addr_pool[FAILSAFE_MAX_ETHADDR]; + uint32_t nb_mcast_addr; + struct rte_ether_addr *mcast_addrs; /* current capabilities */ struct rte_eth_dev_info infos; struct rte_eth_dev_owner my_owner; /* Unique owner. */ @@ -184,7 +201,7 @@ int failsafe_hotplug_alarm_cancel(struct rte_eth_dev *dev); /* RX / TX */ -void set_burst_fn(struct rte_eth_dev *dev, int force_safe); +void failsafe_set_burst_fn(struct rte_eth_dev *dev, int force_safe); uint16_t failsafe_rx_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts); @@ -211,6 +228,7 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev); /* ETH_DEV */ int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev); +void failsafe_eth_dev_unregister_callbacks(struct sub_device *sdev); void failsafe_dev_remove(struct rte_eth_dev *dev); void failsafe_stats_increment(struct rte_eth_stats *to, struct rte_eth_stats *from); @@ -220,14 +238,17 @@ 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 */ extern const char pmd_failsafe_driver_name[]; extern const struct eth_dev_ops failsafe_ops; extern const struct rte_flow_ops fs_flow_ops; -extern uint64_t hotplug_poll; -extern int mac_from_arg; +extern uint64_t failsafe_hotplug_poll; +extern int failsafe_mac_from_arg; /* HELPERS */ @@ -237,11 +258,12 @@ extern int mac_from_arg; /* sdev: (struct sub_device *) */ #define ETH(sdev) \ - ((sdev)->edev) + ((sdev)->sdev_port_id == RTE_MAX_ETHPORTS ? \ + NULL : &rte_eth_devices[(sdev)->sdev_port_id]) /* sdev: (struct sub_device *) */ #define PORT_ID(sdev) \ - (ETH(sdev)->data->port_id) + ((sdev)->sdev_port_id) /* sdev: (struct sub_device *) */ #define SUB_ID(sdev) \ @@ -307,19 +329,31 @@ extern int mac_from_arg; */ #define FS_ATOMIC_RX(s, i) \ rte_atomic64_read( \ - &((struct rxq *)((s)->fs_dev->data->rx_queues[i]))->refcnt[(s)->sid] \ - ) + &((struct rxq *) \ + (fs_dev(s)->data->rx_queues[i]))->refcnt[(s)->sid]) /** * s: (struct sub_device *) * i: uint16_t qid */ #define FS_ATOMIC_TX(s, i) \ rte_atomic64_read( \ - &((struct txq *)((s)->fs_dev->data->tx_queues[i]))->refcnt[(s)->sid] \ - ) + &((struct txq *) \ + (fs_dev(s)->data->tx_queues[i]))->refcnt[(s)->sid]) + +#ifdef RTE_EXEC_ENV_FREEBSD +#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, m, ...) \ - RTE_LOG(level, PMD, "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__) @@ -350,6 +384,11 @@ fs_find_next(struct rte_eth_dev *dev, return &subs[sid]; } +static inline struct rte_eth_dev * +fs_dev(struct sub_device *sdev) { + return &rte_eth_devices[sdev->fs_port_id]; +} + /* * Lock hot-plug mutex. * is_alarm means that the caller is, for sure, the hot-plug alarm mechanism. @@ -374,8 +413,6 @@ fs_lock(struct rte_eth_dev *dev, unsigned int is_alarm) return ret; } } - DEBUG("Hot-plug mutex was locked by thread %lu%s", pthread_self(), - PRIV(dev)->alarm_lock ? " by the hot-plug alarm" : ""); return ret; } @@ -387,7 +424,6 @@ 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); @@ -396,10 +432,6 @@ fs_unlock(struct rte_eth_dev *dev, unsigned int is_alarm) 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 %lu%s", - pthread_self(), - prev_alarm_lock ? " by the hot-plug alarm" : ""); } /* @@ -447,7 +479,7 @@ fs_switch_dev(struct rte_eth_dev *dev, } else { return; } - set_burst_fn(dev, 0); + failsafe_set_burst_fn(dev, 0); rte_wmb(); }