qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping
@ 2011-10-12 17:14 Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list Mark Wu
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel

This series add support for trace events grouping. The state of a given group
of trace events can be queried or changed in bulk by the following monitor
commands:

* info trace-groups
  View available trace event groups and their state.  State 1 means enabled,
  state 0 means disabled.

* trace-group NAME on|off
  Enable/disable a given trace event group.

A group of trace events can also be enabled in early running stage through
adding its group name prefixed with "group:" to trace events list file
which is passed to "-trace events".

Mark Wu (6):
  trace: Make "tracetool" generate a group list
  trace: Add HMP monitor commands for trace events group
  trace: Add trace events group implementation in the backend "simple"
  trace: Add trace events group implementation in the backend "stderr"
  trace: Enable "-trace events" argument to control initial state of
    groups
  trace: Update doc for trace events group

 docs/tracing.txt  |   29 ++++++++++++++--
 hmp-commands.hx   |   14 ++++++++
 monitor.c         |   22 ++++++++++++
 scripts/tracetool |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 trace-events      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
 trace/control.c   |   17 +++++++++
 trace/control.h   |    9 +++++
 trace/default.c   |   15 ++++++++
 trace/simple.c    |   30 +++++++++++++++++
 trace/simple.h    |    7 ++++
 trace/stderr.c    |   32 ++++++++++++++++++
 trace/stderr.h    |    7 ++++
 12 files changed, 359 insertions(+), 5 deletions(-)

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

* [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-14  1:48   ` Sheldon
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 2/6] trace: Add HMP monitor commands for trace events group Mark Wu
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel

Each trace events group starts with a line containing "group_start:
GroupName" and end with a line containing "group_end". The range of
a trace events group is determined by the "tracetool" script when it
processes the "trace-events" file.

Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 scripts/tracetool |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 trace-events      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 180 insertions(+), 2 deletions(-)

diff --git a/scripts/tracetool b/scripts/tracetool
index 4c9951d..3b4ca41 100755
--- a/scripts/tracetool
+++ b/scripts/tracetool
@@ -166,6 +166,82 @@ linetoc_end_nop()
     return
 }
 
+linetoh_begin_group()
+{
+    group_num=0
+}
+
+linetoh_end_group()
+{
+    cat <<EOF
+#define NR_TRACE_EVENT_GROUPS $group_num
+extern TraceEventGroup trace_group_list[NR_TRACE_EVENT_GROUPS];
+EOF
+}
+
+linetoc_begin_group()
+{
+    cat <<EOF >trace-groups
+
+TraceEventGroup trace_group_list[] = {
+
+EOF
+    group_num=0
+}
+
+linetoc_end_group()
+{
+    cat <<EOF >>trace-groups
+};
+EOF
+    cat < trace-groups
+    rm -f trace-groups
+}
+
+linetoc_group()
+{
+    if echo $str|grep -q "group_start"; then
+        gp_name=${1##*group_start:}
+	if ! test -z "$gp_name"; then
+            start=$((${backend}_event_num))
+	fi
+    elif echo $str|grep -q "group_end"; then
+	stop=$((${backend}_event_num - 1))
+    	cat <<EOF >>trace-groups
+{.gp_name = "$gp_name", .state = 0, .start = $start, .end = $stop},
+
+EOF
+	group_num=$((group_num + 1))
+    fi
+}
+
+linetoc_group_simple()
+{
+    linetoc_group "$1"
+}
+
+linetoc_group_stderr()
+{
+    linetoc_group "$1"
+}
+
+linetoh_group()
+{
+    if echo $str|grep -q "group_end"; then
+        group_num=$((group_num + 1))
+    fi
+}
+
+linetoh_group_simple()
+{
+    linetoh_group
+}
+
+linetoh_group_stderr()
+{
+    linetoh_group
+}
+
 linetoh_begin_simple()
 {
     cat <<EOF
@@ -173,8 +249,10 @@ linetoh_begin_simple()
 EOF
 
     simple_event_num=0
+    linetoh_begin_group
 }
 
+
 cast_args_to_uint64_t()
 {
     local arg
@@ -206,12 +284,14 @@ EOF
     simple_event_num=$((simple_event_num + 1))
 }
 
+
 linetoh_end_simple()
 {
     cat <<EOF
 #define NR_TRACE_EVENTS $simple_event_num
 extern TraceEvent trace_list[NR_TRACE_EVENTS];
 EOF
+    linetoh_end_group
 }
 
 linetoc_begin_simple()
@@ -222,7 +302,7 @@ linetoc_begin_simple()
 TraceEvent trace_list[] = {
 EOF
     simple_event_num=0
-
+    linetoc_begin_group
 }
 
 linetoc_simple()
@@ -240,6 +320,7 @@ linetoc_end_simple()
     cat <<EOF
 };
 EOF
+    linetoc_end_group
 }
 
 #STDERR
@@ -285,6 +366,7 @@ linetoh_end_stderr()
     cat <<EOF
 #define NR_TRACE_EVENTS $stderr_event_num
 EOF
+    linetoh_end_group
 }
 
 linetoc_begin_stderr()
@@ -295,6 +377,7 @@ linetoc_begin_stderr()
 TraceEvent trace_list[] = {
 EOF
     stderr_event_num=0
+    linetoc_begin_group
 }
 
 linetoc_stderr()
@@ -312,6 +395,7 @@ linetoc_end_stderr()
     cat <<EOF
 };
 EOF
+    linetoc_end_group
 }
 #END OF STDERR
 
@@ -523,12 +607,18 @@ convert()
     begin="lineto$1_begin_$backend"
     process_line="lineto$1_$backend"
     end="lineto$1_end_$backend"
+    group="lineto$1_group_$backend"
 
     "$begin"
 
     while read -r str; do
         # Skip comments and empty lines
-        test -z "${str%%#*}" && continue
+        if test -z "${str%%#*}"; then
+	    if [ "$backend" == "simple" -o "$backend" == "stderr" ] && [ ! `echo $str|grep -q "^# group_"` ]; then
+		$group "$str"
+	    fi
+	    continue
+	fi
 
         echo
         # Process the line.  The nop backend handles disabled lines.
diff --git a/trace-events b/trace-events
index a31d9aa..cbd4b58 100644
--- a/trace-events
+++ b/trace-events
@@ -26,6 +26,7 @@
 # The <format-string> should be a sprintf()-compatible format string.
 
 # qemu-malloc.c
+# group_start:qemu-memory
 g_malloc(size_t size, void *ptr) "size %zu ptr %p"
 g_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
 g_free(void *ptr) "ptr %p"
@@ -34,8 +35,10 @@ g_free(void *ptr) "ptr %p"
 qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p"
 qemu_vmalloc(size_t size, void *ptr) "size %zu ptr %p"
 qemu_vfree(void *ptr) "ptr %p"
+# group_end
 
 # hw/virtio.c
+# group_start:virtio
 virtqueue_fill(void *vq, const void *elem, unsigned int len, unsigned int idx) "vq %p elem %p len %u idx %u"
 virtqueue_flush(void *vq, unsigned int count) "vq %p count %u"
 virtqueue_pop(void *vq, void *elem, unsigned int in_num, unsigned int out_num) "vq %p elem %p in_num %u out_num %u"
@@ -43,6 +46,7 @@ virtio_queue_notify(void *vdev, int n, void *vq) "vdev %p n %d vq %p"
 virtio_irq(void *vq) "vq %p"
 virtio_notify(void *vdev, void *vq) "vdev %p vq %p"
 virtio_set_status(void *vdev, uint8_t val) "vdev %p val %u"
+# group_end
 
 # hw/virtio-serial-bus.c
 virtio_serial_send_control_event(unsigned int port, uint16_t event, uint16_t value) "port %u, event %u, value %u"
@@ -51,11 +55,14 @@ virtio_serial_handle_control_message(uint16_t event, uint16_t value) "event %u,
 virtio_serial_handle_control_message_port(unsigned int port) "port %u"
 
 # hw/virtio-console.c
+# group_start:virtio-console
 virtio_console_flush_buf(unsigned int port, size_t len, ssize_t ret) "port %u, in_len %zu, out_len %zd"
 virtio_console_chr_read(unsigned int port, int size) "port %u, size %d"
 virtio_console_chr_event(unsigned int port, int event) "port %u, event %d"
+# group_end
 
 # block.c
+# group_start:block
 multiwrite_cb(void *mcb, int ret) "mcb %p ret %d"
 bdrv_aio_multiwrite(void *mcb, int num_callbacks, int num_reqs) "mcb %p num_callbacks %d num_reqs %d"
 bdrv_aio_multiwrite_earlyfail(void *mcb) "mcb %p"
@@ -67,26 +74,34 @@ bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
 bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
 bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
 bdrv_co_io(int is_write, void *acb) "is_write %d acb %p"
+# group_end
 
 # hw/virtio-blk.c
+# group_start:virtio-blk
 virtio_blk_req_complete(void *req, int status) "req %p status %d"
 virtio_blk_rw_complete(void *req, int ret) "req %p ret %d"
 virtio_blk_handle_write(void *req, uint64_t sector, size_t nsectors) "req %p sector %"PRIu64" nsectors %zu"
+# group_end
 
 # posix-aio-compat.c
+# group_start:posix-aio
 paio_submit(void *acb, void *opaque, int64_t sector_num, int nb_sectors, int type) "acb %p opaque %p sector_num %"PRId64" nb_sectors %d type %d"
 paio_complete(void *acb, void *opaque, int ret) "acb %p opaque %p ret %d"
 paio_cancel(void *acb, void *opaque) "acb %p opaque %p"
+# group_end
 
 # ioport.c
+# group_start:ioport
 cpu_in(unsigned int addr, unsigned int val) "addr %#x value %u"
 cpu_out(unsigned int addr, unsigned int val) "addr %#x value %u"
+# group_end
 
 # balloon.c
 # Since requests are raised via monitor, not many tracepoints are needed.
 balloon_event(void *opaque, unsigned long addr) "opaque %p addr %lu"
 
 # hw/apic.c
+# group_start:apic
 apic_local_deliver(int vector, uint32_t lvt) "vector %d delivery mode %d"
 apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, uint8_t vector_num, uint8_t trigger_mode) "dest %d dest_mode %d delivery_mode %d vector %d trigger_mode %d"
 cpu_set_apic_base(uint64_t val) "%016"PRIx64
@@ -97,18 +112,24 @@ apic_mem_writel(uint64_t addr, uint32_t val) "%"PRIx64" = %08x"
 apic_reset_irq_delivered(int apic_irq_delivered) "old coalescing %d"
 apic_get_irq_delivered(int apic_irq_delivered) "returning coalescing %d"
 apic_set_irq(int apic_irq_delivered) "coalescing %d"
+# group_end
 
 # hw/cs4231.c
+# group_start:cs4231
 cs4231_mem_readl_dreg(uint32_t reg, uint32_t ret) "read dreg %d: 0x%02x"
 cs4231_mem_readl_reg(uint32_t reg, uint32_t ret) "read reg %d: 0x%08x"
 cs4231_mem_writel_reg(uint32_t reg, uint32_t old, uint32_t val) "write reg %d: 0x%08x -> 0x%08x"
 cs4231_mem_writel_dreg(uint32_t reg, uint32_t old, uint32_t val) "write dreg %d: 0x%02x -> 0x%02x"
+# group_end
 
 # hw/ds1225y.c
+# group_start:ds1225y
 nvram_read(uint32_t addr, uint32_t ret) "read addr %d: 0x%02x"
 nvram_write(uint32_t addr, uint32_t old, uint32_t val) "write addr %d: 0x%02x -> 0x%02x"
+# group_end
 
 # hw/eccmemctl.c
+# group_start:eccmemctl
 ecc_mem_writel_mer(uint32_t val) "Write memory enable %08x"
 ecc_mem_writel_mdr(uint32_t val) "Write memory delay %08x"
 ecc_mem_writel_mfsr(uint32_t val) "Write memory fault status %08x"
@@ -127,12 +148,16 @@ ecc_mem_readl_ecr0(uint32_t ret) "Read event count 1 %08x"
 ecc_mem_readl_ecr1(uint32_t ret) "Read event count 2 %08x"
 ecc_diag_mem_writeb(uint64_t addr, uint32_t val) "Write diagnostic %"PRId64" = %02x"
 ecc_diag_mem_readb(uint64_t addr, uint32_t ret) "Read diagnostic %"PRId64"= %02x"
+# group_end
 
 # hw/lance.c
+# group_start:lance
 lance_mem_readw(uint64_t addr, uint32_t ret) "addr=%"PRIx64"val=0x%04x"
 lance_mem_writew(uint64_t addr, uint32_t val) "addr=%"PRIx64"val=0x%04x"
+# group_end
 
 # hw/slavio_intctl.c
+# group_start:slavio_intctl
 slavio_intctl_mem_readl(uint32_t cpu, uint64_t addr, uint32_t ret) "read cpu %d reg 0x%"PRIx64" = %x"
 slavio_intctl_mem_writel(uint32_t cpu, uint64_t addr, uint32_t val) "write cpu %d reg 0x%"PRIx64" = %x"
 slavio_intctl_mem_writel_clear(uint32_t cpu, uint32_t val, uint32_t intreg_pending) "Cleared cpu %d irq mask %x, curmask %x"
@@ -145,8 +170,10 @@ slavio_intctlm_mem_writel_target(uint32_t cpu) "Set master irq cpu %d"
 slavio_check_interrupts(uint32_t pending, uint32_t intregm_disabled) "pending %x disabled %x"
 slavio_set_irq(uint32_t target_cpu, int irq, uint32_t pil, int level) "Set cpu %d irq %d -> pil %d level %d"
 slavio_set_timer_irq_cpu(int cpu, int level) "Set cpu %d local timer level %d"
+# group_end
 
 # hw/slavio_misc.c
+# group_start:slavio_misc
 slavio_misc_update_irq_raise(void) "Raise IRQ"
 slavio_misc_update_irq_lower(void) "Lower IRQ"
 slavio_set_power_fail(int power_failing, uint8_t config) "Power fail: %d, config: %d"
@@ -166,8 +193,10 @@ slavio_sysctrl_mem_writel(uint32_t val) "Write system control %08x"
 slavio_sysctrl_mem_readl(uint32_t ret) "Read system control %08x"
 slavio_led_mem_writew(uint32_t val) "Write diagnostic LED %04x"
 slavio_led_mem_readw(uint32_t ret) "Read diagnostic LED %04x"
+# group_end
 
 # hw/slavio_timer.c
+# group_start:slavio_timer
 slavio_timer_get_out(uint64_t limit, uint32_t counthigh, uint32_t count) "limit %"PRIx64" count %x%08x"
 slavio_timer_irq(uint32_t counthigh, uint32_t count) "callback: count %x%08x"
 slavio_timer_mem_readl_invalid(uint64_t addr) "invalid read address %"PRIx64
@@ -181,8 +210,10 @@ slavio_timer_mem_writel_mode_user(unsigned int timer_index) "processor %d change
 slavio_timer_mem_writel_mode_counter(unsigned int timer_index) "processor %d changed from user timer to counter"
 slavio_timer_mem_writel_mode_invalid(void) "not system timer"
 slavio_timer_mem_writel_invalid(uint64_t addr) "invalid write address %"PRIx64
+# group_end
 
 # hw/sparc32_dma.c
+# group_start:sparc32_dma
 ledma_memory_read(uint64_t addr) "DMA read addr 0x%"PRIx64
 ledma_memory_write(uint64_t addr) "DMA write addr 0x%"PRIx64
 sparc32_dma_set_irq_raise(void) "Raise IRQ"
@@ -193,14 +224,18 @@ sparc32_dma_mem_readl(uint64_t addr, uint32_t ret) "read dmareg %"PRIx64": 0x%08
 sparc32_dma_mem_writel(uint64_t addr, uint32_t old, uint32_t val) "write dmareg %"PRIx64": 0x%08x -> 0x%08x"
 sparc32_dma_enable_raise(void) "Raise DMA enable"
 sparc32_dma_enable_lower(void) "Lower DMA enable"
+# group_end
 
 # hw/sun4m.c
+# group_start:sun4m
 sun4m_cpu_interrupt(unsigned int level) "Set CPU IRQ %d"
 sun4m_cpu_reset_interrupt(unsigned int level) "Reset CPU IRQ %d"
 sun4m_cpu_set_irq_raise(int level) "Raise CPU IRQ %d"
 sun4m_cpu_set_irq_lower(int level) "Lower CPU IRQ %d"
+# group_end
 
 # hw/sun4m_iommu.c
+# group_start:sun4m_iommu
 sun4m_iommu_mem_readl(uint64_t addr, uint32_t ret) "read reg[%"PRIx64"] = %x"
 sun4m_iommu_mem_writel(uint64_t addr, uint32_t val) "write reg[%"PRIx64"] = %x"
 sun4m_iommu_mem_writel_ctrl(uint64_t iostart) "iostart = %"PRIx64
@@ -209,14 +244,18 @@ sun4m_iommu_mem_writel_pgflush(uint32_t val) "page flush %x"
 sun4m_iommu_page_get_flags(uint64_t pa, uint64_t iopte, uint32_t ret) "get flags addr %"PRIx64" => pte %"PRIx64", *pte = %x"
 sun4m_iommu_translate_pa(uint64_t addr, uint64_t pa, uint32_t iopte) "xlate dva %"PRIx64" => pa %"PRIx64" iopte = %x"
 sun4m_iommu_bad_addr(uint64_t addr) "bad addr %"PRIx64
+# group_end
 
 # hw/usb-bus.c
+# group_start:usb-bus
 usb_port_claim(int bus, const char *port) "bus %d, port %s"
 usb_port_attach(int bus, const char *port) "bus %d, port %s"
 usb_port_detach(int bus, const char *port) "bus %d, port %s"
 usb_port_release(int bus, const char *port) "bus %d, port %s"
+# group_end
 
 # hw/usb-ehci.c
+# group_start:usb-ehci
 usb_ehci_reset(void) "=== RESET ==="
 usb_ehci_mmio_readl(uint32_t addr, const char *str, uint32_t val) "rd mmio %04x [%s] = %x"
 usb_ehci_mmio_writel(uint32_t addr, const char *str, uint32_t val) "wr mmio %04x [%s] = %x"
@@ -236,8 +275,10 @@ usb_ehci_port_detach(uint32_t port) "detach port #%d"
 usb_ehci_port_reset(uint32_t port, int enable) "reset port #%d - %d"
 usb_ehci_data(int rw, uint32_t cpage, uint32_t offset, uint32_t addr, uint32_t len, uint32_t bufpos) "write %d, cpage %d, offset 0x%03x, addr 0x%08x, len %d, bufpos %d"
 usb_ehci_queue_action(void *q, const char *action) "q %p: %s"
+# group_end
 
 # hw/usb-desc.c
+# group_start:usb-desc
 usb_desc_device(int addr, int len, int ret) "dev %d query device, len %d, ret %d"
 usb_desc_device_qualifier(int addr, int len, int ret) "dev %d query device qualifier, len %d, ret %d"
 usb_desc_config(int addr, int index, int len, int ret) "dev %d query config %d, len %d, ret %d"
@@ -247,8 +288,10 @@ usb_set_addr(int addr) "dev %d"
 usb_set_config(int addr, int config, int ret) "dev %d, config %d, ret %d"
 usb_clear_device_feature(int addr, int feature, int ret) "dev %d, feature %d, ret %d"
 usb_set_device_feature(int addr, int feature, int ret) "dev %d, feature %d, ret %d"
+# group_end
 
 # usb-linux.c
+# group_start:usb-linux
 usb_host_open_started(int bus, int addr) "dev %d:%d"
 usb_host_open_success(int bus, int addr) "dev %d:%d"
 usb_host_open_failure(int bus, int addr) "dev %d:%d"
@@ -272,8 +315,10 @@ usb_host_reset(int bus, int addr) "dev %d:%d"
 usb_host_auto_scan_enabled(void)
 usb_host_auto_scan_disabled(void)
 usb_host_claim_port(int bus, int hub, int port) "bus %d, hub addr %d, port %d"
+# group_end
 
 # hw/scsi-bus.c
+# group_start:scsi-bus
 scsi_req_alloc(int target, int lun, int tag) "target %d lun %d tag %d"
 scsi_req_data(int target, int lun, int tag, int len) "target %d lun %d tag %d len %d"
 scsi_req_dequeue(int target, int lun, int tag) "target %d lun %d tag %d"
@@ -286,10 +331,12 @@ scsi_report_luns(int target, int lun, int tag) "target %d lun %d tag %d"
 scsi_inquiry(int target, int lun, int tag, int cdb1, int cdb2) "target %d lun %d tag %d page %#02x/%#02x"
 scsi_test_unit_ready(int target, int lun, int tag) "target %d lun %d tag %d"
 scsi_request_sense(int target, int lun, int tag) "target %d lun %d tag %d"
+# group_end
 
 # vl.c
 vm_state_notify(int running, int reason) "running %d reason %d"
 
+# group_start:qed
 # block/qed-l2-cache.c
 qed_alloc_l2_cache_entry(void *l2_cache, void *entry) "l2_cache %p entry %p"
 qed_unref_l2_cache_entry(void *entry, int ref) "entry %p ref %d"
@@ -313,6 +360,7 @@ qed_aio_write_data(void *s, void *acb, int ret, uint64_t offset, size_t len) "s
 qed_aio_write_prefill(void *s, void *acb, uint64_t start, size_t len, uint64_t offset) "s %p acb %p start %"PRIu64" len %zu offset %"PRIu64
 qed_aio_write_postfill(void *s, void *acb, uint64_t start, size_t len, uint64_t offset) "s %p acb %p start %"PRIu64" len %zu offset %"PRIu64
 qed_aio_write_main(void *s, void *acb, int ret, uint64_t offset, size_t len) "s %p acb %p ret %d offset %"PRIu64" len %zu"
+# group_end
 
 # hw/g364fb.c
 g364fb_read(uint64_t addr, uint32_t val) "read addr=0x%"PRIx64": 0x%x"
@@ -339,16 +387,21 @@ grlib_apbuart_event(int event) "event:%d"
 grlib_apbuart_writel_unknown(uint64_t addr, uint32_t value) "addr 0x%"PRIx64" value 0x%x"
 
 # hw/leon3.c
+# group_start:leon3
 leon3_set_irq(int intno) "Set CPU IRQ %d"
 leon3_reset_irq(int intno) "Reset CPU IRQ %d"
+# group_end
 
 # spice-qemu-char.c
+# group_start:spice
 spice_vmc_write(ssize_t out, int len) "spice wrottn %zd of requested %d"
 spice_vmc_read(int bytes, int len) "spice read %d of requested %d"
 spice_vmc_register_interface(void *scd) "spice vmc registered interface %p"
 spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p"
+# group_end
 
 # hw/lm32_pic.c
+# group_start:lm32_pic
 lm32_pic_raise_irq(void) "Raise CPU interrupt"
 lm32_pic_lower_irq(void) "Lower CPU interrupt"
 lm32_pic_interrupt(int irq, int level) "Set IRQ%d %d"
@@ -356,28 +409,36 @@ lm32_pic_set_im(uint32_t im) "im 0x%08x"
 lm32_pic_set_ip(uint32_t ip) "ip 0x%08x"
 lm32_pic_get_im(uint32_t im) "im 0x%08x"
 lm32_pic_get_ip(uint32_t ip) "ip 0x%08x"
+# group_end
 
 # hw/lm32_juart.c
+# group_start:lm32_juart
 lm32_juart_get_jtx(uint32_t value) "jtx 0x%08x"
 lm32_juart_set_jtx(uint32_t value) "jtx 0x%08x"
 lm32_juart_get_jrx(uint32_t value) "jrx 0x%08x"
 lm32_juart_set_jrx(uint32_t value) "jrx 0x%08x"
+# group_end
 
 # hw/lm32_timer.c
+# group_start:lm32_timer
 lm32_timer_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
 lm32_timer_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
 lm32_timer_hit(void) "timer hit"
 lm32_timer_irq_state(int level) "irq state %d"
+# group_end
 
 # hw/lm32_uart.c
+# group_start:lm32_uart
 lm32_uart_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
 lm32_uart_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
 lm32_uart_irq_state(int level) "irq state %d"
+# group_end
 
 # hw/lm32_sys.c
 lm32_sys_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
 
 # hw/milkymist-ac97.c
+# group_start:milkymist-ac97
 milkymist_ac97_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_ac97_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_ac97_pulse_irq_crrequest(void) "Pulse IRQ CR request"
@@ -388,16 +449,22 @@ milkymist_ac97_in_cb(int avail, uint32_t remaining) "avail %d remaining %u"
 milkymist_ac97_in_cb_transferred(int transferred) "transferred %d"
 milkymist_ac97_out_cb(int free, uint32_t remaining) "free %d remaining %u"
 milkymist_ac97_out_cb_transferred(int transferred) "transferred %d"
+# group_end
 
 # hw/milkymist-hpdmc.c
+# group_start:milkymist-hpdmc
 milkymist_hpdmc_memory_read(uint32_t addr, uint32_t value) "addr=%08x value=%08x"
 milkymist_hpdmc_memory_write(uint32_t addr, uint32_t value) "addr=%08x value=%08x"
+# group_end
 
 # hw/milkymist-memcard.c
+# group_start:milkymist-memcard
 milkymist_memcard_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_memcard_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
+# group_end
 
 # hw/milkymist-minimac2.c
+# group_start:milkymist-minimac2
 milkymist_minimac2_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_minimac2_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_minimac2_mdio_write(uint8_t phy_addr, uint8_t addr, uint16_t value) "phy_addr %02x addr %02x value %04x"
@@ -409,22 +476,28 @@ milkymist_minimac2_rx_transfer(const void *buf, uint32_t length) "buf %p length
 milkymist_minimac2_raise_irq_rx(void) "Raise IRQ RX"
 milkymist_minimac2_lower_irq_rx(void) "Lower IRQ RX"
 milkymist_minimac2_pulse_irq_tx(void) "Pulse IRQ TX"
+# group_end
 
 # hw/milkymist-pfpu.c
+# group_start:milkymist-pfpu
 milkymist_pfpu_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_pfpu_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_pfpu_vectout(uint32_t a, uint32_t b, uint32_t dma_ptr) "a %08x b %08x dma_ptr %08x"
 milkymist_pfpu_pulse_irq(void) "Pulse IRQ"
+# group_end
 
 # hw/milkymist-softusb.c
+# group_start:milkymist-softusb
 milkymist_softusb_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_softusb_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_softusb_mevt(uint8_t m) "m %d"
 milkymist_softusb_kevt(uint8_t m) "m %d"
 milkymist_softusb_mouse_event(int dx, int dy, int dz, int bs) "dx %d dy %d dz %d bs %02x"
 milkymist_softusb_pulse_irq(void) "Pulse IRQ"
+# group_end
 
 # hw/milkymist-sysctl.c
+# group_start:milkymist-sysctl
 milkymist_sysctl_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_sysctl_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_sysctl_icap_write(uint32_t value) "value %08x"
@@ -434,12 +507,15 @@ milkymist_sysctl_start_timer1(void) "Start timer1"
 milkymist_sysctl_stop_timer1(void) "Stop timer1"
 milkymist_sysctl_pulse_irq_timer0(void) "Pulse IRQ Timer0"
 milkymist_sysctl_pulse_irq_timer1(void) "Pulse IRQ Timer1"
+# group_end
 
 # hw/milkymist-tmu2.c
+# group_start:milkymist-tmu2
 milkymist_tmu2_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_tmu2_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 milkymist_tmu2_start(void) "Start TMU"
 milkymist_tmu2_pulse_irq(void) "Pulse IRQ"
+# group_end
 
 # hw/milkymist-uart.c
 milkymist_uart_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
@@ -452,22 +528,28 @@ milkymist_vgafb_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x
 milkymist_vgafb_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
 
 # hw/mipsnet.c
+# group_start:mipsnet
 mipsnet_send(uint32_t size) "sending len=%u"
 mipsnet_receive(uint32_t size) "receiving len=%u"
 mipsnet_read(uint64_t addr, uint32_t val) "read addr=0x%" PRIx64 " val=0x%x"
 mipsnet_write(uint64_t addr, uint64_t val) "write addr=0x%" PRIx64 " val=0x%" PRIx64 ""
 mipsnet_irq(uint32_t isr, uint32_t intctl) "set irq to %d (%02x)"
+# group_end
 
 # xen-all.c
+# group_start:xen-all
 xen_ram_alloc(unsigned long ram_addr, unsigned long size) "requested: %#lx, size %#lx"
 xen_client_set_memory(uint64_t start_addr, unsigned long size, unsigned long phys_offset, bool log_dirty) "%#"PRIx64" size %#lx, offset %#lx, log_dirty %i"
+# group_end
 
 # xen-mapcache.c
+# group_start:xen-mapcache
 xen_map_cache(uint64_t phys_addr) "want %#"PRIx64
 xen_remap_bucket(uint64_t index) "index %#"PRIx64
 xen_map_cache_return(void* ptr) "%p"
 xen_map_block(uint64_t phys_addr, uint64_t size) "%#"PRIx64", size %#"PRIx64
 xen_unmap_block(void* addr, unsigned long size) "%p, size %#lx"
+# group_end
 
 # exec.c
 qemu_put_ram_ptr(void* addr) "%p"
@@ -476,19 +558,24 @@ qemu_put_ram_ptr(void* addr) "%p"
 xen_platform_log(char *s) "xen platform: %s"
 
 # qemu-coroutine.c
+# group_start:coroutine
 qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p"
 qemu_coroutine_yield(void *from, void *to) "from %p to %p"
 qemu_coroutine_terminate(void *co) "self %p"
+# group_end
 
 # qemu-coroutine-lock.c
+# group_start:coroutine-lock
 qemu_co_queue_next_bh(void) ""
 qemu_co_queue_next(void *next) "next %p"
 qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p"
 qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
 qemu_co_mutex_unlock_entry(void *mutex, void *self) "mutex %p self %p"
 qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p"
+# group_end
 
 # hw/escc.c
+# group_start:escc
 escc_put_queue(char channel, int b) "channel %c put: 0x%02x"
 escc_get_queue(char channel, int val) "channel %c get 0x%02x"
 escc_update_irq(int irq) "IRQ = %d"
@@ -502,3 +589,4 @@ escc_sunkbd_event_in(int ch) "Untranslated keycode %2.2x"
 escc_sunkbd_event_out(int ch) "Translated keycode %2.2x"
 escc_kbd_command(int val) "Command %d"
 escc_sunmouse_event(int dx, int dy, int buttons_state) "dx=%d dy=%d buttons=%01x"
+# group_end
-- 
1.7.1

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

* [Qemu-devel] [PATCH 2/6] trace: Add HMP monitor commands for trace events group
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple" Mark Wu
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel

Add monitor commands 'trace-group NAME on|off' and 'info trace-groups'
to set and query the state of a given group of trace events.

Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 hmp-commands.hx |   14 ++++++++++++++
 monitor.c       |   22 ++++++++++++++++++++++
 trace/control.h |    9 +++++++++
 trace/default.c |   15 +++++++++++++++
 4 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 9e1cca8..b415616 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -194,6 +194,20 @@ STEXI
 changes status of a trace event
 ETEXI
 
+    {
+        .name       = "trace-group",
+        .args_type  = "name:s,option:b",
+        .params     = "name on|off",
+        .help       = "changes status of a specific trace event",
+        .mhandler.cmd = do_trace_event_group_set_state,
+    },
+
+STEXI
+@item trace-group
+@findex trace-group
+changes status of a group of trace events
+ETEXI
+
 #if defined(CONFIG_SIMPLE_TRACE)
     {
         .name       = "trace-file",
diff --git a/monitor.c b/monitor.c
index 88d8228..0b8ca09 100644
--- a/monitor.c
+++ b/monitor.c
@@ -605,6 +605,17 @@ static void do_trace_event_set_state(Monitor *mon, const QDict *qdict)
     }
 }
 
+static void do_trace_event_group_set_state(Monitor *mon, const QDict *qdict)
+{
+    const char *gp_name = qdict_get_str(qdict, "name");
+    bool new_state = qdict_get_bool(qdict, "option");
+    int ret = trace_event_group_set_state(gp_name, new_state);
+
+    if (!ret) {
+        monitor_printf(mon, "unknown group name \"%s\"\n", gp_name);
+    }
+}
+
 #ifdef CONFIG_SIMPLE_TRACE
 static void do_trace_file(Monitor *mon, const QDict *qdict)
 {
@@ -1010,6 +1021,10 @@ static void do_trace_print_events(Monitor *mon)
     trace_print_events((FILE *)mon, &monitor_fprintf);
 }
 
+static void do_trace_print_groups(Monitor *mon)
+{
+    trace_print_groups((FILE *)mon, &monitor_fprintf);
+}
 /**
  * do_quit(): Quit QEMU execution
  */
@@ -3170,6 +3185,13 @@ static const mon_cmd_t info_cmds[] = {
         .mhandler.info = do_trace_print_events,
     },
     {
+        .name       = "trace-groups",
+        .args_type  = "",
+        .params     = "",
+        .help       = "show available trace-groups & their state",
+        .mhandler.info = do_trace_print_groups,
+    },
+    {
         .name       = NULL,
     },
 };
diff --git a/trace/control.h b/trace/control.h
index 2acaa42..97ecce7 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -15,12 +15,21 @@
 
 /** Print the state of all events. */
 void trace_print_events(FILE *stream, fprintf_function stream_printf);
+
+/** Print the state of all groups. */
+void trace_print_groups(FILE *stream, fprintf_function stream_printf);
+
 /** Set the state of an event.
  *
  * @return Whether the state changed.
  */
 bool trace_event_set_state(const char *name, bool state);
 
+/** Set the state of a group of  events.
+ *
+ * @return Whether the state changed.
+ */
+bool trace_event_group_set_state(const char *name, bool state);
 
 /** Initialize the tracing backend.
  *
diff --git a/trace/default.c b/trace/default.c
index c9b27a2..c7e70c7 100644
--- a/trace/default.c
+++ b/trace/default.c
@@ -18,6 +18,14 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
                   "operation not supported with the current backend\n");
 }
 
+void trace_print_groups(FILE *stream, fprintf_function stream_printf)
+{
+    fprintf(stderr, "warning: "
+            "cannot print the trace groups with the current backend\n");
+    stream_printf(stream, "error: "
+                  "operation not supported with the current backend\n");
+}
+
 bool trace_event_set_state(const char *name, bool state)
 {
     fprintf(stderr, "warning: "
@@ -25,6 +33,13 @@ bool trace_event_set_state(const char *name, bool state)
     return false;
 }
 
+bool trace_event_group_set_state(const char *gp_name, bool state)
+{
+    fprintf(stderr, "warning: "
+            "cannot set the state of a trace group with the current backend\n");
+    return false;
+}
+
 bool trace_backend_init(const char *events, const char *file)
 {
     if (events) {
-- 
1.7.1

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

* [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple"
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 2/6] trace: Add HMP monitor commands for trace events group Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-12 20:46   ` Ryan Harper
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 4/6] trace: Add trace events group implementation in the backend "stderr" Mark Wu
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel


Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 trace/simple.c |   30 ++++++++++++++++++++++++++++++
 trace/simple.h |    7 +++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/trace/simple.c b/trace/simple.c
index b639dda..7aa4c0b 100644
--- a/trace/simple.c
+++ b/trace/simple.c
@@ -321,6 +321,16 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
     }
 }
 
+void trace_print_groups(FILE *stream, fprintf_function stream_printf)
+{
+    unsigned int i;
+
+    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
+        stream_printf(stream, "%s [GROUP ID %u] : state %u\n",
+                      trace_group_list[i].gp_name, i,
+		      trace_group_list[i].state);
+    }
+}
 bool trace_event_set_state(const char *name, bool state)
 {
     unsigned int i;
@@ -334,6 +344,26 @@ bool trace_event_set_state(const char *name, bool state)
     return false;
 }
 
+bool trace_event_group_set_state(const char *gp_name, bool state)
+{
+    unsigned int i;
+    unsigned int j;
+    TraceEventGroup *group;
+
+    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
+	group = &trace_group_list[i]; 
+        if (!strcmp(group->gp_name, gp_name)) {
+            group->state = state;
+
+	    for (j = group->start; j <= group->end; j++) {
+                trace_list[j].state = state;
+            }
+            return true;
+        }
+    }
+    return false;
+}
+
 /* Helper function to create a thread with signals blocked.  Use glib's
  * portable threads since QEMU abstractions cannot be used due to reentrancy in
  * the tracer.  Also note the signal masking on POSIX hosts so that the thread
diff --git a/trace/simple.h b/trace/simple.h
index 466e75b..cf119f3 100644
--- a/trace/simple.h
+++ b/trace/simple.h
@@ -22,6 +22,13 @@ typedef struct {
     bool state;
 } TraceEvent;
 
+typedef struct {
+    const char *gp_name;
+    bool state;
+    int start;
+    int end;
+} TraceEventGroup;
+
 void trace0(TraceEventID event);
 void trace1(TraceEventID event, uint64_t x1);
 void trace2(TraceEventID event, uint64_t x1, uint64_t x2);
-- 
1.7.1

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

* [Qemu-devel] [PATCH 4/6] trace: Add trace events group implementation in the backend "stderr"
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
                   ` (2 preceding siblings ...)
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple" Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 5/6] trace: Enable "-trace events" argument to control initial state of groups Mark Wu
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel


Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 trace/stderr.c |   32 ++++++++++++++++++++++++++++++++
 trace/stderr.h |    7 +++++++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/trace/stderr.c b/trace/stderr.c
index 7107c4a..c409840 100644
--- a/trace/stderr.c
+++ b/trace/stderr.c
@@ -12,6 +12,17 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
     }
 }
 
+void trace_print_groups(FILE *stream, fprintf_function stream_printf)
+{
+    unsigned int i;
+
+    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
+        stream_printf(stream, "%s [GROUP ID %u] : state %u\n",
+                      trace_group_list[i].gp_name, i,
+                      trace_group_list[i].state);
+    }
+}
+
 bool trace_event_set_state(const char *name, bool state)
 {
     unsigned int i;
@@ -25,6 +36,27 @@ bool trace_event_set_state(const char *name, bool state)
     return false;
 }
 
+bool trace_event_group_set_state(const char *gp_name, bool state)
+{
+    unsigned int i;
+    unsigned int j;
+    TraceEventGroup *group;
+
+    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
+
+	group = &trace_group_list[i];
+        if (!strcmp(group->gp_name, gp_name)) {
+            group->state = state;
+
+            for (j = group->start; j <= group->end; j++) {
+                trace_list[j].state = state;
+            }
+            return true;
+        }
+    }
+    return false;
+}
+
 bool trace_backend_init(const char *events, const char *file)
 {
     if (file) {
diff --git a/trace/stderr.h b/trace/stderr.h
index d575b61..45499f6 100644
--- a/trace/stderr.h
+++ b/trace/stderr.h
@@ -8,4 +8,11 @@ typedef struct {
     bool state;
 } TraceEvent;
 
+typedef struct {
+    const char *gp_name;
+    bool state;
+    int start;
+    int end;
+} TraceEventGroup;
+
 #endif /* ! TRACE_STDERR_H */
-- 
1.7.1

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

* [Qemu-devel] [PATCH 5/6] trace: Enable "-trace events" argument to control initial state of groups
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
                   ` (3 preceding siblings ...)
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 4/6] trace: Add trace events group implementation in the backend "stderr" Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 6/6] trace: Update doc for trace events group Mark Wu
  2011-10-13  8:10 ` [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
  6 siblings, 0 replies; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel

A group of trace events can be enabled in early running stage through
adding its group name prefixed with "group:" to trace events list file
which is passed to "-trace events".

Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 trace/control.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/trace/control.c b/trace/control.c
index 4c5527d..5043c83 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -23,10 +23,27 @@ void trace_backend_init_events(const char *fname)
         exit(1);
     }
     char line_buf[1024];
+    char *group;
+
     while (fgets(line_buf, sizeof(line_buf), fp)) {
         size_t len = strlen(line_buf);
         if (len > 1) {              /* skip empty lines */
             line_buf[len - 1] = '\0';
+	    group = strstr(line_buf, "group:");
+	    if (group != NULL) {
+		group += strlen("group:");
+                if (group == NULL) {
+                   fprintf(stderr, "error: empty group name\n");
+                   exit(1);
+                }
+                if (!trace_event_group_set_state(group, true)) {
+                    fprintf(stderr, "error: trace event group '%s'"
+                            "does not exist\n", group);
+                    exit(1);
+                }
+                continue;
+            }
+
             if (!trace_event_set_state(line_buf, true)) {
                 fprintf(stderr,
                         "error: trace event '%s' does not exist\n", line_buf);
-- 
1.7.1

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

* [Qemu-devel] [PATCH 6/6] trace: Update doc for trace events group
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
                   ` (4 preceding siblings ...)
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 5/6] trace: Enable "-trace events" argument to control initial state of groups Mark Wu
@ 2011-10-12 17:14 ` Mark Wu
  2011-10-13  8:10 ` [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
  6 siblings, 0 replies; 11+ messages in thread
From: Mark Wu @ 2011-10-12 17:14 UTC (permalink / raw)
  To: Stefan Hajnoczi; +Cc: Mark Wu, qemu-devel


Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 docs/tracing.txt |   29 ++++++++++++++++++++++++++---
 1 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/docs/tracing.txt b/docs/tracing.txt
index 95ca16c..2bd4824 100644
--- a/docs/tracing.txt
+++ b/docs/tracing.txt
@@ -16,6 +16,7 @@ for debugging, profiling, and observing execution.
 
    echo bdrv_aio_readv   > /tmp/events
    echo bdrv_aio_writev >> /tmp/events
+   echo group:virtio >> /tmp/events
 
 3. Run the virtual machine to produce a trace file:
 
@@ -53,6 +54,16 @@ source code like this:
         return ptr;
     }
 
+== Trace events group ==
+
+Trace events group is used to represent a set of trace events added for the same
+component or feature. Each trace events group starts with a line containing
+"group_start:GroupName" and end with a line containing "group_end". The range of
+a trace events group is determined by the "tracetool" script when it processes
+the "trace-events" file. You can change the state of a group of trace events at
+one time through trace events group.
+
+
 === Declaring trace events ===
 
 The "tracetool" script produces the trace.h header file which is included by
@@ -106,8 +117,8 @@ respectively.  This ensures portability between 32- and 64-bit platforms.
 
 == Generic interface and monitor commands ==
 
-You can programmatically query and control the dynamic state of trace events
-through a backend-agnostic interface:
+You can programmatically query and control the dynamic state of trace events or
+groups through a backend-agnostic interface:
 
 * trace_print_events
 
@@ -122,6 +133,11 @@ through a backend-agnostic interface:
     [...]
     trace_event_set_state("virtio_irq", false); /* disable */
 
+* trace_print_groups
+
+* trace_event_group_set_state
+  Enables or disables a given group of trace events at runtime inside QEMU.
+
 Note that some of the backends do not provide an implementation for this
 interface, in which case QEMU will just print a warning.
 
@@ -131,12 +147,19 @@ This functionality is also provided through monitor commands:
   View available trace events and their state.  State 1 means enabled, state 0
   means disabled.
 
+* info trace-groups
+  View available trace event groups and their state.  State 1 means enabled, state 0
+  means disabled.
+
 * trace-event NAME on|off
   Enable/disable a given trace event.
 
+* trace-group NAME on|off
+  Enable/disable a given trace event group.
+
 The "-trace events=<file>" command line argument can be used to enable the
 events listed in <file> from the very beginning of the program. This file must
-contain one event name per line.
+contain one event name or one group name, which is prefixed by "group:".
 
 == Trace backends ==
 
-- 
1.7.1

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

* Re: [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple"
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple" Mark Wu
@ 2011-10-12 20:46   ` Ryan Harper
  0 siblings, 0 replies; 11+ messages in thread
From: Ryan Harper @ 2011-10-12 20:46 UTC (permalink / raw)
  To: Mark Wu; +Cc: Stefan Hajnoczi, qemu-devel

* Mark Wu <wudxw@linux.vnet.ibm.com> [2011-10-12 12:26]:
> 
> Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
> ---
>  trace/simple.c |   30 ++++++++++++++++++++++++++++++
>  trace/simple.h |    7 +++++++
>  2 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/trace/simple.c b/trace/simple.c
> index b639dda..7aa4c0b 100644
> --- a/trace/simple.c
> +++ b/trace/simple.c
> @@ -321,6 +321,16 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
>      }
>  }
> 
> +void trace_print_groups(FILE *stream, fprintf_function stream_printf)
> +{
> +    unsigned int i;
> +
> +    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
> +        stream_printf(stream, "%s [GROUP ID %u] : state %u\n",
> +                      trace_group_list[i].gp_name, i,
> +		      trace_group_list[i].state);

You've got a mix of space and tabs in this file.  Remove the tabs and
adjust the spacing to CODING_STYLE rules.

> +    }
> +}
>  bool trace_event_set_state(const char *name, bool state)
>  {
>      unsigned int i;
> @@ -334,6 +344,26 @@ bool trace_event_set_state(const char *name, bool state)
>      return false;
>  }
> 
> +bool trace_event_group_set_state(const char *gp_name, bool state)
> +{
> +    unsigned int i;
> +    unsigned int j;
> +    TraceEventGroup *group;
> +
> +    for (i = 0; i < NR_TRACE_EVENT_GROUPS; i++) {
> +	group = &trace_group_list[i]; 

here

> +        if (!strcmp(group->gp_name, gp_name)) {
> +            group->state = state;
> +
> +	    for (j = group->start; j <= group->end; j++) {

here

> +                trace_list[j].state = state;
> +            }
> +            return true;
> +        }
> +    }
> +    return false;
> +}
> +
>  /* Helper function to create a thread with signals blocked.  Use glib's
>   * portable threads since QEMU abstractions cannot be used due to reentrancy in
>   * the tracer.  Also note the signal masking on POSIX hosts so that the thread
> diff --git a/trace/simple.h b/trace/simple.h
> index 466e75b..cf119f3 100644
> --- a/trace/simple.h
> +++ b/trace/simple.h
> @@ -22,6 +22,13 @@ typedef struct {
>      bool state;
>  } TraceEvent;
> 
> +typedef struct {
> +    const char *gp_name;
> +    bool state;
> +    int start;
> +    int end;
> +} TraceEventGroup;
> +
>  void trace0(TraceEventID event);
>  void trace1(TraceEventID event, uint64_t x1);
>  void trace2(TraceEventID event, uint64_t x1, uint64_t x2);
> -- 
> 1.7.1
> 

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
ryanh@us.ibm.com

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

* Re: [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping
  2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
                   ` (5 preceding siblings ...)
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 6/6] trace: Update doc for trace events group Mark Wu
@ 2011-10-13  8:10 ` Mark Wu
  2011-10-14 12:16   ` Stefan Hajnoczi
  6 siblings, 1 reply; 11+ messages in thread
From: Mark Wu @ 2011-10-13  8:10 UTC (permalink / raw)
  To: Mark Wu; +Cc: Stefan Hajnoczi, qemu-devel

On 10/13/2011 01:14 AM, Mark Wu wrote:
> This series add support for trace events grouping. The state of a given group
> of trace events can be queried or changed in bulk by the following monitor
> commands:
>
> * info trace-groups
>    View available trace event groups and their state.  State 1 means enabled,
>    state 0 means disabled.
>
> * trace-group NAME on|off
>    Enable/disable a given trace event group.
>
> A group of trace events can also be enabled in early running stage through
> adding its group name prefixed with "group:" to trace events list file
> which is passed to "-trace events".
>
> Mark Wu (6):
>    trace: Make "tracetool" generate a group list
>    trace: Add HMP monitor commands for trace events group
>    trace: Add trace events group implementation in the backend "simple"
>    trace: Add trace events group implementation in the backend "stderr"
>    trace: Enable "-trace events" argument to control initial state of
>      groups
>    trace: Update doc for trace events group
>
>   docs/tracing.txt  |   29 ++++++++++++++--
>   hmp-commands.hx   |   14 ++++++++
>   monitor.c         |   22 ++++++++++++
>   scripts/tracetool |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++-
>   trace-events      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
>   trace/control.c   |   17 +++++++++
>   trace/control.h   |    9 +++++
>   trace/default.c   |   15 ++++++++
>   trace/simple.c    |   30 +++++++++++++++++
>   trace/simple.h    |    7 ++++
>   trace/stderr.c    |   32 ++++++++++++++++++
>   trace/stderr.h    |    7 ++++
>   12 files changed, 359 insertions(+), 5 deletions(-)
>
Sorry, there're some coding style problems in the patches. I have fixed 
them and will send out later in order to see if there's any other 
problem coming up. :)

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

* Re: [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list
  2011-10-12 17:14 ` [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list Mark Wu
@ 2011-10-14  1:48   ` Sheldon
  0 siblings, 0 replies; 11+ messages in thread
From: Sheldon @ 2011-10-14  1:48 UTC (permalink / raw)
  To: qemu-devel

git apply fails. details as follow:
error: patch failed: trace-events:51
error: trace-events: patch does not apply

Tested-by ShaoHe Feng <shaohef@linux.vnet.ibm.com>

On 10/13/2011 01:14 AM, Mark Wu wrote:
> Each trace events group starts with a line containing "group_start:
> GroupName" and end with a line containing "group_end". The range of
> a trace events group is determined by the "tracetool" script when it
> processes the "trace-events" file.
>
> Signed-off-by: Mark Wu<wudxw@linux.vnet.ibm.com>
> ---
>   scripts/tracetool |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++-
>   trace-events      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 180 insertions(+), 2 deletions(-)
>
> diff --git a/scripts/tracetool b/scripts/tracetool
> index 4c9951d..3b4ca41 100755
> --- a/scripts/tracetool
> +++ b/scripts/tracetool
> @@ -166,6 +166,82 @@ linetoc_end_nop()
>       return
>   }
>
> +linetoh_begin_group()
> +{
> +    group_num=0
> +}
> +
> +linetoh_end_group()
> +{
> +    cat<<EOF
> +#define NR_TRACE_EVENT_GROUPS $group_num
> +extern TraceEventGroup trace_group_list[NR_TRACE_EVENT_GROUPS];
> +EOF
> +}
> +
> +linetoc_begin_group()
> +{
> +    cat<<EOF>trace-groups
> +
> +TraceEventGroup trace_group_list[] = {
> +
> +EOF
> +    group_num=0
> +}
> +
> +linetoc_end_group()
> +{
> +    cat<<EOF>>trace-groups
> +};
> +EOF
> +    cat<  trace-groups
> +    rm -f trace-groups
> +}
> +
> +linetoc_group()
> +{
> +    if echo $str|grep -q "group_start"; then
> +        gp_name=${1##*group_start:}
> +	if ! test -z "$gp_name"; then
> +            start=$((${backend}_event_num))
> +	fi
> +    elif echo $str|grep -q "group_end"; then
> +	stop=$((${backend}_event_num - 1))
> +    	cat<<EOF>>trace-groups
> +{.gp_name = "$gp_name", .state = 0, .start = $start, .end = $stop},
> +
> +EOF
> +	group_num=$((group_num + 1))
> +    fi
> +}
> +
> +linetoc_group_simple()
> +{
> +    linetoc_group "$1"
> +}
> +
> +linetoc_group_stderr()
> +{
> +    linetoc_group "$1"
> +}
> +
> +linetoh_group()
> +{
> +    if echo $str|grep -q "group_end"; then
> +        group_num=$((group_num + 1))
> +    fi
> +}
> +
> +linetoh_group_simple()
> +{
> +    linetoh_group
> +}
> +
> +linetoh_group_stderr()
> +{
> +    linetoh_group
> +}
> +
>   linetoh_begin_simple()
>   {
>       cat<<EOF
> @@ -173,8 +249,10 @@ linetoh_begin_simple()
>   EOF
>
>       simple_event_num=0
> +    linetoh_begin_group
>   }
>
> +
>   cast_args_to_uint64_t()
>   {
>       local arg
> @@ -206,12 +284,14 @@ EOF
>       simple_event_num=$((simple_event_num + 1))
>   }
>
> +
>   linetoh_end_simple()
>   {
>       cat<<EOF
>   #define NR_TRACE_EVENTS $simple_event_num
>   extern TraceEvent trace_list[NR_TRACE_EVENTS];
>   EOF
> +    linetoh_end_group
>   }
>
>   linetoc_begin_simple()
> @@ -222,7 +302,7 @@ linetoc_begin_simple()
>   TraceEvent trace_list[] = {
>   EOF
>       simple_event_num=0
> -
> +    linetoc_begin_group
>   }
>
>   linetoc_simple()
> @@ -240,6 +320,7 @@ linetoc_end_simple()
>       cat<<EOF
>   };
>   EOF
> +    linetoc_end_group
>   }
>
>   #STDERR
> @@ -285,6 +366,7 @@ linetoh_end_stderr()
>       cat<<EOF
>   #define NR_TRACE_EVENTS $stderr_event_num
>   EOF
> +    linetoh_end_group
>   }
>
>   linetoc_begin_stderr()
> @@ -295,6 +377,7 @@ linetoc_begin_stderr()
>   TraceEvent trace_list[] = {
>   EOF
>       stderr_event_num=0
> +    linetoc_begin_group
>   }
>
>   linetoc_stderr()
> @@ -312,6 +395,7 @@ linetoc_end_stderr()
>       cat<<EOF
>   };
>   EOF
> +    linetoc_end_group
>   }
>   #END OF STDERR
>
> @@ -523,12 +607,18 @@ convert()
>       begin="lineto$1_begin_$backend"
>       process_line="lineto$1_$backend"
>       end="lineto$1_end_$backend"
> +    group="lineto$1_group_$backend"
>
>       "$begin"
>
>       while read -r str; do
>           # Skip comments and empty lines
> -        test -z "${str%%#*}"&&  continue
> +        if test -z "${str%%#*}"; then
> +	    if [ "$backend" == "simple" -o "$backend" == "stderr" ]&&  [ ! `echo $str|grep -q "^# group_"` ]; then
> +		$group "$str"
> +	    fi
> +	    continue
> +	fi
>
>           echo
>           # Process the line.  The nop backend handles disabled lines.
> diff --git a/trace-events b/trace-events
> index a31d9aa..cbd4b58 100644
> --- a/trace-events
> +++ b/trace-events
> @@ -26,6 +26,7 @@
>   # The<format-string>  should be a sprintf()-compatible format string.
>
>   # qemu-malloc.c
> +# group_start:qemu-memory
>   g_malloc(size_t size, void *ptr) "size %zu ptr %p"
>   g_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
>   g_free(void *ptr) "ptr %p"
> @@ -34,8 +35,10 @@ g_free(void *ptr) "ptr %p"
>   qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p"
>   qemu_vmalloc(size_t size, void *ptr) "size %zu ptr %p"
>   qemu_vfree(void *ptr) "ptr %p"
> +# group_end
>
>   # hw/virtio.c
> +# group_start:virtio
>   virtqueue_fill(void *vq, const void *elem, unsigned int len, unsigned int idx) "vq %p elem %p len %u idx %u"
>   virtqueue_flush(void *vq, unsigned int count) "vq %p count %u"
>   virtqueue_pop(void *vq, void *elem, unsigned int in_num, unsigned int out_num) "vq %p elem %p in_num %u out_num %u"
> @@ -43,6 +46,7 @@ virtio_queue_notify(void *vdev, int n, void *vq) "vdev %p n %d vq %p"
>   virtio_irq(void *vq) "vq %p"
>   virtio_notify(void *vdev, void *vq) "vdev %p vq %p"
>   virtio_set_status(void *vdev, uint8_t val) "vdev %p val %u"
> +# group_end
>
>   # hw/virtio-serial-bus.c
>   virtio_serial_send_control_event(unsigned int port, uint16_t event, uint16_t value) "port %u, event %u, value %u"
> @@ -51,11 +55,14 @@ virtio_serial_handle_control_message(uint16_t event, uint16_t value) "event %u,
>   virtio_serial_handle_control_message_port(unsigned int port) "port %u"
>
>   # hw/virtio-console.c
> +# group_start:virtio-console
>   virtio_console_flush_buf(unsigned int port, size_t len, ssize_t ret) "port %u, in_len %zu, out_len %zd"
>   virtio_console_chr_read(unsigned int port, int size) "port %u, size %d"
>   virtio_console_chr_event(unsigned int port, int event) "port %u, event %d"
> +# group_end
>
>   # block.c
> +# group_start:block
>   multiwrite_cb(void *mcb, int ret) "mcb %p ret %d"
>   bdrv_aio_multiwrite(void *mcb, int num_callbacks, int num_reqs) "mcb %p num_callbacks %d num_reqs %d"
>   bdrv_aio_multiwrite_earlyfail(void *mcb) "mcb %p"
> @@ -67,26 +74,34 @@ bdrv_lock_medium(void *bs, bool locked) "bs %p locked %d"
>   bdrv_co_readv(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
>   bdrv_co_writev(void *bs, int64_t sector_num, int nb_sector) "bs %p sector_num %"PRId64" nb_sectors %d"
>   bdrv_co_io(int is_write, void *acb) "is_write %d acb %p"
> +# group_end
>
>   # hw/virtio-blk.c
> +# group_start:virtio-blk
>   virtio_blk_req_complete(void *req, int status) "req %p status %d"
>   virtio_blk_rw_complete(void *req, int ret) "req %p ret %d"
>   virtio_blk_handle_write(void *req, uint64_t sector, size_t nsectors) "req %p sector %"PRIu64" nsectors %zu"
> +# group_end
>
>   # posix-aio-compat.c
> +# group_start:posix-aio
>   paio_submit(void *acb, void *opaque, int64_t sector_num, int nb_sectors, int type) "acb %p opaque %p sector_num %"PRId64" nb_sectors %d type %d"
>   paio_complete(void *acb, void *opaque, int ret) "acb %p opaque %p ret %d"
>   paio_cancel(void *acb, void *opaque) "acb %p opaque %p"
> +# group_end
>
>   # ioport.c
> +# group_start:ioport
>   cpu_in(unsigned int addr, unsigned int val) "addr %#x value %u"
>   cpu_out(unsigned int addr, unsigned int val) "addr %#x value %u"
> +# group_end
>
>   # balloon.c
>   # Since requests are raised via monitor, not many tracepoints are needed.
>   balloon_event(void *opaque, unsigned long addr) "opaque %p addr %lu"
>
>   # hw/apic.c
> +# group_start:apic
>   apic_local_deliver(int vector, uint32_t lvt) "vector %d delivery mode %d"
>   apic_deliver_irq(uint8_t dest, uint8_t dest_mode, uint8_t delivery_mode, uint8_t vector_num, uint8_t trigger_mode) "dest %d dest_mode %d delivery_mode %d vector %d trigger_mode %d"
>   cpu_set_apic_base(uint64_t val) "%016"PRIx64
> @@ -97,18 +112,24 @@ apic_mem_writel(uint64_t addr, uint32_t val) "%"PRIx64" = %08x"
>   apic_reset_irq_delivered(int apic_irq_delivered) "old coalescing %d"
>   apic_get_irq_delivered(int apic_irq_delivered) "returning coalescing %d"
>   apic_set_irq(int apic_irq_delivered) "coalescing %d"
> +# group_end
>
>   # hw/cs4231.c
> +# group_start:cs4231
>   cs4231_mem_readl_dreg(uint32_t reg, uint32_t ret) "read dreg %d: 0x%02x"
>   cs4231_mem_readl_reg(uint32_t reg, uint32_t ret) "read reg %d: 0x%08x"
>   cs4231_mem_writel_reg(uint32_t reg, uint32_t old, uint32_t val) "write reg %d: 0x%08x ->  0x%08x"
>   cs4231_mem_writel_dreg(uint32_t reg, uint32_t old, uint32_t val) "write dreg %d: 0x%02x ->  0x%02x"
> +# group_end
>
>   # hw/ds1225y.c
> +# group_start:ds1225y
>   nvram_read(uint32_t addr, uint32_t ret) "read addr %d: 0x%02x"
>   nvram_write(uint32_t addr, uint32_t old, uint32_t val) "write addr %d: 0x%02x ->  0x%02x"
> +# group_end
>
>   # hw/eccmemctl.c
> +# group_start:eccmemctl
>   ecc_mem_writel_mer(uint32_t val) "Write memory enable %08x"
>   ecc_mem_writel_mdr(uint32_t val) "Write memory delay %08x"
>   ecc_mem_writel_mfsr(uint32_t val) "Write memory fault status %08x"
> @@ -127,12 +148,16 @@ ecc_mem_readl_ecr0(uint32_t ret) "Read event count 1 %08x"
>   ecc_mem_readl_ecr1(uint32_t ret) "Read event count 2 %08x"
>   ecc_diag_mem_writeb(uint64_t addr, uint32_t val) "Write diagnostic %"PRId64" = %02x"
>   ecc_diag_mem_readb(uint64_t addr, uint32_t ret) "Read diagnostic %"PRId64"= %02x"
> +# group_end
>
>   # hw/lance.c
> +# group_start:lance
>   lance_mem_readw(uint64_t addr, uint32_t ret) "addr=%"PRIx64"val=0x%04x"
>   lance_mem_writew(uint64_t addr, uint32_t val) "addr=%"PRIx64"val=0x%04x"
> +# group_end
>
>   # hw/slavio_intctl.c
> +# group_start:slavio_intctl
>   slavio_intctl_mem_readl(uint32_t cpu, uint64_t addr, uint32_t ret) "read cpu %d reg 0x%"PRIx64" = %x"
>   slavio_intctl_mem_writel(uint32_t cpu, uint64_t addr, uint32_t val) "write cpu %d reg 0x%"PRIx64" = %x"
>   slavio_intctl_mem_writel_clear(uint32_t cpu, uint32_t val, uint32_t intreg_pending) "Cleared cpu %d irq mask %x, curmask %x"
> @@ -145,8 +170,10 @@ slavio_intctlm_mem_writel_target(uint32_t cpu) "Set master irq cpu %d"
>   slavio_check_interrupts(uint32_t pending, uint32_t intregm_disabled) "pending %x disabled %x"
>   slavio_set_irq(uint32_t target_cpu, int irq, uint32_t pil, int level) "Set cpu %d irq %d ->  pil %d level %d"
>   slavio_set_timer_irq_cpu(int cpu, int level) "Set cpu %d local timer level %d"
> +# group_end
>
>   # hw/slavio_misc.c
> +# group_start:slavio_misc
>   slavio_misc_update_irq_raise(void) "Raise IRQ"
>   slavio_misc_update_irq_lower(void) "Lower IRQ"
>   slavio_set_power_fail(int power_failing, uint8_t config) "Power fail: %d, config: %d"
> @@ -166,8 +193,10 @@ slavio_sysctrl_mem_writel(uint32_t val) "Write system control %08x"
>   slavio_sysctrl_mem_readl(uint32_t ret) "Read system control %08x"
>   slavio_led_mem_writew(uint32_t val) "Write diagnostic LED %04x"
>   slavio_led_mem_readw(uint32_t ret) "Read diagnostic LED %04x"
> +# group_end
>
>   # hw/slavio_timer.c
> +# group_start:slavio_timer
>   slavio_timer_get_out(uint64_t limit, uint32_t counthigh, uint32_t count) "limit %"PRIx64" count %x%08x"
>   slavio_timer_irq(uint32_t counthigh, uint32_t count) "callback: count %x%08x"
>   slavio_timer_mem_readl_invalid(uint64_t addr) "invalid read address %"PRIx64
> @@ -181,8 +210,10 @@ slavio_timer_mem_writel_mode_user(unsigned int timer_index) "processor %d change
>   slavio_timer_mem_writel_mode_counter(unsigned int timer_index) "processor %d changed from user timer to counter"
>   slavio_timer_mem_writel_mode_invalid(void) "not system timer"
>   slavio_timer_mem_writel_invalid(uint64_t addr) "invalid write address %"PRIx64
> +# group_end
>
>   # hw/sparc32_dma.c
> +# group_start:sparc32_dma
>   ledma_memory_read(uint64_t addr) "DMA read addr 0x%"PRIx64
>   ledma_memory_write(uint64_t addr) "DMA write addr 0x%"PRIx64
>   sparc32_dma_set_irq_raise(void) "Raise IRQ"
> @@ -193,14 +224,18 @@ sparc32_dma_mem_readl(uint64_t addr, uint32_t ret) "read dmareg %"PRIx64": 0x%08
>   sparc32_dma_mem_writel(uint64_t addr, uint32_t old, uint32_t val) "write dmareg %"PRIx64": 0x%08x ->  0x%08x"
>   sparc32_dma_enable_raise(void) "Raise DMA enable"
>   sparc32_dma_enable_lower(void) "Lower DMA enable"
> +# group_end
>
>   # hw/sun4m.c
> +# group_start:sun4m
>   sun4m_cpu_interrupt(unsigned int level) "Set CPU IRQ %d"
>   sun4m_cpu_reset_interrupt(unsigned int level) "Reset CPU IRQ %d"
>   sun4m_cpu_set_irq_raise(int level) "Raise CPU IRQ %d"
>   sun4m_cpu_set_irq_lower(int level) "Lower CPU IRQ %d"
> +# group_end
>
>   # hw/sun4m_iommu.c
> +# group_start:sun4m_iommu
>   sun4m_iommu_mem_readl(uint64_t addr, uint32_t ret) "read reg[%"PRIx64"] = %x"
>   sun4m_iommu_mem_writel(uint64_t addr, uint32_t val) "write reg[%"PRIx64"] = %x"
>   sun4m_iommu_mem_writel_ctrl(uint64_t iostart) "iostart = %"PRIx64
> @@ -209,14 +244,18 @@ sun4m_iommu_mem_writel_pgflush(uint32_t val) "page flush %x"
>   sun4m_iommu_page_get_flags(uint64_t pa, uint64_t iopte, uint32_t ret) "get flags addr %"PRIx64" =>  pte %"PRIx64", *pte = %x"
>   sun4m_iommu_translate_pa(uint64_t addr, uint64_t pa, uint32_t iopte) "xlate dva %"PRIx64" =>  pa %"PRIx64" iopte = %x"
>   sun4m_iommu_bad_addr(uint64_t addr) "bad addr %"PRIx64
> +# group_end
>
>   # hw/usb-bus.c
> +# group_start:usb-bus
>   usb_port_claim(int bus, const char *port) "bus %d, port %s"
>   usb_port_attach(int bus, const char *port) "bus %d, port %s"
>   usb_port_detach(int bus, const char *port) "bus %d, port %s"
>   usb_port_release(int bus, const char *port) "bus %d, port %s"
> +# group_end
>
>   # hw/usb-ehci.c
> +# group_start:usb-ehci
>   usb_ehci_reset(void) "=== RESET ==="
>   usb_ehci_mmio_readl(uint32_t addr, const char *str, uint32_t val) "rd mmio %04x [%s] = %x"
>   usb_ehci_mmio_writel(uint32_t addr, const char *str, uint32_t val) "wr mmio %04x [%s] = %x"
> @@ -236,8 +275,10 @@ usb_ehci_port_detach(uint32_t port) "detach port #%d"
>   usb_ehci_port_reset(uint32_t port, int enable) "reset port #%d - %d"
>   usb_ehci_data(int rw, uint32_t cpage, uint32_t offset, uint32_t addr, uint32_t len, uint32_t bufpos) "write %d, cpage %d, offset 0x%03x, addr 0x%08x, len %d, bufpos %d"
>   usb_ehci_queue_action(void *q, const char *action) "q %p: %s"
> +# group_end
>
>   # hw/usb-desc.c
> +# group_start:usb-desc
>   usb_desc_device(int addr, int len, int ret) "dev %d query device, len %d, ret %d"
>   usb_desc_device_qualifier(int addr, int len, int ret) "dev %d query device qualifier, len %d, ret %d"
>   usb_desc_config(int addr, int index, int len, int ret) "dev %d query config %d, len %d, ret %d"
> @@ -247,8 +288,10 @@ usb_set_addr(int addr) "dev %d"
>   usb_set_config(int addr, int config, int ret) "dev %d, config %d, ret %d"
>   usb_clear_device_feature(int addr, int feature, int ret) "dev %d, feature %d, ret %d"
>   usb_set_device_feature(int addr, int feature, int ret) "dev %d, feature %d, ret %d"
> +# group_end
>
>   # usb-linux.c
> +# group_start:usb-linux
>   usb_host_open_started(int bus, int addr) "dev %d:%d"
>   usb_host_open_success(int bus, int addr) "dev %d:%d"
>   usb_host_open_failure(int bus, int addr) "dev %d:%d"
> @@ -272,8 +315,10 @@ usb_host_reset(int bus, int addr) "dev %d:%d"
>   usb_host_auto_scan_enabled(void)
>   usb_host_auto_scan_disabled(void)
>   usb_host_claim_port(int bus, int hub, int port) "bus %d, hub addr %d, port %d"
> +# group_end
>
>   # hw/scsi-bus.c
> +# group_start:scsi-bus
>   scsi_req_alloc(int target, int lun, int tag) "target %d lun %d tag %d"
>   scsi_req_data(int target, int lun, int tag, int len) "target %d lun %d tag %d len %d"
>   scsi_req_dequeue(int target, int lun, int tag) "target %d lun %d tag %d"
> @@ -286,10 +331,12 @@ scsi_report_luns(int target, int lun, int tag) "target %d lun %d tag %d"
>   scsi_inquiry(int target, int lun, int tag, int cdb1, int cdb2) "target %d lun %d tag %d page %#02x/%#02x"
>   scsi_test_unit_ready(int target, int lun, int tag) "target %d lun %d tag %d"
>   scsi_request_sense(int target, int lun, int tag) "target %d lun %d tag %d"
> +# group_end
>
>   # vl.c
>   vm_state_notify(int running, int reason) "running %d reason %d"
>
> +# group_start:qed
>   # block/qed-l2-cache.c
>   qed_alloc_l2_cache_entry(void *l2_cache, void *entry) "l2_cache %p entry %p"
>   qed_unref_l2_cache_entry(void *entry, int ref) "entry %p ref %d"
> @@ -313,6 +360,7 @@ qed_aio_write_data(void *s, void *acb, int ret, uint64_t offset, size_t len) "s
>   qed_aio_write_prefill(void *s, void *acb, uint64_t start, size_t len, uint64_t offset) "s %p acb %p start %"PRIu64" len %zu offset %"PRIu64
>   qed_aio_write_postfill(void *s, void *acb, uint64_t start, size_t len, uint64_t offset) "s %p acb %p start %"PRIu64" len %zu offset %"PRIu64
>   qed_aio_write_main(void *s, void *acb, int ret, uint64_t offset, size_t len) "s %p acb %p ret %d offset %"PRIu64" len %zu"
> +# group_end
>
>   # hw/g364fb.c
>   g364fb_read(uint64_t addr, uint32_t val) "read addr=0x%"PRIx64": 0x%x"
> @@ -339,16 +387,21 @@ grlib_apbuart_event(int event) "event:%d"
>   grlib_apbuart_writel_unknown(uint64_t addr, uint32_t value) "addr 0x%"PRIx64" value 0x%x"
>
>   # hw/leon3.c
> +# group_start:leon3
>   leon3_set_irq(int intno) "Set CPU IRQ %d"
>   leon3_reset_irq(int intno) "Reset CPU IRQ %d"
> +# group_end
>
>   # spice-qemu-char.c
> +# group_start:spice
>   spice_vmc_write(ssize_t out, int len) "spice wrottn %zd of requested %d"
>   spice_vmc_read(int bytes, int len) "spice read %d of requested %d"
>   spice_vmc_register_interface(void *scd) "spice vmc registered interface %p"
>   spice_vmc_unregister_interface(void *scd) "spice vmc unregistered interface %p"
> +# group_end
>
>   # hw/lm32_pic.c
> +# group_start:lm32_pic
>   lm32_pic_raise_irq(void) "Raise CPU interrupt"
>   lm32_pic_lower_irq(void) "Lower CPU interrupt"
>   lm32_pic_interrupt(int irq, int level) "Set IRQ%d %d"
> @@ -356,28 +409,36 @@ lm32_pic_set_im(uint32_t im) "im 0x%08x"
>   lm32_pic_set_ip(uint32_t ip) "ip 0x%08x"
>   lm32_pic_get_im(uint32_t im) "im 0x%08x"
>   lm32_pic_get_ip(uint32_t ip) "ip 0x%08x"
> +# group_end
>
>   # hw/lm32_juart.c
> +# group_start:lm32_juart
>   lm32_juart_get_jtx(uint32_t value) "jtx 0x%08x"
>   lm32_juart_set_jtx(uint32_t value) "jtx 0x%08x"
>   lm32_juart_get_jrx(uint32_t value) "jrx 0x%08x"
>   lm32_juart_set_jrx(uint32_t value) "jrx 0x%08x"
> +# group_end
>
>   # hw/lm32_timer.c
> +# group_start:lm32_timer
>   lm32_timer_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
>   lm32_timer_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
>   lm32_timer_hit(void) "timer hit"
>   lm32_timer_irq_state(int level) "irq state %d"
> +# group_end
>
>   # hw/lm32_uart.c
> +# group_start:lm32_uart
>   lm32_uart_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
>   lm32_uart_memory_read(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
>   lm32_uart_irq_state(int level) "irq state %d"
> +# group_end
>
>   # hw/lm32_sys.c
>   lm32_sys_memory_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
>
>   # hw/milkymist-ac97.c
> +# group_start:milkymist-ac97
>   milkymist_ac97_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_ac97_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_ac97_pulse_irq_crrequest(void) "Pulse IRQ CR request"
> @@ -388,16 +449,22 @@ milkymist_ac97_in_cb(int avail, uint32_t remaining) "avail %d remaining %u"
>   milkymist_ac97_in_cb_transferred(int transferred) "transferred %d"
>   milkymist_ac97_out_cb(int free, uint32_t remaining) "free %d remaining %u"
>   milkymist_ac97_out_cb_transferred(int transferred) "transferred %d"
> +# group_end
>
>   # hw/milkymist-hpdmc.c
> +# group_start:milkymist-hpdmc
>   milkymist_hpdmc_memory_read(uint32_t addr, uint32_t value) "addr=%08x value=%08x"
>   milkymist_hpdmc_memory_write(uint32_t addr, uint32_t value) "addr=%08x value=%08x"
> +# group_end
>
>   # hw/milkymist-memcard.c
> +# group_start:milkymist-memcard
>   milkymist_memcard_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_memcard_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
> +# group_end
>
>   # hw/milkymist-minimac2.c
> +# group_start:milkymist-minimac2
>   milkymist_minimac2_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_minimac2_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_minimac2_mdio_write(uint8_t phy_addr, uint8_t addr, uint16_t value) "phy_addr %02x addr %02x value %04x"
> @@ -409,22 +476,28 @@ milkymist_minimac2_rx_transfer(const void *buf, uint32_t length) "buf %p length
>   milkymist_minimac2_raise_irq_rx(void) "Raise IRQ RX"
>   milkymist_minimac2_lower_irq_rx(void) "Lower IRQ RX"
>   milkymist_minimac2_pulse_irq_tx(void) "Pulse IRQ TX"
> +# group_end
>
>   # hw/milkymist-pfpu.c
> +# group_start:milkymist-pfpu
>   milkymist_pfpu_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_pfpu_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_pfpu_vectout(uint32_t a, uint32_t b, uint32_t dma_ptr) "a %08x b %08x dma_ptr %08x"
>   milkymist_pfpu_pulse_irq(void) "Pulse IRQ"
> +# group_end
>
>   # hw/milkymist-softusb.c
> +# group_start:milkymist-softusb
>   milkymist_softusb_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_softusb_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_softusb_mevt(uint8_t m) "m %d"
>   milkymist_softusb_kevt(uint8_t m) "m %d"
>   milkymist_softusb_mouse_event(int dx, int dy, int dz, int bs) "dx %d dy %d dz %d bs %02x"
>   milkymist_softusb_pulse_irq(void) "Pulse IRQ"
> +# group_end
>
>   # hw/milkymist-sysctl.c
> +# group_start:milkymist-sysctl
>   milkymist_sysctl_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_sysctl_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_sysctl_icap_write(uint32_t value) "value %08x"
> @@ -434,12 +507,15 @@ milkymist_sysctl_start_timer1(void) "Start timer1"
>   milkymist_sysctl_stop_timer1(void) "Stop timer1"
>   milkymist_sysctl_pulse_irq_timer0(void) "Pulse IRQ Timer0"
>   milkymist_sysctl_pulse_irq_timer1(void) "Pulse IRQ Timer1"
> +# group_end
>
>   # hw/milkymist-tmu2.c
> +# group_start:milkymist-tmu2
>   milkymist_tmu2_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_tmu2_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>   milkymist_tmu2_start(void) "Start TMU"
>   milkymist_tmu2_pulse_irq(void) "Pulse IRQ"
> +# group_end
>
>   # hw/milkymist-uart.c
>   milkymist_uart_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x"
> @@ -452,22 +528,28 @@ milkymist_vgafb_memory_read(uint32_t addr, uint32_t value) "addr %08x value %08x
>   milkymist_vgafb_memory_write(uint32_t addr, uint32_t value) "addr %08x value %08x"
>
>   # hw/mipsnet.c
> +# group_start:mipsnet
>   mipsnet_send(uint32_t size) "sending len=%u"
>   mipsnet_receive(uint32_t size) "receiving len=%u"
>   mipsnet_read(uint64_t addr, uint32_t val) "read addr=0x%" PRIx64 " val=0x%x"
>   mipsnet_write(uint64_t addr, uint64_t val) "write addr=0x%" PRIx64 " val=0x%" PRIx64 ""
>   mipsnet_irq(uint32_t isr, uint32_t intctl) "set irq to %d (%02x)"
> +# group_end
>
>   # xen-all.c
> +# group_start:xen-all
>   xen_ram_alloc(unsigned long ram_addr, unsigned long size) "requested: %#lx, size %#lx"
>   xen_client_set_memory(uint64_t start_addr, unsigned long size, unsigned long phys_offset, bool log_dirty) "%#"PRIx64" size %#lx, offset %#lx, log_dirty %i"
> +# group_end
>
>   # xen-mapcache.c
> +# group_start:xen-mapcache
>   xen_map_cache(uint64_t phys_addr) "want %#"PRIx64
>   xen_remap_bucket(uint64_t index) "index %#"PRIx64
>   xen_map_cache_return(void* ptr) "%p"
>   xen_map_block(uint64_t phys_addr, uint64_t size) "%#"PRIx64", size %#"PRIx64
>   xen_unmap_block(void* addr, unsigned long size) "%p, size %#lx"
> +# group_end
>
>   # exec.c
>   qemu_put_ram_ptr(void* addr) "%p"
> @@ -476,19 +558,24 @@ qemu_put_ram_ptr(void* addr) "%p"
>   xen_platform_log(char *s) "xen platform: %s"
>
>   # qemu-coroutine.c
> +# group_start:coroutine
>   qemu_coroutine_enter(void *from, void *to, void *opaque) "from %p to %p opaque %p"
>   qemu_coroutine_yield(void *from, void *to) "from %p to %p"
>   qemu_coroutine_terminate(void *co) "self %p"
> +# group_end
>
>   # qemu-coroutine-lock.c
> +# group_start:coroutine-lock
>   qemu_co_queue_next_bh(void) ""
>   qemu_co_queue_next(void *next) "next %p"
>   qemu_co_mutex_lock_entry(void *mutex, void *self) "mutex %p self %p"
>   qemu_co_mutex_lock_return(void *mutex, void *self) "mutex %p self %p"
>   qemu_co_mutex_unlock_entry(void *mutex, void *self) "mutex %p self %p"
>   qemu_co_mutex_unlock_return(void *mutex, void *self) "mutex %p self %p"
> +# group_end
>
>   # hw/escc.c
> +# group_start:escc
>   escc_put_queue(char channel, int b) "channel %c put: 0x%02x"
>   escc_get_queue(char channel, int val) "channel %c get 0x%02x"
>   escc_update_irq(int irq) "IRQ = %d"
> @@ -502,3 +589,4 @@ escc_sunkbd_event_in(int ch) "Untranslated keycode %2.2x"
>   escc_sunkbd_event_out(int ch) "Translated keycode %2.2x"
>   escc_kbd_command(int val) "Command %d"
>   escc_sunmouse_event(int dx, int dy, int buttons_state) "dx=%d dy=%d buttons=%01x"
> +# group_end

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

* Re: [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping
  2011-10-13  8:10 ` [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
@ 2011-10-14 12:16   ` Stefan Hajnoczi
  0 siblings, 0 replies; 11+ messages in thread
From: Stefan Hajnoczi @ 2011-10-14 12:16 UTC (permalink / raw)
  To: Mark Wu; +Cc: Mark Wu, Stefan Hajnoczi, qemu-devel

On Thu, Oct 13, 2011 at 04:10:56PM +0800, Mark Wu wrote:
> On 10/13/2011 01:14 AM, Mark Wu wrote:
> >This series add support for trace events grouping. The state of a given group
> >of trace events can be queried or changed in bulk by the following monitor
> >commands:
> >
> >* info trace-groups
> >   View available trace event groups and their state.  State 1 means enabled,
> >   state 0 means disabled.
> >
> >* trace-group NAME on|off
> >   Enable/disable a given trace event group.
> >
> >A group of trace events can also be enabled in early running stage through
> >adding its group name prefixed with "group:" to trace events list file
> >which is passed to "-trace events".
> >
> >Mark Wu (6):
> >   trace: Make "tracetool" generate a group list
> >   trace: Add HMP monitor commands for trace events group
> >   trace: Add trace events group implementation in the backend "simple"
> >   trace: Add trace events group implementation in the backend "stderr"
> >   trace: Enable "-trace events" argument to control initial state of
> >     groups
> >   trace: Update doc for trace events group
> >
> >  docs/tracing.txt  |   29 ++++++++++++++--
> >  hmp-commands.hx   |   14 ++++++++
> >  monitor.c         |   22 ++++++++++++
> >  scripts/tracetool |   94 +++++++++++++++++++++++++++++++++++++++++++++++++++-
> >  trace-events      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
> >  trace/control.c   |   17 +++++++++
> >  trace/control.h   |    9 +++++
> >  trace/default.c   |   15 ++++++++
> >  trace/simple.c    |   30 +++++++++++++++++
> >  trace/simple.h    |    7 ++++
> >  trace/stderr.c    |   32 ++++++++++++++++++
> >  trace/stderr.h    |    7 ++++
> >  12 files changed, 359 insertions(+), 5 deletions(-)
> >
> Sorry, there're some coding style problems in the patches. I have
> fixed them and will send out later in order to see if there's any
> other problem coming up. :)

Hi Mark,
Please run scripts/checkpatch.pl on the patches if you haven't already.
It will point out many of the coding style issues.

I think we can get the same convenience by adding wildcard trace event
support.  For example, virtio-blk trace events could be enabled using:

  trace-event virtio_blk_* on

This doesn't work for the memory allocation functions because their
names do not share a common unique prefix, e.g. g_malloc and
qemu_memalign.  However, most related trace events do share a common
unique prefix.

Wildcards don't require special comments in trace-events so it
eliminates the problem of people forgetting to add groups when they add
trace events to QEMU.

The other advantage is that wildcards can select fine-grained sets of
trace events, like ecc_mem_writel_mer, ecc_mem_writel_mdr, etc.
ecc_mem_writel_* selects all these related trace events (they are a
subset of the hw/eccmemctl.c trace events).  This is not possible with
the groups patches since each trace-event can only be in one group;
either we have a high-level hw/eccmemctl.c group or a lower-level
ecc_mem_writel group but both is not possible.

I suggest adding wildcard trace event matching instead of adding groups.
The code changes for wildcards should be much smaller than for groups.
What do you think?

Stefan

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

end of thread, other threads:[~2011-10-14 12:16 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-12 17:14 [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
2011-10-12 17:14 ` [Qemu-devel] [PATCH 1/6] trace: Make "tracetool" generate a group list Mark Wu
2011-10-14  1:48   ` Sheldon
2011-10-12 17:14 ` [Qemu-devel] [PATCH 2/6] trace: Add HMP monitor commands for trace events group Mark Wu
2011-10-12 17:14 ` [Qemu-devel] [PATCH 3/6] trace: Add trace events group implementation in the backend "simple" Mark Wu
2011-10-12 20:46   ` Ryan Harper
2011-10-12 17:14 ` [Qemu-devel] [PATCH 4/6] trace: Add trace events group implementation in the backend "stderr" Mark Wu
2011-10-12 17:14 ` [Qemu-devel] [PATCH 5/6] trace: Enable "-trace events" argument to control initial state of groups Mark Wu
2011-10-12 17:14 ` [Qemu-devel] [PATCH 6/6] trace: Update doc for trace events group Mark Wu
2011-10-13  8:10 ` [Qemu-devel] [PATCH 0/6] trace: Add support for trace events grouping Mark Wu
2011-10-14 12:16   ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).