Skip to content

Commit

Permalink
nfp: register a notifier handler in a central location for the device
Browse files Browse the repository at this point in the history
Code interested in networking events registers its own notifier
handlers.  Create one device-wide notifier instance.

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>
  • Loading branch information
Jakub Kicinski authored and David S. Miller committed Nov 7, 2018
1 parent 659bb40 commit 3e33359
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 15 deletions.
47 changes: 47 additions & 0 deletions drivers/net/ethernet/netronome/nfp/nfp_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,53 @@ nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type,
return old;
}

static int
nfp_app_netdev_event(struct notifier_block *nb, unsigned long event, void *ptr)
{
struct net_device *netdev;
struct nfp_app *app;

netdev = netdev_notifier_info_to_dev(ptr);
app = container_of(nb, struct nfp_app, netdev_nb);

if (app->type->netdev_event)
return app->type->netdev_event(app, netdev, event, ptr);
return NOTIFY_DONE;
}

int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
{
int err;

app->ctrl = ctrl;

if (app->type->start) {
err = app->type->start(app);
if (err)
return err;
}

app->netdev_nb.notifier_call = nfp_app_netdev_event;
err = register_netdevice_notifier(&app->netdev_nb);
if (err)
goto err_app_stop;

return 0;

err_app_stop:
if (app->type->stop)
app->type->stop(app);
return err;
}

void nfp_app_stop(struct nfp_app *app)
{
unregister_netdevice_notifier(&app->netdev_nb);

if (app->type->stop)
app->type->stop(app);
}

struct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id)
{
struct nfp_app *app;
Expand Down
25 changes: 10 additions & 15 deletions drivers/net/ethernet/netronome/nfp/nfp_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ extern const struct nfp_app_type app_abm;
* @port_get_stats_strings: get strings for extra statistics
* @start: start application logic
* @stop: stop application logic
* @netdev_event: Netdevice notifier event
* @ctrl_msg_rx: control message handler
* @ctrl_msg_rx_raw: handler for control messages from data queues
* @setup_tc: setup TC ndo
Expand Down Expand Up @@ -122,6 +123,9 @@ struct nfp_app_type {
int (*start)(struct nfp_app *app);
void (*stop)(struct nfp_app *app);

int (*netdev_event)(struct nfp_app *app, struct net_device *netdev,
unsigned long event, void *ptr);

void (*ctrl_msg_rx)(struct nfp_app *app, struct sk_buff *skb);
void (*ctrl_msg_rx_raw)(struct nfp_app *app, const void *data,
unsigned int len);
Expand Down Expand Up @@ -151,6 +155,7 @@ struct nfp_app_type {
* @reprs: array of pointers to representors
* @type: pointer to const application ops and info
* @ctrl_mtu: MTU to set on the control vNIC (set in .init())
* @netdev_nb: Netdevice notifier block
* @priv: app-specific priv data
*/
struct nfp_app {
Expand All @@ -163,6 +168,9 @@ struct nfp_app {

const struct nfp_app_type *type;
unsigned int ctrl_mtu;

struct notifier_block netdev_nb;

void *priv;
};

Expand Down Expand Up @@ -264,21 +272,6 @@ nfp_app_repr_change_mtu(struct nfp_app *app, struct net_device *netdev,
return app->type->repr_change_mtu(app, netdev, new_mtu);
}

static inline int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl)
{
app->ctrl = ctrl;
if (!app->type->start)
return 0;
return app->type->start(app);
}

static inline void nfp_app_stop(struct nfp_app *app)
{
if (!app->type->stop)
return;
app->type->stop(app);
}

static inline const char *nfp_app_name(struct nfp_app *app)
{
if (!app)
Expand Down Expand Up @@ -430,6 +423,8 @@ nfp_app_ctrl_msg_alloc(struct nfp_app *app, unsigned int size, gfp_t priority);

struct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id);
void nfp_app_free(struct nfp_app *app);
int nfp_app_start(struct nfp_app *app, struct nfp_net *ctrl);
void nfp_app_stop(struct nfp_app *app);

/* Callbacks shared between apps */

Expand Down

0 comments on commit 3e33359

Please sign in to comment.