hv_netvsc: Eliminate send_completion_tid from struct hv_netvsc_packet
authorKY Srinivasan <kys@microsoft.com>
Wed, 2 Dec 2015 00:43:14 +0000 (16:43 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Dec 2015 04:43:25 +0000 (23:43 -0500)
Eliminate send_completion_tid from struct hv_netvsc_packet.

Signed-off-by: K. Y. Srinivasan <kys@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 c7517b146b4fc32385e4b7c2bbfa620a3d34529b..eebfbe5f2f3d9064c60d1d07514d03ff9d9af186 100644 (file)
@@ -145,10 +145,6 @@ struct hv_netvsc_packet {
        u32 send_buf_index;
 
        u32 total_data_buflen;
-       u32 pad1;
-
-
-       u64 send_completion_tid;
 };
 
 struct netvsc_device_info {
@@ -187,10 +183,10 @@ int netvsc_device_remove(struct hv_device *device);
 int netvsc_send(struct hv_device *device,
                struct hv_netvsc_packet *packet,
                struct rndis_message *rndis_msg,
-               struct hv_page_buffer **page_buffer);
+               struct hv_page_buffer **page_buffer,
+               struct sk_buff *skb);
 void netvsc_linkstatus_callback(struct hv_device *device_obj,
                                struct rndis_message *resp);
-void netvsc_xmit_completion(void *context);
 int netvsc_recv_callback(struct hv_device *device_obj,
                        struct hv_netvsc_packet *packet,
                        void **data,
index 18058a593b356bf36d934b817ac0a1d49bc57b5f..d18e10cceced1558d86e6d56fe86abc916f22b5a 100644 (file)
@@ -614,6 +614,7 @@ static void netvsc_send_completion(struct netvsc_device *net_device,
        struct hv_netvsc_packet *nvsc_packet;
        struct net_device *ndev;
        u32 send_index;
+       struct sk_buff *skb;
 
        ndev = net_device->ndev;
 
@@ -639,17 +640,17 @@ static void netvsc_send_completion(struct netvsc_device *net_device,
                int queue_sends;
 
                /* Get the send context */
-               nvsc_packet = (struct hv_netvsc_packet *)(unsigned long)
-                       packet->trans_id;
+               skb = (struct sk_buff *)(unsigned long)packet->trans_id;
 
                /* Notify the layer above us */
-               if (nvsc_packet) {
+               if (skb) {
+                       nvsc_packet = (struct hv_netvsc_packet *) skb->cb;
                        send_index = nvsc_packet->send_buf_index;
                        if (send_index != NETVSC_INVALID_INDEX)
                                netvsc_free_send_slot(net_device, send_index);
                        q_idx = nvsc_packet->q_idx;
                        channel = incoming_channel;
-                       netvsc_xmit_completion(nvsc_packet);
+                       dev_kfree_skb_any(skb);
                }
 
                num_outstanding_sends =
@@ -744,7 +745,8 @@ static u32 netvsc_copy_to_send_buf(struct netvsc_device *net_device,
 static inline int netvsc_send_pkt(
        struct hv_netvsc_packet *packet,
        struct netvsc_device *net_device,
-       struct hv_page_buffer **pb)
+       struct hv_page_buffer **pb,
+       struct sk_buff *skb)
 {
        struct nvsp_message nvmsg;
        u16 q_idx = packet->q_idx;
@@ -772,10 +774,7 @@ static inline int netvsc_send_pkt(
                nvmsg.msg.v1_msg.send_rndis_pkt.send_buf_section_size =
                        packet->total_data_buflen;
 
-       if (packet->completion_func)
-               req_id = (ulong)packet;
-       else
-               req_id = 0;
+       req_id = (ulong)skb;
 
        if (out_channel->rescind)
                return -ENODEV;
@@ -841,7 +840,8 @@ static inline int netvsc_send_pkt(
 int netvsc_send(struct hv_device *device,
                struct hv_netvsc_packet *packet,
                struct rndis_message *rndis_msg,
-               struct hv_page_buffer **pb)
+               struct hv_page_buffer **pb,
+               struct sk_buff *skb)
 {
        struct netvsc_device *net_device;
        int ret = 0, m_ret = 0;
@@ -907,7 +907,7 @@ int netvsc_send(struct hv_device *device,
                }
 
                if (msdp->pkt)
-                       netvsc_xmit_completion(msdp->pkt);
+                       dev_kfree_skb_any(skb);
 
                if (packet->xmit_more && !packet->cp_partial) {
                        msdp->pkt = packet;
@@ -925,17 +925,17 @@ int netvsc_send(struct hv_device *device,
        }
 
        if (msd_send) {
-               m_ret = netvsc_send_pkt(msd_send, net_device, pb);
+               m_ret = netvsc_send_pkt(msd_send, net_device, pb, skb);
 
                if (m_ret != 0) {
                        netvsc_free_send_slot(net_device,
                                              msd_send->send_buf_index);
-                       netvsc_xmit_completion(msd_send);
+                       dev_kfree_skb_any(skb);
                }
        }
 
        if (cur_send)
-               ret = netvsc_send_pkt(cur_send, net_device, pb);
+               ret = netvsc_send_pkt(cur_send, net_device, pb, skb);
 
        if (ret != 0 && section_index != NETVSC_INVALID_INDEX)
                netvsc_free_send_slot(net_device, section_index);
index eca669257360da3c70e2139ac52d8023a60fbf7d..c1078a62a23163c1843afeb3b08e9d170b6debf8 100644 (file)
@@ -279,16 +279,6 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,
        return q_idx;
 }
 
-void netvsc_xmit_completion(void *context)
-{
-       struct hv_netvsc_packet *packet = (struct hv_netvsc_packet *)context;
-       struct sk_buff *skb = (struct sk_buff *)
-               (unsigned long)packet->send_completion_tid;
-
-       if (skb)
-               dev_kfree_skb_any(skb);
-}
-
 static u32 fill_pg_buf(struct page *page, u32 offset, u32 len,
                        struct hv_page_buffer *pb)
 {
@@ -497,7 +487,6 @@ check_size:
 
        /* Set the completion routine */
        packet->completion_func = 1;
-       packet->send_completion_tid = (unsigned long)skb;
 
        isvlan = packet->vlan_tci & VLAN_TAG_PRESENT;
 
@@ -625,7 +614,8 @@ do_send:
        packet->page_buf_cnt = init_page_array(rndis_msg, rndis_msg_size,
                                               skb, packet, &pb);
 
-       ret = netvsc_send(net_device_ctx->device_ctx, packet, rndis_msg, &pb);
+       ret = netvsc_send(net_device_ctx->device_ctx, packet,
+                         rndis_msg, &pb, skb);
 
 drop:
        if (ret == 0) {
index 6ff22530488fba5de0289f211ee32f9fcf5e69de..53139f7efcb913a6a7678150b430848f65d81573 100644 (file)
@@ -240,7 +240,7 @@ static int rndis_filter_send_request(struct rndis_device *dev,
        packet->completion_func = 0;
        packet->xmit_more = false;
 
-       ret = netvsc_send(dev->net_dev->dev, packet, NULL, &pb);
+       ret = netvsc_send(dev->net_dev->dev, packet, NULL, &pb, NULL);
        return ret;
 }