Skip to content

Commit cf0c409

Browse files
Dimon-Zhaoshemminger
authored andcommitted
net/nbl: add support for imissed stats
Add an imissed statistic to monitor the number of RX packets dropped by the hardware. Signed-off-by: Dimon Zhao <[email protected]>
1 parent aa3b984 commit cf0c409

File tree

7 files changed

+299
-4
lines changed

7 files changed

+299
-4
lines changed

drivers/net/nbl/nbl_dev/nbl_dev.c

Lines changed: 206 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,80 @@ static int nbl_dev_txrx_start(struct rte_eth_dev *eth_dev)
132132
return ret;
133133
}
134134

135+
static int nbl_dev_update_hw_stats(struct rte_eth_dev *eth_dev)
136+
{
137+
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
138+
struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter);
139+
struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt);
140+
struct nbl_dev_net_mgt *net_dev = NBL_DEV_MGT_TO_NET_DEV(dev_mgt);
141+
u32 *uvn_stat_pkt_drop;
142+
int i = 0;
143+
int ret = 0;
144+
145+
if (!net_dev->hw_stats_inited)
146+
return 0;
147+
uvn_stat_pkt_drop = calloc(eth_dev->data->nb_rx_queues, sizeof(*uvn_stat_pkt_drop));
148+
if (!uvn_stat_pkt_drop) {
149+
ret = -ENOMEM;
150+
goto alloc_uvn_stat_pkt_drop_fail;
151+
}
152+
ret = disp_ops->get_uvn_pkt_drop_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
153+
net_dev->vsi_id,
154+
eth_dev->data->nb_rx_queues, uvn_stat_pkt_drop);
155+
if (ret)
156+
goto get_uvn_pkt_drop_stats_fail;
157+
for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
158+
net_dev->hw_stats.total_uvn_stat_pkt_drop[i] += uvn_stat_pkt_drop[i];
159+
free(uvn_stat_pkt_drop);
160+
uvn_stat_pkt_drop = NULL;
161+
162+
return 0;
163+
164+
get_uvn_pkt_drop_stats_fail:
165+
free(uvn_stat_pkt_drop);
166+
uvn_stat_pkt_drop = NULL;
167+
alloc_uvn_stat_pkt_drop_fail:
168+
return ret;
169+
}
170+
171+
static void nbl_dev_update_hw_stats_handler(void *param)
172+
{
173+
struct rte_eth_dev *eth_dev = param;
174+
175+
nbl_dev_update_hw_stats(eth_dev);
176+
177+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
178+
}
179+
180+
static int nbl_dev_hw_stats_start(struct rte_eth_dev *eth_dev)
181+
{
182+
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
183+
struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter);
184+
struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt);
185+
struct nbl_common_info *common = NBL_ADAPTER_TO_COMMON(adapter);
186+
struct nbl_dev_net_mgt *net_dev = NBL_DEV_MGT_TO_NET_DEV(dev_mgt);
187+
struct nbl_ustore_stats ustore_stats = {0};
188+
int ret;
189+
190+
if (!common->is_vf) {
191+
ret = disp_ops->get_ustore_total_pkt_drop_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
192+
common->eth_id, &ustore_stats);
193+
if (ret) {
194+
net_dev->hw_stats_inited = false;
195+
return 0;
196+
}
197+
net_dev->hw_stats_inited = true;
198+
net_dev->hw_stats.start_ustore_stats->rx_drop_packets =
199+
ustore_stats.rx_drop_packets;
200+
net_dev->hw_stats.start_ustore_stats->rx_trun_packets =
201+
ustore_stats.rx_trun_packets;
202+
}
203+
204+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
205+
206+
return 0;
207+
}
208+
135209
int nbl_dev_port_start(struct rte_eth_dev *eth_dev)
136210
{
137211
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
@@ -152,6 +226,10 @@ int nbl_dev_port_start(struct rte_eth_dev *eth_dev)
152226
return ret;
153227
}
154228

