Skip to content

Commit 86f669b

Browse files
nfontdavem330
authored andcommitted
ibmvnic: Make napi usage dynamic
In order to handle the number of rx sub crqs changing during a driver reset, the ibmvnic driver also needs to update the number of napi. To do this the code to init and free napi's is moved to their own routines so they can be called during the reset process. Signed-off-by: Nathan Fontenot <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d7c0ef3 commit 86f669b

File tree

1 file changed

+45
-25
lines changed

1 file changed

+45
-25
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,43 @@ static void ibmvnic_napi_disable(struct ibmvnic_adapter *adapter)
730730
adapter->napi_enabled = false;
731731
}
732732

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+
733770
static int ibmvnic_login(struct net_device *netdev)
734771
{
735772
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
@@ -795,8 +832,6 @@ static void release_login_rsp_buffer(struct ibmvnic_adapter *adapter)
795832

796833
static void release_resources(struct ibmvnic_adapter *adapter)
797834
{
798-
int i;
799-
800835
release_vpd_data(adapter);
801836

802837
release_tx_pools(adapter);
@@ -805,19 +840,7 @@ static void release_resources(struct ibmvnic_adapter *adapter)
805840
release_stats_token(adapter);
806841
release_stats_buffers(adapter);
807842
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);
821844
release_login_rsp_buffer(adapter);
822845
}
823846

@@ -937,7 +960,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
937960
static int init_resources(struct ibmvnic_adapter *adapter)
938961
{
939962
struct net_device *netdev = adapter->netdev;
940-
int i, rc;
963+
int rc;
941964

942965
rc = set_real_num_queues(netdev);
943966
if (rc)
@@ -963,16 +986,10 @@ static int init_resources(struct ibmvnic_adapter *adapter)
963986
}
964987

965988
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;
970989

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;
976993

977994
send_map_query(adapter);
978995

@@ -1687,6 +1704,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
16871704
init_rx_pools(netdev);
16881705
init_tx_pools(netdev);
16891706

1707+
release_napi(adapter);
1708+
init_napi(adapter);
1709+
16901710
adapter->num_active_tx_scrqs = adapter->req_tx_queues;
16911711
adapter->num_active_rx_scrqs = adapter->req_rx_queues;
16921712
} else {

0 commit comments

Comments
 (0)