diff options
author | Keir Fraser <keir@xen.org> | 2010-12-16 20:07:03 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-12-16 20:07:03 +0000 |
commit | 5ec363dfe9654d3be6d3e9a0105ebe53577913fe (patch) | |
tree | 5fb25679f24ced102bb8d060bab134278a1e52e0 /xen/common/trace.c | |
parent | 3b2ddb02d6dc8e97691ebb53d1888a0844eaae07 (diff) | |
download | xen-5ec363dfe9654d3be6d3e9a0105ebe53577913fe.tar.gz xen-5ec363dfe9654d3be6d3e9a0105ebe53577913fe.tar.bz2 xen-5ec363dfe9654d3be6d3e9a0105ebe53577913fe.zip |
xentrace: Clean up initialisation.
Allocate no memory and print no debug messages when disabled.
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/trace.c')
-rw-r--r-- | xen/common/trace.c | 105 |
1 files changed, 47 insertions, 58 deletions
diff --git a/xen/common/trace.c b/xen/common/trace.c index 5b0c52e2a8..734f195d82 100644 --- a/xen/common/trace.c +++ b/xen/common/trace.c @@ -80,14 +80,8 @@ static u32 tb_event_mask = TRC_ALL; static void calc_tinfo_first_offset(void) { - int offset_in_bytes; - - offset_in_bytes = offsetof(struct t_info, mfn_offset[NR_CPUS]); - + int offset_in_bytes = offsetof(struct t_info, mfn_offset[NR_CPUS]); t_info_first_offset = fit_to_type(uint32_t, offset_in_bytes); - - gdprintk(XENLOG_INFO, "%s: NR_CPUs %d, offset_in_bytes %d, t_info_first_offset %u\n", - __func__, NR_CPUS, offset_in_bytes, (unsigned)t_info_first_offset); } /** @@ -122,21 +116,37 @@ static int alloc_trace_bufs(void) int i, cpu, order; unsigned long nr_pages; /* Start after a fixed-size array of NR_CPUS */ - uint32_t *t_info_mfn_list = (uint32_t *)t_info; - int offset = t_info_first_offset; - - BUG_ON(check_tbuf_size(opt_tbuf_size)); + uint32_t *t_info_mfn_list; + int offset; if ( opt_tbuf_size == 0 ) return -EINVAL; - if ( !t_info ) + if ( check_tbuf_size(opt_tbuf_size) ) { - printk("%s: t_info not allocated, cannot allocate trace buffers!\n", - __func__); + printk("Xen trace buffers: tb size %d too large. " + "Tracing disabled.\n", + opt_tbuf_size); return -EINVAL; } + /* t_info size is fixed for now. Currently this works great, so there + * seems to be no need to make it dynamic. */ + t_info = alloc_xenheap_pages(get_order_from_pages(T_INFO_PAGES), 0); + if ( t_info == NULL ) + { + printk("Xen trace buffers: t_info allocation failed! " + "Tracing disabled.\n"); + return -ENOMEM; + } + + for ( i = 0; i < T_INFO_PAGES; i++ ) + share_xen_page_with_privileged_guests( + virt_to_page(t_info) + i, XENSHARE_readonly); + + t_info_mfn_list = (uint32_t *)t_info; + offset = t_info_first_offset; + t_info->tbuf_size = opt_tbuf_size; printk(XENLOG_INFO "tbuf_size %d\n", t_info->tbuf_size); @@ -240,7 +250,7 @@ static int tb_set_size(int size) */ int ret = 0; - if ( (opt_tbuf_size != 0) ) + if ( opt_tbuf_size != 0 ) { if ( size != opt_tbuf_size ) gdprintk(XENLOG_INFO, "tb_set_size from %d to %d not implemented\n", @@ -251,20 +261,16 @@ static int tb_set_size(int size) if ( size <= 0 ) return -EINVAL; - if ( check_tbuf_size(size) ) - { - gdprintk(XENLOG_INFO, "tb size %d too large\n", size); - return -EINVAL; - } - opt_tbuf_size = size; - if ( (ret = alloc_trace_bufs()) == 0 ) - printk("Xen trace buffers: initialized\n"); - else + if ( (ret = alloc_trace_bufs()) != 0 ) + { opt_tbuf_size = 0; + return ret; + } - return ret; + printk("Xen trace buffers: initialized\n"); + return 0; } int trace_will_trace_event(u32 event) @@ -307,6 +313,7 @@ static int cpu_callback( static struct notifier_block cpu_nfb = { .notifier_call = cpu_callback }; + /** * init_trace_bufs - performs initialization of the per-cpu trace buffers. * @@ -321,50 +328,32 @@ void __init init_trace_bufs(void) /* Calculate offset in u32 of first mfn */ calc_tinfo_first_offset(); - /* t_info size is fixed for now. Currently this works great, so there - * seems to be no need to make it dynamic. */ - t_info = alloc_xenheap_pages(get_order_from_pages(T_INFO_PAGES), 0); - - if ( t_info == NULL ) - { - printk("Xen trace buffers: t_info allocation failed! Tracing disabled.\n"); - return; - } - + /* Per-cpu t_lock initialisation. */ for_each_online_cpu ( i ) spin_lock_init(&per_cpu(t_lock, i)); register_cpu_notifier(&cpu_nfb); - for(i=0; i<T_INFO_PAGES; i++) - share_xen_page_with_privileged_guests( - virt_to_page(t_info) + i, XENSHARE_readonly); - if ( opt_tbuf_size == 0 ) { printk("Xen trace buffers: disabled\n"); - return; - } - else if ( check_tbuf_size(opt_tbuf_size) ) - { - gdprintk(XENLOG_INFO, "Xen trace buffers: " - "tb size %d too large, disabling\n", - opt_tbuf_size); - opt_tbuf_size = 0; + goto fail; } - if ( alloc_trace_bufs() == 0 ) + if ( alloc_trace_bufs() != 0 ) { - printk("Xen trace buffers: initialised\n"); - wmb(); /* above must be visible before tb_init_done flag set */ - tb_init_done = 1; - } - else - { - gdprintk(XENLOG_INFO, "Xen trace buffers: " - "allocation size %d failed, disabling\n", - opt_tbuf_size); - opt_tbuf_size = 0; + dprintk(XENLOG_INFO, "Xen trace buffers: " + "allocation size %d failed, disabling\n", + opt_tbuf_size); + goto fail; } + + printk("Xen trace buffers: initialised\n"); + wmb(); /* above must be visible before tb_init_done flag set */ + tb_init_done = 1; + return; + + fail: + opt_tbuf_size = 0; } /** |