Skip to content

Commit

Permalink
hv_netvsc: Exclude non-TCP port numbers from vRSS hashing
Browse files Browse the repository at this point in the history
Azure hosts are not supporting non-TCP port numbers in vRSS hashing for
now. For example, UDP packet loss rate will be high if port numbers are
also included in vRSS hash.

So, we created this patch to use only IP numbers for hashing in non-TCP
traffic.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Haiyang Zhang authored and David S. Miller committed Apr 17, 2017
1 parent 8db91f6 commit f72860a
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion drivers/net/hyperv/netvsc_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,44 @@ static void *init_ppi_data(struct rndis_message *msg, u32 ppi_size,
return ppi;
}

/* Azure hosts don't support non-TCP port numbers in hashing yet. We compute
* hash for non-TCP traffic with only IP numbers.
*/
static inline u32 netvsc_get_hash(struct sk_buff *skb, struct sock *sk)
{
struct flow_keys flow;
u32 hash;
static u32 hashrnd __read_mostly;

net_get_random_once(&hashrnd, sizeof(hashrnd));

if (!skb_flow_dissect_flow_keys(skb, &flow, 0))
return 0;

if (flow.basic.ip_proto == IPPROTO_TCP) {
return skb_get_hash(skb);
} else {
if (flow.basic.n_proto == htons(ETH_P_IP))
hash = jhash2((u32 *)&flow.addrs.v4addrs, 2, hashrnd);
else if (flow.basic.n_proto == htons(ETH_P_IPV6))
hash = jhash2((u32 *)&flow.addrs.v6addrs, 8, hashrnd);
else
hash = 0;

skb_set_hash(skb, hash, PKT_HASH_TYPE_L3);
}

return hash;
}

static inline int netvsc_get_tx_queue(struct net_device *ndev,
struct sk_buff *skb, int old_idx)
{
const struct net_device_context *ndc = netdev_priv(ndev);
struct sock *sk = skb->sk;
int q_idx;

q_idx = ndc->tx_send_table[skb_get_hash(skb) &
q_idx = ndc->tx_send_table[netvsc_get_hash(skb, sk) &
(VRSS_SEND_TAB_SIZE - 1)];

/* If queue index changed record the new value */
Expand Down

0 comments on commit f72860a

Please sign in to comment.