@@ -252,10 +252,17 @@ void ovs_dp_process_packet(struct sk_buff *skb, struct sw_flow_key *key)
252252
253253 upcall .mru = OVS_CB (skb )-> mru ;
254254 error = ovs_dp_upcall (dp , skb , key , & upcall , 0 );
255- if (unlikely (error ))
256- kfree_skb (skb );
257- else
255+ switch (error ) {
256+ case 0 :
257+ case - EAGAIN :
258+ case - ERESTARTSYS :
259+ case - EINTR :
258260 consume_skb (skb );
261+ break ;
262+ default :
263+ kfree_skb (skb );
264+ break ;
265+ }
259266 stats_counter = & stats -> n_missed ;
260267 goto out ;
261268 }
@@ -551,8 +558,9 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
551558out :
552559 if (err )
553560 skb_tx_error (skb );
554- kfree_skb (user_skb );
555- kfree_skb (nskb );
561+ consume_skb (user_skb );
562+ consume_skb (nskb );
563+
556564 return err ;
557565}
558566
@@ -1515,6 +1523,7 @@ static size_t ovs_dp_cmd_msg_size(void)
15151523 msgsize += nla_total_size_64bit (sizeof (struct ovs_dp_megaflow_stats ));
15161524 msgsize += nla_total_size (sizeof (u32 )); /* OVS_DP_ATTR_USER_FEATURES */
15171525 msgsize += nla_total_size (sizeof (u32 )); /* OVS_DP_ATTR_MASKS_CACHE_SIZE */
1526+ msgsize += nla_total_size (sizeof (u32 ) * nr_cpu_ids ); /* OVS_DP_ATTR_PER_CPU_PIDS */
15181527
15191528 return msgsize ;
15201529}
@@ -1526,7 +1535,8 @@ static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb,
15261535 struct ovs_header * ovs_header ;
15271536 struct ovs_dp_stats dp_stats ;
15281537 struct ovs_dp_megaflow_stats dp_megaflow_stats ;
1529- int err ;
1538+ struct dp_nlsk_pids * pids = ovsl_dereference (dp -> upcall_portids );
1539+ int err , pids_len ;
15301540
15311541 ovs_header = genlmsg_put (skb , portid , seq , & dp_datapath_genl_family ,
15321542 flags , cmd );
@@ -1556,6 +1566,12 @@ static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb,
15561566 ovs_flow_tbl_masks_cache_size (& dp -> table )))
15571567 goto nla_put_failure ;
15581568
1569+ if (dp -> user_features & OVS_DP_F_DISPATCH_UPCALL_PER_CPU && pids ) {
1570+ pids_len = min (pids -> n_pids , nr_cpu_ids ) * sizeof (u32 );
1571+ if (nla_put (skb , OVS_DP_ATTR_PER_CPU_PIDS , pids_len , & pids -> pids ))
1572+ goto nla_put_failure ;
1573+ }
1574+
15591575 genlmsg_end (skb , ovs_header );
15601576 return 0 ;
15611577
@@ -1779,6 +1795,8 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
17791795 parms .dp = dp ;
17801796 parms .port_no = OVSP_LOCAL ;
17811797 parms .upcall_portids = a [OVS_DP_ATTR_UPCALL_PID ];
1798+ parms .desired_ifindex = a [OVS_DP_ATTR_IFINDEX ]
1799+ ? nla_get_u32 (a [OVS_DP_ATTR_IFINDEX ]) : 0 ;
17821800
17831801 /* So far only local changes have been made, now need the lock. */
17841802 ovs_lock ();
@@ -1802,7 +1820,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
18021820 ovs_dp_reset_user_features (skb , info );
18031821 }
18041822
1805- goto err_unlock_and_destroy_meters ;
1823+ goto err_destroy_portids ;
18061824 }
18071825
18081826 err = ovs_dp_cmd_fill_info (dp , reply , info -> snd_portid ,
@@ -1817,6 +1835,8 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
18171835 ovs_notify (& dp_datapath_genl_family , reply , info );
18181836 return 0 ;
18191837
1838+ err_destroy_portids :
1839+ kfree (rcu_dereference_raw (dp -> upcall_portids ));
18201840err_unlock_and_destroy_meters :
18211841 ovs_unlock ();
18221842 ovs_meters_exit (dp );
@@ -1996,6 +2016,7 @@ static const struct nla_policy datapath_policy[OVS_DP_ATTR_MAX + 1] = {
19962016 [OVS_DP_ATTR_USER_FEATURES ] = { .type = NLA_U32 },
19972017 [OVS_DP_ATTR_MASKS_CACHE_SIZE ] = NLA_POLICY_RANGE (NLA_U32 , 0 ,
19982018 PCPU_MIN_UNIT_SIZE / sizeof (struct mask_cache_entry )),
2019+ [OVS_DP_ATTR_IFINDEX ] = {.type = NLA_U32 },
19992020};
20002021
20012022static const struct genl_small_ops dp_datapath_genl_ops [] = {
@@ -2199,7 +2220,10 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)
21992220 if (!a [OVS_VPORT_ATTR_NAME ] || !a [OVS_VPORT_ATTR_TYPE ] ||
22002221 !a [OVS_VPORT_ATTR_UPCALL_PID ])
22012222 return - EINVAL ;
2202- if (a [OVS_VPORT_ATTR_IFINDEX ])
2223+
2224+ parms .type = nla_get_u32 (a [OVS_VPORT_ATTR_TYPE ]);
2225+
2226+ if (a [OVS_VPORT_ATTR_IFINDEX ] && parms .type != OVS_VPORT_TYPE_INTERNAL )
22032227 return - EOPNOTSUPP ;
22042228
22052229 port_no = a [OVS_VPORT_ATTR_PORT_NO ]
@@ -2236,11 +2260,12 @@ static int ovs_vport_cmd_new(struct sk_buff *skb, struct genl_info *info)
22362260 }
22372261
22382262 parms .name = nla_data (a [OVS_VPORT_ATTR_NAME ]);
2239- parms .type = nla_get_u32 (a [OVS_VPORT_ATTR_TYPE ]);
22402263 parms .options = a [OVS_VPORT_ATTR_OPTIONS ];
22412264 parms .dp = dp ;
22422265 parms .port_no = port_no ;
22432266 parms .upcall_portids = a [OVS_VPORT_ATTR_UPCALL_PID ];
2267+ parms .desired_ifindex = a [OVS_VPORT_ATTR_IFINDEX ]
2268+ ? nla_get_u32 (a [OVS_VPORT_ATTR_IFINDEX ]) : 0 ;
22442269
22452270 vport = new_vport (& parms );
22462271 err = PTR_ERR (vport );
0 commit comments