Skip to content

Commit 6e1a288

Browse files
committed
Merge branch 'nfp-TC-block-fixes-app-fallback-and-dev_alloc'
Jakub Kicinski says: ==================== nfp: TC block fixes, app fallback and dev_alloc() This series has three parts. First of all John and I fix some fallout from the TC block conversion. John also fixes sleeping in the neigh notifier. Secondly I reorganise the nfp_app table to make it easier to deal with excluding apps which have unmet Kconfig dependencies. Last but not least after the fixes which went into -net some time ago I refactor the page allocation, add a ethtool counter for failed allocations and clean the ethtool stat code while at it. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents cdc89c9 + 18f7619 commit 6e1a288

File tree

12 files changed

+77
-72
lines changed

12 files changed

+77
-72
lines changed

drivers/net/ethernet/netronome/nfp/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ nfp-objs := \
2727
nfp_net_sriov.o \
2828
nfp_netvf_main.o \
2929
nfp_port.o \
30-
bpf/main.o \
31-
bpf/offload.o \
3230
nic/main.o
3331

3432
ifeq ($(CONFIG_NFP_APP_FLOWER),y)
@@ -44,6 +42,8 @@ endif
4442

4543
ifeq ($(CONFIG_BPF_SYSCALL),y)
4644
nfp-objs += \
45+
bpf/main.o \
46+
bpf/offload.o \
4747
bpf/verifier.o \
4848
bpf/jit.o
4949
endif

drivers/net/ethernet/netronome/nfp/bpf/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ static int nfp_bpf_setup_tc_block_cb(enum tc_setup_type type,
130130
cls_bpf->common.protocol != htons(ETH_P_ALL) ||
131131
cls_bpf->common.chain_index)
132132
return -EOPNOTSUPP;
133+
if (nn->dp.bpf_offload_xdp)
134+
return -EBUSY;
135+
133136
return nfp_net_bpf_offload(nn, cls_bpf);
134137
default:
135138
return -EOPNOTSUPP;

drivers/net/ethernet/netronome/nfp/bpf/offload.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,6 @@ nfp_net_bpf_offload_prepare(struct nfp_net *nn,
150150
unsigned int max_mtu;
151151
int ret;
152152

153-
if (!IS_ENABLED(CONFIG_BPF_SYSCALL))
154-
return -EOPNOTSUPP;
155-
156153
ret = nfp_net_bpf_get_act(nn, cls_bpf);
157154
if (ret < 0)
158155
return ret;

drivers/net/ethernet/netronome/nfp/flower/cmsg.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ nfp_flower_cmsg_get_hdr(struct sk_buff *skb)
5050

5151
struct sk_buff *
5252
nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
53-
enum nfp_flower_cmsg_type_port type)
53+
enum nfp_flower_cmsg_type_port type, gfp_t flag)
5454
{
5555
struct nfp_flower_cmsg_hdr *ch;
5656
struct sk_buff *skb;
5757

5858
size += NFP_FLOWER_CMSG_HLEN;
5959

60-
skb = nfp_app_ctrl_msg_alloc(app, size, GFP_KERNEL);
60+
skb = nfp_app_ctrl_msg_alloc(app, size, flag);
6161
if (!skb)
6262
return NULL;
6363

@@ -78,7 +78,8 @@ nfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports)
7878
unsigned int size;
7979

8080
size = sizeof(*msg) + num_ports * sizeof(msg->ports[0]);
81-
skb = nfp_flower_cmsg_alloc(app, size, NFP_FLOWER_CMSG_TYPE_MAC_REPR);
81+
skb = nfp_flower_cmsg_alloc(app, size, NFP_FLOWER_CMSG_TYPE_MAC_REPR,
82+
GFP_KERNEL);
8283
if (!skb)
8384
return NULL;
8485

@@ -109,7 +110,7 @@ int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok)
109110
struct sk_buff *skb;
110111

