nfp: add .ndo_init() and .ndo_uninit() callbacks
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 17 Jul 2018 17:53:22 +0000 (10:53 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 18 Jul 2018 13:10:34 +0000 (15:10 +0200)
BPF code should unregister the offload capabilities from .ndo_uninit(),
to make sure the operation is atomic with unlist_netdevice().  Plumb
the init/uninit NDOs for vNICs and representors.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
drivers/net/ethernet/netronome/nfp/nfp_app.c
drivers/net/ethernet/netronome/nfp/nfp_app.h
drivers/net/ethernet/netronome/nfp/nfp_net_common.c
drivers/net/ethernet/netronome/nfp/nfp_net_repr.c

index f28b244f4ee7ebcd7235b163c7c5f42a7ab120d9..69d4ae7a61f3a25339a77b00688e9c130d2d17d0 100644 (file)
@@ -86,6 +86,23 @@ const char *nfp_app_mip_name(struct nfp_app *app)
        return nfp_mip_name(app->pf->mip);
 }
 
+int nfp_app_ndo_init(struct net_device *netdev)
+{
+       struct nfp_app *app = nfp_app_from_netdev(netdev);
+
+       if (!app || !app->type->ndo_init)
+               return 0;
+       return app->type->ndo_init(app, netdev);
+}
+
+void nfp_app_ndo_uninit(struct net_device *netdev)
+{
+       struct nfp_app *app = nfp_app_from_netdev(netdev);
+
+       if (app && app->type->ndo_uninit)
+               app->type->ndo_uninit(app, netdev);
+}
+
 u64 *nfp_app_port_get_stats(struct nfp_port *port, u64 *data)
 {
        if (!port || !port->app || !port->app->type->port_get_stats)
index ee74caacb01530d9d3d40532648ff3e3b23ffb11..afbc19aa66a8a52acd8d4282390f4808d55e3316 100644 (file)
@@ -78,6 +78,8 @@ extern const struct nfp_app_type app_abm;
  * @init:      perform basic app checks and init
  * @clean:     clean app state
  * @extra_cap: extra capabilities string
+ * @ndo_init:  vNIC and repr netdev .ndo_init
+ * @ndo_uninit:        vNIC and repr netdev .ndo_unint
  * @vnic_alloc:        allocate vNICs (assign port types, etc.)
  * @vnic_free: free up app's vNIC state
  * @vnic_init: vNIC netdev was registered
@@ -117,6 +119,9 @@ struct nfp_app_type {
 
        const char *(*extra_cap)(struct nfp_app *app, struct nfp_net *nn);
 
+       int (*ndo_init)(struct nfp_app *app, struct net_device *netdev);
+       void (*ndo_uninit)(struct nfp_app *app, struct net_device *netdev);
+
        int (*vnic_alloc)(struct nfp_app *app, struct nfp_net *nn,
                          unsigned int id);
        void (*vnic_free)(struct nfp_app *app, struct nfp_net *nn);
@@ -200,6 +205,9 @@ static inline void nfp_app_clean(struct nfp_app *app)
                app->type->clean(app);
 }
 
+int nfp_app_ndo_init(struct net_device *netdev);
+void nfp_app_ndo_uninit(struct net_device *netdev);
+
 static inline int nfp_app_vnic_alloc(struct nfp_app *app, struct nfp_net *nn,
                                     unsigned int id)
 {
index a712e83c3f0f84ee1301ddf2859b9d86e009a90c..279b8ab8a17b567d9f62a1d0c5c3a9b25a7fd371 100644 (file)
@@ -3480,6 +3480,8 @@ static int nfp_net_set_mac_address(struct net_device *netdev, void *addr)
 }
 
 const struct net_device_ops nfp_net_netdev_ops = {
+       .ndo_init               = nfp_app_ndo_init,
+       .ndo_uninit             = nfp_app_ndo_uninit,
        .ndo_open               = nfp_net_netdev_open,
        .ndo_stop               = nfp_net_netdev_close,
        .ndo_start_xmit         = nfp_net_tx,
index d7b712f6362fae44474e37d791841805734c01d3..18a09cdcd9c6ff0247a625d71f46395f6a55aa6b 100644 (file)
@@ -262,6 +262,8 @@ err_port_disable:
 }
 
 const struct net_device_ops nfp_repr_netdev_ops = {
+       .ndo_init               = nfp_app_ndo_init,
+       .ndo_uninit             = nfp_app_ndo_uninit,
        .ndo_open               = nfp_repr_open,
        .ndo_stop               = nfp_repr_stop,
        .ndo_start_xmit         = nfp_repr_xmit,