[ovs-dev] [PATCH 3/4] ofpbuf: Add ofpbuf_rss()

Daniele Di Proietto ddiproietto at vmware.com
Wed Aug 13 23:42:25 UTC 2014


On 8/13/14, 3:28 PM, "Pravin Shelar" <pshelar at nicira.com> wrote:

>On Wed, Aug 13, 2014 at 8:49 AM, Daniele Di Proietto
><ddiproietto at vmware.com> wrote:
>>
>>
>> On 8/12/14, 5:42 PM, "Pravin Shelar" <pshelar at nicira.com> wrote:
>>
>>>On Tue, Jul 22, 2014 at 5:06 PM, Daniele Di Proietto
>>><ddiproietto at vmware.com> wrote:
>>>> ofpbuf_rss() is introduced to get the RSS hash from the NIC. It works
>>>>only for
>>>> packets received by DPDK (otherwise it returns 0, which tells the
>>>>caller to
>>>> compute the hash in another way)
>>>>
>>>> This commit also configure DPDK devices to compute RSS hash for UDP
>>>>packets
>>>>
>>>> Signed-off-by: Daniele Di Proietto <ddiproietto at vmware.com>
>>>> ---
>>>>  lib/netdev-dpdk.c |  3 ++-
>>>>  lib/ofpbuf.h      | 13 +++++++++++++
>>>>  2 files changed, 15 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>>>> index 62c9a0c..44d2dc0 100644
>>>> --- a/lib/netdev-dpdk.c
>>>> +++ b/lib/netdev-dpdk.c
>>>> @@ -96,7 +96,8 @@ static const struct rte_eth_conf port_conf = {
>>>>      .rx_adv_conf = {
>>>>          .rss_conf = {
>>>>              .rss_key = NULL,
>>>> -            .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6,
>>>> +            .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6
>>>> +                      | ETH_RSS_IPV4_UDP,
>>>>          },
>>>>      },
>>>>      .txmode = {
>>>> diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h
>>>> index adaf526..9254c98 100644
>>>> --- a/lib/ofpbuf.h
>>>> +++ b/lib/ofpbuf.h
>>>> @@ -159,6 +159,7 @@ char *ofpbuf_to_string(const struct ofpbuf *,
>>>>size_t maxbytes);
>>>>  static inline struct ofpbuf *ofpbuf_from_list(const struct list *);
>>>>  void ofpbuf_list_delete(struct list *);
>>>>  static inline bool ofpbuf_equal(const struct ofpbuf *, const struct
>>>>ofpbuf *);
>>>> +static inline uint32_t ofpbuf_rss(const struct ofpbuf *);
>>>>
>>>>
>>>>  /* Returns a pointer that may be passed to free() to accomplish the
>>>>same thing
>>>> @@ -389,6 +390,13 @@ static inline void ofpbuf_set_size(struct ofpbuf
>>>>*b, uint32_t v)
>>>>      b->mbuf.pkt.pkt_len = v;     /* Total length of all segments
>>>>linked to
>>>>                                    * this segment. */
>>>>  }
>>>> +static inline uint32_t ofpbuf_rss(const struct ofpbuf * b)
>>>> +{
>>>> +    if (OVS_LIKELY(b->source == OFPBUF_DPDK)) {
>>>> +        return (b)->mbuf.pkt.hash.rss;
>>>> +    }
>>>> +    return 0;
>>>> +}
>>>We need to handle case if buffer is not from dpdk.
>>
>> If the buffer is not from DPDK we just return 0 (which is considered an
>> invalid hash value). Is there anything better we could do?
>>
>
>You can use miniflow_hash_5tuple() to calculate the hash. We also need
>this API for hash action code in dpif-netdev to use DPDK rss rather
>than extracting flow key for every packet.

I am using ofpbuf_rss() like this (in the next commit):

uint32_t hash = ofpbuf_rss(&packets[i]->ofpbuf);
if (OVS_UNLIKELY(!hash)) {
    hash = miniflow_hash_5tuple(&key.flow, 0);
        }

If you think it¹s better we can pass a miniflow pointer and move
miniflow_hash_5tuple() into ofpbuf_rss(), but we¹ll need to include flow.h
into ofpbuf.h or move ofpbuf_rss() to ofpbuf.c




More information about the dev mailing list