Skip to content

Commit

Permalink
Merge branch 'nfp-process-MTU-updates-from-firmware-flower-app'
Browse files Browse the repository at this point in the history
Simon Horman says:

====================
nfp: process MTU updates from firmware flower app

The first patch of this series moves processing of control messages from a
BH handler to a workqueue. That change makes it safe to process MTU
updates from the firmware which is added by the second patch of this
series.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Aug 16, 2017
2 parents cf9d014 + 2dff196 commit 7440ccc
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 5 deletions.
35 changes: 32 additions & 3 deletions drivers/net/ethernet/netronome/nfp/flower/cmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@
#include <linux/bitfield.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/workqueue.h>
#include <net/dst_metadata.h>

#include "main.h"
#include "../nfpcore/nfp_cpp.h"
#include "../nfp_net.h"
#include "../nfp_net_repr.h"
#include "./cmsg.h"

Expand Down Expand Up @@ -148,14 +150,22 @@ nfp_flower_cmsg_portmod_rx(struct nfp_app *app, struct sk_buff *skb)
return;
}

if (link)
if (link) {
u16 mtu = be16_to_cpu(msg->mtu);

netif_carrier_on(netdev);
else

/* An MTU of 0 from the firmware should be ignored */
if (mtu)
dev_set_mtu(netdev, mtu);
} else {
netif_carrier_off(netdev);
}
rcu_read_unlock();
}

void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
static void
nfp_flower_cmsg_process_one_rx(struct nfp_app *app, struct sk_buff *skb)
{
struct nfp_flower_cmsg_hdr *cmsg_hdr;
enum nfp_flower_cmsg_type_port type;
Expand Down Expand Up @@ -184,3 +194,22 @@ void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
out:
dev_kfree_skb_any(skb);
}

void nfp_flower_cmsg_process_rx(struct work_struct *work)
{
struct nfp_flower_priv *priv;
struct sk_buff *skb;

priv = container_of(work, struct nfp_flower_priv, cmsg_work);

while ((skb = skb_dequeue(&priv->cmsg_skbs)))
nfp_flower_cmsg_process_one_rx(priv->nn->app, skb);
}

void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb)
{
struct nfp_flower_priv *priv = app->priv;

skb_queue_tail(&priv->cmsg_skbs, skb);
schedule_work(&priv->cmsg_work);
}
1 change: 1 addition & 0 deletions drivers/net/ethernet/netronome/nfp/flower/cmsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ nfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx,
unsigned int nbi, unsigned int nbi_port,
unsigned int phys_port);
int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok);
void nfp_flower_cmsg_process_rx(struct work_struct *work);
void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
struct sk_buff *
nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
Expand Down
14 changes: 12 additions & 2 deletions drivers/net/ethernet/netronome/nfp/flower/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,7 @@ static int nfp_flower_vnic_init(struct nfp_app *app, struct nfp_net *nn,
static int nfp_flower_init(struct nfp_app *app)
{
const struct nfp_pf *pf = app->pf;
struct nfp_flower_priv *app_priv;
u64 version;
int err;

Expand Down Expand Up @@ -362,10 +363,14 @@ static int nfp_flower_init(struct nfp_app *app)
return -EINVAL;
}

app->priv = vzalloc(sizeof(struct nfp_flower_priv));
if (!app->priv)
app_priv = vzalloc(sizeof(struct nfp_flower_priv));
if (!app_priv)
return -ENOMEM;

app->priv = app_priv;
skb_queue_head_init(&app_priv->cmsg_skbs);
INIT_WORK(&app_priv->cmsg_work, nfp_flower_cmsg_process_rx);

err = nfp_flower_metadata_init(app);
if (err)
goto err_free_app_priv;
Expand All @@ -379,6 +384,11 @@ static int nfp_flower_init(struct nfp_app *app)

static void nfp_flower_clean(struct nfp_app *app)
{
struct nfp_flower_priv *app_priv = app->priv;

skb_queue_purge(&app_priv->cmsg_skbs);
flush_work(&app_priv->cmsg_work);

nfp_flower_metadata_cleanup(app);
vfree(app->priv);
app->priv = NULL;
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/ethernet/netronome/nfp/flower/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include <linux/time64.h>
#include <linux/types.h>
#include <net/pkt_cls.h>
#include <linux/workqueue.h>

struct net_device;
struct nfp_app;
Expand Down Expand Up @@ -78,6 +79,8 @@ struct nfp_fl_stats_id {
* @mask_ids: List of free mask ids
* @mask_table: Hash table used to store masks
* @flow_table: Hash table used to store flower rules
* @cmsg_work: Workqueue for control messages processing
* @cmsg_skbs: List of skbs for control message processing
*/
struct nfp_flower_priv {
struct nfp_net *nn;
Expand All @@ -87,6 +90,8 @@ struct nfp_flower_priv {
struct nfp_fl_mask_id mask_ids;
DECLARE_HASHTABLE(mask_table, NFP_FLOWER_MASK_HASH_BITS);
DECLARE_HASHTABLE(flow_table, NFP_FLOWER_HASH_BITS);
struct work_struct cmsg_work;
struct sk_buff_head cmsg_skbs;
};

struct nfp_fl_key_ls {
Expand Down

0 comments on commit 7440ccc

Please sign in to comment.