From: Eliezer Tamir <eliezer.tamir@linux.jf.intel.com>
To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: Dave Miller <davem@davemloft.net>,
Jesse Brandeburg <jesse.brandeburg@intel.com>,
e1000-devel@lists.sourceforge.net,
Willem de Bruijn <willemb@google.com>,
Andi Kleen <andi@firstfloor.org>, HPA <hpa@zytor.com>,
Eliezer Tamir <eliezer@tamir.org.il>
Subject: [RFC PATCH 5/5] ixgbe: kprobes latency test module
Date: Wed, 27 Feb 2013 09:56:17 -0800 [thread overview]
Message-ID: <20130227175617.10611.73061.stgit@gitlad.jf.intel.com> (raw)
In-Reply-To: <20130227175549.10611.82188.stgit@gitlad.jf.intel.com>
A module to measure time between two symbols.
For each delta compile with EXTRA_CFLAGS="-DSTAGE=$stage"
where stage is from 0 to 20
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: Eliezer Tamir <eliezer.tamir@linux.intel.com>
---
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 5 -
samples/kprobes/Makefile | 2
samples/kprobes/kprobe_delta.c | 208 +++++++++++++++++++++++++
3 files changed, 212 insertions(+), 3 deletions(-)
create mode 100644 samples/kprobes/kprobe_delta.c
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 5248c63..c7c8432 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1755,8 +1755,9 @@ static bool ixgbe_add_rx_frag(struct ixgbe_ring *rx_ring,
return true;
}
-static struct sk_buff *ixgbe_fetch_rx_buffer(struct ixgbe_ring *rx_ring,
- union ixgbe_adv_rx_desc *rx_desc)
+static noinline struct sk_buff *ixgbe_fetch_rx_buffer(
+ struct ixgbe_ring *rx_ring,
+ union ixgbe_adv_rx_desc *rx_desc)
{
struct ixgbe_rx_buffer *rx_buffer;
struct sk_buff *skb;
diff --git a/samples/kprobes/Makefile b/samples/kprobes/Makefile
index 68739bc..5559ea9 100644
--- a/samples/kprobes/Makefile
+++ b/samples/kprobes/Makefile
@@ -1,5 +1,5 @@
# builds the kprobes example kernel modules;
# then to use one (as root): insmod <module_name.ko>
-obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o jprobe_example.o
+obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o kprobe_delta.o jprobe_example.o
obj-$(CONFIG_SAMPLE_KRETPROBES) += kretprobe_example.o
diff --git a/samples/kprobes/kprobe_delta.c b/samples/kprobes/kprobe_delta.c
new file mode 100644
index 0000000..88abe63
--- /dev/null
+++ b/samples/kprobes/kprobe_delta.c
@@ -0,0 +1,208 @@
+/*
+ * measure the time between two points in the kernel.
+ * for each stage compile with EXTRA_CFLAGS="-DSTAGE=$stage"
+ * where stage goes from 0 to 20
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kprobes.h>
+#include <linux/ktime.h>
+#include <linux/limits.h>
+#include <linux/sched.h>
+
+#ifndef STAGE
+#define STAGE 3
+#endif
+
+#if (STAGE == 0)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "__netif_receive_skb"
+#elif (STAGE == 1)
+#define START_SYMBOL "__netif_receive_skb"
+#define END_SYMBOL "tcp_v4_rcv"
+#elif (STAGE == 2)
+#define START_SYMBOL "tcp_v4_rcv"
+#define END_SYMBOL "sys_recvfrom"
+#define END_POST
+#elif (STAGE == 3)
+#define START_SYMBOL "sys_recvfrom"
+#define START_POST
+#define END_SYMBOL "sys_sendto"
+#elif (STAGE == 4)
+#define START_SYMBOL "sys_sendto"
+#define END_SYMBOL "tcp_transmit_skb"
+#elif (STAGE == 5)
+#define START_SYMBOL "tcp_transmit_skb"
+#define END_SYMBOL "dev_queue_xmit"
+#elif (STAGE == 6)
+#define START_SYMBOL "dev_queue_xmit"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 7)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 8)
+#define START_SYMBOL "__netif_receive_skb"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 9)
+#define START_SYMBOL "tcp_v4_rcv"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 10)
+#define START_SYMBOL "sys_recvfrom"
+#define START_POST
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 11)
+#define START_SYMBOL "sys_sendto"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 12)
+#define START_SYMBOL "tcp_transmit_skb"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 13)
+#define START_SYMBOL "dev_queue_xmit"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#elif (STAGE == 14)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "__netif_receive_skb"
+#elif (STAGE == 15)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "tcp_v4_rcv"
+#elif (STAGE == 16)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "sys_recvfrom"
+#define END_POST
+#elif (STAGE == 17)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "sys_sendto"
+#elif (STAGE == 18)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "tcp_transmit_skb"
+#elif (STAGE == 19)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "dev_queue_xmit"
+#elif (STAGE == 20)
+#define START_SYMBOL "ixgbe_fetch_rx_buffer"
+#define END_SYMBOL "ixgbe_xmit_frame"
+#define END_POST
+#endif
+
+/* per-instance private data */
+u64 start_cycles;
+u64 total_cycles;
+bool probe_valid;
+unsigned int sample_count;
+
+static u64 rdtsc(void)
+{
+ unsigned int l, h;
+
+ asm volatile("rdtsc" : "=a" (l), "=d" (h));
+
+ return l | (((u64)h) << 32);
+}
+
+/* Here we use the entry_hanlder to timestamp function entry */
+static int start_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
+{
+ start_cycles = rdtsc();
+ probe_valid = true;
+
+ return 0;
+}
+
+/*
+ * Return-probe handler: Log the return value and duration. Duration may turn
+ * out to be zero consistently, depending upon the granularity of time
+ * accounting on the platform.
+ */
+static int end_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
+{
+ if (probe_valid) {
+ total_cycles += rdtsc() - start_cycles;
+ sample_count++;
+ probe_valid = false;
+ }
+
+ if (sample_count > 1000000) {
+ trace_printk("%4lldns %22s -> " END_SYMBOL " %s\n",
+ (long long)(total_cycles * 10) /
+ (sample_count * 27),
+#ifdef START_POST
+ START_SYMBOL " (ret)",
+#else
+ START_SYMBOL,
+#endif
+#ifdef END_POST
+ "(ret)"
+#else
+ ""
+#endif
+ );
+ total_cycles = 0;
+ sample_count = 0;
+ }
+
+ return 0;
+}
+
+/* For each probe you need to allocate a kprobe structure */
+static struct kretprobe start_kretprobe = {
+#ifdef START_POST
+ .handler = start_handler,
+#else
+ .entry_handler = start_handler,
+#endif
+ .kp.symbol_name = START_SYMBOL,
+};
+
+static struct kretprobe end_kretprobe = {
+#ifdef END_POST
+ .handler = end_handler,
+#else
+ .entry_handler = end_handler,
+#endif
+ .kp.symbol_name = END_SYMBOL,
+};
+
+static int __init kretprobe_init(void)
+{
+ int ret;
+
+ total_cycles = 0;
+ sample_count = 0;
+ probe_valid = false;
+
+ ret = register_kretprobe(&start_kretprobe);
+ if (ret < 0) {
+ printk(KERN_INFO "register_kretprobe failed, returned %d\n",
+ ret);
+ return ret;
+ }
+
+ ret = register_kretprobe(&end_kretprobe);
+ if (ret < 0) {
+ unregister_kretprobe(&end_kretprobe);
+ printk(KERN_INFO "register_kretprobe failed, returned %d\n",
+ ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static void __exit kretprobe_exit(void)
+{
+ unregister_kretprobe(&start_kretprobe);
+ unregister_kretprobe(&end_kretprobe);
+}
+
+module_init(kretprobe_init)
+module_exit(kretprobe_exit)
+MODULE_LICENSE("GPL");
next prev parent reply other threads:[~2013-02-27 17:56 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-02-27 17:55 [RFC PATCH 0/5] net: low latency Ethernet device polling Eliezer Tamir
2013-02-27 17:55 ` [RFC PATCH 1/5] net: implement support for low latency socket polling Eliezer Tamir
2013-03-03 18:35 ` Eric Dumazet
2013-03-03 19:21 ` Andi Kleen
2013-03-03 21:20 ` Eric Dumazet
2013-03-04 3:55 ` Andi Kleen
2013-03-04 8:43 ` Eliezer Tamir
2013-03-04 14:52 ` Eric Dumazet
2013-03-04 15:28 ` Eliezer Tamir
2013-03-04 16:15 ` Eric Dumazet
2013-03-04 7:23 ` Cong Wang
2013-03-05 16:43 ` Ben Hutchings
2013-03-05 16:43 ` Ben Hutchings
2013-03-05 17:15 ` Eliezer Tamir
2013-03-05 19:57 ` David Miller
2013-03-05 19:55 ` David Miller
2013-03-05 20:03 ` H. Peter Anvin
2013-03-05 20:03 ` H. Peter Anvin
2013-02-27 17:56 ` [RFC PATCH 2/5] tcp: add TCP support for low latency receive poll Eliezer Tamir
2013-03-05 17:13 ` Ben Hutchings
2013-03-05 17:13 ` Ben Hutchings
2013-02-27 17:56 ` [RFC PATCH 3/5] ixgbe: Add support for ndo_ll_poll Eliezer Tamir
2013-02-27 18:41 ` Eric Dumazet
2013-02-27 19:20 ` Eliezer Tamir
2013-03-05 17:26 ` Ben Hutchings
2013-03-05 17:26 ` Ben Hutchings
2013-03-05 17:28 ` Ben Hutchings
2013-03-05 17:28 ` Ben Hutchings
2013-03-05 17:36 ` Eric Dumazet
2013-03-05 17:36 ` Eric Dumazet
2013-02-27 17:56 ` [RFC PATCH 4/5] ixgbe: add extra stats " Eliezer Tamir
2013-02-27 17:56 ` Eliezer Tamir [this message]
2013-02-27 18:07 ` [RFC PATCH 0/5] net: low latency Ethernet device polling Eliezer Tamir
2013-02-27 18:07 ` Eliezer Tamir
2013-02-27 18:13 ` Stephen Hemminger
2013-02-27 18:47 ` Tom Herbert
2013-02-27 19:17 ` Eliezer Tamir
2013-03-04 22:34 ` Ben Hutchings
2013-02-27 19:58 ` Rick Jones
2013-02-27 20:40 ` Eliezer Tamir
2013-02-27 21:42 ` Ben Greear
2013-02-28 8:38 ` Eliezer Tamir
2013-03-01 21:24 ` David Miller
2013-03-01 22:57 ` Tom Herbert
2013-03-02 17:02 ` Eliezer Tamir
2013-03-04 7:37 ` Cong Wang
2013-03-04 7:37 ` Cong Wang
2013-03-04 8:19 ` Eliezer Tamir
2013-03-04 8:46 ` Eliezer Tamir
2013-03-04 17:19 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130227175617.10611.73061.stgit@gitlad.jf.intel.com \
--to=eliezer.tamir@linux.jf.intel.com \
--cc=andi@firstfloor.org \
--cc=davem@davemloft.net \
--cc=e1000-devel@lists.sourceforge.net \
--cc=eliezer@tamir.org.il \
--cc=hpa@zytor.com \
--cc=jesse.brandeburg@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.