111112
skb = nfp_flower_cmsg_alloc(repr->app, sizeof(*msg),
112-
NFP_FLOWER_CMSG_TYPE_PORT_MOD);
113+
NFP_FLOWER_CMSG_TYPE_PORT_MOD, GFP_KERNEL);
113114
if (!skb)
114115
return -ENOMEM;
115116

drivers/net/ethernet/netronome/nfp/flower/cmsg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,6 @@ void nfp_flower_cmsg_process_rx(struct work_struct *work);
458458
void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
459459
struct sk_buff *
460460
nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
461-
enum nfp_flower_cmsg_type_port type);
461+
enum nfp_flower_cmsg_type_port type, gfp_t flag);
462462

463463
#endif

drivers/net/ethernet/netronome/nfp/flower/main.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ struct nfp_flower_priv {
115115
struct mutex nfp_mac_off_lock;
116116
struct mutex nfp_mac_index_lock;
117117
struct mutex nfp_ipv4_off_lock;
118-
struct mutex nfp_neigh_off_lock;
118+
spinlock_t nfp_neigh_off_lock;
119119
struct ida nfp_mac_off_ids;
120120
int nfp_mac_off_count;
121121
struct notifier_block nfp_tun_mac_nb;

drivers/net/ethernet/netronome/nfp/flower/offload.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ nfp_flower_xmit_flow(struct net_device *netdev,
9595
nfp_flow->meta.mask_len >>= NFP_FL_LW_SIZ;
9696
nfp_flow->meta.act_len >>= NFP_FL_LW_SIZ;
9797

98-
skb = nfp_flower_cmsg_alloc(priv->app, tot_len, mtype);
98+
skb = nfp_flower_cmsg_alloc(priv->app, tot_len, mtype, GFP_KERNEL);
9999
if (!skb)
100100
return -ENOMEM;
101101

@@ -468,14 +468,14 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
468468
static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
469469
void *type_data, void *cb_priv)
470470
{
471-
struct nfp_net *nn = cb_priv;
471+
struct nfp_repr *repr = cb_priv;
472472

473-
if (!tc_can_offload(nn->dp.netdev))
473+
if (!tc_can_offload(repr->netdev))
474474
return -EOPNOTSUPP;
475475

476476
switch (type) {
477477
case TC_SETUP_CLSFLOWER:
478-
return nfp_flower_repr_offload(nn->app, nn->port->netdev,
478+
return nfp_flower_repr_offload(repr->app, repr->netdev,
479479
type_data);
480480
default:
481481
return -EOPNOTSUPP;
@@ -485,7 +485,7 @@ static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
485485
static int nfp_flower_setup_tc_block(struct net_device *netdev,
486486
struct tc_block_offload *f)
487487
{
488-
struct nfp_net *nn = netdev_priv(netdev);
488+
struct nfp_repr *repr = netdev_priv(netdev);
489489

490490
if (f->binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
491491
return -EOPNOTSUPP;
@@ -494,11 +494,11 @@ static int nfp_flower_setup_tc_block(struct net_device *netdev,
494494
case TC_BLOCK_BIND:
495495
return tcf_block_cb_register(f->block,
496496
nfp_flower_setup_tc_block_cb,
497-
nn, nn);
497+
repr, repr);
498498
case TC_BLOCK_UNBIND:
499499
tcf_block_cb_unregister(f->block,
500500
nfp_flower_setup_tc_block_cb,
501-
nn);
501+
repr);
502502
return 0;
503503
default:
504504
return -EOPNOTSUPP;

drivers/net/ethernet/netronome/nfp/flower/tunnel_conf.c

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,13 @@ static bool nfp_tun_is_netdev_to_offload(struct net_device *netdev)
224224
}
225225

226226
static int
227-
nfp_flower_xmit_tun_conf(struct nfp_app *app, u8 mtype, u16 plen, void *pdata)
227+
nfp_flower_xmit_tun_conf(struct nfp_app *app, u8 mtype, u16 plen, void *pdata,
228+
gfp_t flag)
228229
{
229230
struct sk_buff *skb;
230231
unsigned char *msg;
231232

232-
skb = nfp_flower_cmsg_alloc(app, plen, mtype);
233+
skb = nfp_flower_cmsg_alloc(app, plen, mtype, flag);
233234
if (!skb)
234235
return -ENOMEM;
235236

@@ -246,15 +247,15 @@ static bool nfp_tun_has_route(struct nfp_app *app, __be32 ipv4_addr)
246247
struct nfp_ipv4_route_entry *entry;
247248
struct list_head *ptr, *storage;
248249

249-
mutex_lock(&priv->nfp_neigh_off_lock);
250+
spin_lock_bh(&priv->nfp_neigh_off_lock);
250251
list_for_each_safe(ptr, storage, &priv->nfp_neigh_off_list) {
251252
entry = list_entry(ptr, struct nfp_ipv4_route_entry, list);
252253
if (entry->ipv4_addr == ipv4_addr) {
253-
mutex_unlock(&priv->nfp_neigh_off_lock);
254+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
254255
return true;
255256
}
256257
}
257-
mutex_unlock(&priv->nfp_neigh_off_lock);
258+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
258259
return false;
259260
}
260261

@@ -264,24 +265,24 @@ static void nfp_tun_add_route_to_cache(struct nfp_app *app, __be32 ipv4_addr)
264265
struct nfp_ipv4_route_entry *entry;
265266
struct list_head *ptr, *storage;
266267

267-
mutex_lock(&priv->nfp_neigh_off_lock);
268+
spin_lock_bh(&priv->nfp_neigh_off_lock);
268269
list_for_each_safe(ptr, storage, &priv->nfp_neigh_off_list) {
269270
entry = list_entry(ptr, struct nfp_ipv4_route_entry, list);
270271
if (entry->ipv4_addr == ipv4_addr) {
271-
mutex_unlock(&priv->nfp_neigh_off_lock);
272+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
272273
return;
273274
}
274275
}
275-
entry = kmalloc(sizeof(*entry), GFP_KERNEL);
276+
entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
276277
if (!entry) {
277-
mutex_unlock(&priv->nfp_neigh_off_lock);
278+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
278279
nfp_flower_cmsg_warn(app, "Mem error when storing new route.\n");
279280
return;
280281
}
281282

282283
entry->ipv4_addr = ipv4_addr;
283284
list_add_tail(&entry->list, &priv->nfp_neigh_off_list);
284-
mutex_unlock(&priv->nfp_neigh_off_lock);
285+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
285286
}
286287

287288
static void nfp_tun_del_route_from_cache(struct nfp_app *app, __be32 ipv4_addr)
@@ -290,7 +291,7 @@ static void nfp_tun_del_route_from_cache(struct nfp_app *app, __be32 ipv4_addr)
290291
struct nfp_ipv4_route_entry *entry;
291292
struct list_head *ptr, *storage;
292293

293-
mutex_lock(&priv->nfp_neigh_off_lock);
294+
spin_lock_bh(&priv->nfp_neigh_off_lock);
294295
list_for_each_safe(ptr, storage, &priv->nfp_neigh_off_list) {
295296
entry = list_entry(ptr, struct nfp_ipv4_route_entry, list);
296297
if (entry->ipv4_addr == ipv4_addr) {
@@ -299,12 +300,12 @@ static void nfp_tun_del_route_from_cache(struct nfp_app *app, __be32 ipv4_addr)
299300
break;
300301
}
301302
}
302-
mutex_unlock(&priv->nfp_neigh_off_lock);
303+
spin_unlock_bh(&priv->nfp_neigh_off_lock);
303304
}
304305

305306
static void
306307
nfp_tun_write_neigh(struct net_device *netdev, struct nfp_app *app,
307-
struct flowi4 *flow, struct neighbour *neigh)
308+
struct flowi4 *flow, struct neighbour *neigh, gfp_t flag)
308309
{
309310
struct nfp_tun_neigh payload;
310311

@@ -334,7 +335,7 @@ nfp_tun_write_neigh(struct net_device *netdev, struct nfp_app *app,
334335
send_msg:
335336
nfp_flower_xmit_tun_conf(app, NFP_FLOWER_CMSG_TYPE_TUN_NEIGH,
336337
sizeof(struct nfp_tun_neigh),
337-
(unsigned char *)&payload);
338+
(unsigned char *)&payload, flag);
338339
}
339340

340341
static int
@@ -385,7 +386,7 @@ nfp_tun_neigh_event_handler(struct notifier_block *nb, unsigned long event,
385386
#endif
386387

387388
flow.flowi4_proto = IPPROTO_UDP;
388-
nfp_tun_write_neigh(n->dev, app, &flow, n);
389+
nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_ATOMIC);
389390

390391
return NOTIFY_OK;
391392
}
@@ -423,7 +424,7 @@ void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb)
423424
ip_rt_put(rt);
424425
if (!n)
425426
goto route_fail_warning;
426-
nfp_tun_write_neigh(n->dev, app, &flow, n);
427+
nfp_tun_write_neigh(n->dev, app, &flow, n, GFP_KERNEL);
427428
neigh_release(n);
428429
return;
429430

