ACK: [azure][PATCH] hv_netvsc: Exclude non-TCP port numbers from vRSS hashing

Stefan Bader stefan.bader at canonical.com
Thu Jul 27 14:43:19 UTC 2017


On 25.07.2017 22:05, Marcelo Henrique Cerri wrote:
> From: Haiyang Zhang <haiyangz at microsoft.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1690174
> 
> 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 at microsoft.com>
> Reviewed-by: Stephen Hemminger <sthemmin at microsoft.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit f72860afa2e32cdc674cbdd7f354f8fb62e908a6)
> Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>

> ---
>  drivers/net/hyperv/netvsc_drv.c | 32 +++++++++++++++++++++++++++++++-
>  1 file changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
> index 68a9b8bf5eb6..43b838c863cb 100644
> --- a/drivers/net/hyperv/netvsc_drv.c
> +++ b/drivers/net/hyperv/netvsc_drv.c
> @@ -191,6 +191,36 @@ 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)
>  {
> @@ -198,7 +228,7 @@ static inline int netvsc_get_tx_queue(struct net_device *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 */
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20170727/581a9397/attachment.sig>


More information about the kernel-team mailing list