On 8/13/14, 3:28 PM, "Pravin Shelar" <pshe...@nicira.com> wrote:
>On Wed, Aug 13, 2014 at 8:49 AM, Daniele Di Proietto ><ddiproie...@vmware.com> wrote: >> >> >> On 8/12/14, 5:42 PM, "Pravin Shelar" <pshe...@nicira.com> wrote: >> >>>On Tue, Jul 22, 2014 at 5:06 PM, Daniele Di Proietto >>><ddiproie...@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 <ddiproie...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev