Commit 25b85ee8 authored by KY Srinivasan's avatar KY Srinivasan Committed by David S. Miller

hv_netvsc: Eliminate the channel field in hv_netvsc_packet structure

Eliminate the channel field in hv_netvsc_packet structure.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 934d2022
...@@ -144,7 +144,6 @@ struct hv_netvsc_packet { ...@@ -144,7 +144,6 @@ struct hv_netvsc_packet {
u32 total_data_buflen; u32 total_data_buflen;
u32 pad1; u32 pad1;
struct vmbus_channel *channel;
u64 send_completion_tid; u64 send_completion_tid;
void *send_completion_ctx; void *send_completion_ctx;
...@@ -198,7 +197,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, ...@@ -198,7 +197,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
void netvsc_xmit_completion(void *context); void netvsc_xmit_completion(void *context);
int netvsc_recv_callback(struct hv_device *device_obj, int netvsc_recv_callback(struct hv_device *device_obj,
struct hv_netvsc_packet *packet, struct hv_netvsc_packet *packet,
struct ndis_tcp_ip_checksum_info *csum_info); struct ndis_tcp_ip_checksum_info *csum_info,
struct vmbus_channel *channel);
void netvsc_channel_cb(void *context); void netvsc_channel_cb(void *context);
int rndis_filter_open(struct hv_device *dev); int rndis_filter_open(struct hv_device *dev);
int rndis_filter_close(struct hv_device *dev); int rndis_filter_close(struct hv_device *dev);
...@@ -206,12 +206,12 @@ int rndis_filter_device_add(struct hv_device *dev, ...@@ -206,12 +206,12 @@ int rndis_filter_device_add(struct hv_device *dev,
void *additional_info); void *additional_info);
void rndis_filter_device_remove(struct hv_device *dev); void rndis_filter_device_remove(struct hv_device *dev);
int rndis_filter_receive(struct hv_device *dev, int rndis_filter_receive(struct hv_device *dev,
struct hv_netvsc_packet *pkt); struct hv_netvsc_packet *pkt,
struct vmbus_channel *channel);
int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter); int rndis_filter_set_packet_filter(struct rndis_device *dev, u32 new_filter);
int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac); int rndis_filter_set_device_mac(struct hv_device *hdev, char *mac);
#define NVSP_INVALID_PROTOCOL_VERSION ((u32)0xFFFFFFFF) #define NVSP_INVALID_PROTOCOL_VERSION ((u32)0xFFFFFFFF)
#define NVSP_PROTOCOL_VERSION_1 2 #define NVSP_PROTOCOL_VERSION_1 2
...@@ -1274,5 +1274,19 @@ struct rndis_message { ...@@ -1274,5 +1274,19 @@ struct rndis_message {
#define TRANSPORT_INFO_IPV6_TCP ((INFO_IPV6 << 16) | INFO_TCP) #define TRANSPORT_INFO_IPV6_TCP ((INFO_IPV6 << 16) | INFO_TCP)
#define TRANSPORT_INFO_IPV6_UDP ((INFO_IPV6 << 16) | INFO_UDP) #define TRANSPORT_INFO_IPV6_UDP ((INFO_IPV6 << 16) | INFO_UDP)
static inline struct vmbus_channel *get_channel(struct hv_netvsc_packet *packet,
struct netvsc_device *net_device)
{
struct vmbus_channel *out_channel;
out_channel = net_device->chn_table[packet->q_idx];
if (!out_channel) {
out_channel = net_device->dev->channel;
packet->q_idx = 0;
}
return out_channel;
}
#endif /* _HYPERV_NET_H */ #endif /* _HYPERV_NET_H */
...@@ -610,6 +610,7 @@ static inline void netvsc_free_send_slot(struct netvsc_device *net_device, ...@@ -610,6 +610,7 @@ static inline void netvsc_free_send_slot(struct netvsc_device *net_device,
} }
static void netvsc_send_completion(struct netvsc_device *net_device, static void netvsc_send_completion(struct netvsc_device *net_device,
struct vmbus_channel *incoming_channel,
struct hv_device *device, struct hv_device *device,
struct vmpacket_descriptor *packet) struct vmpacket_descriptor *packet)
{ {
...@@ -651,7 +652,7 @@ static void netvsc_send_completion(struct netvsc_device *net_device, ...@@ -651,7 +652,7 @@ static void netvsc_send_completion(struct netvsc_device *net_device,
if (send_index != NETVSC_INVALID_INDEX) if (send_index != NETVSC_INVALID_INDEX)
netvsc_free_send_slot(net_device, send_index); netvsc_free_send_slot(net_device, send_index);
q_idx = nvsc_packet->q_idx; q_idx = nvsc_packet->q_idx;
channel = nvsc_packet->channel; channel = incoming_channel;
nvsc_packet->send_completion(nvsc_packet-> nvsc_packet->send_completion(nvsc_packet->
send_completion_ctx); send_completion_ctx);
} }
...@@ -748,7 +749,7 @@ static inline int netvsc_send_pkt( ...@@ -748,7 +749,7 @@ static inline int netvsc_send_pkt(
struct netvsc_device *net_device) struct netvsc_device *net_device)
{ {
struct nvsp_message nvmsg; struct nvsp_message nvmsg;
struct vmbus_channel *out_channel = packet->channel; struct vmbus_channel *out_channel = get_channel(packet, net_device);
u16 q_idx = packet->q_idx; u16 q_idx = packet->q_idx;
struct net_device *ndev = net_device->ndev; struct net_device *ndev = net_device->ndev;
u64 req_id; u64 req_id;
...@@ -857,13 +858,9 @@ int netvsc_send(struct hv_device *device, ...@@ -857,13 +858,9 @@ int netvsc_send(struct hv_device *device,
if (!net_device) if (!net_device)
return -ENODEV; return -ENODEV;
out_channel = net_device->chn_table[q_idx]; out_channel = get_channel(packet, net_device);
if (!out_channel) { q_idx = packet->q_idx;
out_channel = device->channel;
q_idx = 0;
packet->q_idx = 0;
}
packet->channel = out_channel;
packet->send_buf_index = NETVSC_INVALID_INDEX; packet->send_buf_index = NETVSC_INVALID_INDEX;
packet->cp_partial = false; packet->cp_partial = false;
...@@ -1043,7 +1040,6 @@ static void netvsc_receive(struct netvsc_device *net_device, ...@@ -1043,7 +1040,6 @@ static void netvsc_receive(struct netvsc_device *net_device,
} }
count = vmxferpage_packet->range_cnt; count = vmxferpage_packet->range_cnt;
netvsc_packet->channel = channel;
/* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */ /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
...@@ -1055,7 +1051,7 @@ static void netvsc_receive(struct netvsc_device *net_device, ...@@ -1055,7 +1051,7 @@ static void netvsc_receive(struct netvsc_device *net_device,
vmxferpage_packet->ranges[i].byte_count; vmxferpage_packet->ranges[i].byte_count;
/* Pass it to the upper layer */ /* Pass it to the upper layer */
rndis_filter_receive(device, netvsc_packet); rndis_filter_receive(device, netvsc_packet, channel);
if (netvsc_packet->status != NVSP_STAT_SUCCESS) if (netvsc_packet->status != NVSP_STAT_SUCCESS)
status = NVSP_STAT_FAIL; status = NVSP_STAT_FAIL;
...@@ -1150,6 +1146,7 @@ void netvsc_channel_cb(void *context) ...@@ -1150,6 +1146,7 @@ void netvsc_channel_cb(void *context)
switch (desc->type) { switch (desc->type) {
case VM_PKT_COMP: case VM_PKT_COMP:
netvsc_send_completion(net_device, netvsc_send_completion(net_device,
channel,
device, desc); device, desc);
break; break;
......
...@@ -683,7 +683,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj, ...@@ -683,7 +683,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
*/ */
int netvsc_recv_callback(struct hv_device *device_obj, int netvsc_recv_callback(struct hv_device *device_obj,
struct hv_netvsc_packet *packet, struct hv_netvsc_packet *packet,
struct ndis_tcp_ip_checksum_info *csum_info) struct ndis_tcp_ip_checksum_info *csum_info,
struct vmbus_channel *channel)
{ {
struct net_device *net; struct net_device *net;
struct net_device_context *net_device_ctx; struct net_device_context *net_device_ctx;
...@@ -729,7 +730,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, ...@@ -729,7 +730,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
packet->vlan_tci); packet->vlan_tci);
skb_record_rx_queue(skb, packet->channel-> skb_record_rx_queue(skb, channel->
offermsg.offer.sub_channel_index); offermsg.offer.sub_channel_index);
u64_stats_update_begin(&rx_stats->syncp); u64_stats_update_begin(&rx_stats->syncp);
......
...@@ -350,7 +350,8 @@ static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type) ...@@ -350,7 +350,8 @@ static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)
static void rndis_filter_receive_data(struct rndis_device *dev, static void rndis_filter_receive_data(struct rndis_device *dev,
struct rndis_message *msg, struct rndis_message *msg,
struct hv_netvsc_packet *pkt) struct hv_netvsc_packet *pkt,
struct vmbus_channel *channel)
{ {
struct rndis_packet *rndis_pkt; struct rndis_packet *rndis_pkt;
u32 data_offset; u32 data_offset;
...@@ -393,11 +394,12 @@ static void rndis_filter_receive_data(struct rndis_device *dev, ...@@ -393,11 +394,12 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
} }
csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO); csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
netvsc_recv_callback(dev->net_dev->dev, pkt, csum_info); netvsc_recv_callback(dev->net_dev->dev, pkt, csum_info, channel);
} }
int rndis_filter_receive(struct hv_device *dev, int rndis_filter_receive(struct hv_device *dev,
struct hv_netvsc_packet *pkt) struct hv_netvsc_packet *pkt,
struct vmbus_channel *channel)
{ {
struct netvsc_device *net_dev = hv_get_drvdata(dev); struct netvsc_device *net_dev = hv_get_drvdata(dev);
struct rndis_device *rndis_dev; struct rndis_device *rndis_dev;
...@@ -436,7 +438,7 @@ int rndis_filter_receive(struct hv_device *dev, ...@@ -436,7 +438,7 @@ int rndis_filter_receive(struct hv_device *dev,
switch (rndis_msg->ndis_msg_type) { switch (rndis_msg->ndis_msg_type) {
case RNDIS_MSG_PACKET: case RNDIS_MSG_PACKET:
/* data msg */ /* data msg */
rndis_filter_receive_data(rndis_dev, rndis_msg, pkt); rndis_filter_receive_data(rndis_dev, rndis_msg, pkt, channel);
break; break;
case RNDIS_MSG_INIT_C: case RNDIS_MSG_INIT_C:
......
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