Skip to content

Commit c66a9cf

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: move basic eBPF stats to app-specific code
Allow apps to associate private data with vNICs and move BPF-specific fields of nfp_net to such structure. Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bb45e51 commit c66a9cf

File tree

5 files changed

+67
-34
lines changed

5 files changed

+67
-34
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ static const char *nfp_bpf_extra_cap(struct nfp_app *app, struct nfp_net *nn)
8686
static int
8787
nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
8888
{
89+
struct nfp_net_bpf_priv *priv;
90+
int ret;
91+
8992
/* Limit to single port, otherwise it's just a NIC */
9093
if (id > 0) {
9194
nfp_warn(app->cpp,
@@ -94,13 +97,27 @@ nfp_bpf_vnic_init(struct nfp_app *app, struct nfp_net *nn, unsigned int id)
9497
return PTR_ERR_OR_ZERO(nn->port);
9598
}
9699

97-
return nfp_app_nic_vnic_init(app, nn, id);
100+
priv = kmalloc(sizeof(*priv), GFP_KERNEL);
101+
if (!priv)
102+
return -ENOMEM;
103+
104+
nn->app_priv = priv;
105+
spin_lock_init(&priv->rx_filter_lock);
106+
setup_timer(&priv->rx_filter_stats_timer,
107+
nfp_net_filter_stats_timer, (unsigned long)nn);
108+
109+
ret = nfp_app_nic_vnic_init(app, nn, id);
110+
if (ret)
111+
kfree(priv);
112+
113+
return ret;
98114
}
99115

100116
static void nfp_bpf_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
101117
{
102118
if (nn->dp.bpf_offload_xdp)
103119
nfp_bpf_xdp_offload(app, nn, NULL);
120+
kfree(nn->app_priv);
104121
}
105122

106123
static int nfp_bpf_setup_tc(struct nfp_app *app, struct net_device *netdev,

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
#include <linux/list.h>
4040
#include <linux/types.h>
4141

42+
#include "../nfp_net.h"
43+
4244
/* For branch fixup logic use up-most byte of branch instruction as scratch
4345
* area. Remember to clear this before sending instructions to HW!
4446
*/
@@ -201,6 +203,22 @@ int nfp_prog_verify(struct nfp_prog *nfp_prog, struct bpf_prog *prog);
201203
struct nfp_net;
202204
struct tc_cls_bpf_offload;
203205

206+
/**
207+
* struct nfp_net_bpf_priv - per-vNIC BPF private data
208+
* @rx_filter: Filter offload statistics - dropped packets/bytes
209+
* @rx_filter_prev: Filter offload statistics - values from previous update
210+
* @rx_filter_change: Jiffies when statistics last changed
211+
* @rx_filter_stats_timer: Timer for polling filter offload statistics
212+
* @rx_filter_lock: Lock protecting timer state changes (teardown)
213+
*/
214+
struct nfp_net_bpf_priv {
215+
struct nfp_stat_pair rx_filter, rx_filter_prev;
216+
unsigned long rx_filter_change;
217+
struct timer_list rx_filter_stats_timer;
218+
spinlock_t rx_filter_lock;
219+
};
220+
204221
int nfp_net_bpf_offload(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf);
222+
void nfp_net_filter_stats_timer(unsigned long data);
205223

206224
#endif

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

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,46 +54,52 @@
5454
void nfp_net_filter_stats_timer(unsigned long data)
5555
{
5656
struct nfp_net *nn = (void *)data;
57+
struct nfp_net_bpf_priv *priv;
5758
struct nfp_stat_pair latest;
5859

59-
spin_lock_bh(&nn->rx_filter_lock);
60+
priv = nn->app_priv;
61+
62+
spin_lock_bh(&priv->rx_filter_lock);
6063

6164
if (nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF)
62-
mod_timer(&nn->rx_filter_stats_timer,
65+
mod_timer(&priv->rx_filter_stats_timer,
6366
jiffies + NFP_NET_STAT_POLL_IVL);
6467

65-
spin_unlock_bh(&nn->rx_filter_lock);
68+
spin_unlock_bh(&priv->rx_filter_lock);
6669

6770
latest.pkts = nn_readq(nn, NFP_NET_CFG_STATS_APP1_FRAMES);
6871
latest.bytes = nn_readq(nn, NFP_NET_CFG_STATS_APP1_BYTES);
6972

70-
if (latest.pkts != nn->rx_filter.pkts)
71-
nn->rx_filter_change = jiffies;
73+
if (latest.pkts != priv->rx_filter.pkts)
74+
priv->rx_filter_change = jiffies;
7275

73-
nn->rx_filter = latest;
76+
priv->rx_filter = latest;
7477
}
7578

7679
static void nfp_net_bpf_stats_reset(struct nfp_net *nn)
7780
{
78-
nn->rx_filter.pkts = nn_readq(nn, NFP_NET_CFG_STATS_APP1_FRAMES);
79-
nn->rx_filter.bytes = nn_readq(nn, NFP_NET_CFG_STATS_APP1_BYTES);
80-
nn->rx_filter_prev = nn->rx_filter;
81-
nn->rx_filter_change = jiffies;
81+
struct nfp_net_bpf_priv *priv = nn->app_priv;
82+
83+
priv->rx_filter.pkts = nn_readq(nn, NFP_NET_CFG_STATS_APP1_FRAMES);
84+
priv->rx_filter.bytes = nn_readq(nn, NFP_NET_CFG_STATS_APP1_BYTES);
85+
priv->rx_filter_prev = priv->rx_filter;
86+
priv->rx_filter_change = jiffies;
8287
}
8388

8489
static int
8590
nfp_net_bpf_stats_update(struct nfp_net *nn, struct tc_cls_bpf_offload *cls_bpf)
8691
{
92+
struct nfp_net_bpf_priv *priv = nn->app_priv;
8793
u64 bytes, pkts;
8894

89-
pkts = nn->rx_filter.pkts - nn->rx_filter_prev.pkts;
90-
bytes = nn->rx_filter.bytes - nn->rx_filter_prev.bytes;
95+
pkts = priv->rx_filter.pkts - priv->rx_filter_prev.pkts;
96+
bytes = priv->rx_filter.bytes - priv->rx_filter_prev.bytes;
9197
bytes -= pkts * ETH_HLEN;
9298

93-
nn->rx_filter_prev = nn->rx_filter;
99+
priv->rx_filter_prev = priv->rx_filter;
94100

95101
tcf_exts_stats_update(cls_bpf->exts,
96-
bytes, pkts, nn->rx_filter_change);
102+
bytes, pkts, priv->rx_filter_change);
97103

98104
return 0;
99105
}
@@ -183,6 +189,7 @@ nfp_net_bpf_load_and_start(struct nfp_net *nn, u32 tc_flags,
183189
unsigned int code_sz, unsigned int n_instr,
184190
bool dense_mode)
185191
{
192+
struct nfp_net_bpf_priv *priv = nn->app_priv;
186193
u64 bpf_addr = dma_addr;
187194
int err;
188195

@@ -209,20 +216,23 @@ nfp_net_bpf_load_and_start(struct nfp_net *nn, u32 tc_flags,
209216
dma_free_coherent(nn->dp.dev, code_sz, code, dma_addr);
210217

211218
nfp_net_bpf_stats_reset(nn);
212-
mod_timer(&nn->rx_filter_stats_timer, jiffies + NFP_NET_STAT_POLL_IVL);
219+
mod_timer(&priv->rx_filter_stats_timer,
220+
jiffies + NFP_NET_STAT_POLL_IVL);
213221
}
214222

215223
static int nfp_net_bpf_stop(struct nfp_net *nn)
216224
{
225+
struct nfp_net_bpf_priv *priv = nn->app_priv;
226+
217227
if (!(nn->dp.ctrl & NFP_NET_CFG_CTRL_BPF))
218228
return 0;
219229

220-
spin_lock_bh(&nn->rx_filter_lock);
230+
spin_lock_bh(&priv->rx_filter_lock);
221231
nn->dp.ctrl &= ~NFP_NET_CFG_CTRL_BPF;
222-
spin_unlock_bh(&nn->rx_filter_lock);
232+
spin_unlock_bh(&priv->rx_filter_lock);
223233
nn_writel(nn, NFP_NET_CFG_CTRL, nn->dp.ctrl);
224234

225-
del_timer_sync(&nn->rx_filter_stats_timer);
235+
del_timer_sync(&priv->rx_filter_stats_timer);
226236
nn->dp.bpf_offload_skip_sw = 0;
227237

228238
return nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_GEN);

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -517,11 +517,6 @@ struct nfp_net_dp {
517517
* @rss_cfg: RSS configuration
518518
* @rss_key: RSS secret key
519519
* @rss_itbl: RSS indirection table
520-
* @rx_filter: Filter offload statistics - dropped packets/bytes
521-
* @rx_filter_prev: Filter offload statistics - values from previous update
522-
* @rx_filter_change: Jiffies when statistics last changed
523-
* @rx_filter_stats_timer: Timer for polling filter offload statistics
524-
* @rx_filter_lock: Lock protecting timer state changes (teardown)
525520
* @max_r_vecs: Number of allocated interrupt vectors for RX/TX
526521
* @max_tx_rings: Maximum number of TX rings supported by the Firmware
527522
* @max_rx_rings: Maximum number of RX rings supported by the Firmware
@@ -556,6 +551,7 @@ struct nfp_net_dp {
556551
* @pdev: Backpointer to PCI device
557552
* @app: APP handle if available
558553
* @port: Pointer to nfp_port structure if vNIC is a port
554+
* @app_priv: APP private data for this vNIC
559555
*/
560556
struct nfp_net {
561557
struct nfp_net_dp dp;
@@ -570,11 +566,6 @@ struct nfp_net {
570566
u8 rss_key[NFP_NET_CFG_RSS_KEY_SZ];
571567
u8 rss_itbl[NFP_NET_CFG_RSS_ITBL_SZ];
572568

573-
struct nfp_stat_pair rx_filter, rx_filter_prev;
574-
unsigned long rx_filter_change;
575-
struct timer_list rx_filter_stats_timer;
576-
spinlock_t rx_filter_lock;
577-
578569
unsigned int max_tx_rings;
579570
unsigned int max_rx_rings;
580571

@@ -627,6 +618,8 @@ struct nfp_net {
627618
struct nfp_app *app;
628619

629620
struct nfp_port *port;
621+
622+
void *app_priv;
630623
};
631624

632625
/* Functions to read/write from/to a BAR
@@ -867,6 +860,4 @@ static inline void nfp_net_debugfs_dir_clean(struct dentry **dir)
867860
}
868861
#endif /* CONFIG_NFP_DEBUG */
869862

870-
void nfp_net_filter_stats_timer(unsigned long data);
871-
872863
#endif /* _NFP_NET_H_ */

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3072,13 +3072,10 @@ struct nfp_net *nfp_net_alloc(struct pci_dev *pdev,
30723072
nn->dp.rxd_cnt = NFP_NET_RX_DESCS_DEFAULT;
30733073

30743074
spin_lock_init(&nn->reconfig_lock);
3075-
spin_lock_init(&nn->rx_filter_lock);
30763075
spin_lock_init(&nn->link_status_lock);
30773076

30783077
setup_timer(&nn->reconfig_timer,
30793078
nfp_net_reconfig_timer, (unsigned long)nn);
3080-
setup_timer(&nn->rx_filter_stats_timer,
3081-
nfp_net_filter_stats_timer, (unsigned long)nn);
30823079

30833080
return nn;
30843081
}

0 commit comments

Comments
 (0)