On 24 Nov 2022, at 10:04, Peng He wrote:

> Eelco Chaudron <[email protected]> 于2022年11月24日周四 16:34写道:
>
>>
>>
>> On 24 Nov 2022, at 1:46, Peng He wrote:
>>
>>> 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....
>>
>> I think we should still add this patch (补丁) , as it’s common to have a
>> single DPDK datapath bridge, but it could have kernel (内核) (the bridge
>> itself for example) and DPDK ports. In this case when the actions of the
>> OpenFlow rule change there could be different actions for existing rules
>> not yet updated by the revalidator.
>>
>> Or do I miss the point here?
>>
>> On a single DPDK datapath, the kernel ports will be processed by the DPDK
> datapath also (through using AF_SOCKET socket), so in this case, we only
> have one datapath and we will not have this race.

If you are sure we can drop this patch.

>> //Eelco
>>
>>> Eelco Chaudron <[email protected]> 于2022年11月23日周三 23:54写道:
>>>
>>>>
>>>>
>>>> On 19 Nov 2022, at 1:46, Peng He wrote:
>>>>
>>>>> Eelco Chaudron <[email protected]> 于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 <[email protected]> 于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 <[email protected]> 于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 <[email protected]>
>>>>>>>>>>> ---
>>>>>>>>>>>  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
>>
>>
>
> -- 
> hepeng

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to