]> xenbits.xensource.com Git - people/vhanquez/xen.git/commitdiff
xentrace: Clean up initialisation.
authorKeir Fraser <keir@xen.org>
Thu, 16 Dec 2010 20:18:11 +0000 (20:18 +0000)
committerKeir Fraser <keir@xen.org>
Thu, 16 Dec 2010 20:18:11 +0000 (20:18 +0000)
Allocate no memory and print no debug messages when disabled.

Signed-off-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   22567:f5f3cf4e001f
xen-unstable date:        Thu Dec 16 20:07:03 2010 +0000

xen/common/trace.c

index 9f2a2121b4167192fb6cbff23e74764dac05f864..d24d444274394fd6abde379a9e9eadd55581daf9 100644 (file)
@@ -79,14 +79,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);
 }
 
 /**
@@ -121,21 +115,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);
 
@@ -241,7 +251,7 @@ static int tb_set_size(int size)
 
 
 
-    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",
@@ -252,20 +262,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)
@@ -308,49 +314,31 @@ void __init init_trace_bufs(void)
     /* Calculate offset in u32 of first mfn */
     calc_tinfo_first_offset();
 
-    /* t_info size fixed at 2 pages for now.  That should be big enough / small enough
-     * until it's worth making it dynamic. */
-    t_info = alloc_xenheap_pages(1, 0);
-
-    if ( t_info == NULL )
-    {
-        printk("Xen trace buffers: t_info allocation failed!  Tracing disabled.\n");
-        return;
-    }
-
-    for(i = 0; i < NR_CPUS; i++)
+    /* Per-cpu t_lock initialisation. */
+    for ( i = 0; i < NR_CPUS; i++ )
         spin_lock_init(&per_cpu(t_lock, i));
 
-    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;
 }
 
 /**