]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
mlx5: update indirect block support
authorPablo Neira Ayuso <pablo@netfilter.org>
Fri, 29 May 2020 00:25:38 +0000 (02:25 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 Jun 2020 18:41:50 +0000 (11:41 -0700)
Register ndo callback via flow_indr_dev_register() and
flow_indr_dev_unregister().

No need for mlx5e_rep_indr_clean_block_privs() since flow_block_cb_free()
already releases the internal mapping via ->release callback, which in
this case is mlx5e_rep_indr_tc_block_unbind().

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.h
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/en_rep.h

index c609a5e50ebcf7b99c856833d55d1d9bb170aed4..80713123de5cab7360cf3c8c7ddcf1b1251ff112 100644 (file)
@@ -306,20 +306,6 @@ mlx5e_rep_indr_block_priv_lookup(struct mlx5e_rep_priv *rpriv,
        return NULL;
 }
 
-static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
-                                           struct net_device *netdev);
-
-void mlx5e_rep_indr_clean_block_privs(struct mlx5e_rep_priv *rpriv)
-{
-       struct mlx5e_rep_indr_block_priv *cb_priv, *temp;
-       struct list_head *head = &rpriv->uplink_priv.tc_indr_block_priv_list;
-
-       list_for_each_entry_safe(cb_priv, temp, head, list) {
-               mlx5e_rep_indr_unregister_block(rpriv, cb_priv->netdev);
-               kfree(cb_priv);
-       }
-}
-
 static int
 mlx5e_rep_indr_offload(struct net_device *netdev,
                       struct flow_cls_offload *flower,
@@ -423,9 +409,14 @@ mlx5e_rep_indr_setup_block(struct net_device *netdev,
                           struct flow_block_offload *f,
                           flow_setup_cb_t *setup_cb)
 {
+       struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
        struct mlx5e_rep_indr_block_priv *indr_priv;
        struct flow_block_cb *block_cb;
 
+       if (!mlx5e_tc_tun_device_to_offload(priv, netdev) &&
+           !(is_vlan_dev(netdev) && vlan_dev_real_dev(netdev) == rpriv->netdev))
+               return -EOPNOTSUPP;
+
        if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
                return -EOPNOTSUPP;
 
@@ -492,76 +483,20 @@ int mlx5e_rep_indr_setup_cb(struct net_device *netdev, void *cb_priv,
        }
 }
 
-static int mlx5e_rep_indr_register_block(struct mlx5e_rep_priv *rpriv,
-                                        struct net_device *netdev)
-{
-       int err;
-
-       err = __flow_indr_block_cb_register(netdev, rpriv,
-                                           mlx5e_rep_indr_setup_cb,
-                                           rpriv);
-       if (err) {
-               struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
-
-               mlx5_core_err(priv->mdev, "Failed to register remote block notifier for %s err=%d\n",
-                             netdev_name(netdev), err);
-       }
-       return err;
-}
-
-static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
-                                           struct net_device *netdev)
-{
-       __flow_indr_block_cb_unregister(netdev, mlx5e_rep_indr_setup_cb,
-                                       rpriv);
-}
-
-static int mlx5e_nic_rep_netdevice_event(struct notifier_block *nb,
-                                        unsigned long event, void *ptr)
-{
-       struct mlx5e_rep_priv *rpriv = container_of(nb, struct mlx5e_rep_priv,
-                                                    uplink_priv.netdevice_nb);
-       struct mlx5e_priv *priv = netdev_priv(rpriv->netdev);
-       struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
-
-       if (!mlx5e_tc_tun_device_to_offload(priv, netdev) &&
-           !(is_vlan_dev(netdev) && vlan_dev_real_dev(netdev) == rpriv->netdev))
-               return NOTIFY_OK;
-
-       switch (event) {
-       case NETDEV_REGISTER:
-               mlx5e_rep_indr_register_block(rpriv, netdev);
-               break;
-       case NETDEV_UNREGISTER:
-               mlx5e_rep_indr_unregister_block(rpriv, netdev);
-               break;
-       }
-       return NOTIFY_OK;
-}
-
 int mlx5e_rep_tc_netdevice_event_register(struct mlx5e_rep_priv *rpriv)
 {
        struct mlx5_rep_uplink_priv *uplink_priv = &rpriv->uplink_priv;
-       int err;
 
        /* init indirect block notifications */
        INIT_LIST_HEAD(&uplink_priv->tc_indr_block_priv_list);
 
-       uplink_priv->netdevice_nb.notifier_call = mlx5e_nic_rep_netdevice_event;
-       err = register_netdevice_notifier_dev_net(rpriv->netdev,
-                                                 &uplink_priv->netdevice_nb,
-                                                 &uplink_priv->netdevice_nn);
-       return err;
+       return flow_indr_dev_register(mlx5e_rep_indr_setup_cb, rpriv);
 }
 
 void mlx5e_rep_tc_netdevice_event_unregister(struct mlx5e_rep_priv *rpriv)
 {
-       struct mlx5_rep_uplink_priv *uplink_priv = &rpriv->uplink_priv;
-
-       /* clean indirect TC block notifications */
-       unregister_netdevice_notifier_dev_net(rpriv->netdev,
-                                             &uplink_priv->netdevice_nb,
-                                             &uplink_priv->netdevice_nn);
+       flow_indr_dev_unregister(mlx5e_rep_indr_setup_cb, rpriv,
+                                mlx5e_rep_indr_setup_tc_cb);
 }
 
 #if IS_ENABLED(CONFIG_NET_TC_SKB_EXT)
index 86f92abf2fdd7f5ad8a1b95d78e726d5887d25de..fdf9702c2d7dc034e13ed9a29a74f1dfbe757bde 100644 (file)
@@ -33,7 +33,6 @@ void mlx5e_rep_encap_entry_detach(struct mlx5e_priv *priv,
 
 int mlx5e_rep_setup_tc(struct net_device *dev, enum tc_setup_type type,
                       void *type_data);
-void mlx5e_rep_indr_clean_block_privs(struct mlx5e_rep_priv *rpriv);
 
 bool mlx5e_rep_tc_update_skb(struct mlx5_cqe64 *cqe,
                             struct sk_buff *skb,
@@ -65,9 +64,6 @@ static inline int
 mlx5e_rep_setup_tc(struct net_device *dev, enum tc_setup_type type,
                   void *type_data) { return -EOPNOTSUPP; }
 
-static inline void
-mlx5e_rep_indr_clean_block_privs(struct mlx5e_rep_priv *rpriv) {}
-
 struct mlx5e_tc_update_priv;
 static inline bool
 mlx5e_rep_tc_update_skb(struct mlx5_cqe64 *cqe,
index af89a4803c7d251d58f033e45b469383c474a7d7..006807e04eda330f8e73a87d607db0b5604aed87 100644 (file)
@@ -1018,7 +1018,6 @@ destroy_tises:
 static void mlx5e_cleanup_uplink_rep_tx(struct mlx5e_rep_priv *rpriv)
 {
        mlx5e_rep_tc_netdevice_event_unregister(rpriv);
-       mlx5e_rep_indr_clean_block_privs(rpriv);
        mlx5e_rep_bond_cleanup(rpriv);
        mlx5e_rep_tc_cleanup(rpriv);
 }
index da9f1686d5254f6ad3d9741ad08bfc8038a10726..1d5669801484341bc839eb85bdd585891084c3d4 100644 (file)
@@ -69,13 +69,8 @@ struct mlx5_rep_uplink_priv {
         * tc_indr_block_cb_priv_list is used to lookup indirect callback
         * private data
         *
-        * netdevice_nb is the netdev events notifier - used to register
-        * tunnel devices for block events
-        *
         */
        struct list_head            tc_indr_block_priv_list;
-       struct notifier_block       netdevice_nb;
-       struct netdev_net_notifier  netdevice_nn;
 
        struct mlx5_tun_entropy tun_entropy;