Commit 307f0995 authored by Haiyang Zhang's avatar Haiyang Zhang Committed by David S. Miller

hyperv: Add hash value into RNDIS Per-packet info

It passes the hash value as the RNDIS Per-packet info to the Hyper-V host,
so that the send completion notices can be spread across multiple channels.
MS-TFS: 140273
Signed-off-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 915f15ca
...@@ -791,6 +791,7 @@ enum ndis_per_pkt_info_type { ...@@ -791,6 +791,7 @@ enum ndis_per_pkt_info_type {
IEEE_8021Q_INFO, IEEE_8021Q_INFO,
ORIGINAL_PKTINFO, ORIGINAL_PKTINFO,
PACKET_CANCEL_ID, PACKET_CANCEL_ID,
NBL_HASH_VALUE = PACKET_CANCEL_ID,
ORIGINAL_NET_BUFLIST, ORIGINAL_NET_BUFLIST,
CACHED_NET_BUFLIST, CACHED_NET_BUFLIST,
SHORT_PKT_PADINFO, SHORT_PKT_PADINFO,
...@@ -937,6 +938,9 @@ struct ndis_tcp_lso_info { ...@@ -937,6 +938,9 @@ struct ndis_tcp_lso_info {
#define NDIS_LSO_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ #define NDIS_LSO_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
sizeof(struct ndis_tcp_lso_info)) sizeof(struct ndis_tcp_lso_info))
#define NDIS_HASH_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \
sizeof(u32))
/* Format of Information buffer passed in a SetRequest for the OID */ /* Format of Information buffer passed in a SetRequest for the OID */
/* OID_GEN_RNDIS_CONFIG_PARAMETER. */ /* OID_GEN_RNDIS_CONFIG_PARAMETER. */
struct rndis_config_parameter_info { struct rndis_config_parameter_info {
......
...@@ -224,9 +224,11 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb, ...@@ -224,9 +224,11 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,
if (nvsc_dev == NULL || ndev->real_num_tx_queues <= 1) if (nvsc_dev == NULL || ndev->real_num_tx_queues <= 1)
return 0; return 0;
if (netvsc_set_hash(&hash, skb)) if (netvsc_set_hash(&hash, skb)) {
q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] % q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] %
ndev->real_num_tx_queues; ndev->real_num_tx_queues;
skb_set_hash(skb, hash, PKT_HASH_TYPE_L3);
}
return q_idx; return q_idx;
} }
...@@ -384,6 +386,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) ...@@ -384,6 +386,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
struct ndis_tcp_lso_info *lso_info; struct ndis_tcp_lso_info *lso_info;
int hdr_offset; int hdr_offset;
u32 net_trans_info; u32 net_trans_info;
u32 hash;
/* We will atmost need two pages to describe the rndis /* We will atmost need two pages to describe the rndis
...@@ -402,9 +405,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) ...@@ -402,9 +405,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
packet = kzalloc(sizeof(struct hv_netvsc_packet) + packet = kzalloc(sizeof(struct hv_netvsc_packet) +
(num_data_pgs * sizeof(struct hv_page_buffer)) + (num_data_pgs * sizeof(struct hv_page_buffer)) +
sizeof(struct rndis_message) + sizeof(struct rndis_message) +
NDIS_VLAN_PPI_SIZE + NDIS_VLAN_PPI_SIZE + NDIS_CSUM_PPI_SIZE +
NDIS_CSUM_PPI_SIZE + NDIS_LSO_PPI_SIZE + NDIS_HASH_PPI_SIZE, GFP_ATOMIC);
NDIS_LSO_PPI_SIZE, GFP_ATOMIC);
if (!packet) { if (!packet) {
/* out of memory, drop packet */ /* out of memory, drop packet */
netdev_err(net, "unable to allocate hv_netvsc_packet\n"); netdev_err(net, "unable to allocate hv_netvsc_packet\n");
...@@ -443,6 +445,14 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) ...@@ -443,6 +445,14 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
rndis_msg_size = RNDIS_MESSAGE_SIZE(struct rndis_packet); rndis_msg_size = RNDIS_MESSAGE_SIZE(struct rndis_packet);
hash = skb_get_hash_raw(skb);
if (hash != 0 && net->real_num_tx_queues > 1) {
rndis_msg_size += NDIS_HASH_PPI_SIZE;
ppi = init_ppi_data(rndis_msg, NDIS_HASH_PPI_SIZE,
NBL_HASH_VALUE);
*(u32 *)((void *)ppi + ppi->ppi_offset) = hash;
}
if (isvlan) { if (isvlan) {
struct ndis_pkt_8021q_info *vlan; struct ndis_pkt_8021q_info *vlan;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment