[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xenoprof: Fix initialisation. Much can be done at boot-time, as



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1184078486 -3600
# Node ID 26eef84261106ee26e05cc3bb8dfb237b4915bd2
# Parent  f01cb504cf28503b8fd3021f9aa53e87dd8f8bd7
xenoprof: Fix initialisation. Much can be done at boot-time, as
indicated by the fact that the low-level functiosn are marked
'__init'.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/arch/ia64/linux-xen/perfmon.c    |    2 
 xen/arch/ia64/xen/oprofile/perfmon.c |   11 ----
 xen/arch/x86/oprofile/nmi_int.c      |   83 ++++++++++++++---------------------
 xen/common/xenoprof.c                |   52 ++++++++++-----------
 xen/include/asm-ia64/xenoprof.h      |    2 
 xen/include/asm-x86/xenoprof.h       |    4 -
 xen/include/xen/xenoprof.h           |    2 
 7 files changed, 65 insertions(+), 91 deletions(-)

diff -r f01cb504cf28 -r 26eef8426110 xen/arch/ia64/linux-xen/perfmon.c
--- a/xen/arch/ia64/linux-xen/perfmon.c Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/arch/ia64/linux-xen/perfmon.c Tue Jul 10 15:41:26 2007 +0100
@@ -7729,7 +7729,7 @@ do_perfmon_op(unsigned long cmd,
 {
        unsigned long error = 0;
 
-       if (!NONPRIV_OP(cmd) && current->domain != xenoprof_primary_profiler) {
+       if (!NONPRIV_OP(cmd) && current->domain->domain_id !=0) {
                gdprintk(XENLOG_INFO, "xen perfmon: "
                         "dom %d denied privileged operation %ld\n",
                         current->domain->domain_id, cmd);
diff -r f01cb504cf28 -r 26eef8426110 xen/arch/ia64/xen/oprofile/perfmon.c
--- a/xen/arch/ia64/xen/oprofile/perfmon.c      Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/arch/ia64/xen/oprofile/perfmon.c      Tue Jul 10 15:41:26 2007 +0100
@@ -119,19 +119,10 @@ __exitcall(xenoprof_perfmon_exit);
 ///////////////////////////////////////////////////////////////////////////
 // glue methods for xenoprof and perfmon.
 int
-xenoprof_arch_init(int *num_events, int *is_primary, char *cpu_type)
+xenoprof_arch_init(int *num_events, char *cpu_type)
 {
     *num_events = 0;
     strlcpy(cpu_type, get_cpu_type(), XENOPROF_CPU_TYPE_SIZE);
-
-    *is_primary = 0;
-    if (xenoprof_primary_profiler == NULL) {
-        /* For now, only dom0 can be the primary profiler */
-        if (current->domain->domain_id == 0) {
-            *is_primary = 1;
-        }
-    } else if (xenoprof_primary_profiler == current->domain)
-        *is_primary = 1;
     return 0;
 }
 
diff -r f01cb504cf28 -r 26eef8426110 xen/arch/x86/oprofile/nmi_int.c
--- a/xen/arch/x86/oprofile/nmi_int.c   Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/arch/x86/oprofile/nmi_int.c   Tue Jul 10 15:41:26 2007 +0100
@@ -27,20 +27,15 @@
 #include "op_counter.h"
 #include "op_x86_model.h"
  
+struct op_counter_config counter_config[OP_MAX_COUNTER];
+
 static struct op_x86_model_spec const * model;
 static struct op_msrs cpu_msrs[NR_CPUS];
 static unsigned long saved_lvtpc[NR_CPUS];
 
-#define VIRQ_BITMASK_SIZE (MAX_OPROF_DOMAINS/32 + 1)
-extern int active_domains[MAX_OPROF_DOMAINS];
-extern unsigned int adomains;
-extern struct domain *adomain_ptrs[MAX_OPROF_DOMAINS];
-extern unsigned long virq_ovf_pending[VIRQ_BITMASK_SIZE];
+static char *cpu_type;
+
 extern int is_active(struct domain *d);
-extern int active_id(struct domain *d);
-extern int is_profiled(struct domain *d);
-
-
 
 static int nmi_callback(struct cpu_user_regs *regs, int cpu)
 {
@@ -262,9 +257,7 @@ void nmi_stop(void)
 }
 
 
-struct op_counter_config counter_config[OP_MAX_COUNTER];
-
-static int __init p4_init(char * cpu_type)
+static int __init p4_init(char ** cpu_type)
 { 
        __u8 cpu_model = current_cpu_data.x86_model;
 
@@ -276,20 +269,18 @@ static int __init p4_init(char * cpu_typ
        }
 
 #ifndef CONFIG_SMP
-       strlcpy (cpu_type, "i386/p4", XENOPROF_CPU_TYPE_SIZE);
+       *cpu_type = "i386/p4", XENOPROF_CPU_TYPE_SIZE);
        model = &op_p4_spec;
        return 1;
 #else
        switch (smp_num_siblings) {
                case 1:
-                       strlcpy (cpu_type, "i386/p4", 
-                                XENOPROF_CPU_TYPE_SIZE);
+                       *cpu_type = "i386/p4";
                        model = &op_p4_spec;
                        return 1;
 
                case 2:
-                       strlcpy (cpu_type, "i386/p4-ht", 
-                                XENOPROF_CPU_TYPE_SIZE);
+                       *cpu_type = "i386/p4-ht";
                        model = &op_p4_ht2_spec;
                        return 1;
        }
@@ -300,7 +291,7 @@ static int __init p4_init(char * cpu_typ
 }
 
 
-static int __init ppro_init(char *cpu_type)
+static int __init ppro_init(char ** cpu_type)
 {
        __u8 cpu_model = current_cpu_data.x86_model;
 
@@ -311,41 +302,32 @@ static int __init ppro_init(char *cpu_ty
                return 0;
        }
        else if (cpu_model == 15)
-               strlcpy (cpu_type, "i386/core_2", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/core_2";
        else if (cpu_model == 14)
-               strlcpy (cpu_type, "i386/core", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/core";
        else if (cpu_model == 9)
-               strlcpy (cpu_type, "i386/p6_mobile", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/p6_mobile";
        else if (cpu_model > 5)
-               strlcpy (cpu_type, "i386/piii", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/piii";
        else if (cpu_model > 2)
-               strlcpy (cpu_type, "i386/pii", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/pii";
        else
-               strlcpy (cpu_type, "i386/ppro", XENOPROF_CPU_TYPE_SIZE);
+               *cpu_type = "i386/ppro";
 
        model = &op_ppro_spec;
        return 1;
 }
 
-int nmi_init(int *num_events, int *is_primary, char *cpu_type)
+static int __init nmi_init(void)
 {
        __u8 vendor = current_cpu_data.x86_vendor;
        __u8 family = current_cpu_data.x86;
-       int prim = 0;
  
        if (!cpu_has_apic) {
-               printk("xenoprof: Initialization failed. No apic.\n");
+               printk("xenoprof: Initialization failed. No APIC\n");
                return -ENODEV;
        }
 
-       if (xenoprof_primary_profiler == NULL) {
-               /* For now, only dom0 can be the primary profiler */
-               if (current->domain->domain_id == 0) {
-                       xenoprof_primary_profiler = current->domain;
-                       prim = 1;
-               }
-       }
- 
        switch (vendor) {
                case X86_VENDOR_AMD:
                        /* Needs to be at least an Athlon (or hammer in 32bit 
mode) */
@@ -358,15 +340,13 @@ int nmi_init(int *num_events, int *is_pr
                                return -ENODEV;
                        case 6:
                                model = &op_athlon_spec;
-                               strlcpy (cpu_type, "i386/athlon", 
-                                        XENOPROF_CPU_TYPE_SIZE);
+                               cpu_type = "i386/athlon";
                                break;
                        case 0xf:
                                model = &op_athlon_spec;
-                               /* Actually it could be i386/hammer too, but 
give
-                                  user space an consistent name. */
-                               strlcpy (cpu_type, "x86-64/hammer", 
-                                        XENOPROF_CPU_TYPE_SIZE);
+                               /* Actually it could be i386/hammer too, but
+                                  give user space an consistent name. */
+                               cpu_type = "x86-64/hammer";
                                break;
                        }
                        break;
@@ -375,13 +355,13 @@ int nmi_init(int *num_events, int *is_pr
                        switch (family) {
                                /* Pentium IV */
                                case 0xf:
-                                       if (!p4_init(cpu_type))
+                                       if (!p4_init(&cpu_type))
                                                return -ENODEV;
                                        break;
 
                                /* A P6-class processor */
                                case 6:
-                                       if (!ppro_init(cpu_type))
+                                       if (!ppro_init(&cpu_type))
                                                return -ENODEV;
                                        break;
 
@@ -400,9 +380,16 @@ int nmi_init(int *num_events, int *is_pr
                        return -ENODEV;
        }
 
+       return 0;
+}
+
+__initcall(nmi_init);
+
+int xenoprof_arch_init(int *num_events, char *_cpu_type)
+{
+       if (cpu_type == NULL)
+               return -ENODEV;
        *num_events = model->num_counters;
-       *is_primary = prim;
-
-       return 0;
-}
-
+       strlcpy(_cpu_type, cpu_type, XENOPROF_CPU_TYPE_SIZE);
+       return 0;
+}
diff -r f01cb504cf28 -r 26eef8426110 xen/common/xenoprof.c
--- a/xen/common/xenoprof.c     Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/common/xenoprof.c     Tue Jul 10 15:41:26 2007 +0100
@@ -21,26 +21,26 @@
 /* Lock protecting the following global state */
 static DEFINE_SPINLOCK(xenoprof_lock);
 
-struct domain *active_domains[MAX_OPROF_DOMAINS];
-int active_ready[MAX_OPROF_DOMAINS];
-unsigned int adomains;
-
-struct domain *passive_domains[MAX_OPROF_DOMAINS];
-unsigned int pdomains;
-
-unsigned int activated;
-struct domain *xenoprof_primary_profiler;
-int xenoprof_state = XENOPROF_IDLE;
+static struct domain *active_domains[MAX_OPROF_DOMAINS];
+static int active_ready[MAX_OPROF_DOMAINS];
+static unsigned int adomains;
+
+static struct domain *passive_domains[MAX_OPROF_DOMAINS];
+static unsigned int pdomains;
+
+static unsigned int activated;
+static struct domain *xenoprof_primary_profiler;
+static int xenoprof_state = XENOPROF_IDLE;
 static unsigned long backtrace_depth;
 
-u64 total_samples;
-u64 invalid_buffer_samples;
-u64 corrupted_buffer_samples;
-u64 lost_samples;
-u64 active_samples;
-u64 passive_samples;
-u64 idle_samples;
-u64 others_samples;
+static u64 total_samples;
+static u64 invalid_buffer_samples;
+static u64 corrupted_buffer_samples;
+static u64 lost_samples;
+static u64 active_samples;
+static u64 passive_samples;
+static u64 idle_samples;
+static u64 others_samples;
 
 int is_active(struct domain *d)
 {
@@ -48,13 +48,13 @@ int is_active(struct domain *d)
     return ((x != NULL) && (x->domain_type == XENOPROF_DOMAIN_ACTIVE));
 }
 
-int is_passive(struct domain *d)
+static int is_passive(struct domain *d)
 {
     struct xenoprof *x = d->xenoprof;
     return ((x != NULL) && (x->domain_type == XENOPROF_DOMAIN_PASSIVE));
 }
 
-int is_profiled(struct domain *d)
+static int is_profiled(struct domain *d)
 {
     return (is_active(d) || is_passive(d));
 }
@@ -543,24 +543,24 @@ void xenoprof_log_event(struct vcpu *vcp
 
 static int xenoprof_op_init(XEN_GUEST_HANDLE(void) arg)
 {
+    struct domain *d = current->domain;
     struct xenoprof_init xenoprof_init;
     int ret;
 
     if ( copy_from_guest(&xenoprof_init, arg, 1) )
         return -EFAULT;
 
-    if ( (ret = xenoprof_arch_init(&xenoprof_init.num_events, 
-                                   &xenoprof_init.is_primary, 
+    if ( (ret = xenoprof_arch_init(&xenoprof_init.num_events,
                                    xenoprof_init.cpu_type)) )
         return ret;
 
-    if ( copy_to_guest(arg, &xenoprof_init, 1) )
-        return -EFAULT;
-
+    xenoprof_init.is_primary = 
+        ((xenoprof_primary_profiler == d) ||
+         ((xenoprof_primary_profiler == NULL) && (d->domain_id == 0)));
     if ( xenoprof_init.is_primary )
         xenoprof_primary_profiler = current->domain;
 
-    return 0;
+    return (copy_to_guest(arg, &xenoprof_init, 1) ? -EFAULT : 0);
 }
 
 #endif /* !COMPAT */
diff -r f01cb504cf28 -r 26eef8426110 xen/include/asm-ia64/xenoprof.h
--- a/xen/include/asm-ia64/xenoprof.h   Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/include/asm-ia64/xenoprof.h   Tue Jul 10 15:41:26 2007 +0100
@@ -24,7 +24,7 @@
 #ifndef __ASM_XENOPROF_H__
 #define __ASM_XENOPROF_H__
 
-int xenoprof_arch_init(int *num_events, int *is_primary, char *cpu_type);
+int xenoprof_arch_init(int *num_events, char *cpu_type);
 int xenoprof_arch_reserve_counters(void);
 int xenoprof_arch_counter(XEN_GUEST_HANDLE(void) arg);
 int xenoprof_arch_setup_events(void);
diff -r f01cb504cf28 -r 26eef8426110 xen/include/asm-x86/xenoprof.h
--- a/xen/include/asm-x86/xenoprof.h    Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/include/asm-x86/xenoprof.h    Tue Jul 10 15:41:26 2007 +0100
@@ -23,7 +23,6 @@
 #ifndef __ASM_X86_XENOPROF_H__
 #define __ASM_X86_XENOPROF_H__
 
-int nmi_init(int *num_events, int *is_primary, char *cpu_type);
 int nmi_reserve_counters(void);
 int nmi_setup_events(void);
 int nmi_enable_virq(void);
@@ -32,8 +31,7 @@ void nmi_disable_virq(void);
 void nmi_disable_virq(void);
 void nmi_release_counters(void);
 
-#define xenoprof_arch_init(num_events, is_primary, cpu_type)    \
-    nmi_init(num_events, is_primary, cpu_type)
+int xenoprof_arch_init(int *num_events, char *cpu_type);
 #define xenoprof_arch_reserve_counters()        nmi_reserve_counters()
 #define xenoprof_arch_setup_events()            nmi_setup_events()
 #define xenoprof_arch_enable_virq()             nmi_enable_virq()
diff -r f01cb504cf28 -r 26eef8426110 xen/include/xen/xenoprof.h
--- a/xen/include/xen/xenoprof.h        Tue Jul 10 14:57:04 2007 +0100
+++ b/xen/include/xen/xenoprof.h        Tue Jul 10 15:41:26 2007 +0100
@@ -69,6 +69,4 @@ int xenoprof_add_trace(struct domain *d,
 int xenoprof_add_trace(struct domain *d, struct vcpu *v, 
                        unsigned long eip, int mode);
 
-extern struct domain *xenoprof_primary_profiler;
-
 #endif  /* __XEN__XENOPROF_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.