ixgbe: Trace Rx and Tx events
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index a2b2ad1..a1c0fb8 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -46,6 +46,9 @@
#include "ixgbe_model.h"
#include "ixgbe_txrx_common.h"
+#define CREATE_TRACE_POINTS
+#include <trace/events/ixgbe.h>
+
char ixgbe_driver_name[] = "ixgbe";
static const char ixgbe_driver_string[] =
"Intel(R) 10 Gigabit PCI Express Network Driver";
@@ -1202,6 +1205,9 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
budget--;
} while (likely(budget));
+ if (total_packets)
+ trace_ixgbe_tx_done(adapter->netdev, total_packets);
+
i += tx_ring->count;
tx_ring->next_to_clean = i;
u64_stats_update_begin(&tx_ring->syncp);
@@ -2403,6 +2409,9 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
total_rx_packets++;
}
+ if (total_rx_packets)
+ trace_ixgbe_rx(adapter->netdev, total_rx_packets, budget);
+
if (xdp_xmit & IXGBE_XDP_REDIR)
xdp_do_flush_map();
@@ -3167,6 +3176,8 @@ int ixgbe_poll(struct napi_struct *napi, int budget)
ixgbe_update_dca(q_vector);
#endif
+ trace_ixgbe_poll(adapter->netdev, budget);
+
ixgbe_for_each_ring(ring, q_vector->tx) {
bool wd = ring->xsk_umem ?
ixgbe_clean_xdp_tx_irq(q_vector, ring, budget) :
@@ -3319,6 +3330,8 @@ static irqreturn_t ixgbe_intr(int irq, void *data)
return IRQ_NONE; /* Not our interrupt */
}
+ trace_ixgbe_intr(adapter->netdev, eicr);
+
if (eicr & IXGBE_EICR_LSC)
ixgbe_check_lsc(adapter);
@@ -8217,7 +8230,7 @@ static int ixgbe_tx_map(struct ixgbe_ring *tx_ring,
union ixgbe_adv_tx_desc *tx_desc;
skb_frag_t *frag;
dma_addr_t dma;
- unsigned int data_len, size;
+ unsigned int data_len, size, count = 0;
u32 tx_flags = first->tx_flags;
u32 cmd_type = ixgbe_tx_cmd_type(skb, tx_flags);
u16 i = tx_ring->next_to_use;
@@ -8251,6 +8264,7 @@ static int ixgbe_tx_map(struct ixgbe_ring *tx_ring,
/* record length, and DMA address */
dma_unmap_len_set(tx_buffer, len, size);
dma_unmap_addr_set(tx_buffer, dma, dma);
+ count++;
tx_desc->read.buffer_addr = cpu_to_le64(dma);
@@ -8334,6 +8348,7 @@ static int ixgbe_tx_map(struct ixgbe_ring *tx_ring,
writel(i, tx_ring->tail);
}
+ trace_ixgbe_tx(tx_ring->netdev, count);
return 0;
dma_error:
dev_err(tx_ring->dev, "TX DMA map failed\n");
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
index b43be9f..961e91c 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
@@ -4,6 +4,7 @@
#include <linux/bpf_trace.h>
#include <net/xdp_sock.h>
#include <net/xdp.h>
+#include <trace/events/ixgbe.h>
#include "ixgbe.h"
#include "ixgbe_txrx_common.h"
@@ -539,6 +540,8 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector,
writel(ring->next_to_use, ring->tail);
}
+ trace_ixgbe_rx(adapter->netdev, total_rx_packets, budget);
+
u64_stats_update_begin(&rx_ring->syncp);
rx_ring->stats.packets += total_rx_packets;
rx_ring->stats.bytes += total_rx_bytes;
diff --git a/include/trace/events/ixgbe.h b/include/trace/events/ixgbe.h
new file mode 100644
index 0000000..6260151
--- /dev/null
+++ b/include/trace/events/ixgbe.h
@@ -0,0 +1,119 @@
+/* Realtek IXGBE tracepoints
+ *
+ * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM ixgbe
+
+#if !defined(_TRACE_IXGBE_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_IXGBE_H
+
+#include <linux/tracepoint.h>
+#include <linux/errqueue.h>
+
+
+TRACE_EVENT(ixgbe_intr,
+ TP_PROTO(struct net_device *netdev, u32 eicr),
+
+ TP_ARGS(netdev, eicr),
+
+ TP_STRUCT__entry(
+ __field(u32, eicr )
+ __array(char, name, IFNAMSIZ )
+ ),
+
+ TP_fast_assign(
+ __entry->eicr = eicr;
+ memcpy(__entry->name, netdev->name, IFNAMSIZ);
+ ),
+
+ TP_printk("%s eicr=%x", __entry->name, __entry->eicr)
+ );
+
+TRACE_EVENT(ixgbe_poll,
+ TP_PROTO(struct net_device *netdev, int budget),
+
+ TP_ARGS(netdev, budget),
+
+ TP_STRUCT__entry(
+ __field(int, budget )
+ __array(char, name, IFNAMSIZ )
+ ),
+
+ TP_fast_assign(
+ __entry->budget = budget;
+ memcpy(__entry->name, netdev->name, IFNAMSIZ);
+ ),
+
+ TP_printk("%s b=%d", __entry->name, __entry->budget)
+ );
+
+TRACE_EVENT(ixgbe_rx,
+ TP_PROTO(struct net_device *netdev, unsigned int count, int budget),
+
+ TP_ARGS(netdev, count, budget),
+
+ TP_STRUCT__entry(
+ __field(unsigned int, count )
+ __field(int, budget )
+ __array(char, name, IFNAMSIZ )
+ ),
+
+ TP_fast_assign(
+ __entry->count = count;
+ __entry->budget = budget;
+ memcpy(__entry->name, netdev->name, IFNAMSIZ);
+ ),
+
+ TP_printk("%s c=%u/%d",
+ __entry->name, __entry->count, __entry->budget)
+ );
+
+TRACE_EVENT(ixgbe_tx,
+ TP_PROTO(struct net_device *netdev, unsigned int count),
+
+ TP_ARGS(netdev, count),
+
+ TP_STRUCT__entry(
+ __field(unsigned int, count )
+ __array(char, name, IFNAMSIZ )
+ ),
+
+ TP_fast_assign(
+ __entry->count = count;
+ memcpy(__entry->name, netdev->name, IFNAMSIZ);
+ ),
+
+ TP_printk("%s c=%u",
+ __entry->name, __entry->count)
+ );
+
+TRACE_EVENT(ixgbe_tx_done,
+ TP_PROTO(struct net_device *netdev, unsigned int count),
+
+ TP_ARGS(netdev, count),
+
+ TP_STRUCT__entry(
+ __field(unsigned int, count )
+ __array(char, name, IFNAMSIZ )
+ ),
+
+ TP_fast_assign(
+ __entry->count = count;
+ memcpy(__entry->name, netdev->name, IFNAMSIZ);
+ ),
+
+ TP_printk("%s c=%u",
+ __entry->name, __entry->count)
+ );
+
+#endif /* _TRACE_IXGBE_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>