summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/vmxnet3.c
diff options
context:
space:
mode:
authorMichael Brown2014-12-12 11:16:26 +0100
committerMichael Brown2014-12-12 11:18:03 +0100
commitd08547309b8c2fe0f24034355a511fa9afb7a76c (patch)
tree984242d52cbc8274bc370e220c59bb3d05f57ecb /src/drivers/net/vmxnet3.c
parent[crypto] Fix parsing of OCSP responder ID key hash (diff)
downloadipxe-d08547309b8c2fe0f24034355a511fa9afb7a76c.tar.gz
ipxe-d08547309b8c2fe0f24034355a511fa9afb7a76c.tar.xz
ipxe-d08547309b8c2fe0f24034355a511fa9afb7a76c.zip
[vmxnet3] Add profiling code to exclude time spent in the hypervisor
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/vmxnet3.c')
-rw-r--r--src/drivers/net/vmxnet3.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/drivers/net/vmxnet3.c b/src/drivers/net/vmxnet3.c
index 57013fb9..31082bf6 100644
--- a/src/drivers/net/vmxnet3.c
+++ b/src/drivers/net/vmxnet3.c
@@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/pci.h>
#include <ipxe/io.h>
#include <ipxe/malloc.h>
+#include <ipxe/profile.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include <ipxe/if_ether.h>
@@ -39,6 +40,22 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/
+/** VM command profiler */
+static struct profiler vmxnet3_vm_command_profiler __profiler =
+ { .name = "vmxnet3.vm_command" };
+
+/** VM transmit profiler */
+static struct profiler vmxnet3_vm_tx_profiler __profiler =
+ { .name = "vmxnet3.vm_tx" };
+
+/** VM receive refill profiler */
+static struct profiler vmxnet3_vm_refill_profiler __profiler =
+ { .name = "vmxnet3.vm_refill" };
+
+/** VM event profiler */
+static struct profiler vmxnet3_vm_event_profiler __profiler =
+ { .name = "vmxnet3.vm_event" };
+
/**
* Issue command
*
@@ -48,10 +65,16 @@ FILE_LICENCE ( GPL2_OR_LATER );
*/
static inline uint32_t vmxnet3_command ( struct vmxnet3_nic *vmxnet,
uint32_t command ) {
+ uint32_t result;
/* Issue command */
+ profile_start ( &vmxnet3_vm_command_profiler );
writel ( command, ( vmxnet->vd + VMXNET3_VD_CMD ) );
- return readl ( vmxnet->vd + VMXNET3_VD_CMD );
+ result = readl ( vmxnet->vd + VMXNET3_VD_CMD );
+ profile_stop ( &vmxnet3_vm_command_profiler );
+ profile_exclude ( &vmxnet3_vm_command_profiler );
+
+ return result;
}
/**
@@ -92,8 +115,11 @@ static int vmxnet3_transmit ( struct net_device *netdev,
/* Hand over descriptor to NIC */
wmb();
+ profile_start ( &vmxnet3_vm_tx_profiler );
writel ( ( vmxnet->count.tx_prod % VMXNET3_NUM_TX_DESC ),
( vmxnet->pt + VMXNET3_PT_TXPROD ) );
+ profile_stop ( &vmxnet3_vm_tx_profiler );
+ profile_exclude ( &vmxnet3_vm_tx_profiler );
return 0;
}
@@ -212,8 +238,11 @@ static void vmxnet3_refill_rx ( struct net_device *netdev ) {
/* Hand over any new descriptors to NIC */
if ( vmxnet->count.rx_prod != orig_rx_prod ) {
wmb();
+ profile_start ( &vmxnet3_vm_refill_profiler );
writel ( ( vmxnet->count.rx_prod % VMXNET3_NUM_RX_DESC ),
( vmxnet->pt + VMXNET3_PT_RXPROD ) );
+ profile_stop ( &vmxnet3_vm_refill_profiler );
+ profile_exclude ( &vmxnet3_vm_refill_profiler );
}
}
@@ -331,7 +360,10 @@ static void vmxnet3_poll_events ( struct net_device *netdev ) {
events = le32_to_cpu ( vmxnet->dma->shared.ecr );
/* Acknowledge these events */
+ profile_start ( &vmxnet3_vm_event_profiler );
writel ( events, ( vmxnet->vd + VMXNET3_VD_ECR ) );
+ profile_stop ( &vmxnet3_vm_event_profiler );
+ profile_exclude ( &vmxnet3_vm_event_profiler );
/* Check for link state change */
if ( events & VMXNET3_ECR_LINK ) {