diff options
author | KY Srinivasan <kys@microsoft.com> | 2014-02-16 19:38:44 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-17 16:32:32 -0500 |
commit | 97c1723a6177790a3a5b8c1173ed0b03571d4e06 (patch) | |
tree | cbe5ecb3b37976d20fa96f2848fe6eaabcbefc7d /drivers/net/hyperv | |
parent | 86eedacc63074dbf304ce9c8b261bef9503c796d (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.c | 29 |
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 | ||
435 | static void netvsc_send_completion(struct hv_device *device, | 435 | static 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 | ||
563 | static void netvsc_send_recv_completion(struct hv_device *device, | 560 | static 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 | ||
660 | static void netvsc_receive(struct hv_device *device, | 658 | static 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: |