@@ -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+
135209int 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+
184269int 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
382510int 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
391567static 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 :
9321134setup_q2vsi_failed :
9331135 disp_ops -> free_txrx_queues (NBL_DEV_MGT_TO_DISP_PRIV (dev_mgt ),
9341136 net_dev -> vsi_id );
0 commit comments