nfp: flower: use the common netdev notifier
Use driver's common notifier for LAG and tunnel configuration. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: John Hurley <john.hurley@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
3e33359040
commit
0c665e2bf4
@@ -626,17 +626,13 @@ nfp_fl_lag_changels_event(struct nfp_fl_lag *lag, struct net_device *netdev,
|
||||
schedule_delayed_work(&lag->work, NFP_FL_LAG_DELAY);
|
||||
}
|
||||
|
||||
static int
|
||||
nfp_fl_lag_netdev_event(struct notifier_block *nb, unsigned long event,
|
||||
void *ptr)
|
||||
int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
|
||||
struct net_device *netdev,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct nfp_fl_lag *lag;
|
||||
struct nfp_fl_lag *lag = &priv->nfp_lag;
|
||||
int err;
|
||||
|
||||
netdev = netdev_notifier_info_to_dev(ptr);
|
||||
lag = container_of(nb, struct nfp_fl_lag, lag_nb);
|
||||
|
||||
switch (event) {
|
||||
case NETDEV_CHANGEUPPER:
|
||||
err = nfp_fl_lag_changeupper_event(lag, ptr);
|
||||
@@ -673,8 +669,6 @@ void nfp_flower_lag_init(struct nfp_fl_lag *lag)
|
||||
|
||||
/* 0 is a reserved batch version so increment to first valid value. */
|
||||
nfp_fl_increment_version(lag);
|
||||
|
||||
lag->lag_nb.notifier_call = nfp_fl_lag_netdev_event;
|
||||
}
|
||||
|
||||
void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag)
|
||||
|
||||
@@ -661,10 +661,6 @@ static int nfp_flower_start(struct nfp_app *app)
|
||||
err = nfp_flower_lag_reset(&app_priv->nfp_lag);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = register_netdevice_notifier(&app_priv->nfp_lag.lag_nb);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
return nfp_tunnel_config_start(app);
|
||||
@@ -672,14 +668,25 @@ static int nfp_flower_start(struct nfp_app *app)
|
||||
|
||||
static void nfp_flower_stop(struct nfp_app *app)
|
||||
{
|
||||
struct nfp_flower_priv *app_priv = app->priv;
|
||||
|
||||
if (app_priv->flower_ext_feats & NFP_FL_FEATS_LAG)
|
||||
unregister_netdevice_notifier(&app_priv->nfp_lag.lag_nb);
|
||||
|
||||
nfp_tunnel_config_stop(app);
|
||||
}
|
||||
|
||||
static int
|
||||
nfp_flower_netdev_event(struct nfp_app *app, struct net_device *netdev,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct nfp_flower_priv *app_priv = app->priv;
|
||||
int ret;
|
||||
|
||||
if (app_priv->flower_ext_feats & NFP_FL_FEATS_LAG) {
|
||||
ret = nfp_flower_lag_netdev_event(app_priv, netdev, event, ptr);
|
||||
if (ret & NOTIFY_STOP_MASK)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return nfp_tunnel_mac_event_handler(app, netdev, event, ptr);
|
||||
}
|
||||
|
||||
const struct nfp_app_type app_flower = {
|
||||
.id = NFP_APP_FLOWER_NIC,
|
||||
.name = "flower",
|
||||
@@ -708,6 +715,8 @@ const struct nfp_app_type app_flower = {
|
||||
.start = nfp_flower_start,
|
||||
.stop = nfp_flower_stop,
|
||||
|
||||
.netdev_event = nfp_flower_netdev_event,
|
||||
|
||||
.ctrl_msg_rx = nfp_flower_cmsg_rx,
|
||||
|
||||
.sriov_enable = nfp_flower_sriov_enable,
|
||||
|
||||
@@ -72,7 +72,6 @@ struct nfp_mtu_conf {
|
||||
|
||||
/**
|
||||
* struct nfp_fl_lag - Flower APP priv data for link aggregation
|
||||
* @lag_nb: Notifier to track master/slave events
|
||||
* @work: Work queue for writing configs to the HW
|
||||
* @lock: Lock to protect lag_group_list
|
||||
* @group_list: List of all master/slave groups offloaded
|
||||
@@ -85,7 +84,6 @@ struct nfp_mtu_conf {
|
||||
* retransmission
|
||||
*/
|
||||
struct nfp_fl_lag {
|
||||
struct notifier_block lag_nb;
|
||||
struct delayed_work work;
|
||||
struct mutex lock;
|
||||
struct list_head group_list;
|
||||
@@ -126,7 +124,6 @@ struct nfp_fl_lag {
|
||||
* @nfp_neigh_off_lock: Lock for the neighbour address list
|
||||
* @nfp_mac_off_ids: IDA to manage id assignment for offloaded macs
|
||||
* @nfp_mac_off_count: Number of MACs in address list
|
||||
* @nfp_tun_mac_nb: Notifier to monitor link state
|
||||
* @nfp_tun_neigh_nb: Notifier to monitor neighbour state
|
||||
* @reify_replies: atomically stores the number of replies received
|
||||
* from firmware for repr reify
|
||||
@@ -160,7 +157,6 @@ struct nfp_flower_priv {
|
||||
spinlock_t nfp_neigh_off_lock;
|
||||
struct ida nfp_mac_off_ids;
|
||||
int nfp_mac_off_count;
|
||||
struct notifier_block nfp_tun_mac_nb;
|
||||
struct notifier_block nfp_tun_neigh_nb;
|
||||
atomic_t reify_replies;
|
||||
wait_queue_head_t reify_wait_queue;
|
||||
@@ -252,6 +248,9 @@ void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb);
|
||||
|
||||
int nfp_tunnel_config_start(struct nfp_app *app);
|
||||
void nfp_tunnel_config_stop(struct nfp_app *app);
|
||||
int nfp_tunnel_mac_event_handler(struct nfp_app *app,
|
||||
struct net_device *netdev,
|
||||
unsigned long event, void *ptr);
|
||||
void nfp_tunnel_write_macs(struct nfp_app *app);
|
||||
void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
|
||||
void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
|
||||
@@ -262,6 +261,9 @@ int nfp_flower_setup_tc_egress_cb(enum tc_setup_type type, void *type_data,
|
||||
void nfp_flower_lag_init(struct nfp_fl_lag *lag);
|
||||
void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag);
|
||||
int nfp_flower_lag_reset(struct nfp_fl_lag *lag);
|
||||
int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
|
||||
struct net_device *netdev,
|
||||
unsigned long event, void *ptr);
|
||||
bool nfp_flower_lag_unprocessed_msg(struct nfp_app *app, struct sk_buff *skb);
|
||||
int nfp_flower_lag_populate_pre_action(struct nfp_app *app,
|
||||
struct net_device *master,
|
||||
|
||||
@@ -652,29 +652,16 @@ static void nfp_tun_add_to_mac_offload_list(struct net_device *netdev,
|
||||
mutex_unlock(&priv->nfp_mac_off_lock);
|
||||
}
|
||||
|
||||
static int nfp_tun_mac_event_handler(struct notifier_block *nb,
|
||||
unsigned long event, void *ptr)
|
||||
int nfp_tunnel_mac_event_handler(struct nfp_app *app,
|
||||
struct net_device *netdev,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct nfp_flower_priv *app_priv;
|
||||
struct net_device *netdev;
|
||||
struct nfp_app *app;
|
||||
|
||||
if (event == NETDEV_DOWN || event == NETDEV_UNREGISTER) {
|
||||
app_priv = container_of(nb, struct nfp_flower_priv,
|
||||
nfp_tun_mac_nb);
|
||||
app = app_priv->app;
|
||||
netdev = netdev_notifier_info_to_dev(ptr);
|
||||
|
||||
/* If non-nfp netdev then free its offload index. */
|
||||
if (nfp_tun_is_netdev_to_offload(netdev))
|
||||
nfp_tun_del_mac_idx(app, netdev->ifindex);
|
||||
} else if (event == NETDEV_UP || event == NETDEV_CHANGEADDR ||
|
||||
event == NETDEV_REGISTER) {
|
||||
app_priv = container_of(nb, struct nfp_flower_priv,
|
||||
nfp_tun_mac_nb);
|
||||
app = app_priv->app;
|
||||
netdev = netdev_notifier_info_to_dev(ptr);
|
||||
|
||||
nfp_tun_add_to_mac_offload_list(netdev, app);
|
||||
|
||||
/* Force a list write to keep NFP up to date. */
|
||||
@@ -686,13 +673,11 @@ static int nfp_tun_mac_event_handler(struct notifier_block *nb,
|
||||
int nfp_tunnel_config_start(struct nfp_app *app)
|
||||
{
|
||||
struct nfp_flower_priv *priv = app->priv;
|
||||
int err;
|
||||
|
||||
/* Initialise priv data for MAC offloading. */
|
||||
priv->nfp_mac_off_count = 0;
|
||||
mutex_init(&priv->nfp_mac_off_lock);
|
||||
INIT_LIST_HEAD(&priv->nfp_mac_off_list);
|
||||
priv->nfp_tun_mac_nb.notifier_call = nfp_tun_mac_event_handler;
|
||||
mutex_init(&priv->nfp_mac_index_lock);
|
||||
INIT_LIST_HEAD(&priv->nfp_mac_index_list);
|
||||
ida_init(&priv->nfp_mac_off_ids);
|
||||
@@ -706,21 +691,7 @@ int nfp_tunnel_config_start(struct nfp_app *app)
|
||||
INIT_LIST_HEAD(&priv->nfp_neigh_off_list);
|
||||
priv->nfp_tun_neigh_nb.notifier_call = nfp_tun_neigh_event_handler;
|
||||
|
||||
err = register_netdevice_notifier(&priv->nfp_tun_mac_nb);
|
||||
if (err)
|
||||
goto err_free_mac_ida;
|
||||
|
||||
err = register_netevent_notifier(&priv->nfp_tun_neigh_nb);
|
||||
if (err)
|
||||
goto err_unreg_mac_nb;
|
||||
|
||||
return 0;
|
||||
|
||||
err_unreg_mac_nb:
|
||||
unregister_netdevice_notifier(&priv->nfp_tun_mac_nb);
|
||||
err_free_mac_ida:
|
||||
ida_destroy(&priv->nfp_mac_off_ids);
|
||||
return err;
|
||||
return register_netevent_notifier(&priv->nfp_tun_neigh_nb);
|
||||
}
|
||||
|
||||
void nfp_tunnel_config_stop(struct nfp_app *app)
|
||||
@@ -732,7 +703,6 @@ void nfp_tunnel_config_stop(struct nfp_app *app)
|
||||
struct nfp_ipv4_addr_entry *ip_entry;
|
||||
struct list_head *ptr, *storage;
|
||||
|
||||
unregister_netdevice_notifier(&priv->nfp_tun_mac_nb);
|
||||
unregister_netevent_notifier(&priv->nfp_tun_neigh_nb);
|
||||
|
||||
/* Free any memory that may be occupied by MAC list. */
|
||||
|
||||
Reference in New Issue
Block a user