@@ -730,6 +730,43 @@ static void ibmvnic_napi_disable(struct ibmvnic_adapter *adapter)
730
730
adapter -> napi_enabled = false;
731
731
}
732
732
733
+ static int init_napi (struct ibmvnic_adapter * adapter )
734
+ {
735
+ int i ;
736
+
737
+ adapter -> napi = kcalloc (adapter -> req_rx_queues ,
738
+ sizeof (struct napi_struct ), GFP_KERNEL );
739
+ if (!adapter -> napi )
740
+ return - ENOMEM ;
741
+
742
+ for (i = 0 ; i < adapter -> req_rx_queues ; i ++ ) {
743
+ netdev_dbg (adapter -> netdev , "Adding napi[%d]\n" , i );
744
+ netif_napi_add (adapter -> netdev , & adapter -> napi [i ],
745
+ ibmvnic_poll , NAPI_POLL_WEIGHT );
746
+ }
747
+
748
+ return 0 ;
749
+ }
750
+
751
+ static void release_napi (struct ibmvnic_adapter * adapter )
752
+ {
753
+ int i ;
754
+
755
+ if (!adapter -> napi )
756
+ return ;
757
+
758
+ for (i = 0 ; i < adapter -> num_active_rx_scrqs ; i ++ ) {
759
+ if (& adapter -> napi [i ]) {
760
+ netdev_dbg (adapter -> netdev ,
761
+ "Releasing napi[%d]\n" , i );
762
+ netif_napi_del (& adapter -> napi [i ]);
763
+ }
764
+ }
765
+
766
+ kfree (adapter -> napi );
767
+ adapter -> napi = NULL ;
768
+ }
769
+
733
770
static int ibmvnic_login (struct net_device * netdev )
734
771
{
735
772
struct ibmvnic_adapter * adapter = netdev_priv (netdev );
@@ -795,8 +832,6 @@ static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter)
795
832
796
833
static void release_resources (struct ibmvnic_adapter * adapter )
797
834
{
798
- int i ;
799
-
800
835
release_vpd_data (adapter );
801
836
802
837
release_tx_pools (adapter );
@@ -805,19 +840,7 @@ static void release_resources(struct ibmvnic_adapter *adapter)
805
840
release_stats_token (adapter );
806
841
release_stats_buffers (adapter );
807
842
release_error_buffers (adapter );
808
-
809
- if (adapter -> napi ) {
810
- for (i = 0 ; i < adapter -> req_rx_queues ; i ++ ) {
811
- if (& adapter -> napi [i ]) {
812
- netdev_dbg (adapter -> netdev ,
813
- "Releasing napi[%d]\n" , i );
814
- netif_napi_del (& adapter -> napi [i ]);
815
- }
816
- }
817
- }
818
- kfree (adapter -> napi );
819
- adapter -> napi = NULL ;
820
-
843
+ release_napi (adapter );
821
844
release_login_rsp_buffer (adapter );
822
845
}
823
846
@@ -937,7 +960,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
937
960
static int init_resources (struct ibmvnic_adapter * adapter )
938
961
{
939
962
struct net_device * netdev = adapter -> netdev ;
940
- int i , rc ;
963
+ int rc ;
941
964
942
965
rc = set_real_num_queues (netdev );
943
966
if (rc )
@@ -963,16 +986,10 @@ static int init_resources(struct ibmvnic_adapter *adapter)
963
986
}
964
987
965
988
adapter -> map_id = 1 ;
966
- adapter -> napi = kcalloc (adapter -> req_rx_queues ,
967
- sizeof (struct napi_struct ), GFP_KERNEL );
968
- if (!adapter -> napi )
969
- return - ENOMEM ;
970
989
971
- for (i = 0 ; i < adapter -> req_rx_queues ; i ++ ) {
972
- netdev_dbg (netdev , "Adding napi[%d]\n" , i );
973
- netif_napi_add (netdev , & adapter -> napi [i ], ibmvnic_poll ,
974
- NAPI_POLL_WEIGHT );
975
- }
990
+ rc = init_napi (adapter );
991
+ if (rc )
992
+ return rc ;
976
993
977
994
send_map_query (adapter );
978
995
@@ -1687,6 +1704,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1687
1704
init_rx_pools (netdev );
1688
1705
init_tx_pools (netdev );
1689
1706
1707
+ release_napi (adapter );
1708
+ init_napi (adapter );
1709
+
1690
1710
adapter -> num_active_tx_scrqs = adapter -> req_tx_queues ;
1691
1711
adapter -> num_active_rx_scrqs = adapter -> req_rx_queues ;
1692
1712
} else {
0 commit comments