aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/hyperv
diff options
context:
space:
mode:
authorKY Srinivasan <kys@microsoft.com>2014-02-16 19:38:44 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-17 16:32:32 -0500
commit97c1723a6177790a3a5b8c1173ed0b03571d4e06 (patch)
treecbe5ecb3b37976d20fa96f2848fe6eaabcbefc7d /drivers/net/hyperv
parent86eedacc63074dbf304ce9c8b261bef9503c796d (diff)
Drivers: net: hyperv: Cleanup the receive path
Make the receive path a little more efficient by parameterizing the required state rather than re-establishing that state. 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>
Diffstat (limited to 'drivers/net/hyperv')
-rw-r--r--drivers/net/hyperv/netvsc.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 03a2c6e17158..7fa2bbade327 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -432,17 +432,14 @@ static inline u32 hv_ringbuf_avail_percent(
432 return avail_write * 100 / ring_info->ring_datasize; 432 return avail_write * 100 / ring_info->ring_datasize;
433} 433}
434 434
435static void netvsc_send_completion(struct hv_device *device, 435static void netvsc_send_completion(struct netvsc_device *net_device,
436 struct hv_device *device,
436 struct vmpacket_descriptor *packet) 437 struct vmpacket_descriptor *packet)
437{ 438{
438 struct netvsc_device *net_device;
439 struct nvsp_message *nvsp_packet; 439 struct nvsp_message *nvsp_packet;
440 struct hv_netvsc_packet *nvsc_packet; 440 struct hv_netvsc_packet *nvsc_packet;
441 struct net_device *ndev; 441 struct net_device *ndev;
442 442
443 net_device = get_inbound_net_device(device);
444 if (!net_device)
445 return;
446 ndev = net_device->ndev; 443 ndev = net_device->ndev;
447 444
448 nvsp_packet = (struct nvsp_message *)((unsigned long)packet + 445 nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
@@ -561,13 +558,13 @@ int netvsc_send(struct hv_device *device,
561} 558}
562 559
563static void netvsc_send_recv_completion(struct hv_device *device, 560static void netvsc_send_recv_completion(struct hv_device *device,
561 struct netvsc_device *net_device,
564 u64 transaction_id, u32 status) 562 u64 transaction_id, u32 status)
565{ 563{
566 struct nvsp_message recvcompMessage; 564 struct nvsp_message recvcompMessage;
567 int retries = 0; 565 int retries = 0;
568 int ret; 566 int ret;
569 struct net_device *ndev; 567 struct net_device *ndev;
570 struct netvsc_device *net_device = hv_get_drvdata(device);
571 568
572 ndev = net_device->ndev; 569 ndev = net_device->ndev;
573 570
@@ -653,14 +650,15 @@ static void netvsc_receive_completion(void *context)
653 650
654 /* Send a receive completion for the xfer page packet */ 651 /* Send a receive completion for the xfer page packet */
655 if (fsend_receive_comp) 652 if (fsend_receive_comp)
656 netvsc_send_recv_completion(device, transaction_id, status); 653 netvsc_send_recv_completion(device, net_device, transaction_id,
654 status);
657 655
658} 656}
659 657
660static void netvsc_receive(struct hv_device *device, 658static void netvsc_receive(struct netvsc_device *net_device,
661 struct vmpacket_descriptor *packet) 659 struct hv_device *device,
660 struct vmpacket_descriptor *packet)
662{ 661{
663 struct netvsc_device *net_device;
664 struct vmtransfer_page_packet_header *vmxferpage_packet; 662 struct vmtransfer_page_packet_header *vmxferpage_packet;
665 struct nvsp_message *nvsp_packet; 663 struct nvsp_message *nvsp_packet;
666 struct hv_netvsc_packet *netvsc_packet = NULL; 664 struct hv_netvsc_packet *netvsc_packet = NULL;
@@ -673,9 +671,6 @@ static void netvsc_receive(struct hv_device *device,
673 671
674 LIST_HEAD(listHead); 672 LIST_HEAD(listHead);
675 673
676 net_device = get_inbound_net_device(device);
677 if (!net_device)
678 return;
679 ndev = net_device->ndev; 674 ndev = net_device->ndev;
680 675
681 /* 676 /*
@@ -741,7 +736,7 @@ static void netvsc_receive(struct hv_device *device,
741 spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, 736 spin_unlock_irqrestore(&net_device->recv_pkt_list_lock,
742 flags); 737 flags);
743 738
744 netvsc_send_recv_completion(device, 739 netvsc_send_recv_completion(device, net_device,
745 vmxferpage_packet->d.trans_id, 740 vmxferpage_packet->d.trans_id,
746 NVSP_STAT_FAIL); 741 NVSP_STAT_FAIL);
747 742
@@ -825,11 +820,13 @@ static void netvsc_channel_cb(void *context)
825 desc = (struct vmpacket_descriptor *)buffer; 820 desc = (struct vmpacket_descriptor *)buffer;
826 switch (desc->type) { 821 switch (desc->type) {
827 case VM_PKT_COMP: 822 case VM_PKT_COMP:
828 netvsc_send_completion(device, desc); 823 netvsc_send_completion(net_device,
824 device, desc);
829 break; 825 break;
830 826
831 case VM_PKT_DATA_USING_XFER_PAGES: 827 case VM_PKT_DATA_USING_XFER_PAGES:
832 netvsc_receive(device, desc); 828 netvsc_receive(net_device,
829 device, desc);
833 break; 830 break;
834 831
835 default: 832 default: