So do we need this patch or not?? Guessing it's quite rare in the real production environment that we have two datapaths at the same time .... And I am more curious that even though we have 2 datapaths, should the port id be different? Is one port capable of being assigned to 2 datapaths at the same time ????
Because only when a port is assigned to 2 datapaths at the same time, we should worry about this race.... Eelco Chaudron <echau...@redhat.com> 于2022年11月23日周三 23:54写道: > > > On 19 Nov 2022, at 1:46, Peng He wrote: > > > Eelco Chaudron <echau...@redhat.com> 于2022年11月18日周五 15:38写道: > > > >> > >> > >> On 18 Nov 2022, at 2:57, Peng He wrote: > >> > >>> Since there are possible race conditions (between the kernel (内核) > >> datapath and > >>> userspace datapath), > >>> I guess this patch (补丁) is now needed again? But two datapath is really > >> rare in > >>> the real deployment. > >>> So I am not sure if we should pay attention here. > >> > >> I still think we should add this, as there seem to be a decent amount of > >> times people intermix a kernel (内核) interface with a DPDK one. For > example, > >> the bridge interface, which would be up to get routing (溃败) information > for > >> tunnels. > > > > > > In this case, bridge interfaces are attached to the userspace datapath, > it > > will be "polled" by the main thread, and it's pmd-id is NON_PMD_CORE_ID. > > > > The case that race could happen is that mix using of userspace datapath > and > > kernel datapath. When the kernel datapath receives a upcall, it will set > > the pmd-id to PMD_ID_NULL. Checking the code of dpif_netdev_flow_put, > only > > the megaflow with pmd-id equals to PMD_ID_NULL will be installed > > into all the PMD threads. > > Agreed, I think this is the only case it could still happen. I could not > find any other paths. > > >> //Eelco > >> > >> > >>> Eelco Chaudron <echau...@redhat.com> 于2022年10月19日周三 18:50写道: > >>> > >>>> > >>>> > >>>> On 10 Oct 2022, at 9:12, Eelco Chaudron wrote: > >>>> > >>>>> On 8 Oct 2022, at 5:27, Peng He wrote: > >>>>> > >>>>>> Hi,Eelco > >>>>>> > >>>>>> after a second thought, I think this patch (补丁) is not needed > neither, > >>>>>> the code (代码) here is trying to find a rule which cover the packet, > >>>>>> it does not mean (意味着) the match and action of rule equals to the > ones > >>>>>> of the ukey. > >>>>>> > >>>>>> So the code (代码) here is just a prevention, no need to make it > >> consistent > >>>>>> with ukey. > >>>>>> > >>>>>> but the comments above are really misleading, so I sent a new patch > >> (补丁) > >>>> fixing > >>>>>> it. > >>>>> > >>>>> Ack, will wait for the v5, and review. > >>>> > >>>> As I did not see a v5, I reviewed the v4, and assume (假设) this patch > >> (补丁) can be > >>>> ignored (忽略) . > >>>> > >>>> //Eelco > >>>> > >>>>>> Peng He <xnhp0...@gmail.com> 于2022年10月3日周一 20:41写道: > >>>>>> > >>>>>>> When PMDs perform upcalls, the newly generated (生成) ukey will > replace > >>>>>>> the old, however, the newly generated (生成) mageflow will be discard > >>>>>>> to reuse the old one without checking if the actions of new and > >>>>>>> old are equal. > >>>>>>> > >>>>>>> This code (代码) prevents in case someone runs dpctl/add-flow to add > >>>>>>> a dp flow with inconsistent actions with the actions of ukey, > >>>>>>> and causes more (更多) confusion (混乱) . > >>>>>>> > >>>>>>> Signed-off-by: Peng He <hepeng.0...@bytedance.com> > >>>>>>> --- > >>>>>>> lib/dpif-netdev.c | 17 ++++++++++++++++- > >>>>>>> 1 file (文件) changed, 16 insertions(+), 1 deletion(-) > >>>>>>> > >>>>>>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c > >>>>>>> index a45b46014..b316e59ef 100644 > >>>>>>> --- a/lib/dpif-netdev.c > >>>>>>> +++ b/lib/dpif-netdev.c > >>>>>>> @@ -8304,7 +8304,22 @@ handle_packet_upcall(struct > >> dp_netdev_pmd_thread > >>>>>>> *pmd, > >>>>>>> * to be locking revalidators out of making flow > >>>> modifications. */ > >>>>>>> ovs_mutex_lock(&pmd->flow_mutex); > >>>>>>> netdev_flow = dp_netdev_pmd_lookup_flow(pmd, key, NULL); > >>>>>>> - if (OVS_LIKELY(!netdev_flow)) { > >>>>>>> + if (OVS_UNLIKELY(netdev_flow)) { > >>>>>>> + struct dp_netdev_actions *old_act = > >>>>>>> + dp_netdev_flow_get_actions(netdev_flow); > >>>>>>> + > >>>>>>> + if ((add_actions->size != old_act->size) || > >>>>>>> + memcmp(old_act->actions, add_actions->data, > >>>>>>> + add_actions->size)) { > >>>>>>> + > >>>>>>> + struct dp_netdev_actions *new_act = > >>>>>>> + dp_netdev_actions_create(add_actions->data, > >>>>>>> + add_actions->size); > >>>>>>> + > >>>>>>> + ovsrcu_set(&netdev_flow->actions, new_act); > >>>>>>> + ovsrcu_postpone(dp_netdev_actions_free, old_act); > >>>>>>> + } > >>>>>>> + } else { > >>>>>>> netdev_flow = dp_netdev_flow_add(pmd, &match, &ufid, > >>>>>>> add_actions->data, > >>>>>>> add_actions->size, > >>>>>>> orig_in_port); > >>>>>>> -- > >>>>>>> 2.25.1 > >>>>>>> > >>>>>>> > >>>>>> > >>>>>> -- > >>>>>> hepeng > >>>> > >>>> > >>> > >>> -- > >>> hepeng > >> > >> > > > > -- > > hepeng > > -- hepeng _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev