All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Add dtrace support on macOS
@ 2020-07-16  8:17 Roman Bolshakov
  2020-07-16  8:17 ` [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS Roman Bolshakov
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16  8:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: Philippe Mathieu-Daudé, Roman Bolshakov, Daniel P. Berrangé

Hi,

This is a small series that enables dtrace tracing backend on macOS.
Whether or not it should go to 5.1 is up to discretion of tracing
maintainers.

Thanks,
Roman

Roman Bolshakov (4):
  scripts/tracetool: Fix dtrace generation for macOS
  scripts/tracetool: Use void pointer for vcpu
  build: Don't make object files for dtrace on macOS
  net/colo: Match is-enabled probe to tracepoint

 Makefile.objs                 |  2 ++
 net/colo-compare.c            | 12 +++++++-----
 net/filter-rewriter.c         |  8 ++++++--
 net/trace-events              |  2 --
 scripts/tracetool/format/d.py |  9 ++++++++-
 scripts/tracetool/vcpu.py     |  2 +-
 6 files changed, 24 insertions(+), 11 deletions(-)

-- 
2.26.1



^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS
  2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
@ 2020-07-16  8:17 ` Roman Bolshakov
  2020-07-16  8:56   ` Daniel P. Berrangé
  2020-07-16  8:17 ` [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu Roman Bolshakov
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16  8:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: Philippe Mathieu-Daudé,
	Roman Bolshakov, Daniel P. Berrangé,
	Stefan Hajnoczi, Cameron Esfahani

dtrace USDT is fully supported since OS X 10.6. There are a few
peculiarities compared to other dtrace flavors.

1. It doesn't accept empty files.
2. It doesn't recognize bool type but accepts ANSI C _Bool.

Cc: Cameron Esfahani <dirty@apple.com>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 scripts/tracetool/format/d.py | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/scripts/tracetool/format/d.py b/scripts/tracetool/format/d.py
index 0afb5f3f47..be4a2aa254 100644
--- a/scripts/tracetool/format/d.py
+++ b/scripts/tracetool/format/d.py
@@ -13,6 +13,7 @@ __email__      = "stefanha@redhat.com"
 
 
 from tracetool import out
+from sys import platform
 
 
 # Reserved keywords from
@@ -34,7 +35,8 @@ def generate(events, backend, group):
 
     # SystemTap's dtrace(1) warns about empty "provider qemu {}" but is happy
     # with an empty file.  Avoid the warning.
-    if not events:
+    # But dtrace on macOS can't deal with empty files.
+    if not events and platform != "darwin":
         return
 
     out('/* This file is autogenerated by tracetool, do not edit. */'
@@ -44,6 +46,11 @@ def generate(events, backend, group):
     for e in events:
         args = []
         for type_, name in e.args:
+            if platform == "darwin":
+                if type_ == 'bool':
+                    type_ = '_Bool'
+                if type_ == 'bool *':
+                    type_ = '_Bool *'
             if name in RESERVED_WORDS:
                 name += '_'
             args.append(type_ + ' ' + name)
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu
  2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
  2020-07-16  8:17 ` [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS Roman Bolshakov
@ 2020-07-16  8:17 ` Roman Bolshakov
  2020-07-16  8:57   ` Daniel P. Berrangé
  2020-07-16  8:17 ` [PATCH 3/4] build: Don't make object files for dtrace on macOS Roman Bolshakov
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16  8:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: Philippe Mathieu-Daudé,
	Roman Bolshakov, Daniel P. Berrangé,
	Stefan Hajnoczi, Cameron Esfahani

dtrace on macOS complains that CPUState * is used for a few probes:

  dtrace: failed to compile script trace-dtrace-root.dtrace: line 130: syntax error near "CPUState"

A comment in scripts/tracetool/__init__.py mentions that:

  We only want to allow standard C types or fixed sized
  integer types. We don't want QEMU specific types
  as we can't assume trace backends can resolve all the
  typedefs

Fixes: 3d211d9f4dbee ("trace: Add 'vcpu' event property to trace guest vCPU")
Cc: Cameron Esfahani <dirty@apple.com>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 scripts/tracetool/vcpu.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/tracetool/vcpu.py b/scripts/tracetool/vcpu.py
index b54e4f4e7a..868b4cb04c 100644
--- a/scripts/tracetool/vcpu.py
+++ b/scripts/tracetool/vcpu.py
@@ -24,7 +24,7 @@ def transform_event(event):
         assert "tcg-trans" not in event.properties
         assert "tcg-exec" not in event.properties
 
-        event.args = Arguments([("CPUState *", "__cpu"), event.args])
+        event.args = Arguments([("void *", "__cpu"), event.args])
         if "tcg" in event.properties:
             fmt = "\"cpu=%p \""
             event.fmt = [fmt + event.fmt[0],
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] build: Don't make object files for dtrace on macOS
  2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
  2020-07-16  8:17 ` [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS Roman Bolshakov
  2020-07-16  8:17 ` [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu Roman Bolshakov
@ 2020-07-16  8:17 ` Roman Bolshakov
  2020-07-16  8:54   ` Daniel P. Berrangé
  2020-07-16  8:17 ` [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint Roman Bolshakov
  2020-07-16  8:55 ` [PATCH 0/4] Add dtrace support on macOS Daniel P. Berrangé
  4 siblings, 1 reply; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16  8:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: Philippe Mathieu-Daudé,
	Roman Bolshakov, Daniel P. Berrangé,
	Cameron Esfahani

dtrace on macOS uses unresolved symbols with a special prefix to define
probes [1], only headers should be generated for USDT (dtrace(1)). But
it doesn't support backwards compatible no-op -G flag [2] and implicit
build rules fail.

1. https://markmail.org/message/6grq2ygr5nwdwsnb
2. https://markmail.org/message/5xrxt2w5m42nojkz

Cc: Cameron Esfahani <dirty@apple.com>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 Makefile.objs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Makefile.objs b/Makefile.objs
index d22b3b45d7..982f15ba30 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -211,5 +211,7 @@ trace-events-files = $(SRC_PATH)/trace-events $(trace-events-subdirs:%=$(SRC_PAT
 trace-obj-y = trace-root.o
 trace-obj-y += $(trace-events-subdirs:%=%/trace.o)
 trace-obj-$(CONFIG_TRACE_UST) += trace-ust-all.o
+ifneq ($(CONFIG_DARWIN),y)
 trace-obj-$(CONFIG_TRACE_DTRACE) += trace-dtrace-root.o
 trace-obj-$(CONFIG_TRACE_DTRACE) += $(trace-events-subdirs:%=%/trace-dtrace.o)
+endif
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint
  2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
                   ` (2 preceding siblings ...)
  2020-07-16  8:17 ` [PATCH 3/4] build: Don't make object files for dtrace on macOS Roman Bolshakov
@ 2020-07-16  8:17 ` Roman Bolshakov
  2020-07-16  8:51   ` Daniel P. Berrangé
  2020-07-16  8:55 ` [PATCH 0/4] Add dtrace support on macOS Daniel P. Berrangé
  4 siblings, 1 reply; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16  8:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: Daniel P. Berrangé,
	Li Zhijian, Jason Wang, Cameron Esfahani, Zhang Chen,
	Roman Bolshakov, Philippe Mathieu-Daudé

Build of QEMU with dtrace fails on macOS:

  LINK    x86_64-softmmu/qemu-system-x86_64
error: probe colo_compare_miscompare doesn't exist
error: Could not register probes
ld: error creating dtrace DOF section for architecture x86_64

The reason of the error is explained by Adam Leventhal [1]:

  Note that is-enabled probes don't have the stability magic so I'm not
  sure how things would work if only is-enabled probes were used.

net/colo code uses is-enabled probes to determine if other probes should
be used but colo_compare_miscompare itself is not used explicitly.
Linker doesn't include the symbol and build fails.

The issue can be resolved if is-enabled probe matches the actual trace
point that is used inside the test.

1. http://markmail.org/message/6grq2ygr5nwdwsnb

Fixes: f4b618360e ("colo-compare: add TCP, UDP, ICMP packet comparison")
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Cc: Cameron Esfahani <dirty@apple.com>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 net/colo-compare.c    | 12 +++++++-----
 net/filter-rewriter.c |  8 ++++++--
 net/trace-events      |  2 --
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/net/colo-compare.c b/net/colo-compare.c
index 398b7546ff..9525ed703b 100644
--- a/net/colo-compare.c
+++ b/net/colo-compare.c
@@ -327,7 +327,7 @@ static int colo_compare_packet_payload(Packet *ppkt,
                                        uint16_t len)
 
 {
-    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
+    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
         char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
 
         strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
@@ -492,7 +492,7 @@ sec:
         g_queue_push_head(&conn->primary_list, ppkt);
         g_queue_push_head(&conn->secondary_list, spkt);
 
-        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
+        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_TCP_INFO)) {
             qemu_hexdump((char *)ppkt->data, stderr,
                         "colo-compare ppkt", ppkt->size);
             qemu_hexdump((char *)spkt->data, stderr,
@@ -533,7 +533,8 @@ static int colo_packet_compare_udp(Packet *spkt, Packet *ppkt)
                                     ppkt->size - offset)) {
         trace_colo_compare_udp_miscompare("primary pkt size", ppkt->size);
         trace_colo_compare_udp_miscompare("Secondary pkt size", spkt->size);
-        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
+        if (trace_event_get_state_backends(
+              TRACE_COLO_COMPARE_UDP_MISCOMPARE)) {
             qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
                          ppkt->size);
             qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",
@@ -576,7 +577,8 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
                                            ppkt->size);
         trace_colo_compare_icmp_miscompare("Secondary pkt size",
                                            spkt->size);
-        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
+        if (trace_event_get_state_backends(
+              TRACE_COLO_COMPARE_ICMP_MISCOMPARE)) {
             qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
                          ppkt->size);
             qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",
@@ -597,7 +599,7 @@ static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
     uint16_t offset = ppkt->vnet_hdr_len;
 
     trace_colo_compare_main("compare other");
-    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
+    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
         char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
 
         strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
index 1aaad101b6..ff04165cc4 100644
--- a/net/filter-rewriter.c
+++ b/net/filter-rewriter.c
@@ -76,7 +76,9 @@ static int handle_primary_tcp_pkt(RewriterState *rf,
     struct tcp_hdr *tcp_pkt;
 
     tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
-    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
+    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
+        trace_event_get_state_backends(
+          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
         trace_colo_filter_rewriter_pkt_info(__func__,
                     inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
                     ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),
@@ -180,7 +182,9 @@ static int handle_secondary_tcp_pkt(RewriterState *rf,
 
     tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
 
-    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
+    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
+        trace_event_get_state_backends(
+          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
         trace_colo_filter_rewriter_pkt_info(__func__,
                     inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
                     ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),
diff --git a/net/trace-events b/net/trace-events
index fa49c71533..bfaff7891d 100644
--- a/net/trace-events
+++ b/net/trace-events
@@ -17,10 +17,8 @@ colo_compare_udp_miscompare(const char *sta, int size) ": %s = %d"
 colo_compare_icmp_miscompare(const char *sta, int size) ": %s = %d"
 colo_compare_ip_info(int psize, const char *sta, const char *stb, int ssize, const char *stc, const char *std) "ppkt size = %d, ip_src = %s, ip_dst = %s, spkt size = %d, ip_src = %s, ip_dst = %s"
 colo_old_packet_check_found(int64_t old_time) "%" PRId64
-colo_compare_miscompare(void) ""
 colo_compare_tcp_info(const char *pkt, uint32_t seq, uint32_t ack, int hdlen, int pdlen, int offset, int flags) "%s: seq/ack= %u/%u hdlen= %d pdlen= %d offset= %d flags=%d"
 
 # filter-rewriter.c
-colo_filter_rewriter_debug(void) ""
 colo_filter_rewriter_pkt_info(const char *func, const char *src, const char *dst, uint32_t seq, uint32_t ack, uint32_t flag) "%s: src/dst: %s/%s p: seq/ack=%u/%u  flags=0x%x"
 colo_filter_rewriter_conn_offset(uint32_t offset) ": offset=%u"
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint
  2020-07-16  8:17 ` [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint Roman Bolshakov
@ 2020-07-16  8:51   ` Daniel P. Berrangé
  2020-07-16 10:55     ` Roman Bolshakov
  0 siblings, 1 reply; 11+ messages in thread
From: Daniel P. Berrangé @ 2020-07-16  8:51 UTC (permalink / raw)
  To: Roman Bolshakov
  Cc: Li Zhijian, Jason Wang, qemu-devel, Cameron Esfahani, Zhang Chen,
	Stefan Hajnoczi, Philippe Mathieu-Daudé

Adding Stefan to CC as the trace maintainer.

On Thu, Jul 16, 2020 at 11:17:54AM +0300, Roman Bolshakov wrote:
> Build of QEMU with dtrace fails on macOS:
> 
>   LINK    x86_64-softmmu/qemu-system-x86_64
> error: probe colo_compare_miscompare doesn't exist
> error: Could not register probes
> ld: error creating dtrace DOF section for architecture x86_64
> 
> The reason of the error is explained by Adam Leventhal [1]:
> 
>   Note that is-enabled probes don't have the stability magic so I'm not
>   sure how things would work if only is-enabled probes were used.
> 
> net/colo code uses is-enabled probes to determine if other probes should
> be used but colo_compare_miscompare itself is not used explicitly.
> Linker doesn't include the symbol and build fails.
> 
> The issue can be resolved if is-enabled probe matches the actual trace
> point that is used inside the test.
> 
> 1. http://markmail.org/message/6grq2ygr5nwdwsnb
> 
> Fixes: f4b618360e ("colo-compare: add TCP, UDP, ICMP packet comparison")
> Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> Cc: Cameron Esfahani <dirty@apple.com>
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> ---
>  net/colo-compare.c    | 12 +++++++-----
>  net/filter-rewriter.c |  8 ++++++--
>  net/trace-events      |  2 --
>  3 files changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/net/colo-compare.c b/net/colo-compare.c
> index 398b7546ff..9525ed703b 100644
> --- a/net/colo-compare.c
> +++ b/net/colo-compare.c
> @@ -327,7 +327,7 @@ static int colo_compare_packet_payload(Packet *ppkt,
>                                         uint16_t len)
>  
>  {
> -    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> +    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
>          char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
>  
>          strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
> @@ -492,7 +492,7 @@ sec:
>          g_queue_push_head(&conn->primary_list, ppkt);
>          g_queue_push_head(&conn->secondary_list, spkt);
>  
> -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> +        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_TCP_INFO)) {
>              qemu_hexdump((char *)ppkt->data, stderr,
>                          "colo-compare ppkt", ppkt->size);
>              qemu_hexdump((char *)spkt->data, stderr,

Not your fault, as this problem is pre-existing, but IMHO this block of code
is simply broken by design. It is checking a trace event enablement state,
and then not emitting any trace event, but instead dumping info to stderr.
This is mis-use of the trace framework, and changing the event name fixes
your immediate macOS bug but the code is still flawed.

Basically it is using the trace framework as a way to dynamically turn on /
off general debugging information.

I'm not quite sure what todo to fix it, but I don't think it should be wrapped
in any trace_event_get_state_backends() call at all.

The simplest immediate option I think is to change it to be a compile time
debug

  // #define DEBUG_COLO_PACKETS

and then use

  #ifdef DEBUG_COLO_PACKETS
      qemu_hexdump(...)
  #endif

and then leave it upto the maintainer to come up with a more advanced
solution if they want to make it runtime configurable again, but not
abusing the trace framework.

> @@ -533,7 +533,8 @@ static int colo_packet_compare_udp(Packet *spkt, Packet *ppkt)
>                                      ppkt->size - offset)) {
>          trace_colo_compare_udp_miscompare("primary pkt size", ppkt->size);
>          trace_colo_compare_udp_miscompare("Secondary pkt size", spkt->size);
> -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> +        if (trace_event_get_state_backends(
> +              TRACE_COLO_COMPARE_UDP_MISCOMPARE)) {
>              qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
>                           ppkt->size);
>              qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",

Same brokenness

> @@ -576,7 +577,8 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
>                                             ppkt->size);
>          trace_colo_compare_icmp_miscompare("Secondary pkt size",
>                                             spkt->size);
> -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> +        if (trace_event_get_state_backends(
> +              TRACE_COLO_COMPARE_ICMP_MISCOMPARE)) {
>              qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
>                           ppkt->size);
>              qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",

Same brokenness

> @@ -597,7 +599,7 @@ static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
>      uint16_t offset = ppkt->vnet_hdr_len;
>  
>      trace_colo_compare_main("compare other");
> -    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> +    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
>          char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
>  
>          strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
> diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
> index 1aaad101b6..ff04165cc4 100644
> --- a/net/filter-rewriter.c
> +++ b/net/filter-rewriter.c
> @@ -76,7 +76,9 @@ static int handle_primary_tcp_pkt(RewriterState *rf,
>      struct tcp_hdr *tcp_pkt;
>  
>      tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
> -    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
> +    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
> +        trace_event_get_state_backends(
> +          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
>          trace_colo_filter_rewriter_pkt_info(__func__,
>                      inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
>                      ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),

Since there are two separate trace events here, each should be wrapped with
its own check. IOW, two completely separate if (...) trace(..); blocks

> @@ -180,7 +182,9 @@ static int handle_secondary_tcp_pkt(RewriterState *rf,
>  
>      tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
>  
> -    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
> +    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
> +        trace_event_get_state_backends(
> +          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
>          trace_colo_filter_rewriter_pkt_info(__func__,
>                      inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
>                      ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),

Same here.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] build: Don't make object files for dtrace on macOS
  2020-07-16  8:17 ` [PATCH 3/4] build: Don't make object files for dtrace on macOS Roman Bolshakov
@ 2020-07-16  8:54   ` Daniel P. Berrangé
  0 siblings, 0 replies; 11+ messages in thread
From: Daniel P. Berrangé @ 2020-07-16  8:54 UTC (permalink / raw)
  To: Roman Bolshakov; +Cc: Philippe Mathieu-Daudé, qemu-devel, Cameron Esfahani

On Thu, Jul 16, 2020 at 11:17:53AM +0300, Roman Bolshakov wrote:
> dtrace on macOS uses unresolved symbols with a special prefix to define
> probes [1], only headers should be generated for USDT (dtrace(1)). But
> it doesn't support backwards compatible no-op -G flag [2] and implicit
> build rules fail.
> 
> 1. https://markmail.org/message/6grq2ygr5nwdwsnb
> 2. https://markmail.org/message/5xrxt2w5m42nojkz
> 
> Cc: Cameron Esfahani <dirty@apple.com>
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> ---
>  Makefile.objs | 2 ++
>  1 file changed, 2 insertions(+)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] Add dtrace support on macOS
  2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
                   ` (3 preceding siblings ...)
  2020-07-16  8:17 ` [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint Roman Bolshakov
@ 2020-07-16  8:55 ` Daniel P. Berrangé
  4 siblings, 0 replies; 11+ messages in thread
From: Daniel P. Berrangé @ 2020-07-16  8:55 UTC (permalink / raw)
  To: Roman Bolshakov; +Cc: Philippe Mathieu-Daudé, qemu-devel, Stefan Hajnoczi

Adding Stefan as the trace maintainer.

On Thu, Jul 16, 2020 at 11:17:50AM +0300, Roman Bolshakov wrote:
> Hi,
> 
> This is a small series that enables dtrace tracing backend on macOS.
> Whether or not it should go to 5.1 is up to discretion of tracing
> maintainers.
> 
> Thanks,
> Roman
> 
> Roman Bolshakov (4):
>   scripts/tracetool: Fix dtrace generation for macOS
>   scripts/tracetool: Use void pointer for vcpu
>   build: Don't make object files for dtrace on macOS
>   net/colo: Match is-enabled probe to tracepoint
> 
>  Makefile.objs                 |  2 ++
>  net/colo-compare.c            | 12 +++++++-----
>  net/filter-rewriter.c         |  8 ++++++--
>  net/trace-events              |  2 --
>  scripts/tracetool/format/d.py |  9 ++++++++-
>  scripts/tracetool/vcpu.py     |  2 +-
>  6 files changed, 24 insertions(+), 11 deletions(-)
> 
> -- 
> 2.26.1
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS
  2020-07-16  8:17 ` [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS Roman Bolshakov
@ 2020-07-16  8:56   ` Daniel P. Berrangé
  0 siblings, 0 replies; 11+ messages in thread
From: Daniel P. Berrangé @ 2020-07-16  8:56 UTC (permalink / raw)
  To: Roman Bolshakov
  Cc: Stefan Hajnoczi, Philippe Mathieu-Daudé,
	qemu-devel, Cameron Esfahani

On Thu, Jul 16, 2020 at 11:17:51AM +0300, Roman Bolshakov wrote:
> dtrace USDT is fully supported since OS X 10.6. There are a few
> peculiarities compared to other dtrace flavors.
> 
> 1. It doesn't accept empty files.
> 2. It doesn't recognize bool type but accepts ANSI C _Bool.
> 
> Cc: Cameron Esfahani <dirty@apple.com>
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> ---
>  scripts/tracetool/format/d.py | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu
  2020-07-16  8:17 ` [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu Roman Bolshakov
@ 2020-07-16  8:57   ` Daniel P. Berrangé
  0 siblings, 0 replies; 11+ messages in thread
From: Daniel P. Berrangé @ 2020-07-16  8:57 UTC (permalink / raw)
  To: Roman Bolshakov
  Cc: Stefan Hajnoczi, Philippe Mathieu-Daudé,
	qemu-devel, Cameron Esfahani

On Thu, Jul 16, 2020 at 11:17:52AM +0300, Roman Bolshakov wrote:
> dtrace on macOS complains that CPUState * is used for a few probes:
> 
>   dtrace: failed to compile script trace-dtrace-root.dtrace: line 130: syntax error near "CPUState"
> 
> A comment in scripts/tracetool/__init__.py mentions that:
> 
>   We only want to allow standard C types or fixed sized
>   integer types. We don't want QEMU specific types
>   as we can't assume trace backends can resolve all the
>   typedefs
> 
> Fixes: 3d211d9f4dbee ("trace: Add 'vcpu' event property to trace guest vCPU")
> Cc: Cameron Esfahani <dirty@apple.com>
> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> ---
>  scripts/tracetool/vcpu.py | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint
  2020-07-16  8:51   ` Daniel P. Berrangé
@ 2020-07-16 10:55     ` Roman Bolshakov
  0 siblings, 0 replies; 11+ messages in thread
From: Roman Bolshakov @ 2020-07-16 10:55 UTC (permalink / raw)
  To: Daniel P. Berrangé
  Cc: Li Zhijian, Jason Wang, qemu-devel, Cameron Esfahani, Zhang Chen,
	Stefan Hajnoczi, Philippe Mathieu-Daudé

On Thu, Jul 16, 2020 at 09:51:27AM +0100, Daniel P. Berrangé wrote:
> Adding Stefan to CC as the trace maintainer.
> 
> On Thu, Jul 16, 2020 at 11:17:54AM +0300, Roman Bolshakov wrote:
> > Build of QEMU with dtrace fails on macOS:
> > 
> >   LINK    x86_64-softmmu/qemu-system-x86_64
> > error: probe colo_compare_miscompare doesn't exist
> > error: Could not register probes
> > ld: error creating dtrace DOF section for architecture x86_64
> > 
> > The reason of the error is explained by Adam Leventhal [1]:
> > 
> >   Note that is-enabled probes don't have the stability magic so I'm not
> >   sure how things would work if only is-enabled probes were used.
> > 
> > net/colo code uses is-enabled probes to determine if other probes should
> > be used but colo_compare_miscompare itself is not used explicitly.
> > Linker doesn't include the symbol and build fails.
> > 
> > The issue can be resolved if is-enabled probe matches the actual trace
> > point that is used inside the test.
> > 
> > 1. http://markmail.org/message/6grq2ygr5nwdwsnb
> > 
> > Fixes: f4b618360e ("colo-compare: add TCP, UDP, ICMP packet comparison")
> > Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
> > Cc: Cameron Esfahani <dirty@apple.com>
> > Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
> > ---
> >  net/colo-compare.c    | 12 +++++++-----
> >  net/filter-rewriter.c |  8 ++++++--
> >  net/trace-events      |  2 --
> >  3 files changed, 13 insertions(+), 9 deletions(-)
> > 
> > diff --git a/net/colo-compare.c b/net/colo-compare.c
> > index 398b7546ff..9525ed703b 100644
> > --- a/net/colo-compare.c
> > +++ b/net/colo-compare.c
> > @@ -327,7 +327,7 @@ static int colo_compare_packet_payload(Packet *ppkt,
> >                                         uint16_t len)
> >  
> >  {
> > -    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> > +    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
> >          char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
> >  
> >          strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
> > @@ -492,7 +492,7 @@ sec:
> >          g_queue_push_head(&conn->primary_list, ppkt);
> >          g_queue_push_head(&conn->secondary_list, spkt);
> >  
> > -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> > +        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_TCP_INFO)) {
> >              qemu_hexdump((char *)ppkt->data, stderr,
> >                          "colo-compare ppkt", ppkt->size);
> >              qemu_hexdump((char *)spkt->data, stderr,
> 
> Not your fault, as this problem is pre-existing, but IMHO this block of code
> is simply broken by design. It is checking a trace event enablement state,
> and then not emitting any trace event, but instead dumping info to stderr.
> This is mis-use of the trace framework, and changing the event name fixes
> your immediate macOS bug but the code is still flawed.
> 
> Basically it is using the trace framework as a way to dynamically turn on /
> off general debugging information.
> 
> I'm not quite sure what todo to fix it, but I don't think it should be wrapped
> in any trace_event_get_state_backends() call at all.
> 
> The simplest immediate option I think is to change it to be a compile time
> debug
> 
>   // #define DEBUG_COLO_PACKETS
> 
> and then use
> 
>   #ifdef DEBUG_COLO_PACKETS
>       qemu_hexdump(...)
>   #endif
> 
> and then leave it upto the maintainer to come up with a more advanced
> solution if they want to make it runtime configurable again, but not
> abusing the trace framework.
> 


Hi Daniel,

It makes sense, compile-time define works better because the trace data
doesn't go into a trace point. I'll use that approach in v2.

> > @@ -533,7 +533,8 @@ static int colo_packet_compare_udp(Packet *spkt, Packet *ppkt)
> >                                      ppkt->size - offset)) {
> >          trace_colo_compare_udp_miscompare("primary pkt size", ppkt->size);
> >          trace_colo_compare_udp_miscompare("Secondary pkt size", spkt->size);
> > -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> > +        if (trace_event_get_state_backends(
> > +              TRACE_COLO_COMPARE_UDP_MISCOMPARE)) {
> >              qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
> >                           ppkt->size);
> >              qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",
> 
> Same brokenness
> 
> > @@ -576,7 +577,8 @@ static int colo_packet_compare_icmp(Packet *spkt, Packet *ppkt)
> >                                             ppkt->size);
> >          trace_colo_compare_icmp_miscompare("Secondary pkt size",
> >                                             spkt->size);
> > -        if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> > +        if (trace_event_get_state_backends(
> > +              TRACE_COLO_COMPARE_ICMP_MISCOMPARE)) {
> >              qemu_hexdump((char *)ppkt->data, stderr, "colo-compare pri pkt",
> >                           ppkt->size);
> >              qemu_hexdump((char *)spkt->data, stderr, "colo-compare sec pkt",
> 
> Same brokenness
> 
> > @@ -597,7 +599,7 @@ static int colo_packet_compare_other(Packet *spkt, Packet *ppkt)
> >      uint16_t offset = ppkt->vnet_hdr_len;
> >  
> >      trace_colo_compare_main("compare other");
> > -    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_MISCOMPARE)) {
> > +    if (trace_event_get_state_backends(TRACE_COLO_COMPARE_IP_INFO)) {
> >          char pri_ip_src[20], pri_ip_dst[20], sec_ip_src[20], sec_ip_dst[20];
> >  
> >          strcpy(pri_ip_src, inet_ntoa(ppkt->ip->ip_src));
> > diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c
> > index 1aaad101b6..ff04165cc4 100644
> > --- a/net/filter-rewriter.c
> > +++ b/net/filter-rewriter.c
> > @@ -76,7 +76,9 @@ static int handle_primary_tcp_pkt(RewriterState *rf,
> >      struct tcp_hdr *tcp_pkt;
> >  
> >      tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
> > -    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
> > +    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
> > +        trace_event_get_state_backends(
> > +          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
> >          trace_colo_filter_rewriter_pkt_info(__func__,
> >                      inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
> >                      ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),
> 
> Since there are two separate trace events here, each should be wrapped with
> its own check. IOW, two completely separate if (...) trace(..); blocks
> 


Agreed, I'll do that, thanks!

> > @@ -180,7 +182,9 @@ static int handle_secondary_tcp_pkt(RewriterState *rf,
> >  
> >      tcp_pkt = (struct tcp_hdr *)pkt->transport_header;
> >  
> > -    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_DEBUG)) {
> > +    if (trace_event_get_state_backends(TRACE_COLO_FILTER_REWRITER_PKT_INFO) ||
> > +        trace_event_get_state_backends(
> > +          TRACE_COLO_FILTER_REWRITER_CONN_OFFSET)) {
> >          trace_colo_filter_rewriter_pkt_info(__func__,
> >                      inet_ntoa(pkt->ip->ip_src), inet_ntoa(pkt->ip->ip_dst),
> >                      ntohl(tcp_pkt->th_seq), ntohl(tcp_pkt->th_ack),
> 
> Same here.
> 
> 

Best regards,
Roman


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-07-16 10:56 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-16  8:17 [PATCH 0/4] Add dtrace support on macOS Roman Bolshakov
2020-07-16  8:17 ` [PATCH 1/4] scripts/tracetool: Fix dtrace generation for macOS Roman Bolshakov
2020-07-16  8:56   ` Daniel P. Berrangé
2020-07-16  8:17 ` [PATCH 2/4] scripts/tracetool: Use void pointer for vcpu Roman Bolshakov
2020-07-16  8:57   ` Daniel P. Berrangé
2020-07-16  8:17 ` [PATCH 3/4] build: Don't make object files for dtrace on macOS Roman Bolshakov
2020-07-16  8:54   ` Daniel P. Berrangé
2020-07-16  8:17 ` [PATCH 4/4] net/colo: Match is-enabled probe to tracepoint Roman Bolshakov
2020-07-16  8:51   ` Daniel P. Berrangé
2020-07-16 10:55     ` Roman Bolshakov
2020-07-16  8:55 ` [PATCH 0/4] Add dtrace support on macOS Daniel P. Berrangé

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.