229+
ret = nbl_dev_hw_stats_start(eth_dev);
230+
if (ret)
231+
return ret;
232+
155233
common->pf_start = 1;
156234
return 0;
157235
}
@@ -181,13 +259,21 @@ static void nbl_dev_txrx_stop(struct rte_eth_dev *eth_dev)
181259
disp_ops->remove_all_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), dev_mgt->net_dev->vsi_id);
182260
}
183261

262+
static int nbl_dev_hw_stats_stop(struct rte_eth_dev *eth_dev)
263+
{
264+
rte_eal_alarm_cancel(nbl_dev_update_hw_stats_handler, eth_dev);
265+
266+
return 0;
267+
}
268+
184269
int nbl_dev_port_stop(struct rte_eth_dev *eth_dev)
185270
{
186271
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
187272
struct nbl_common_info *common = NBL_ADAPTER_TO_COMMON(adapter);
188273
common->pf_start = 0;
189274
rte_delay_ms(NBL_SAFE_THREADS_WAIT_TIME);
190275

276+
nbl_dev_hw_stats_stop(eth_dev);
191277
nbl_clear_queues(eth_dev);
192278
nbl_dev_txrx_stop(eth_dev);
193279
nbl_userdev_port_config(adapter, NBL_KERNEL_NETWORK);
@@ -375,17 +461,107 @@ int nbl_stats_get(struct rte_eth_dev *eth_dev, struct rte_eth_stats *rte_stats,
375461
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
376462
struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter);
377463
struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt);
464+
struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt);
465+
struct nbl_dev_net_mgt *net_dev = NBL_DEV_MGT_TO_NET_DEV(dev_mgt);
466+
struct nbl_ustore_stats ustore_stats = {0};
467+
int i = 0;
468+
int ret = 0;
469+
470+
ret = disp_ops->get_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), rte_stats, qstats);
471+
if (ret)
472+
goto get_stats_fail;
378473

379-
return disp_ops->get_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), rte_stats, qstats);
474+
if (!net_dev->hw_stats_inited)
475+
return 0;
476+
477+
rte_eal_alarm_cancel(nbl_dev_update_hw_stats_handler, eth_dev);
478+
ret = nbl_dev_update_hw_stats(eth_dev);
479+
if (ret)
480+
goto update_hw_stats_fail;
481+
482+
for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
483+
if (qstats && i < RTE_ETHDEV_QUEUE_STAT_CNTRS)
484+
qstats->q_errors[i] = net_dev->hw_stats.total_uvn_stat_pkt_drop[i];
485+
rte_stats->imissed += net_dev->hw_stats.total_uvn_stat_pkt_drop[i];
486+
}
487+
488+
if (!common->is_vf) {
489+
ret = disp_ops->get_ustore_total_pkt_drop_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
490+
common->eth_id, &ustore_stats);
491+
if (ret)
492+
goto get_ustore_total_pkt_drop_stats_fail;
493+
rte_stats->imissed += ustore_stats.rx_drop_packets -
494+
net_dev->hw_stats.start_ustore_stats->rx_drop_packets;
495+
rte_stats->imissed += ustore_stats.rx_trun_packets -
496+
net_dev->hw_stats.start_ustore_stats->rx_trun_packets;
497+
}
498+
499+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
500+
501+
return 0;
502+
503+
get_ustore_total_pkt_drop_stats_fail:
504+
update_hw_stats_fail:
505+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
506+
get_stats_fail:
507+
return ret;
380508
}
381509

382510
int nbl_stats_reset(struct rte_eth_dev *eth_dev)
383511
{
384512
struct nbl_adapter *adapter = ETH_DEV_TO_NBL_DEV_PF_PRIV(eth_dev);
385513
struct nbl_dev_mgt *dev_mgt = NBL_ADAPTER_TO_DEV_MGT(adapter);
386514
struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt);
515+
struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt);
516+
struct nbl_dev_net_mgt *net_dev = NBL_DEV_MGT_TO_NET_DEV(dev_mgt);
517+
u32 *uvn_stat_pkt_drop;
518+
struct nbl_ustore_stats ustore_stats = {0};
519+
int i = 0;
520+
int ret = 0;
521+
522+
ret = disp_ops->reset_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt));
523+
524+
if (!net_dev->hw_stats_inited || ret)
525+
return ret;
387526

388-
return disp_ops->reset_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt));
527+
rte_eal_alarm_cancel(nbl_dev_update_hw_stats_handler, eth_dev);
528+
529+
uvn_stat_pkt_drop = calloc(eth_dev->data->nb_rx_queues, sizeof(*uvn_stat_pkt_drop));
530+
if (!uvn_stat_pkt_drop) {
531+
ret = -ENOMEM;
532+
goto alloc_uvn_stat_pkt_drop_fail;
533+
}
534+
ret = disp_ops->get_uvn_pkt_drop_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
535+
net_dev->vsi_id,
536+
eth_dev->data->nb_rx_queues, uvn_stat_pkt_drop);
537+
if (ret)
538+
goto get_uvn_pkt_drop_stats_fail;
539+
for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
540+
net_dev->hw_stats.total_uvn_stat_pkt_drop[i] = 0;
541+
if (!common->is_vf) {
542+
ret = disp_ops->get_ustore_total_pkt_drop_stats(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
543+
common->eth_id, &ustore_stats);
544+
if (ret)
545+
goto get_ustore_total_pkt_drop_stats_fail;
546+
net_dev->hw_stats.start_ustore_stats->rx_drop_packets =
547+
ustore_stats.rx_drop_packets;
548+
net_dev->hw_stats.start_ustore_stats->rx_trun_packets =
549+
ustore_stats.rx_trun_packets;
550+
}
551+
free(uvn_stat_pkt_drop);
552+
uvn_stat_pkt_drop = NULL;
553+
554+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
555+
556+
return 0;
557+
558+
get_ustore_total_pkt_drop_stats_fail:
559+
get_uvn_pkt_drop_stats_fail:
560+
free(uvn_stat_pkt_drop);
561+
uvn_stat_pkt_drop = NULL;
562+
alloc_uvn_stat_pkt_drop_fail:
563+
rte_eal_alarm_set(NBL_ALARM_INTERNAL, nbl_dev_update_hw_stats_handler, eth_dev);
564+
return ret;
389565
}
390566

391567
static int nbl_dev_update_hw_xstats(struct nbl_dev_mgt *dev_mgt, struct rte_eth_xstat *xstats,
@@ -837,6 +1013,14 @@ static void nbl_dev_remove_net_dev(struct nbl_dev_mgt *dev_mgt)
8371013
struct nbl_dev_net_mgt *net_dev = NBL_DEV_MGT_TO_NET_DEV(dev_mgt);
8381014
struct nbl_dev_ring_mgt *ring_mgt = &net_dev->ring_mgt;
8391015
struct nbl_dispatch_ops *disp_ops = NBL_DEV_MGT_TO_DISP_OPS(dev_mgt);
1016+
struct nbl_common_info *common = NBL_DEV_MGT_TO_COMMON(dev_mgt);
1017+
1018+
if (!common->is_vf) {
1019+
rte_free(net_dev->hw_stats.start_ustore_stats);
1020+
net_dev->hw_stats.start_ustore_stats = NULL;
1021+
}
1022+
rte_free(net_dev->hw_stats.total_uvn_stat_pkt_drop);
1023+
net_dev->hw_stats.total_uvn_stat_pkt_drop = NULL;
8401024

8411025
disp_ops->remove_rss(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), net_dev->vsi_id);
8421026
disp_ops->remove_q2vsi(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), net_dev->vsi_id);
@@ -924,11 +1108,29 @@ static int nbl_dev_setup_net_dev(struct nbl_dev_mgt *dev_mgt,
9241108
goto setup_q2vsi_failed;
9251109
}
9261110

