[Intel-wired-lan] [jkirsher-next-queue:dev-queue 109/109] drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3017:43: sparse: restricted __be16 degrades to integer
kbuild test robot
fengguang.wu at intel.com
Fri Jan 12 23:19:07 UTC 2018
tree: https://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue.git dev-queue
head: 5a2f5288e8033ca6995630146eb61790471d9542
commit: 5a2f5288e8033ca6995630146eb61790471d9542 [109/109] i40e: Add and delete cloud filter
reproduce:
# apt-get install sparse
git checkout 5a2f5288e8033ca6995630146eb61790471d9542
make ARCH=x86_64 allmodconfig
make C=1 CF=-D__CHECK_ENDIAN__
sparse warnings: (new ones prefixed by >>)
>> drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3017:43: sparse: restricted __be16 degrades to integer
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3025:43: sparse: restricted __be16 degrades to integer
>> drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3057:17: sparse: symbol 'i40e_find_vsi_from_seid' was not declared. Should it be
>> drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c:3077:6: sparse: symbol 'i40e_del_all_cloud_filters' was not declared. Should it be
Please review and possibly fold the followup patch.
vim +3017 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
2918
2919 /**
2920 * i40e_validate_cloud_filter
2921 * @mask: mask for TC filter
2922 * @data: data for TC filter
2923 *
2924 * This function validates cloud filter programmed as TC filter for ADq
2925 **/
2926 static int i40e_validate_cloud_filter(struct i40e_vf *vf,
2927 struct virtchnl_filter *tc_filter)
2928 {
2929 struct virtchnl_l4_spec mask = tc_filter->mask.tcp_spec;
2930 struct virtchnl_l4_spec data = tc_filter->data.tcp_spec;
2931 struct i40e_pf *pf = vf->pf;
2932 struct i40e_vsi *vsi = NULL;
2933 struct i40e_mac_filter *f;
2934 struct hlist_node *h;
2935 bool found = false;
2936 int bkt;
2937
2938 if (!tc_filter->action) {
2939 dev_info(&pf->pdev->dev,
2940 "VF %d: Currently ADq doesn't support Drop Action\n",
2941 vf->vf_id);
2942 goto err;
2943 }
2944
2945 /* action_meta is TC number here to which the filter is applied */
2946 if (!tc_filter->action_meta ||
2947 tc_filter->action_meta > I40E_MAX_VF_VSI) {
2948 dev_info(&pf->pdev->dev, "VF %d: Invalid TC number %u\n",
2949 vf->vf_id, tc_filter->action_meta);
2950 goto err;
2951 }
2952
2953 /* Check filter if it's programmed for advanced mode or basic mode.
2954 * There are two ADq modes (for VF only),
2955 * 1. Basic mode: intended to allow as many filter options as posssible
2956 * to be added to a VF in Non-trusted mode. Main goal is
2957 * to add filters to its own MAC and VLAN id.
2958 * 2. Advanced mode: is for allowing filters to be applied other than
2959 * its own MAC or VLAN. This mode requires the VF to be
2960 * Trusted.
2961 */
2962 if (mask.dst_mac[0] && !mask.dst_ip[0]) {
2963 vsi = pf->vsi[vf->lan_vsi_idx];
2964 f = i40e_find_mac(vsi, data.dst_mac);
2965
2966 if (!f) {
2967 dev_info(&pf->pdev->dev,
2968 "Destination MAC %pM doesn't belong to VF %d\n",
2969 data.dst_mac, vf->vf_id);
2970 goto err;
2971 }
2972
2973 if (mask.vlan_id) {
2974 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f,
2975 hlist) {
2976 if (f->vlan == ntohs(data.vlan_id)) {
2977 found = true;
2978 break;
2979 }
2980 }
2981 if (!found) {
2982 dev_info(&pf->pdev->dev,
2983 "VF %d doesn't have any VLAN id %u\n",
2984 vf->vf_id, ntohs(data.vlan_id));
2985 goto err;
2986 }
2987 }
2988 } else {
2989 /* Check if VF is trusted */
2990 if (!test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps)) {
2991 dev_err(&pf->pdev->dev,
2992 "VF %d not trusted, make VF trusted to add advanced mode ADq cloud filters\n",
2993 vf->vf_id);
2994 return I40E_ERR_CONFIG;
2995 }
2996 }
2997
2998 if (mask.dst_mac[0] & data.dst_mac[0]) {
2999 if (is_broadcast_ether_addr(data.dst_mac) ||
3000 is_zero_ether_addr(data.dst_mac)) {
3001 dev_info(&pf->pdev->dev, "VF %d: Invalid Dest MAC addr %pM\n",
3002 vf->vf_id, data.dst_mac);
3003 goto err;
3004 }
3005 }
3006
3007 if (mask.src_mac[0] & data.src_mac[0]) {
3008 if (is_broadcast_ether_addr(data.src_mac) ||
3009 is_zero_ether_addr(data.src_mac)) {
3010 dev_info(&pf->pdev->dev, "VF %d: Invalid Source MAC addr %pM\n",
3011 vf->vf_id, data.src_mac);
3012 goto err;
3013 }
3014 }
3015
3016 if (mask.dst_port & data.dst_port) {
> 3017 if (!data.dst_port || data.dst_port > 0xFFFF) {
3018 dev_info(&pf->pdev->dev, "VF %d: Invalid Dest port\n",
3019 vf->vf_id);
3020 goto err;
3021 }
3022 }
3023
3024 if (mask.src_port & data.src_port) {
3025 if (!data.src_port || data.src_port > 0xFFFF) {
3026 dev_info(&pf->pdev->dev, "VF %d: Invalid Source port\n",
3027 vf->vf_id);
3028 goto err;
3029 }
3030 }
3031
3032 if (tc_filter->flow_type != VIRTCHNL_TCP_V6_FLOW &&
3033 tc_filter->flow_type != VIRTCHNL_TCP_V4_FLOW) {
3034 dev_info(&pf->pdev->dev, "VF %d: Invalid Flow type\n",
3035 vf->vf_id);
3036 goto err;
3037 }
3038
3039 if (mask.vlan_id & data.vlan_id) {
3040 if (ntohs(data.vlan_id) > I40E_MAX_VLANID) {
3041 dev_info(&pf->pdev->dev, "VF %d: invalid VLAN ID\n",
3042 vf->vf_id);
3043 goto err;
3044 }
3045 }
3046
3047 return I40E_SUCCESS;
3048 err:
3049 return I40E_ERR_CONFIG;
3050 }
3051
3052 /**
3053 * i40e_find_vsi_from_seid - searches for the vsi with the given seid
3054 * @vf: pointer to the VF info
3055 * @seid - seid of the vsi it is searching for
3056 **/
> 3057 struct i40e_vsi *i40e_find_vsi_from_seid(struct i40e_vf *vf, u16 seid)
3058 {
3059 struct i40e_pf *pf = vf->pf;
3060 struct i40e_vsi *vsi = NULL;
3061 int i;
3062
3063 for (i = 0; i < vf->num_tc ; i++) {
3064 vsi = i40e_find_vsi_from_id(pf, vf->ch[i].vsi_id);
3065 if (vsi->seid == seid)
3066 return vsi;
3067 }
3068 return NULL;
3069 }
3070
3071 /**
3072 * i40e_del_all_cloud_filters
3073 * @vf: pointer to the VF info
3074 *
3075 * This function deletes all cloud filters
3076 **/
> 3077 void i40e_del_all_cloud_filters(struct i40e_vf *vf)
3078 {
3079 struct i40e_cloud_filter *cfilter = NULL;
3080 struct i40e_pf *pf = vf->pf;
3081 struct i40e_vsi *vsi = NULL;
3082 struct hlist_node *node;
3083 int ret;
3084
3085 hlist_for_each_entry_safe(cfilter, node,
3086 &vf->cloud_filter_list, cloud_node) {
3087 vsi = i40e_find_vsi_from_seid(vf, cfilter->seid);
3088
3089 if (!vsi) {
3090 dev_err(&pf->pdev->dev, "VF %d: no VSI found for matching %u seid, can't delete cloud filter\n",
3091 vf->vf_id, cfilter->seid);
3092 continue;
3093 }
3094
3095 if (cfilter->dst_port)
3096 ret = i40e_add_del_cloud_filter_big_buf(vsi, cfilter,
3097 false);
3098 else
3099 ret = i40e_add_del_cloud_filter(vsi, cfilter, false);
3100 if (ret)
3101 dev_err(&pf->pdev->dev,
3102 "VF %d: Failed to delete cloud filter, err %s aq_err %s\n",
3103 vf->vf_id, i40e_stat_str(&pf->hw, ret),
3104 i40e_aq_str(&pf->hw,
3105 pf->hw.aq.asq_last_status));
3106
3107 hlist_del(&cfilter->cloud_node);
3108 kfree(cfilter);
3109 vf->num_cloud_filters--;
3110 }
3111 }
3112
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
More information about the Intel-wired-lan
mailing list