aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-01-22 15:46:56 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-22 15:46:56 -0500
commit18b0affaf40cf5f320258d28f7069dfff76da184 (patch)
treedbccddd469066137cb152eb96789184fc591267d
parentb589513e6354a5fd6934823b7fd66bffad41137a (diff)
parent69d08dcbbe34347cbc044629cf6f25d062593dfe (diff)
Merge branch 'ibmvnic-reset-behavior-fixes'
John Allen says: ==================== ibmvnic: Reset behavior fixes This patchset fixes a number of issues related to ibmvnic reset uncovered from testing new Power9 machines with Everglades adapters and the new functionality to change mtu and other parameters in the driver. Changes since v1: -In patch 1/3, added the line to free the long term buffers before allocating a new one. This change inadvertently uncovered the problem that the number of queues can change after a failover as well. To fix this, we check whether or not the number of queues has changed in do_reset and if they have, we do a full release and init of the queues. -In patch 1/3, added variables to the adapter struct to track how many rx/tx pools have actually been allocated and modify the release pools routines to use these values rather than the possibly incorrect req_rx/tx_queues values. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c73
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.h2
2 files changed, 60 insertions, 15 deletions
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index ab2e1917cd04..b65f5f3ac034 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -410,6 +410,10 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
410 struct ibmvnic_rx_pool *rx_pool; 410 struct ibmvnic_rx_pool *rx_pool;
411 int rx_scrqs; 411 int rx_scrqs;
412 int i, j, rc; 412 int i, j, rc;
413 u64 *size_array;
414
415 size_array = (u64 *)((u8 *)(adapter->login_rsp_buf) +
416 be32_to_cpu(adapter->login_rsp_buf->off_rxadd_buff_size));
413 417
414 rx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); 418 rx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs);
415 for (i = 0; i < rx_scrqs; i++) { 419 for (i = 0; i < rx_scrqs; i++) {
@@ -417,7 +421,17 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
417 421
418 netdev_dbg(adapter->netdev, "Re-setting rx_pool[%d]\n", i); 422 netdev_dbg(adapter->netdev, "Re-setting rx_pool[%d]\n", i);
419 423
420 rc = reset_long_term_buff(adapter, &rx_pool->long_term_buff); 424 if (rx_pool->buff_size != be64_to_cpu(size_array[i])) {
425 free_long_term_buff(adapter, &rx_pool->long_term_buff);
426 rx_pool->buff_size = be64_to_cpu(size_array[i]);
427 alloc_long_term_buff(adapter, &rx_pool->long_term_buff,
428 rx_pool->size *
429 rx_pool->buff_size);
430 } else {
431 rc = reset_long_term_buff(adapter,
432 &rx_pool->long_term_buff);
433 }
434
421 if (rc) 435 if (rc)
422 return rc; 436 return rc;
423 437
@@ -439,14 +453,12 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
439static void release_rx_pools(struct ibmvnic_adapter *adapter) 453static void release_rx_pools(struct ibmvnic_adapter *adapter)
440{ 454{
441 struct ibmvnic_rx_pool *rx_pool; 455 struct ibmvnic_rx_pool *rx_pool;
442 int rx_scrqs;
443 int i, j; 456 int i, j;
444 457
445 if (!adapter->rx_pool) 458 if (!adapter->rx_pool)
446 return; 459 return;
447 460
448 rx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_rxadd_subcrqs); 461 for (i = 0; i < adapter->num_active_rx_pools; i++) {
449 for (i = 0; i < rx_scrqs; i++) {
450 rx_pool = &adapter->rx_pool[i]; 462 rx_pool = &adapter->rx_pool[i];
451 463
452 netdev_dbg(adapter->netdev, "Releasing rx_pool[%d]\n", i); 464 netdev_dbg(adapter->netdev, "Releasing rx_pool[%d]\n", i);
@@ -469,6 +481,7 @@ static void release_rx_pools(struct ibmvnic_adapter *adapter)
469 481
470 kfree(adapter->rx_pool); 482 kfree(adapter->rx_pool);
471 adapter->rx_pool = NULL; 483 adapter->rx_pool = NULL;
484 adapter->num_active_rx_pools = 0;
472} 485}
473 486
474static int init_rx_pools(struct net_device *netdev) 487static int init_rx_pools(struct net_device *netdev)
@@ -493,6 +506,8 @@ static int init_rx_pools(struct net_device *netdev)
493 return -1; 506 return -1;
494 } 507 }
495 508
509 adapter->num_active_rx_pools = 0;
510
496 for (i = 0; i < rxadd_subcrqs; i++) { 511 for (i = 0; i < rxadd_subcrqs; i++) {
497 rx_pool = &adapter->rx_pool[i]; 512 rx_pool = &adapter->rx_pool[i];
498 513
@@ -536,6 +551,8 @@ static int init_rx_pools(struct net_device *netdev)
536 rx_pool->next_free = 0; 551 rx_pool->next_free = 0;
537 } 552 }
538 553
554 adapter->num_active_rx_pools = rxadd_subcrqs;
555
539 return 0; 556 return 0;
540} 557}
541 558
@@ -586,13 +603,12 @@ static void release_vpd_data(struct ibmvnic_adapter *adapter)
586static void release_tx_pools(struct ibmvnic_adapter *adapter) 603static void release_tx_pools(struct ibmvnic_adapter *adapter)
587{ 604{
588 struct ibmvnic_tx_pool *tx_pool; 605 struct ibmvnic_tx_pool *tx_pool;
589 int i, tx_scrqs; 606 int i;
590 607
591 if (!adapter->tx_pool) 608 if (!adapter->tx_pool)
592 return; 609 return;
593 610
594 tx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs); 611 for (i = 0; i < adapter->num_active_tx_pools; i++) {
595 for (i = 0; i < tx_scrqs; i++) {
596 netdev_dbg(adapter->netdev, "Releasing tx_pool[%d]\n", i); 612 netdev_dbg(adapter->netdev, "Releasing tx_pool[%d]\n", i);
597 tx_pool = &adapter->tx_pool[i]; 613 tx_pool = &adapter->tx_pool[i];
598 kfree(tx_pool->tx_buff); 614 kfree(tx_pool->tx_buff);
@@ -603,6 +619,7 @@ static void release_tx_pools(struct ibmvnic_adapter *adapter)
603 619
604 kfree(adapter->tx_pool); 620 kfree(adapter->tx_pool);
605 adapter->tx_pool = NULL; 621 adapter->tx_pool = NULL;
622 adapter->num_active_tx_pools = 0;
606} 623}
607 624
608static int init_tx_pools(struct net_device *netdev) 625static int init_tx_pools(struct net_device *netdev)
@@ -619,6 +636,8 @@ static int init_tx_pools(struct net_device *netdev)
619 if (!adapter->tx_pool) 636 if (!adapter->tx_pool)
620 return -1; 637 return -1;
621 638
639 adapter->num_active_tx_pools = 0;
640
622 for (i = 0; i < tx_subcrqs; i++) { 641 for (i = 0; i < tx_subcrqs; i++) {
623 tx_pool = &adapter->tx_pool[i]; 642 tx_pool = &adapter->tx_pool[i];
624 643
@@ -666,6 +685,8 @@ static int init_tx_pools(struct net_device *netdev)
666 tx_pool->producer_index = 0; 685 tx_pool->producer_index = 0;
667 } 686 }
668 687
688 adapter->num_active_tx_pools = tx_subcrqs;
689
669 return 0; 690 return 0;
670} 691}
671 692
@@ -860,7 +881,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter)
860 if (adapter->vpd->buff) 881 if (adapter->vpd->buff)
861 len = adapter->vpd->len; 882 len = adapter->vpd->len;
862 883
863 reinit_completion(&adapter->fw_done); 884 init_completion(&adapter->fw_done);
864 crq.get_vpd_size.first = IBMVNIC_CRQ_CMD; 885 crq.get_vpd_size.first = IBMVNIC_CRQ_CMD;
865 crq.get_vpd_size.cmd = GET_VPD_SIZE; 886 crq.get_vpd_size.cmd = GET_VPD_SIZE;
866 ibmvnic_send_crq(adapter, &crq); 887 ibmvnic_send_crq(adapter, &crq);
@@ -922,6 +943,13 @@ static int init_resources(struct ibmvnic_adapter *adapter)
922 if (!adapter->vpd) 943 if (!adapter->vpd)
923 return -ENOMEM; 944 return -ENOMEM;
924 945
946 /* Vital Product Data (VPD) */
947 rc = ibmvnic_get_vpd(adapter);
948 if (rc) {
949 netdev_err(netdev, "failed to initialize Vital Product Data (VPD)\n");
950 return rc;
951 }
952
925 adapter->map_id = 1; 953 adapter->map_id = 1;
926 adapter->napi = kcalloc(adapter->req_rx_queues, 954 adapter->napi = kcalloc(adapter->req_rx_queues,
927 sizeof(struct napi_struct), GFP_KERNEL); 955 sizeof(struct napi_struct), GFP_KERNEL);
@@ -995,7 +1023,7 @@ static int __ibmvnic_open(struct net_device *netdev)
995static int ibmvnic_open(struct net_device *netdev) 1023static int ibmvnic_open(struct net_device *netdev)
996{ 1024{
997 struct ibmvnic_adapter *adapter = netdev_priv(netdev); 1025 struct ibmvnic_adapter *adapter = netdev_priv(netdev);
998 int rc, vpd; 1026 int rc;
999 1027
1000 mutex_lock(&adapter->reset_lock); 1028 mutex_lock(&adapter->reset_lock);
1001 1029
@@ -1018,11 +1046,6 @@ static int ibmvnic_open(struct net_device *netdev)
1018 rc = __ibmvnic_open(netdev); 1046 rc = __ibmvnic_open(netdev);
1019 netif_carrier_on(netdev); 1047 netif_carrier_on(netdev);
1020 1048
1021 /* Vital Product Data (VPD) */
1022 vpd = ibmvnic_get_vpd(adapter);
1023 if (vpd)
1024 netdev_err(netdev, "failed to initialize Vital Product Data (VPD)\n");
1025
1026 mutex_unlock(&adapter->reset_lock); 1049 mutex_unlock(&adapter->reset_lock);
1027 1050
1028 return rc; 1051 return rc;
@@ -1548,6 +1571,7 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p)
1548static int do_reset(struct ibmvnic_adapter *adapter, 1571static int do_reset(struct ibmvnic_adapter *adapter,
1549 struct ibmvnic_rwi *rwi, u32 reset_state) 1572 struct ibmvnic_rwi *rwi, u32 reset_state)
1550{ 1573{
1574 u64 old_num_rx_queues, old_num_tx_queues;
1551 struct net_device *netdev = adapter->netdev; 1575 struct net_device *netdev = adapter->netdev;
1552 int i, rc; 1576 int i, rc;
1553 1577
@@ -1557,6 +1581,9 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1557 netif_carrier_off(netdev); 1581 netif_carrier_off(netdev);
1558 adapter->reset_reason = rwi->reset_reason; 1582 adapter->reset_reason = rwi->reset_reason;
1559 1583
1584 old_num_rx_queues = adapter->req_rx_queues;
1585 old_num_tx_queues = adapter->req_tx_queues;
1586
1560 if (rwi->reset_reason == VNIC_RESET_MOBILITY) { 1587 if (rwi->reset_reason == VNIC_RESET_MOBILITY) {
1561 rc = ibmvnic_reenable_crq_queue(adapter); 1588 rc = ibmvnic_reenable_crq_queue(adapter);
1562 if (rc) 1589 if (rc)
@@ -1601,6 +1628,12 @@ static int do_reset(struct ibmvnic_adapter *adapter,
1601 rc = init_resources(adapter); 1628 rc = init_resources(adapter);
1602 if (rc) 1629 if (rc)
1603 return rc; 1630 return rc;
1631 } else if (adapter->req_rx_queues != old_num_rx_queues ||
1632 adapter->req_tx_queues != old_num_tx_queues) {
1633 release_rx_pools(adapter);
1634 release_tx_pools(adapter);
1635 init_rx_pools(netdev);
1636 init_tx_pools(netdev);
1604 } else { 1637 } else {
1605 rc = reset_tx_pools(adapter); 1638 rc = reset_tx_pools(adapter);
1606 if (rc) 1639 if (rc)
@@ -3592,7 +3625,17 @@ static void handle_request_cap_rsp(union ibmvnic_crq *crq,
3592 *req_value, 3625 *req_value,
3593 (long int)be64_to_cpu(crq->request_capability_rsp. 3626 (long int)be64_to_cpu(crq->request_capability_rsp.
3594 number), name); 3627 number), name);
3595 *req_value = be64_to_cpu(crq->request_capability_rsp.number); 3628
3629 if (be16_to_cpu(crq->request_capability_rsp.capability) ==
3630 REQ_MTU) {
3631 pr_err("mtu of %llu is not supported. Reverting.\n",
3632 *req_value);
3633 *req_value = adapter->fallback.mtu;
3634 } else {
3635 *req_value =
3636 be64_to_cpu(crq->request_capability_rsp.number);
3637 }
3638
3596 ibmvnic_send_req_caps(adapter, 1); 3639 ibmvnic_send_req_caps(adapter, 1);
3597 return; 3640 return;
3598 default: 3641 default:
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
index 4487f1e2c266..3aec42118db2 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.h
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
@@ -1091,6 +1091,8 @@ struct ibmvnic_adapter {
1091 u64 opt_rxba_entries_per_subcrq; 1091 u64 opt_rxba_entries_per_subcrq;
1092 __be64 tx_rx_desc_req; 1092 __be64 tx_rx_desc_req;
1093 u8 map_id; 1093 u8 map_id;
1094 u64 num_active_rx_pools;
1095 u64 num_active_tx_pools;
1094 1096
1095 struct tasklet_struct tasklet; 1097 struct tasklet_struct tasklet;
1096 enum vnic_state state; 1098 enum vnic_state state;