927-
ret = disp_ops->setup_rss(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
928-
net_dev->vsi_id);
1111+
ret = disp_ops->setup_rss(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt), net_dev->vsi_id);
1112+
1113+
net_dev->hw_stats.total_uvn_stat_pkt_drop =
1114+
rte_zmalloc("nbl_total_uvn_stat_pkt_drop",
1115+
sizeof(u64) * (ring_mgt->rx_ring_num), 0);
1116+
if (!net_dev->hw_stats.total_uvn_stat_pkt_drop) {
1117+
ret = -ENOMEM;
1118+
goto alloc_total_uvn_stat_pkt_drop_fail;
1119+
}
1120+
if (!common->is_vf) {
1121+
net_dev->hw_stats.start_ustore_stats =
1122+
rte_zmalloc("nbl_start_ustore_stats", sizeof(struct nbl_ustore_stats), 0);
1123+
if (!net_dev->hw_stats.start_ustore_stats) {
1124+
ret = -ENOMEM;
1125+
goto alloc_start_ustore_stats_fail;
1126+
}
1127+
}
9291128

9301129
return ret;
9311130

1131+
alloc_start_ustore_stats_fail:
1132+
rte_free(net_dev->hw_stats.total_uvn_stat_pkt_drop);
1133+
alloc_total_uvn_stat_pkt_drop_fail:
9321134
setup_q2vsi_failed:
9331135
disp_ops->free_txrx_queues(NBL_DEV_MGT_TO_DISP_PRIV(dev_mgt),
9341136
net_dev->vsi_id);

drivers/net/nbl/nbl_dev/nbl_dev.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#define NBL_FRAME_SIZE_MAX (9600)
2121
#define NBL_DEV_MIN_RX_BUFSIZE (2048)
2222

23+
#define NBL_ALARM_INTERNAL (10000000)
24+
2325
struct nbl_dev_ring {
2426
u16 index;
2527
u64 dma;
@@ -37,6 +39,11 @@ struct nbl_dev_ring_mgt {
3739
u8 active_ring_num;
3840
};
3941

42+
struct nbl_hw_stats {
43+
u64 *total_uvn_stat_pkt_drop;
44+
struct nbl_ustore_stats *start_ustore_stats;
45+
};
46+
4047
struct nbl_dev_net_mgt {
4148
const struct rte_eth_dev *eth_dev;
4249
struct nbl_dev_ring_mgt ring_mgt;
@@ -51,6 +58,8 @@ struct nbl_dev_net_mgt {
5158
u8 trust:1;
5259
u8 promisc:1;
5360
u8 rsv:6;
61+
struct nbl_hw_stats hw_stats;
62+
bool hw_stats_inited;
5463
};
5564

5665
struct nbl_dev_mgt {

drivers/net/nbl/nbl_dispatch.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,60 @@ static int nbl_disp_get_stats(void *priv, struct rte_eth_stats *rte_stats,
816816
return res_ops->get_stats(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt), rte_stats, qstats);
817817
}
818818

819+
static int nbl_disp_get_uvn_pkt_drop_stats(void *priv, u16 vsi_id,
820+
u16 num_queues, u32 *uvn_stat_pkt_drop)
821+
{
822+
struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
823+
struct nbl_resource_ops *res_ops = NBL_DISP_MGT_TO_RES_OPS(disp_mgt);
824+
int ret = 0;
825+
826+
ret = NBL_OPS_CALL(res_ops->get_uvn_pkt_drop_stats,
827+
(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt),
828+
vsi_id, num_queues, uvn_stat_pkt_drop));
829+
return ret;
830+
}
831+
832+
static int nbl_disp_chan_get_uvn_pkt_drop_stats_req(void *priv, u16 vsi_id,
833+
u16 num_queues, u32 *uvn_stat_pkt_drop)
834+
{
835+
struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
836+
const struct nbl_channel_ops *chan_ops = NBL_DISP_MGT_TO_CHAN_OPS(disp_mgt);
837+
struct nbl_chan_param_get_uvn_pkt_drop_stats param = {0};
838+
struct nbl_chan_send_info chan_send = {0};
839+
840+
param.vsi_id = vsi_id;
841+
param.num_queues = num_queues;
842+
843+
NBL_CHAN_SEND(chan_send, 0, NBL_CHAN_GET_UVN_PKT_DROP_STATS,
844+
&param, sizeof(param),
845+
uvn_stat_pkt_drop, num_queues * sizeof(*uvn_stat_pkt_drop), 1);
846+
return chan_ops->send_msg(NBL_DISP_MGT_TO_CHAN_PRIV(disp_mgt), &chan_send);
847+
}
848+
849+
static int nbl_disp_get_ustore_total_pkt_drop_stats(void *priv, u8 eth_id,
850+
struct nbl_ustore_stats *ustore_stats)
851+
{
852+
struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
853+
struct nbl_resource_ops *res_ops = NBL_DISP_MGT_TO_RES_OPS(disp_mgt);
854+
int ret = 0;
855+
856+
ret = NBL_OPS_CALL(res_ops->get_ustore_total_pkt_drop_stats,
857+
(NBL_DISP_MGT_TO_RES_PRIV(disp_mgt), eth_id, ustore_stats));
858+
return ret;
859+
}
860+
861+
static int nbl_disp_chan_get_ustore_total_pkt_drop_stats_req(void *priv, u8 eth_id,
862+
struct nbl_ustore_stats *ustore_stats)
863+
{
864+
struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
865+
const struct nbl_channel_ops *chan_ops = NBL_DISP_MGT_TO_CHAN_OPS(disp_mgt);
866+
struct nbl_chan_send_info chan_send = {0};
867+
868+
NBL_CHAN_SEND(chan_send, 0, NBL_CHAN_GET_USTORE_TOTAL_PKT_DROP_STATS,
869+
&eth_id, sizeof(eth_id), ustore_stats, sizeof(*ustore_stats), 1);
870+
return chan_ops->send_msg(NBL_DISP_MGT_TO_CHAN_PRIV(disp_mgt), &chan_send);
871+
}
872+
819873
static int nbl_disp_reset_stats(void *priv)
820874
{
821875
struct nbl_dispatch_mgt *disp_mgt = (struct nbl_dispatch_mgt *)priv;
@@ -1111,6 +1165,17 @@ do { \
11111165
NBL_DISP_SET_OPS(get_stats, nbl_disp_get_stats, \
11121166
NBL_DISP_CTRL_LVL_ALWAYS, -1, \
11131167
NULL, NULL); \
1168+
NBL_DISP_SET_OPS(get_uvn_pkt_drop_stats, \
1169+
nbl_disp_get_uvn_pkt_drop_stats, \
1170+
NBL_DISP_CTRL_LVL_MGT, \
1171+
NBL_CHAN_GET_UVN_PKT_DROP_STATS, \
1172+
nbl_disp_chan_get_uvn_pkt_drop_stats_req, NULL);\
1173+
NBL_DISP_SET_OPS(get_ustore_total_pkt_drop_stats, \
1174+
nbl_disp_get_ustore_total_pkt_drop_stats, \
1175+
NBL_DISP_CTRL_LVL_MGT, \
1176+
NBL_CHAN_GET_USTORE_TOTAL_PKT_DROP_STATS, \
1177+
nbl_disp_chan_get_ustore_total_pkt_drop_stats_req,\
1178+
NULL); \
11141179
NBL_DISP_SET_OPS(reset_stats, nbl_disp_reset_stats, \
11151180
NBL_DISP_CTRL_LVL_ALWAYS, -1, \
11161181
NULL, NULL); \

drivers/net/nbl/nbl_include/nbl_def_channel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ struct nbl_chan_param_get_private_stat_data {
395395
u32 data_len;
396396
};
397397

398+
struct nbl_chan_param_get_uvn_pkt_drop_stats {
399+
u16 vsi_id;
400+
u16 num_queues;
401+
};
402+
398403
struct nbl_chan_send_info {
399404
uint16_t dstid;
400405
uint16_t msg_type;

0 commit comments

Comments
 (0)