[ovs-dev] [PATCH v2] dpif-netdev: Check for PKT_RX_RSS_HASH flag.
Pravin Shelar
pshelar at nicira.com
Wed Sep 9 17:56:35 UTC 2015
On Wed, Sep 9, 2015 at 8:45 AM, Daniele Di Proietto
<diproiettod at vmware.com> wrote:
> DPDK mbufs contain a valid RSS hash only if PKT_RX_RSS_HASH is
> set in 'ol_flags'. Otherwise the hash is garbage and doesn't
> relate to the packet.
>
> This fixes an issue with vhost, which, being a virtual NIC, doesn't
> compute the hash.
>
> Reported-by: Dongjun <dongj at dtdream.com>
> Suggested-by: Flavio Leitner <fbl at sysclose.org>
> Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
> ---
> v1 -> v2:
>
> * Added a comment above dp_packet_get_rss_hash()
> * Added an OVS_UNUSED attribute on dp_packet_rss_valid()
> ---
> lib/dp-packet.h | 13 +++++++++++++
> lib/dpif-netdev.c | 2 +-
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/lib/dp-packet.h b/lib/dp-packet.h
> index e4c2593..5532bee 100644
> --- a/lib/dp-packet.h
> +++ b/lib/dp-packet.h
> @@ -514,6 +514,8 @@ dp_packet_reset_packet(struct dp_packet *b, int off)
> b->l2_5_ofs = b->l3_ofs = b->l4_ofs = UINT16_MAX;
> }
>
> +/* Returns the RSS hash of the packet 'p'. Note that the returned value is
> + * correct only if 'dp_packet_rss_valid(p)' returns true */
> static inline uint32_t
> dp_packet_get_rss_hash(struct dp_packet *p)
> {
> @@ -529,11 +531,22 @@ dp_packet_set_rss_hash(struct dp_packet *p, uint32_t hash)
> {
> #ifdef DPDK_NETDEV
> p->mbuf.hash.rss = hash;
> + p->mbuf.ol_flags |= PKT_RX_RSS_HASH;
> #else
> p->rss_hash = hash;
> #endif
> }
>
> +static inline bool
> +dp_packet_rss_valid(struct dp_packet *p OVS_UNUSED)
> +{
> +#ifdef DPDK_NETDEV
> + return p->mbuf.ol_flags & PKT_RX_RSS_HASH;
> +#else
> + return true;
> +#endif
> +}
> +
> #ifdef __cplusplus
> }
> #endif
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index db76290..490ced3 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -3100,7 +3100,7 @@ dpif_netdev_packet_get_rss_hash(struct dp_packet *packet,
> {
> uint32_t hash, recirc_depth;
>
> - hash = dp_packet_get_rss_hash(packet);
> + hash = dp_packet_rss_valid(packet) ? dp_packet_get_rss_hash(packet) : 0;
> if (OVS_UNLIKELY(!hash)) {
With new valid hash bit, zero hash should be a valid hash value.
> hash = miniflow_hash_5tuple(mf, 0);
> dp_packet_set_rss_hash(packet, hash);
> --
> 2.1.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list