* [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
* 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
* [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
* 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
* [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 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 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).