[dpdk-dev] [PATCH v5] app/testpmd: fix the default RSS key configuration

oulijun oulijun at huawei.com
Wed Oct 21 10:19:32 CEST 2020



在 2020/10/20 22:34, Ferruh Yigit 写道:
> On 10/20/2020 2:35 PM, oulijun wrote:
>>
>>
>> 在 2020/10/20 18:02, Ferruh Yigit 写道:
>>> On 10/20/2020 10:00 AM, oulijun wrote:
>>>>
>>>>
>>>> 在 2020/10/16 18:57, Ferruh Yigit 写道:
>>>>> On 10/16/2020 11:04 AM, oulijun wrote:
>>>>>>
>>>>>>
>>>>>> 在 2020/10/16 7:53, Ferruh Yigit 写道:
>>>>>>> On 10/16/2020 12:21 AM, Ophir Munk wrote:
>>>>>>>>> From: Ferruh Yigit <ferruh.yigit at intel.com>
>>>>>>>>>>>> On 10/15/2020 1:41 PM, Lijun Ou wrote:
>>>>>>>>>>>>> When start the testpmd, the pmd driver initializes the RSS
>>>>>>>>>>>>> configuration. Generally, the recommended RSS hash key is 
>>>>>>>>>>>>> used as
>>>>>>>>>>>>> the default key in the driver. In addition, the default key is
>>>>>>>>>>>>> different from the default RSS flow in testpmd without 
>>>>>>>>>>>>> specifying
>>>>>>>>>>>>> RSS hash key. So. if you do not specify the RSS key when 
>>>>>>>>>>>>> creating
>>>>>>>>>>>>> an RSS rule, the testpmd uses the default key as the 
>>>>>>>>>>>>> default RSS
>>>>>>>>>>>>> key of the RSS rule. As a result, you may mistakenly 
>>>>>>>>>>>>> consider that
>>>>>>>>>>>>> the RSS key in use is the valid default key of the NIC, 
>>>>>>>>>>>>> actually,
>>>>>>>>>>>>> the key and the valid default key of the NIC are two values.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Consider the follow usage with testpmd:
>>>>>>>>>>>>> 1. first, startup testpmd:
>>>>>>>>>>>>> testpmd> show port 0 rss-hash key
>>>>>>>>>>>>> RSS functions:
>>>>>>>>>>>>>     all ipv4-frag ipv4-other ipv6-frag ipv6-other ip RSS key:
>>>>>>>>>>>>> -
>>>>>>>>> 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA3803
>>>>>>>>> 0F
>>>>>>>>>>>>> -20C6A42B73BBEAC01FA
>>>>>>>>>>>>> 2. create a rss rule
>>>>>>>>>>>>> testpmd> flow create 0 ingress pattern eth / ipv4 / udp / end
>>>>>>>>>>>>> testpmd> actions rss \
>>>>>>>>>>>>> types ipv4-udp end queues end / end
>>>>>>>>>>>>>
>>>>>>>>>>>>> 3. show rss-hash key
>>>>>>>>>>>>> testpmd> show port 0 rss-hash key
>>>>>>>>>>>>> RSS functions:
>>>>>>>>>>>>>     all ipv4-udp udp
>>>>>>>>>>>>> RSS key:
>>>>>>>>>>>>> -
>>>>>>>>> 74657374706D6427732064656661756C74205253532068617368206B65792C
>>>>>>>>> 206F
>>>>>>>>>>>>> -76657272696465
>>>>>>>>>>>>>
>>>>>>>>>>>>> In order to solve the above problems, it use the NIC valid 
>>>>>>>>>>>>> default
>>>>>>>>>>>>> RSS key instead of the testpmd dummy RSS key in the flow
>>>>>>>>>>>>> configuration when the RSS key is not specified in the flow 
>>>>>>>>>>>>> rule.
>>>>>>>>>>>>> If the NIC RSS key is invalid, it will use testpmd dummy 
>>>>>>>>>>>>> RSS key as the
>>>>>>>>> default key.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Fixes: ac8d22de2394 ("ethdev: flatten RSS configuration in 
>>>>>>>>>>>>> flow
>>>>>>>>>>>>> API")
>>>>>>>>>>>>> Cc: stable at dpdk.org
>>>>>>>>>>>>>
>>>>>>>>>>>>> Signed-off-by: Lijun Ou <oulijun at huawei.com>
>>>>>>>>>>>>> Reviewed-by: Phil Yang <phil.yang at arm.com>
>>>>>>>>>>>>> ---
>>>>>>>>>>>>> V4->V5:
>>>>>>>>>>>>> -rewrite the commit log
>>>>>>>>>>>>> -add reviewed-by
>>>>>>>>>>>>
>>>>>>>>>>>> Hi Lijun,
>>>>>>>>>>>>
>>>>>>>>>>>> There were multiple other comments, it seems they are not 
>>>>>>>>>>>> addressed
>>>>>>>>>>>> but only updated the commit log, can you please check 
>>>>>>>>>>>> comments to
>>>>>>>>> prev versions.
>>>>>>>>>>>>
>>>>>>>>>>>> Before going into the details, my question was what happens if
>>>>>>>>>>>> default key not provided at all?
>>>>>>>>>>>> It seems this has been already tried by Ophir [1], later 
>>>>>>>>>>>> reverted
>>>>>>>>>>>> back [2] bringing the initial issue back.
>>>>>>>>>>>>
>>>>>>>>>>>> According commit, the reason of revert is to support following
>>>>>>>>> command:
>>>>>>>>>>>> "flow create 0 <pattern> actions rss queues 0 1 end key_len 
>>>>>>>>>>>> 40 / end"
>>>>>>>>>>>>
>>>>>>>>>>>> @Ophir, @Lijun,
>>>>>>>>>>>> Can we ignore the 'key_len' if the 'key' is not supported 
>>>>>>>>>>>> and solve
>>>>>>>>>>>> current issue as initially intended ([1])?
>>>>>>>>>>>>
>>>>>>>>>>> Hi, Ferruh
>>>>>>>>>>>     I have discussed with Phil Yang about the problem in [1]. 
>>>>>>>>>>> I think
>>>>>>>>>>> there may be other problems with the idea and there is no better
>>>>>>>>>>> solution. and we need to remove key_len definition from 
>>>>>>>>>>> rte_rss_conf
>>>>>>>>>>> structure. They don't have a plan. And [1] was eventually 
>>>>>>>>>>> reverted.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Why ignoring 'key_len' (set it to zero) when there is no 'key'
>>>>>>>>>> provided doesn't work?
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> What do you think [1] + following update, will it work?
>>>>>>>>>
>>>>>>>>>    diff --git a/lib/librte_ethdev/rte_flow.c 
>>>>>>>>> b/lib/librte_ethdev/rte_flow.c
>>>>>>>>>    index ee4f3464fe..e7789c87b3 100644
>>>>>>>>>    --- a/lib/librte_ethdev/rte_flow.c
>>>>>>>>>    +++ b/lib/librte_ethdev/rte_flow.c
>>>>>>>>>    @@ -535,7 +535,7 @@ rte_flow_conv_action_conf(void *buf, 
>>>>>>>>> const size_t
>>>>>>>>> size,
>>>>>>>>>                               }),
>>>>>>>>>                               size > sizeof(*dst.rss) ? 
>>>>>>>>> sizeof(*dst.rss) : size);
>>>>>>>>>                    off = sizeof(*dst.rss);
>>>>>>>>>    -               if (src.rss->key_len) {
>>>>>>>>>    +               if (src.rss->key_len && src.rss->key) {
>>>>>>>>>                            off = RTE_ALIGN_CEIL(off, 
>>>>>>>>> sizeof(*dst.rss->key));
>>>>>>>>>                            tmp = sizeof(*src.rss->key) * 
>>>>>>>>> src.rss->key_len;
>>>>>>>>>                            if (size >= off + tmp)
>>>>>>>>>
>>>>>>>>
>>>>>>>> Ferruh, your suggestion ([1] + update) looks correct. I also 
>>>>>>>> verified it on mlx5 PMD.
>>>>>>>> Advantage: it's a generic fix for all dpdk applications using 
>>>>>>>> rte_flows (not just testpmd).
>>>>>>>> It reduces code.
>>>>>>>> With this fix the responsibility of handling key==NULL and/or 
>>>>>>>> len==0 is moved to the PMDs (which is good).
>>>>>>>> With regard to Lijun patch - I liked the approach of overriding 
>>>>>>>> the default testpmd key with the default PMD key.
>>>>>>>> But it only addresses testpmd. More code was added.
>>>>>>>> It seems OK to call rte_eth_dev_rss_hash_conf_get() as part of 
>>>>>>>> parsing RSS, but it would feel more confident if we could 
>>>>>>>> confirm it for all the PMDs (by testing) or at least review the 
>>>>>>>> PMDs rss_hash_conf_get() implementations.
>>>>>>>>
>>>>>>>
>>>>>>> Lijun's idea can work. There was a problem in implementation 
>>>>>>> related to the key size assumption, which can be fixed.
>>>>>>>
>>>>>>> Even it is fixed, when user gives a rss rule without a key, we 
>>>>>>> are getting key from device and feeding same key back to device, 
>>>>>>> this is unnecessary I think.
>>>>>>> When user didn't provide a key, rss rule shouldn't touch the key 
>>>>>>> at all.
>>>>>>>
>>>>>> Do you mean that the driver should not configure the key to the 
>>>>>> hardware when the RSS key is not specified?
>>>>>
>>>>> We are talking about 'key' in RSS rte flow rule, not generally 
>>>>> configuring the device for RSS.
>>>>>
>>>> Yes, I know. However, I am talking about some implementations. The 
>>>> configuration interface may be the same as that for configuring RSS
>>>> parameters of the device in general mode.
>>>>> If a specific rss rte flow rule, lets say to filter some defined 
>>>>> packets to some specific queues, don't have 'key' as a part of 
>>>>> rule, I am suggesting not touch 'key' configuration of the device.
>>>>>
>>>> Yes, I agree. I think your point of view is very reasonable and a more
>>>> appropriate implementation. However, for the sake of simplicity and
>>>> other considerations in the architecture design of some devices, the
>>>> hardware may support reasonable hybrid configuration for paramter 
>>>> configuration in the RSS config, rather than independent configuration
>>>> for hw, that is, maybe touch A of rss configuration of the device and
>>>> must touch B of rss configuration. As a result, If the preceding 
>>>> scenario occurs, it is reasonable to configure an RSS config that 
>>>> does not change and specified.What do you think?
>>>>>> If so, we cannot identify when the user does not specify the RSS 
>>>>>> key to determine whether to configure the key.
>>>>>
>>>>> I think we can. If the rule has 'key' attribute, driver can use 
>>>>> that key to program the device, if 'key' attribute is missing, 
>>>>> don't do anything related to the rss key.
>>>>>
>>>> Yes, if 'key' attribute is missing, don't do anything related to the 
>>>> rss key. It's more reasonable.
>>>> But, If he can't do that, I think it is reasonable to configure the 
>>>> default key that already exists on the device. The only disadvantage 
>>>> is wasteful.
>>>>>> In hardware design, most vendors do not configure keys for 
>>>>>> hardware independently, which may be associated with other RSS 
>>>>>> config parameters.
>>>>>> I think it would be reasonable for us to reconfigure the RSS key 
>>>>>> with the default value configured and valid in the hardware as the 
>>>>>> default value if the user does not specify the RSS key.
>>>>>
>>>>> There are already APIs to update the RSS configuration, like RSS 
>>>>> key, hash functions etc.. They are independent from the rte flow 
>>>>> RSS rule.
>>>>> Application should configure RSS according needs using those APIs.
>>>>>
>>>> Yes, should do this. Are there any unreasonable users who simply do 
>>>> not know these APIs or do not want to use them and want to configure 
>>>> some parameters through the rte flow RSS rule without changing other 
>>>> parameters?
>>>>> The question here is about each RSS rte flow rule that can update 
>>>>> the key. Am I missing something?
>>>> I don't think you've misunderstood the general situation.
>>>> Even if the RSS key is not specified in a rule, the driver uses the 
>>>> default key value to re-touch the device.
>>>>>
>>>>>>> Complication was when user provides key_len without a key, I 
>>>>>>> think both ignoring or returning error in this case is OK.
>>>>>> I agree. However, I think it is meaningless to expose the RSS key 
>>>>>> length to users. Do you consider deleting the RSS key length 
>>>>>> directly?
>>>>>
>>>>> Isn't both 'key' and 'key_len' needed to program the RSS key? Can 
>>>>> the driver know the size of the 'key' without 'key_len'?
>>>>> And driver should verify these provided values.
>>>>>
>>>> I know and agree.It is only during the analysis of the [1] scheme, 
>>>> from the time it was proposed to the time it was withdrawn, that I 
>>>> found some guys in the community questioned the significance of 
>>>> key_len.
>>>>
>>>> Back to the subject, what is your plan for the solution in the patch?
>>>
>>> I think, Ophir's old reverted patch [1] + 
>>> 'rte_flow_conv_action_conf()' update I proposed above can work. Is 
>>> this working for you? If so can you please send a patch?
>>>
>>>
>>> [1] https://git.dpdk.org/dpdk/commit/?id=a4391f8bae8
>>> .
>> Hi, Ferruh
>>     I've just used [1] + 'rte_flow_conv_action_conf()' for testing 
>> based on the Kunpeng920 NIC plation and use hns3 pmd driver. it can be 
>> resolve the RSS key question.
>>     testpmd> show port 0 rss-hash key
>> RSS functions:
>>   all ipv4-frag ipv4-other ipv6-frag ipv6-other ip
>> RSS key:
>> 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FA 
>>
>> testpmd> flow create 0 ingress pattern end actions rss func 
>> symmetric_toeplitz types all end / end
>> 0000:7d:00.0 hns3_config_rss_filter(): modified RSS types based on 
>> hardware support, requested:7f83fffc configured:3ef8
>> 0000:7d:00.0 hns3_parse_rss_key(): no valid RSS key config, using default
>> Flow rule #0 created
>> testpmd> show port 0 rss-hash key
>> RSS functions:
>>   all ipv4-frag ipv4-tcp ipv4-udp ipv4-sctp ipv4-other ipv6-frag 
>> ipv6-tcp ipv6-udp ipv6-sctp ipv6-other ip udp tcp sctp
>> RSS key:
>> 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FA 
>>
>>
>> However, I also tested the case. I am not specified the RSS key and 
>> specified the key_len when create a RSS flow rule, it can create success.
>> testpmd> flow create 0 ingress pattern end actions rss queues 0 1 end 
>> key_len 40 / end
>> 0000:7d:00.0 hns3_config_rss_filter(): modified RSS types based on 
>> hardware support, requested:a38c configured:2288
>> 0000:7d:00.0 hns3_parse_rss_key(): no valid RSS key config, using default
>> Flow rule #0 created
>> testpmd> show port 0 rss-hash key
>> RSS functions:
>>   all ipv4-frag ipv4-other ipv6-frag ipv6-other ip
>> RSS key:
>> 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FA 
>>
>>
> 
> So are you happy with this solution?
> .
Yes, thanks.
> 


More information about the dev mailing list