@@ -456,7 +457,7 @@ static void nfp_tun_write_ipv4_list(struct nfp_app *app)
456457

457458
nfp_flower_xmit_tun_conf(app, NFP_FLOWER_CMSG_TYPE_TUN_IPS,
458459
sizeof(struct nfp_tun_ipv4_addr),
459-
&payload);
460+
&payload, GFP_KERNEL);
460461
}
461462

462463
void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4)
@@ -548,7 +549,7 @@ void nfp_tunnel_write_macs(struct nfp_app *app)
548549
}
549550

550551
err = nfp_flower_xmit_tun_conf(app, NFP_FLOWER_CMSG_TYPE_TUN_MAC,
551-
pay_size, payload);
552+
pay_size, payload, GFP_KERNEL);
552553

553554
kfree(payload);
554555

@@ -729,7 +730,7 @@ int nfp_tunnel_config_start(struct nfp_app *app)
729730
INIT_LIST_HEAD(&priv->nfp_ipv4_off_list);
730731

731732
/* Initialise priv data for neighbour offloading. */
732-
mutex_init(&priv->nfp_neigh_off_lock);
733+
spin_lock_init(&priv->nfp_neigh_off_lock);
733734
INIT_LIST_HEAD(&priv->nfp_neigh_off_list);
734735
priv->nfp_tun_neigh_nb.notifier_call = nfp_tun_neigh_event_handler;
735736

