On Fri, Apr 04, 2025 at 12:17:44PM +0200, Eelco Chaudron wrote: > > > On 31 Mar 2025, at 21:27, Adrian Moreno via dev wrote: > > > This patch makes it possible to display only succeeded or errored > > upcalls. > Hi Adrian, > > Small nit below, which if you agree, I can apply on commit. The rest looks > good. > > Thanks, > > Eelco > > Acked-by: Eelco Chaudron <echau...@redhat.com> > > Signed-off-by: Adrian Moreno <amore...@redhat.com> > > --- > > utilities/usdt-scripts/upcall_monitor.py | 64 +++++++++++++++++++----- > > 1 file changed, 51 insertions(+), 13 deletions(-) > > > > diff --git a/utilities/usdt-scripts/upcall_monitor.py > > b/utilities/usdt-scripts/upcall_monitor.py > > index 0c2518f54..0785fa4cc 100755 > > --- a/utilities/usdt-scripts/upcall_monitor.py > > +++ b/utilities/usdt-scripts/upcall_monitor.py > > @@ -62,6 +62,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: > > @@ -114,7 +117,7 @@ > > # > > > > from bcc import BPF, USDT, USDTException > > -from os.path import exists > > +from os.path import exists, join > > from scapy.all import hexdump, wrpcap > > from scapy.layers.l2 import Ether > > > > @@ -157,6 +160,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; > > @@ -198,7 +202,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; > > @@ -264,6 +270,7 @@ int kretprobe__ovs_dp_upcall(struct pt_regs *ctx) > > events.ringbuf_submit(event, 0); > > return 0; > > } > > +#endif > > """ > > > > > > @@ -526,9 +533,33 @@ 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() > > > > + # > > + # Check if current kernel supports error reporting. > > + # > > + tracefs_paths = ("/sys/kernel/debug/tracing/", "/sys/kernel/tracing/") > > + upcall_tp_found = False > > + for tracefs in tracefs_paths: > > + if exists(join(tracefs, "events/openvswitch/ovs_dp_upcall")): > > + upcall_tp_found = True > > nit: I think we can add a break here. >
Absolutely, good catch! > > + > > + if not upcall_tp_found: > > + if options.result == "error": > > + print("ERROR: Monitoring error upcalls is not supported by the > > " > > + "running kernel (or the tracefs is not mounted).") > > + sys.exit(-1) > > + if options.result == "any": > > + print("WARN: Monitoring error upcalls is not supported by the " > > + "running kernel (or the tracefs is not mounted). " > > + "Only successful ones will be monitored.") > > + options.result = "ok" > > + > > # > > # Find the PID of the ovs-vswitchd daemon if not specified. > > # > > @@ -560,20 +591,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()) > > # > > > > # > > @@ -583,8 +617,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 > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev