hv_netvsc: Eliminate the channel field in hv_netvsc_packet structure
authorKY Srinivasan <kys@microsoft.com>
Wed, 2 Dec 2015 00:43:05 +0000 (16:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 04:43:23 +0000 (23:43 -0500)
Eliminate the channel field in hv_netvsc_packet structure.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc.c
drivers/net/hyperv/netvsc_drv.c
drivers/net/hyperv/rndis_filter.c

index 3f66a23dd94f0166446da2ddcaac46db5e942249..6bb1acd2a81c53f9829ed3877b4cfdadf9339791 100644 (file)
@@ -144,7 +144,6 @@ struct hv_netvsc_packet {
        u32 total_data_buflen;
        u32 pad1;
 
-       struct vmbus_channel *channel;
 
        u64 send_completion_tid;
        void *send_completion_ctx;
@@ -198,7 +197,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
 void netvsc_xmit_completion(void *context);
 int netvsc_recv_callback(struct hv_device *device_obj,
                        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);
 int rndis_filter_open(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,
                        void *additional_info);
 void rndis_filter_device_remove(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_device_mac(struct hv_device *hdev, char *mac);
 
-
 #define NVSP_INVALID_PROTOCOL_VERSION  ((u32)0xFFFFFFFF)
 
 #define NVSP_PROTOCOL_VERSION_1                2
@@ -1274,5 +1274,19 @@ struct rndis_message {
 #define TRANSPORT_INFO_IPV6_TCP ((INFO_IPV6 << 16) | INFO_TCP)
 #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 */
index 51e4c0fd0a7480c4c705a79a9cf8ec2f627862f9..52533edbd2b049ac6bb1ab307cd99f70c642156e 100644 (file)
@@ -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,
+                                  struct vmbus_channel *incoming_channel,
                                   struct hv_device *device,
                                   struct vmpacket_descriptor *packet)
 {
@@ -651,7 +652,7 @@ static void netvsc_send_completion(struct netvsc_device *net_device,
                        if (send_index != NETVSC_INVALID_INDEX)
                                netvsc_free_send_slot(net_device, send_index);
                        q_idx = nvsc_packet->q_idx;
-                       channel = nvsc_packet->channel;
+                       channel = incoming_channel;
                        nvsc_packet->send_completion(nvsc_packet->
                                                     send_completion_ctx);
                }
@@ -748,7 +749,7 @@ static inline int netvsc_send_pkt(
        struct netvsc_device *net_device)
 {
        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;
        struct net_device *ndev = net_device->ndev;
        u64 req_id;
@@ -857,13 +858,9 @@ int netvsc_send(struct hv_device *device,
        if (!net_device)
                return -ENODEV;
 
-       out_channel = net_device->chn_table[q_idx];
-       if (!out_channel) {
-               out_channel = device->channel;
-               q_idx = 0;
-               packet->q_idx = 0;
-       }
-       packet->channel = out_channel;
+       out_channel = get_channel(packet, net_device);
+       q_idx = packet->q_idx;
+
        packet->send_buf_index = NETVSC_INVALID_INDEX;
        packet->cp_partial = false;
 
@@ -1043,7 +1040,6 @@ static void netvsc_receive(struct netvsc_device *net_device,
        }
 
        count = vmxferpage_packet->range_cnt;
-       netvsc_packet->channel = channel;
 
        /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
        for (i = 0; i < count; i++) {
@@ -1055,7 +1051,7 @@ static void netvsc_receive(struct netvsc_device *net_device,
                                        vmxferpage_packet->ranges[i].byte_count;
 
                /* 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)
                        status = NVSP_STAT_FAIL;
@@ -1150,6 +1146,7 @@ void netvsc_channel_cb(void *context)
                                switch (desc->type) {
                                case VM_PKT_COMP:
                                        netvsc_send_completion(net_device,
+                                                               channel,
                                                                device, desc);
                                        break;
 
index 268a05821d46c5604f0e44447e8fbe48ccd3b2da..c8f294ee347be9028864dc8a0276da4c5447870f 100644 (file)
@@ -683,7 +683,8 @@ void netvsc_linkstatus_callback(struct hv_device *device_obj,
  */
 int netvsc_recv_callback(struct hv_device *device_obj,
                                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_context *net_device_ctx;
@@ -729,7 +730,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
                __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
                                       packet->vlan_tci);
 
-       skb_record_rx_queue(skb, packet->channel->
+       skb_record_rx_queue(skb, channel->
                            offermsg.offer.sub_channel_index);
 
        u64_stats_update_begin(&rx_stats->syncp);
index 5931a799aa17860de8fd8122636cf41db5761122..1b04d78bc7b9ed88dcb59dc5b00ead0d6d4147d5 100644 (file)
@@ -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,
                                   struct rndis_message *msg,
-                                  struct hv_netvsc_packet *pkt)
+                                  struct hv_netvsc_packet *pkt,
+                                  struct vmbus_channel *channel)
 {
        struct rndis_packet *rndis_pkt;
        u32 data_offset;
@@ -393,11 +394,12 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
        }
 
        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,
-                               struct hv_netvsc_packet *pkt)
+                               struct hv_netvsc_packet *pkt,
+                               struct vmbus_channel *channel)
 {
        struct netvsc_device *net_dev = hv_get_drvdata(dev);
        struct rndis_device *rndis_dev;
@@ -436,7 +438,7 @@ int rndis_filter_receive(struct hv_device *dev,
        switch (rndis_msg->ndis_msg_type) {
        case RNDIS_MSG_PACKET:
                /* data msg */
-               rndis_filter_receive_data(rndis_dev, rndis_msg, pkt);
+               rndis_filter_receive_data(rndis_dev, rndis_msg, pkt, channel);
                break;
 
        case RNDIS_MSG_INIT_C: