aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShradha Shah <sshah@solarflare.com>2015-07-08 05:12:45 -0400
committerDavid S. Miller <davem@davemloft.net>2015-07-08 19:18:52 -0400
commit671b53eec2edcbfac3e53d02cf3d0c6d9ecc07de (patch)
treee18d141536a5c3ef18ff8a8dacf16ed67fffe466
parentf1158b74e54f2e2462ba5e2f45a118246d9d5b43 (diff)
sfc: Ensure down_write(&filter_sem) and up_write() are matched before calling efx_net_open()
This patch avoids the double up_write to filter_sem if efx_net_open() fails. Resolves: 2d432f20d27c1813a2746008e16dd6ce12a14dc1 Signed-off-by: Shradha Shah <sshah@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/sfc/ef10_sriov.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/net/ethernet/sfc/ef10_sriov.c b/drivers/net/ethernet/sfc/ef10_sriov.c
index 7485f71b4e2f..3c17f274e802 100644
--- a/drivers/net/ethernet/sfc/ef10_sriov.c
+++ b/drivers/net/ethernet/sfc/ef10_sriov.c
@@ -598,21 +598,21 @@ int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan,
598 MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL, 598 MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL,
599 vf->vlan, &vf->vport_id); 599 vf->vlan, &vf->vport_id);
600 if (rc) 600 if (rc)
601 goto reset_nic; 601 goto reset_nic_up_write;
602 602
603restore_mac: 603restore_mac:
604 if (!is_zero_ether_addr(vf->mac)) { 604 if (!is_zero_ether_addr(vf->mac)) {
605 rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac); 605 rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac);
606 if (rc2) { 606 if (rc2) {
607 eth_zero_addr(vf->mac); 607 eth_zero_addr(vf->mac);
608 goto reset_nic; 608 goto reset_nic_up_write;
609 } 609 }
610 } 610 }
611 611
612restore_evb_port: 612restore_evb_port:
613 rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i); 613 rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i);
614 if (rc2) 614 if (rc2)
615 goto reset_nic; 615 goto reset_nic_up_write;
616 else 616 else
617 vf->vport_assigned = 1; 617 vf->vport_assigned = 1;
618 618
@@ -620,14 +620,16 @@ restore_vadaptor:
620 if (vf->efx) { 620 if (vf->efx) {
621 rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED); 621 rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED);
622 if (rc2) 622 if (rc2)
623 goto reset_nic; 623 goto reset_nic_up_write;
624 } 624 }
625 625
626restore_filters: 626restore_filters:
627 if (vf->efx) { 627 if (vf->efx) {
628 rc2 = vf->efx->type->filter_table_probe(vf->efx); 628 rc2 = vf->efx->type->filter_table_probe(vf->efx);
629 if (rc2) 629 if (rc2)
630 goto reset_nic; 630 goto reset_nic_up_write;
631
632 up_write(&vf->efx->filter_sem);
631 633
632 up_write(&vf->efx->filter_sem); 634 up_write(&vf->efx->filter_sem);
633 635
@@ -639,9 +641,12 @@ restore_filters:
639 } 641 }
640 return rc; 642 return rc;
641 643
644reset_nic_up_write:
645 if (vf->efx)
646 up_write(&vf->efx->filter_sem);
647
642reset_nic: 648reset_nic:
643 if (vf->efx) { 649 if (vf->efx) {
644 up_write(&vf->efx->filter_sem);
645 netif_err(efx, drv, efx->net_dev, 650 netif_err(efx, drv, efx->net_dev,
646 "Failed to restore VF - scheduling reset.\n"); 651 "Failed to restore VF - scheduling reset.\n");
647 efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH); 652 efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH);