Skip to content

Commit

Permalink
i40e: Delete queue channel for ADq on VF
Browse files Browse the repository at this point in the history
This patch takes care of freeing up all the VSIs, queues and
other ADq related software and hardware resources, when a user
requests for deletion of ADq on VF.

Example command:
tc qdisc del dev eth0 root

Signed-off-by: Avinash Dayanand <avinash.dayanand@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
  • Loading branch information
Avinash Dayanand authored and Jeff Kirsher committed Feb 14, 2018
1 parent 5e97ce6 commit c4998aa
Showing 1 changed file with 63 additions and 0 deletions.
63 changes: 63 additions & 0 deletions drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
Original file line number Diff line number Diff line change
Expand Up @@ -1672,6 +1672,27 @@ static int i40e_vc_get_version_msg(struct i40e_vf *vf, u8 *msg)
sizeof(struct virtchnl_version_info));
}

/**
* i40e_del_qch - delete all the additional VSIs created as a part of ADq
* @vf: pointer to VF structure
**/
static void i40e_del_qch(struct i40e_vf *vf)
{
struct i40e_pf *pf = vf->pf;
int i;

/* first element in the array belongs to primary VF VSI and we shouldn't
* delete it. We should however delete the rest of the VSIs created
*/
for (i = 1; i < vf->num_tc; i++) {
if (vf->ch[i].vsi_idx) {
i40e_vsi_release(pf->vsi[vf->ch[i].vsi_idx]);
vf->ch[i].vsi_idx = 0;
vf->ch[i].vsi_id = 0;
}
}
}

/**
* i40e_vc_get_vf_resources_msg
* @vf: pointer to the VF info
Expand Down Expand Up @@ -2978,6 +2999,45 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)
aq_ret);
}

/**
* i40e_vc_del_qch_msg
* @vf: pointer to the VF info
* @msg: pointer to the msg buffer
**/
static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg)
{
struct i40e_pf *pf = vf->pf;
i40e_status aq_ret = 0;

if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
aq_ret = I40E_ERR_PARAM;
goto err;
}

if (vf->adq_enabled) {
i40e_del_qch(vf);
vf->adq_enabled = false;
vf->num_tc = 0;
dev_info(&pf->pdev->dev,
"Deleting Queue Channels for ADq on VF %d\n",
vf->vf_id);
} else {
dev_info(&pf->pdev->dev, "VF %d trying to delete queue channels but ADq isn't enabled\n",
vf->vf_id);
aq_ret = I40E_ERR_PARAM;
}

/* reset the VF in order to allocate resources */
i40e_vc_notify_vf_reset(vf);
i40e_reset_vf(vf, false);

return I40E_SUCCESS;

err:
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_DISABLE_CHANNELS,
aq_ret);
}

/**
* i40e_vc_process_vf_msg
* @pf: pointer to the PF structure
Expand Down Expand Up @@ -3110,6 +3170,9 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,
case VIRTCHNL_OP_ENABLE_CHANNELS:
ret = i40e_vc_add_qch_msg(vf, msg);
break;
case VIRTCHNL_OP_DISABLE_CHANNELS:
ret = i40e_vc_del_qch_msg(vf, msg);
break;
case VIRTCHNL_OP_UNKNOWN:
default:
dev_err(&pf->pdev->dev, "Unsupported opcode %d from VF %d\n",
Expand Down

0 comments on commit c4998aa

Please sign in to comment.