Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 671b53ee authored by Shradha Shah's avatar Shradha Shah Committed by David S. Miller
Browse files

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: 2d432f20

Signed-off-by: default avatarShradha Shah <sshah@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f1158b74
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -598,21 +598,21 @@ int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan,
				  MC_CMD_VPORT_ALLOC_IN_VPORT_TYPE_NORMAL,
				  vf->vlan, &vf->vport_id);
	if (rc)
		goto reset_nic;
		goto reset_nic_up_write;

restore_mac:
	if (!is_zero_ether_addr(vf->mac)) {
		rc2 = efx_ef10_vport_add_mac(efx, vf->vport_id, vf->mac);
		if (rc2) {
			eth_zero_addr(vf->mac);
			goto reset_nic;
			goto reset_nic_up_write;
		}
	}

restore_evb_port:
	rc2 = efx_ef10_evb_port_assign(efx, vf->vport_id, vf_i);
	if (rc2)
		goto reset_nic;
		goto reset_nic_up_write;
	else
		vf->vport_assigned = 1;

@@ -620,14 +620,16 @@ int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan,
	if (vf->efx) {
		rc2 = efx_ef10_vadaptor_alloc(vf->efx, EVB_PORT_ID_ASSIGNED);
		if (rc2)
			goto reset_nic;
			goto reset_nic_up_write;
	}

restore_filters:
	if (vf->efx) {
		rc2 = vf->efx->type->filter_table_probe(vf->efx);
		if (rc2)
			goto reset_nic;
			goto reset_nic_up_write;

		up_write(&vf->efx->filter_sem);

		up_write(&vf->efx->filter_sem);

@@ -639,9 +641,12 @@ int efx_ef10_sriov_set_vf_vlan(struct efx_nic *efx, int vf_i, u16 vlan,
	}
	return rc;

reset_nic_up_write:
	if (vf->efx)
		up_write(&vf->efx->filter_sem);

reset_nic:
	if (vf->efx) {
		up_write(&vf->efx->filter_sem);
		netif_err(efx, drv, efx->net_dev,
			  "Failed to restore VF - scheduling reset.\n");
		efx_schedule_reset(vf->efx, RESET_TYPE_DATAPATH);