Hello Qi Zhang,
Commit 1f7ea1cd6a37 ("ice: Enable FDIR Configure for AVF") from Mar
9, 2021 (linux-next), leads to the following Smatch static checker
warning:
drivers/net/ethernet/intel/ice/virt/fdir.c:2339 ice_vc_del_fdir_fltr()
warn: missing error code here? 'kzalloc_noprof()' failed
drivers/net/ethernet/intel/ice/virt/fdir.c
2311 int ice_vc_del_fdir_fltr(struct ice_vf *vf, u8 *msg)
2312 {
2313 struct virtchnl_fdir_del *fltr = (struct virtchnl_fdir_del
*)msg;
2314 struct virtchnl_fdir_del *stat = NULL;
2315 struct virtchnl_fdir_fltr_conf *conf;
2316 struct ice_vf_fdir *fdir = &vf->fdir;
2317 enum virtchnl_status_code v_ret;
2318 struct ice_fdir_fltr *input;
2319 enum ice_fltr_ptype flow;
2320 struct device *dev;
2321 struct ice_pf *pf;
2322 int is_tun = 0;
2323 int len = 0;
2324 int ret;
2325
2326 pf = vf->pf;
2327 dev = ice_pf_to_dev(pf);
2328 ret = ice_vc_fdir_param_check(vf, fltr->vsi_id);
2329 if (ret) {
2330 v_ret = VIRTCHNL_STATUS_ERR_PARAM;
2331 dev_dbg(dev, "Parameter check for VF %d failed\n",
vf->vf_id);
2332 goto err_exit;
2333 }
2334
2335 stat = kzalloc(sizeof(*stat), GFP_KERNEL);
2336 if (!stat) {
2337 v_ret = VIRTCHNL_STATUS_ERR_NO_MEMORY;
It's not clear if this is deliberate or not. Maybe we could add a comment?
Here set v_ret.
2338 dev_dbg(dev, "Alloc stat for VF %d failed\n",
vf->vf_id);
--> 2339 goto err_exit;
2340 }
2341
2342 len = sizeof(*stat);
2343
2344 conf = ice_vc_fdir_lookup_entry(vf, fltr->flow_id);
2345 if (!conf) {
2346 v_ret = VIRTCHNL_STATUS_SUCCESS;
2347 stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST;
2348 dev_dbg(dev, "VF %d: FDIR invalid flow_id:0x%X\n",
2349 vf->vf_id, fltr->flow_id);
2350 goto err_exit;
2351 }
2352
2353 /* Just return failure when ctrl_vsi idx is invalid */
2354 if (vf->ctrl_vsi_idx == ICE_NO_VSI) {
2355 v_ret = VIRTCHNL_STATUS_SUCCESS;
2356 stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE;
2357 dev_err(dev, "Invalid FDIR ctrl_vsi for VF %d\n",
vf->vf_id);
2358 goto err_exit;
2359 }
2360
2361 ret = ice_vc_fdir_set_irq_ctx(vf, conf,
VIRTCHNL_OP_DEL_FDIR_FILTER);
2362 if (ret) {
2363 v_ret = VIRTCHNL_STATUS_SUCCESS;
2364 stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE;
2365 dev_dbg(dev, "VF %d: set FDIR context failed\n",
vf->vf_id);
2366 goto err_exit;
2367 }
2368
2369 /* For raw FDIR filters created by the parser */
2370 if (conf->parser_ena) {
2371 ret = ice_vc_del_fdir_raw(vf, conf, &v_ret, stat, len);
2372 if (ret)
2373 goto err_del_tmr;
2374 goto exit;
2375 }
2376
2377 is_tun = ice_fdir_is_tunnel(conf->ttype);
2378 ret = ice_vc_fdir_write_fltr(vf, conf, false, is_tun);
2379 if (ret) {
2380 v_ret = VIRTCHNL_STATUS_SUCCESS;
2381 stat->status = VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE;
2382 dev_err(dev, "VF %d: writing FDIR rule failed,
ret:%d\n",
2383 vf->vf_id, ret);
2384 goto err_del_tmr;
2385 }
2386
2387 /* Remove unused profiles to avoid unexpected behaviors */
2388 input = &conf->input;
2389 flow = input->flow_type;
2390 if (fdir->fdir_fltr_cnt[flow][is_tun] == 1)
2391 ice_vc_fdir_rem_prof(vf, flow, is_tun);
2392
2393 exit:
2394 kfree(stat);
2395
2396 return ret;
2397
2398 err_del_tmr:
2399 ice_vc_fdir_clear_irq_ctx(vf);
2400 err_exit:
2401 ret = ice_vc_send_msg_to_vf(vf, VIRTCHNL_OP_DEL_FDIR_FILTER,
v_ret,
2402 (u8 *)stat, len);
But then "ret" is generally going to be success.
2403 kfree(stat);
2404 return ret;
2405 }
regards,
dan carpenter