This patch makes it possible to display only succeeded or errored
upcalls.

Signed-off-by: Adrian Moreno <amore...@redhat.com>
---
 utilities/usdt-scripts/upcall_monitor.py | 42 +++++++++++++++++-------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/utilities/usdt-scripts/upcall_monitor.py 
b/utilities/usdt-scripts/upcall_monitor.py
index 4047c0085..917892b0e 100755
--- a/utilities/usdt-scripts/upcall_monitor.py
+++ b/utilities/usdt-scripts/upcall_monitor.py
@@ -61,6 +61,9 @@
 #                            Set maximum packet size to capture, default 64
 #      -w PCAP_FILE, --pcap PCAP_FILE
 #                            Write upcall packets to specified pcap file.
+#      -r, --result {error,ok,any}
+#                            Display only events with the given result,
+#                            default: any
 #
 # The following is an example of how to use the script on the running
 # ovs-vswitchd process with a packet and flow key dump enabled:
@@ -156,6 +159,7 @@ void report_missed_event() {
         __sync_fetch_and_add(value, 1);
 }
 
+#if <INSTALL_OVS_UPCALL_RECV_PROBE>
 int do_trace(struct pt_regs *ctx) {
     uint64_t addr;
     uint64_t size;
@@ -197,7 +201,9 @@ int do_trace(struct pt_regs *ctx) {
     events.ringbuf_submit(event, 0);
     return 0;
 };
+#endif
 
+#if <INSTALL_OVS_UPCALL_DROP_PROBE>
 struct inflight_upcall {
     u32 cpu;
     u32 upcall_type;
@@ -263,6 +269,7 @@ int kretprobe__ovs_dp_upcall(struct pt_regs *ctx)
     events.ringbuf_submit(event, 0);
     return 0;
 }
+#endif
 """
 
 
@@ -525,6 +532,10 @@ def main():
     parser.add_argument("-w", "--pcap", metavar="PCAP_FILE",
                         help="Write upcall packets to specified pcap file.",
                         type=str, default=None)
+    parser.add_argument("-r", "--result",
+                        help="Display only events with the given result, "
+                        "default: any",
+                        choices=["error", "ok", "any"], default="any")
 
     options = parser.parse_args()
 
@@ -559,20 +570,23 @@ def main():
     #
     # Attach the usdt probe
     #
-    u = USDT(pid=int(options.pid))
-    try:
-        u.enable_probe(probe="recv_upcall", fn_name="do_trace")
-    except USDTException as e:
-        print("ERROR: {}"
-              "ovs-vswitchd!".format(
-                  (re.sub('^', ' ' * 7, str(e), flags=re.MULTILINE)).strip().
-                  replace("--with-dtrace or --enable-dtrace",
-                          "--enable-usdt-probes")))
-        sys.exit(-1)
+    usdt = []
+    if options.result in ["ok", "any"]:
+        u = USDT(pid=int(options.pid))
+        try:
+            u.enable_probe(probe="recv_upcall", fn_name="do_trace")
+            usdt.append(u)
+        except USDTException as e:
+            print("ERROR: {}"
+                  "ovs-vswitchd!".format(
+                      (re.sub('^', ' ' * 7, str(e), flags=re.MULTILINE)).
+                      strip().replace("--with-dtrace or --enable-dtrace",
+                                      "--enable-usdt-probes")))
+            sys.exit(-1)
 
     #
     # Uncomment to see how arguments are decoded.
-    #   print(u.get_text())
+    #       print(u.get_text())
     #
 
     #
@@ -582,8 +596,12 @@ def main():
     source = source.replace("<MAX_KEY_VAL>", str(options.flow_key_size))
     source = source.replace("<BUFFER_PAGE_CNT>",
                             str(options.buffer_page_count))
+    source = source.replace("<INSTALL_OVS_UPCALL_RECV_PROBE>", "1"
+                            if options.result in ["ok", "any"] else "0")
+    source = source.replace("<INSTALL_OVS_UPCALL_DROP_PROBE>", "1"
+                            if options.result in ["error", "any"] else "0")
 
-    b = BPF(text=source, usdt_contexts=[u], debug=options.debug)
+    b = BPF(text=source, usdt_contexts=usdt, debug=options.debug)
 
     #
     # Print header
-- 
2.48.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to