On 9/16/21 12:04 PM, Mark Gray wrote:
> On 16/09/2021 09:40, Dumitru Ceara wrote:
>> On 9/15/21 5:08 PM, Mark Gray wrote:
>>> Older kernels do not reject unsupported features. This can lead
>>> to a situation in which 'ovs-vswitchd' believes that a feature is
>>> supported when, in fact, it is not.
>>>
>>> This patch probes for this by attempting to set a known unsupported
>>> feature.
>>>
>>> Reported-by: Dumitru Ceara <dce...@redhat.com>
>>> Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2004083
>>> Suggested-by: Ilya Maximets <i.maxim...@ovn.org>
>>> Signed-off-by: Mark Gray <mark.d.g...@redhat.com>
>>> ---
>>
>> This works for me, for this version:
>>
>> Tested-by: Dumitru Ceara <dce...@redhat.com>
>>
>> I do have a small comment below, thanks!
>>
>>>
>>> Notes:
>>>     v2: Fix case raised by Dumitru in which kernel is already configured 
>>> with
>>>         unsupported features.
>>>
>>>  lib/dpif-netlink.c | 72 ++++++++++++++++++++++++++++++++--------------
>>>  1 file changed, 50 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
>>> index 34fc04237333..5f4b60c5a6d6 100644
>>> --- a/lib/dpif-netlink.c
>>> +++ b/lib/dpif-netlink.c
>>> @@ -84,6 +84,8 @@ enum { MAX_PORTS = USHRT_MAX };
>>>  #define EPOLLEXCLUSIVE (1u << 28)
>>>  #endif
>>>  
>>> +#define OVS_DP_F_UNSUPPORTED (1 << 31);
>>> +
>>>  /* This PID is not used by the kernel datapath when using dispatch per CPU,
>>>   * but it is required to be set (not zero). */
>>>  #define DPIF_NETLINK_PER_CPU_PID UINT32_MAX
>>> @@ -382,36 +384,62 @@ dpif_netlink_open(const struct dpif_class *class 
>>> OVS_UNUSED, const char *name,
>>>          dp_request.cmd = OVS_DP_CMD_SET;
>>>      }
>>>  
>>> -    /* The Open vSwitch kernel module has two modes for dispatching 
>>> upcalls:
>>> -     * per-vport and per-cpu.
>>> -     *
>>> -     * When dispatching upcalls per-vport, the kernel will
>>> -     * send the upcall via a Netlink socket that has been selected based 
>>> on the
>>> -     * vport that received the packet that is causing the upcall.
>>> -     *
>>> -     * When dispatching upcall per-cpu, the kernel will send the upcall via
>>> -     * a Netlink socket that has been selected based on the cpu that 
>>> received
>>> -     * the packet that is causing the upcall.
>>> -     *
>>> -     * First we test to see if the kernel module supports per-cpu 
>>> dispatching
>>> -     * (the preferred method). If it does not support per-cpu dispatching, 
>>> we
>>> -     * fall back to the per-vport dispatch mode.
>>> +    /* Some older kernels will not reject unknown features. This will cause
>>> +     * 'ovs-vswitchd' to incorrectly assume a feature is supported. In 
>>> order to
>>> +     * test for that, we attempt to set a feature that we know is not 
>>> supported
>>> +     * by any kernel. If this feature is not rejected, we can assume we are
>>> +     * running on one of these older kernels.
>>>       */
>>>      dp_request.user_features |= OVS_DP_F_UNALIGNED;
>>> -    dp_request.user_features &= ~OVS_DP_F_VPORT_PIDS;
>>> -    dp_request.user_features |= OVS_DP_F_DISPATCH_UPCALL_PER_CPU;
>>> +    dp_request.user_features |= OVS_DP_F_VPORT_PIDS;
>>> +    dp_request.user_features |= OVS_DP_F_UNSUPPORTED;
>>
>> Nit: Sorry, I missed this on v1, but I guess we could just remove the
>> lines that set OVS_DP_F_UNALIGNED and OVS_DP_F_VPORT_PIDS here, and just
>> request OVS_DP_F_UNSUPPORTED.  We set the correct features anyway, in
>> all cases, below.
> 
> I don't want to do that because it would change the behaviour of the
> "create" case. In the previous code, when we are creating the datapath,
> we set UNALIGNED, VPORT_PIDs using the NEW command. If I remove that, I
> will call NEW without the flags and then SET them flags after. Not sure
> if it will have any adverse consequences on some version of the kernel
> so it may not be worth the risk. What do you think?
> 

Ok, I see now, thanks for the follow up!  Let's leave it as is then.

Regards,
Dumitru

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to