@@ -769,43 +770,35 @@ void nfp_tunnel_config_stop(struct nfp_app *app)
769770
unregister_netevent_notifier(&priv->nfp_tun_neigh_nb);
770771

771772
/* Free any memory that may be occupied by MAC list. */
772-
mutex_lock(&priv->nfp_mac_off_lock);
773773
list_for_each_safe(ptr, storage, &priv->nfp_mac_off_list) {
774774
mac_entry = list_entry(ptr, struct nfp_tun_mac_offload_entry,
775775
list);
776776
list_del(&mac_entry->list);
777777
kfree(mac_entry);
778778
}
779-
mutex_unlock(&priv->nfp_mac_off_lock);
780779

781780
/* Free any memory that may be occupied by MAC index list. */
782-
mutex_lock(&priv->nfp_mac_index_lock);
783781
list_for_each_safe(ptr, storage, &priv->nfp_mac_index_list) {
784782
mac_idx = list_entry(ptr, struct nfp_tun_mac_non_nfp_idx,
785783
list);
786784
list_del(&mac_idx->list);
787785
kfree(mac_idx);
788786
}
789-
mutex_unlock(&priv->nfp_mac_index_lock);
790787

791788
ida_destroy(&priv->nfp_mac_off_ids);
792789

793790
/* Free any memory that may be occupied by ipv4 list. */
794-
mutex_lock(&priv->nfp_ipv4_off_lock);
795791
list_for_each_safe(ptr, storage, &priv->nfp_ipv4_off_list) {
796792
ip_entry = list_entry(ptr, struct nfp_ipv4_addr_entry, list);
797793
list_del(&ip_entry->list);
798794
kfree(ip_entry);
799795
}
800-
mutex_unlock(&priv->nfp_ipv4_off_lock);
801796

802797
/* Free any memory that may be occupied by the route list. */
803-
mutex_lock(&priv->nfp_neigh_off_lock);
804798
list_for_each_safe(ptr, storage, &priv->nfp_neigh_off_list) {
805799
route_entry = list_entry(ptr, struct nfp_ipv4_route_entry,
806800
list);
807801
list_del(&route_entry->list);
808802
kfree(route_entry);
809803
}
810-
mutex_unlock(&priv->nfp_neigh_off_lock);
811804
}

drivers/net/ethernet/netronome/nfp/nfp_app.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,14 @@
4343
#include "nfp_net_repr.h"
4444

4545
static const struct nfp_app_type *apps[] = {
46-
&app_nic,
47-
&app_bpf,
46+
[NFP_APP_CORE_NIC] = &app_nic,
47+
#ifdef CONFIG_BPF_SYSCALL
48+
[NFP_APP_BPF_NIC] = &app_bpf,
49+
#else
50+
[NFP_APP_BPF_NIC] = &app_nic,
51+
#endif
4852
#ifdef CONFIG_NFP_APP_FLOWER
49-
&app_flower,
53+
[NFP_APP_FLOWER_NIC] = &app_flower,
5054
#endif
5155
};
5256

@@ -116,17 +120,13 @@ nfp_app_reprs_set(struct nfp_app *app, enum nfp_repr_type type,
116120
struct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id)
117121
{
118122
struct nfp_app *app;
119-
unsigned int i;
120123

121-
for (i = 0; i < ARRAY_SIZE(apps); i++)
122-
if (apps[i]->id == id)
123-
break;
124-
if (i == ARRAY_SIZE(apps)) {
124+
if (id >= ARRAY_SIZE(apps) || !apps[id]) {
125125
nfp_err(pf->cpp, "failed to find app with ID 0x%02hhx\n", id);
126126
return ERR_PTR(-EINVAL);
127127
}
128128

129-
if (WARN_ON(!apps[i]->name || !apps[i]->vnic_alloc))
129+
if (WARN_ON(!apps[id]->name || !apps[id]->vnic_alloc))
130130
return ERR_PTR(-EINVAL);
131131

132132
app = kzalloc(sizeof(*app), GFP_KERNEL);
@@ -136,7 +136,7 @@ struct nfp_app *nfp_app_alloc(struct nfp_pf *pf, enum nfp_app_id id)
136136
app->pf = pf;
137137
app->cpp = pf->cpp;
138138
app->pdev = pf->pdev;
139-
app->type = apps[i];
139+
app->type = apps[id];
140140

141141
return app;
142142
}

drivers/net/ethernet/netronome/nfp/nfp_net.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ struct nfp_net_rx_ring {
394394
* @tx_lso: Counter of LSO packets sent
395395
* @tx_errors: How many TX errors were encountered
396396
* @tx_busy: How often was TX busy (no space)?
397+
* @rx_replace_buf_alloc_fail: Counter of RX buffer allocation failures
397398
* @irq_vector: Interrupt vector number (use for talking to the OS)
398399
* @handler: Interrupt handler for this ring vector
399400
* @name: Name of the interrupt vector
@@ -437,6 +438,8 @@ struct nfp_net_r_vector {
437438
u64 hw_csum_tx_inner;
438439
u64 tx_gather;
439440
u64 tx_lso;
441+
442+
u64 rx_replace_buf_alloc_fail;
440443
u64 tx_errors;
441444
u64 tx_busy;
442445

0 commit comments

Comments
 (0)