WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] Remove many uses of cpu_possible_map and

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Remove many uses of cpu_possible_map and iterators over NR_CPUS.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 19 May 2010 05:15:37 -0700
Delivery-date: Wed, 19 May 2010 05:17:26 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1273865822 -3600
# Node ID 6348b2ab5c391114593c63b491b42fc16cce0dab
# Parent  44f25f7250bea0f14d90f4174f7cd337bc6215bf
Remove many uses of cpu_possible_map and iterators over NR_CPUS.

The significant remaining culprits for x86 are credit2, hpet, and
percpu-area subsystems. To be dealt with in a separate patch.

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/hvm.c          |    1 
 xen/arch/x86/nmi.c              |    2 
 xen/arch/x86/oprofile/nmi_int.c |    5 --
 xen/arch/x86/setup.c            |    2 
 xen/arch/x86/smpboot.c          |    5 --
 xen/arch/x86/time.c             |    7 +-
 xen/common/domctl.c             |    7 +-
 xen/common/perfc.c              |   28 ++++++-----
 xen/common/radix-tree.c         |    5 +-
 xen/common/rcupdate.c           |    2 
 xen/common/sched_sedf.c         |   14 +++--
 xen/common/schedule.c           |   41 +++++++++++++---
 xen/common/stop_machine.c       |   25 ++++++++--
 xen/common/tasklet.c            |   11 ++--
 xen/common/timer.c              |   31 +++++++++---
 xen/common/tmem.c               |    9 ++-
 xen/common/tmem_xen.c           |   98 ++++++++++++++++++++++++++++++----------
 xen/include/asm-ia64/perfc.h    |    4 -
 xen/include/asm-x86/perfc.h     |    4 -
 xen/include/asm-x86/setup.h     |    1 
 xen/include/asm-x86/smp.h       |    1 
 xen/include/xen/tmem.h          |    1 
 xen/xsm/flask/flask_op.c        |    8 ---
 23 files changed, 209 insertions(+), 103 deletions(-)

diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/hvm/hvm.c    Fri May 14 20:37:02 2010 +0100
@@ -85,6 +85,7 @@ static int cpu_callback(
     case CPU_DYING:
         hvm_cpu_down();
         break;
+    case CPU_UP_CANCELED:
     case CPU_DEAD:
         hvm_funcs.cpu_dead(cpu);
         break;
diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/nmi.c
--- a/xen/arch/x86/nmi.c        Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/nmi.c        Fri May 14 20:37:02 2010 +0100
@@ -468,7 +468,7 @@ static void do_nmi_stats(unsigned char k
     struct vcpu *v;
 
     printk("CPU\tNMI\n");
-    for_each_possible_cpu ( i )
+    for_each_online_cpu ( i )
         printk("%3d\t%3d\n", i, nmi_count(i));
 
     if ( ((d = dom0) == NULL) || (d->vcpu == NULL) ||
diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/oprofile/nmi_int.c
--- a/xen/arch/x86/oprofile/nmi_int.c   Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/oprofile/nmi_int.c   Fri May 14 20:37:02 2010 +0100
@@ -150,10 +150,7 @@ static int allocate_msrs(void)
        size_t counters_size = sizeof(struct op_msr) * model->num_counters;
 
        int i;
-       for (i = 0; i < NR_CPUS; ++i) {
-               if (!test_bit(i, &cpu_online_map))
-                       continue;
-
+       for_each_online_cpu (i) {
                cpu_msrs[i].counters = xmalloc_bytes(counters_size);
                if (!cpu_msrs[i].counters) {
                        success = 0;
diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/setup.c      Fri May 14 20:37:02 2010 +0100
@@ -1158,8 +1158,6 @@ void __init __start_xen(unsigned long mb
 
     init_trace_bufs();
 
-    init_tmem();
-
     console_endboot();
 
     /* Hide UART from DOM0 if we're using it */
diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c    Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/smpboot.c    Fri May 14 20:37:02 2010 +0100
@@ -1198,11 +1198,6 @@ static void __init smp_boot_cpus(unsigne
         * construct cpu_sibling_map, so that we can tell sibling CPUs
         * efficiently.
         */
-       for_each_possible_cpu(cpu) {
-               cpus_clear(per_cpu(cpu_sibling_map, cpu));
-               cpus_clear(per_cpu(cpu_core_map, cpu));
-       }
-
        cpu_set(0, per_cpu(cpu_sibling_map, 0));
        cpu_set(0, per_cpu(cpu_core_map, 0));
 
diff -r 44f25f7250be -r 6348b2ab5c39 xen/arch/x86/time.c
--- a/xen/arch/x86/time.c       Fri May 14 18:39:02 2010 +0100
+++ b/xen/arch/x86/time.c       Fri May 14 20:37:02 2010 +0100
@@ -1401,6 +1401,10 @@ void init_percpu_time(void)
     unsigned long flags;
     s_time_t now;
 
+    /* If we have constant-rate TSCs then scale factor can be shared. */
+    if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) )
+        this_cpu(cpu_time).tsc_scale = per_cpu(cpu_time, 0).tsc_scale;
+
     local_irq_save(flags);
     rdtscll(t->local_tsc_stamp);
     now = read_platform_stime();
@@ -1435,9 +1439,6 @@ int __init init_xen_time(void)
     /* If we have constant-rate TSCs then scale factor can be shared. */
     if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) )
     {
-        int cpu;
-        for_each_possible_cpu ( cpu )
-            per_cpu(cpu_time, cpu).tsc_scale = per_cpu(cpu_time, 0).tsc_scale;
         /* If TSCs are not marked as 'reliable', re-sync during rendezvous. */
         if ( !boot_cpu_has(X86_FEATURE_TSC_RELIABLE) )
             time_calibration_rendezvous_fn = time_calibration_tsc_rendezvous;
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/domctl.c
--- a/xen/common/domctl.c       Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/domctl.c       Fri May 14 20:37:02 2010 +0100
@@ -155,7 +155,7 @@ static unsigned int default_vcpu0_locati
     cpumask_t      cpu_exclude_map;
 
     /* Do an initial CPU placement. Pick the least-populated CPU. */
-    nr_cpus = last_cpu(cpu_possible_map) + 1;
+    nr_cpus = last_cpu(cpu_online_map) + 1;
     cnt = xmalloc_array(unsigned int, nr_cpus);
     if ( cnt )
     {
@@ -164,8 +164,9 @@ static unsigned int default_vcpu0_locati
         rcu_read_lock(&domlist_read_lock);
         for_each_domain ( d )
             for_each_vcpu ( d, v )
-                if ( !test_bit(_VPF_down, &v->pause_flags) )
-                    cnt[v->processor]++;
+                if ( !test_bit(_VPF_down, &v->pause_flags)
+                     && ((cpu = v->processor) < nr_cpus) )
+                    cnt[cpu]++;
         rcu_read_unlock(&domlist_read_lock);
     }
 
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/perfc.c
--- a/xen/common/perfc.c        Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/perfc.c        Fri May 14 20:37:02 2010 +0100
@@ -114,8 +114,6 @@ void perfc_printall(unsigned char key)
         }
         printk("\n");
     }
-
-    arch_perfc_printall();
 }
 
 void perfc_reset(unsigned char key)
@@ -136,13 +134,13 @@ void perfc_reset(unsigned char key)
         switch ( perfc_info[i].type )
         {
         case TYPE_SINGLE:
-            for_each_possible_cpu ( cpu )
+            for_each_online_cpu ( cpu )
                 per_cpu(perfcounters, cpu)[j] = 0;
         case TYPE_S_SINGLE:
             ++j;
             break;
         case TYPE_ARRAY:
-            for_each_possible_cpu ( cpu )
+            for_each_online_cpu ( cpu )
                 memset(per_cpu(perfcounters, cpu) + j, 0,
                        perfc_info[i].nr_elements * sizeof(perfc_t));
         case TYPE_S_ARRAY:
@@ -157,15 +155,22 @@ static xen_sysctl_perfc_desc_t perfc_d[N
 static xen_sysctl_perfc_desc_t perfc_d[NR_PERFCTRS];
 static xen_sysctl_perfc_val_t *perfc_vals;
 static unsigned int      perfc_nbr_vals;
-static int               perfc_init = 0;
+static cpumask_t         perfc_cpumap;
+
 static int perfc_copy_info(XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc,
                            XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val)
 {
     unsigned int i, j, v;
 
     /* We only copy the name and array-size information once. */
-    if ( !perfc_init ) 
-    {
+    if ( !cpus_equal(cpu_online_map, perfc_cpumap) )
+    {
+        unsigned int nr_cpus;
+        perfc_cpumap = cpu_online_map;
+        nr_cpus = cpus_weight(perfc_cpumap);
+
+        perfc_nbr_vals = 0;
+
         for ( i = 0; i < NR_PERFCTRS; i++ )
         {
             safe_strcpy(perfc_d[i].name, perfc_info[i].name);
@@ -174,7 +179,7 @@ static int perfc_copy_info(XEN_GUEST_HAN
             {
             case TYPE_SINGLE:
             case TYPE_S_SINGLE:
-                perfc_d[i].nr_vals = num_possible_cpus();
+                perfc_d[i].nr_vals = nr_cpus;
                 break;
             case TYPE_ARRAY:
             case TYPE_S_ARRAY:
@@ -183,8 +188,9 @@ static int perfc_copy_info(XEN_GUEST_HAN
             }
             perfc_nbr_vals += perfc_d[i].nr_vals;
         }
+
+        xfree(perfc_vals);
         perfc_vals = xmalloc_array(xen_sysctl_perfc_val_t, perfc_nbr_vals);
-        perfc_init = 1;
     }
 
     if ( guest_handle_is_null(desc) )
@@ -205,14 +211,14 @@ static int perfc_copy_info(XEN_GUEST_HAN
         {
         case TYPE_SINGLE:
         case TYPE_S_SINGLE:
-            for_each_possible_cpu ( cpu )
+            for_each_cpu_mask ( cpu, perfc_cpumap )
                 perfc_vals[v++] = per_cpu(perfcounters, cpu)[j];
             ++j;
             break;
         case TYPE_ARRAY:
         case TYPE_S_ARRAY:
             memset(perfc_vals + v, 0, perfc_d[i].nr_vals * 
sizeof(*perfc_vals));
-            for_each_possible_cpu ( cpu )
+            for_each_cpu_mask ( cpu, perfc_cpumap )
             {
                 perfc_t *counters = per_cpu(perfcounters, cpu) + j;
                 unsigned int k;
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/radix-tree.c
--- a/xen/common/radix-tree.c   Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/radix-tree.c   Fri May 14 20:37:02 2010 +0100
@@ -31,6 +31,7 @@
  */
 
 #include <xen/config.h>
+#include <xen/init.h>
 #include <xen/lib.h>
 #include <xen/types.h>
 #include <xen/errno.h>
@@ -429,7 +430,7 @@ void radix_tree_destroy(struct radix_tre
 }
 EXPORT_SYMBOL(radix_tree_destroy);
 
-static /*__init*/ unsigned long __maxindex(unsigned int height)
+static unsigned long __init __maxindex(unsigned int height)
 {
     unsigned int tmp = height * RADIX_TREE_MAP_SHIFT;
     unsigned long index = (~0UL >> (RADIX_TREE_INDEX_BITS - tmp - 1)) >> 1;
@@ -439,7 +440,7 @@ static /*__init*/ unsigned long __maxind
     return index;
 }
 
-/*__init*/ void radix_tree_init(void)
+void __init radix_tree_init(void)
 {
     unsigned int i;
 
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/rcupdate.c
--- a/xen/common/rcupdate.c     Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/rcupdate.c     Fri May 14 20:37:02 2010 +0100
@@ -361,7 +361,7 @@ void __init rcu_init(void)
 void __init rcu_init(void)
 {
     void *cpu = (void *)(long)smp_processor_id();
-    cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
+    cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
     register_cpu_notifier(&cpu_nfb);
     open_softirq(RCU_SOFTIRQ, rcu_process_callbacks);
 }
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c   Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/sched_sedf.c   Fri May 14 20:37:02 2010 +0100
@@ -1333,7 +1333,7 @@ static int sedf_adjust_weights(struct cp
 {
     struct vcpu *p;
     struct domain      *d;
-    unsigned int        nr_cpus = last_cpu(cpu_possible_map) + 1;
+    unsigned int        cpu, nr_cpus = last_cpu(cpu_online_map) + 1;
     int                *sumw = xmalloc_array(int, nr_cpus);
     s_time_t           *sumt = xmalloc_array(s_time_t, nr_cpus);
 
@@ -1354,9 +1354,12 @@ static int sedf_adjust_weights(struct cp
             continue;
         for_each_vcpu( d, p )
         {
+            if ( (cpu = p->processor) >= nr_cpus )
+                continue;
+
             if ( EDOM_INFO(p)->weight )
             {
-                sumw[p->processor] += EDOM_INFO(p)->weight;
+                sumw[cpu] += EDOM_INFO(p)->weight;
             }
             else
             {
@@ -1367,7 +1370,7 @@ static int sedf_adjust_weights(struct cp
                 /*check for overflows*/
                 ASSERT((WEIGHT_PERIOD < ULONG_MAX) 
                        && (EDOM_INFO(p)->slice_orig < ULONG_MAX));
-                sumt[p->processor] += 
+                sumt[cpu] += 
                     (WEIGHT_PERIOD * EDOM_INFO(p)->slice_orig) / 
                     EDOM_INFO(p)->period_orig;
             }
@@ -1381,6 +1384,8 @@ static int sedf_adjust_weights(struct cp
     {
         for_each_vcpu ( d, p )
         {
+            if ( (cpu = p->processor) >= nr_cpus )
+                continue;
             if ( EDOM_INFO(p)->weight )
             {
                 EDOM_INFO(p)->period_orig = 
@@ -1388,8 +1393,7 @@ static int sedf_adjust_weights(struct cp
                 EDOM_INFO(p)->slice_orig  =
                     EDOM_INFO(p)->slice   = 
                     (EDOM_INFO(p)->weight *
-                     (WEIGHT_PERIOD - WEIGHT_SAFETY - sumt[p->processor])) / 
-                    sumw[p->processor];
+                     (WEIGHT_PERIOD - WEIGHT_SAFETY - sumt[cpu])) / sumw[cpu];
             }
         }
     }
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/schedule.c
--- a/xen/common/schedule.c     Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/schedule.c     Fri May 14 20:37:02 2010 +0100
@@ -31,6 +31,7 @@
 #include <xen/errno.h>
 #include <xen/guest_access.h>
 #include <xen/multicall.h>
+#include <xen/cpu.h>
 #include <public/sched.h>
 #include <xsm/xsm.h>
 
@@ -1089,9 +1090,39 @@ const struct scheduler *scheduler_get_by
     return NULL;
 }
 
+static int cpu_callback(
+    struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+    unsigned int cpu = (unsigned long)hcpu;
+
+    switch ( action )
+    {
+    case CPU_UP_PREPARE:
+        per_cpu(scheduler, cpu) = &ops;
+        spin_lock_init(&per_cpu(schedule_data, cpu)._lock);
+        per_cpu(schedule_data, cpu).schedule_lock
+            = &per_cpu(schedule_data, cpu)._lock;
+        init_timer(&per_cpu(schedule_data, cpu).s_timer,
+                   s_timer_fn, NULL, cpu);
+        break;
+    case CPU_DEAD:
+        kill_timer(&per_cpu(schedule_data, cpu).s_timer);
+        break;
+    default:
+        break;
+    }
+
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block cpu_nfb = {
+    .notifier_call = cpu_callback
+};
+
 /* Initialise the data structures. */
 void __init scheduler_init(void)
 {
+    void *hcpu = (void *)(long)smp_processor_id();
     int i;
 
     open_softirq(SCHEDULE_SOFTIRQ, schedule);
@@ -1109,14 +1140,8 @@ void __init scheduler_init(void)
         ops = *schedulers[0];
     }
 
-    for_each_possible_cpu ( i )
-    {
-        per_cpu(scheduler, i) = &ops;
-        spin_lock_init(&per_cpu(schedule_data, i)._lock);
-        per_cpu(schedule_data, i).schedule_lock
-            = &per_cpu(schedule_data, i)._lock;
-        init_timer(&per_cpu(schedule_data, i).s_timer, s_timer_fn, NULL, i);
-    }
+    cpu_callback(&cpu_nfb, CPU_UP_PREPARE, hcpu);
+    register_cpu_notifier(&cpu_nfb);
 
     printk("Using scheduler: %s (%s)\n", ops.name, ops.opt_name);
     if ( SCHED_OP(&ops, init, 1) )
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/stop_machine.c
--- a/xen/common/stop_machine.c Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/stop_machine.c Fri May 14 20:37:02 2010 +0100
@@ -155,12 +155,31 @@ static void stopmachine_action(unsigned 
     local_irq_enable();
 }
 
+static int cpu_callback(
+    struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+    unsigned int cpu = (unsigned long)hcpu;
+
+    if ( action == CPU_UP_PREPARE )
+        tasklet_init(&per_cpu(stopmachine_tasklet, cpu),
+                     stopmachine_action, cpu);
+
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block cpu_nfb = {
+    .notifier_call = cpu_callback
+};
+
 static int __init cpu_stopmachine_init(void)
 {
     unsigned int cpu;
-    for_each_possible_cpu ( cpu )
-        tasklet_init(&per_cpu(stopmachine_tasklet, cpu),
-                     stopmachine_action, cpu);
+    for_each_online_cpu ( cpu )
+    {
+        void *hcpu = (void *)(long)cpu;
+        cpu_callback(&cpu_nfb, CPU_UP_PREPARE, hcpu);
+    }
+    register_cpu_notifier(&cpu_nfb);
     return 0;
 }
 __initcall(cpu_stopmachine_init);
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/tasklet.c
--- a/xen/common/tasklet.c      Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/tasklet.c      Fri May 14 20:37:02 2010 +0100
@@ -19,7 +19,7 @@
 #include <xen/cpu.h>
 
 /* Some subsystems call into us before we are initialised. We ignore them. */
-static cpumask_t tasklets_initialised;
+static bool_t tasklets_initialised;
 
 DEFINE_PER_CPU(unsigned long, tasklet_work_to_do);
 
@@ -44,7 +44,7 @@ void tasklet_schedule_on_cpu(struct task
 
     spin_lock_irqsave(&tasklet_lock, flags);
 
-    if ( cpu_isset(cpu, tasklets_initialised) && !t->is_dead )
+    if ( tasklets_initialised && !t->is_dead )
     {
         t->scheduled_on = cpu;
         if ( !t->is_running )
@@ -174,9 +174,9 @@ static int cpu_callback(
     switch ( action )
     {
     case CPU_UP_PREPARE:
-        if ( !cpu_test_and_set(cpu, tasklets_initialised) )
-            INIT_LIST_HEAD(&per_cpu(tasklet_list, cpu));
-        break;
+        INIT_LIST_HEAD(&per_cpu(tasklet_list, cpu));
+        break;
+    case CPU_UP_CANCELED:
     case CPU_DEAD:
         migrate_tasklets_from_cpu(cpu);
         break;
@@ -196,6 +196,7 @@ void __init tasklet_subsys_init(void)
     void *hcpu = (void *)(long)smp_processor_id();
     cpu_callback(&cpu_nfb, CPU_UP_PREPARE, hcpu);
     register_cpu_notifier(&cpu_nfb);
+    tasklets_initialised = 1;
 }
 
 /*
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/timer.c
--- a/xen/common/timer.c        Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/timer.c        Fri May 14 20:37:02 2010 +0100
@@ -18,6 +18,7 @@
 #include <xen/timer.h>
 #include <xen/keyhandler.h>
 #include <xen/percpu.h>
+#include <xen/cpu.h>
 #include <asm/system.h>
 #include <asm/desc.h>
 
@@ -514,10 +515,29 @@ static struct keyhandler dump_timerq_key
     .desc = "dump timer queues"
 };
 
+static struct timer *dummy_heap;
+
+static int cpu_callback(
+    struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+    unsigned int cpu = (unsigned long)hcpu;
+
+    if ( action == CPU_UP_PREPARE )
+    {
+        spin_lock_init(&per_cpu(timers, cpu).lock);
+        per_cpu(timers, cpu).heap = &dummy_heap;
+    }
+
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block cpu_nfb = {
+    .notifier_call = cpu_callback
+};
+
 void __init timer_init(void)
 {
-    static struct timer *dummy_heap;
-    int i;
+    void *cpu = (void *)(long)smp_processor_id();
 
     open_softirq(TIMER_SOFTIRQ, timer_softirq_action);
 
@@ -528,11 +548,8 @@ void __init timer_init(void)
     SET_HEAP_SIZE(&dummy_heap, 0);
     SET_HEAP_LIMIT(&dummy_heap, 0);
 
-    for_each_possible_cpu ( i )
-    {
-        spin_lock_init(&per_cpu(timers, i).lock);
-        per_cpu(timers, i).heap = &dummy_heap;
-    }
+    cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);
+    register_cpu_notifier(&cpu_nfb);
 
     register_keyhandler('a', &dump_timerq_keyhandler);
 }
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/tmem.c
--- a/xen/common/tmem.c Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/tmem.c Fri May 14 20:37:02 2010 +0100
@@ -2877,11 +2877,11 @@ EXPORT void *tmem_relinquish_pages(unsig
 }
 
 /* called at hypervisor startup */
-EXPORT void init_tmem(void)
+static int __init init_tmem(void)
 {
     int i;
     if ( !tmh_enabled() )
-        return;
+        return 0;
 
     radix_tree_init();
     if ( tmh_dedup_enabled() )
@@ -2905,7 +2905,10 @@ EXPORT void init_tmem(void)
     }
     else
         printk("tmem: initialization FAILED\n");
-}
+
+    return 0;
+}
+__initcall(init_tmem);
 
 /*
  * Local variables:
diff -r 44f25f7250be -r 6348b2ab5c39 xen/common/tmem_xen.c
--- a/xen/common/tmem_xen.c     Fri May 14 18:39:02 2010 +0100
+++ b/xen/common/tmem_xen.c     Fri May 14 20:37:02 2010 +0100
@@ -11,6 +11,7 @@
 #include <xen/lzo.h> /* compression code */
 #include <xen/paging.h>
 #include <xen/domain_page.h>
+#include <xen/cpu.h>
 
 #define EXPORT /* indicates code other modules are dependent upon */
 
@@ -277,7 +278,7 @@ static void tmh_mempool_page_put(void *p
     tmh_free_page(virt_to_page(page_va));
 }
 
-static int tmh_mempool_init(void)
+static int __init tmh_mempool_init(void)
 {
     tmh_mempool = xmem_pool_create("tmem", tmh_mempool_page_get,
         tmh_mempool_page_put, PAGE_SIZE, 0, PAGE_SIZE);
@@ -347,32 +348,83 @@ EXPORT void tmh_client_destroy(tmh_clien
 
 /******************  XEN-SPECIFIC HOST INITIALIZATION ********************/
 
-EXPORT int tmh_init(void)
-{
 #ifndef __i386__
-    int dstmem_order, workmem_order;
-    bool_t bad_alloc = 0;
-    struct page_info *pi;
-    unsigned char *p1, *p2;
-    int cpu;
+
+static int dstmem_order, workmem_order;
+
+static int cpu_callback(
+    struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+    unsigned int cpu = (unsigned long)hcpu;
+
+    switch ( action )
+    {
+    case CPU_UP_PREPARE: {
+        if ( per_cpu(dstmem, cpu) == NULL )
+        {
+            struct page_info *p = alloc_domheap_pages(0, dstmem_order, 0);
+            per_cpu(dstmem, cpu) = p ? page_to_virt(p) : NULL;
+        }
+        if ( per_cpu(workmem, cpu) == NULL )
+        {
+            struct page_info *p = alloc_domheap_pages(0, workmem_order, 0);
+            per_cpu(workmem, cpu) = p ? page_to_virt(p) : NULL;
+        }
+        break;
+    }
+    case CPU_DEAD:
+    case CPU_UP_CANCELED: {
+        if ( per_cpu(dstmem, cpu) != NULL )
+        {
+            struct page_info *p = virt_to_page(per_cpu(dstmem, cpu));
+            free_domheap_pages(p, dstmem_order);
+            per_cpu(dstmem, cpu) = NULL;
+        }
+        if ( per_cpu(workmem, cpu) != NULL )
+        {
+            struct page_info *p = virt_to_page(per_cpu(workmem, cpu));
+            free_domheap_pages(p, workmem_order);
+            per_cpu(workmem, cpu) = NULL;
+        }
+        break;
+    }
+    default:
+        break;
+    }
+
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block cpu_nfb = {
+    .notifier_call = cpu_callback
+};
+
+EXPORT int __init tmh_init(void)
+{
+    unsigned int cpu;
 
     if ( !tmh_mempool_init() )
         return 0;
 
     dstmem_order = get_order_from_pages(LZO_DSTMEM_PAGES);
     workmem_order = get_order_from_bytes(LZO1X_1_MEM_COMPRESS);
-    for_each_possible_cpu ( cpu )
-    {
-        pi = alloc_domheap_pages(0,dstmem_order,0);
-        per_cpu(dstmem, cpu) = p1 = ((pi == NULL) ? NULL : page_to_virt(pi));
-        pi = alloc_domheap_pages(0,workmem_order,0);
-        per_cpu(workmem, cpu) = p2 = ((pi == NULL) ? NULL : page_to_virt(pi));
-        if ( (p1 == NULL) || (p2 == NULL) )
-            bad_alloc++;
-    }
-    if ( bad_alloc )
-        printk("tmem: can't allocate compression buffers for %d cpus\n",
-               bad_alloc);
-#endif
-    return 1;
-}
+
+    for_each_online_cpu ( cpu )
+    {
+        void *hcpu = (void *)(long)cpu;
+        cpu_callback(&cpu_nfb, CPU_UP_PREPARE, hcpu);
+    }
+
+    register_cpu_notifier(&cpu_nfb);
+
+    return 1;
+}
+
+#else
+
+EXPORT int __init tmh_init(void)
+{
+    return 1;
+}
+
+#endif
diff -r 44f25f7250be -r 6348b2ab5c39 xen/include/asm-ia64/perfc.h
--- a/xen/include/asm-ia64/perfc.h      Fri May 14 18:39:02 2010 +0100
+++ b/xen/include/asm-ia64/perfc.h      Fri May 14 20:37:02 2010 +0100
@@ -3,10 +3,6 @@
 
 #include <asm/vhpt.h>
 #include <asm/privop_stat.h>
-
-static inline void arch_perfc_printall(void)
-{
-}
 
 static inline void arch_perfc_reset(void)
 {
diff -r 44f25f7250be -r 6348b2ab5c39 xen/include/asm-x86/perfc.h
--- a/xen/include/asm-x86/perfc.h       Fri May 14 18:39:02 2010 +0100
+++ b/xen/include/asm-x86/perfc.h       Fri May 14 20:37:02 2010 +0100
@@ -1,9 +1,5 @@
 #ifndef __ASM_PERFC_H__
 #define __ASM_PERFC_H__
-
-static inline void arch_perfc_printall(void)
-{
-}
 
 static inline void arch_perfc_reset(void)
 {
diff -r 44f25f7250be -r 6348b2ab5c39 xen/include/asm-x86/setup.h
--- a/xen/include/asm-x86/setup.h       Fri May 14 18:39:02 2010 +0100
+++ b/xen/include/asm-x86/setup.h       Fri May 14 20:37:02 2010 +0100
@@ -22,7 +22,6 @@ void subarch_init_memory(void);
 void subarch_init_memory(void);
 
 void init_IRQ(void);
-void init_tmem(void);
 void vesa_init(void);
 void vesa_mtrr_init(void);
 
diff -r 44f25f7250be -r 6348b2ab5c39 xen/include/asm-x86/smp.h
--- a/xen/include/asm-x86/smp.h Fri May 14 18:39:02 2010 +0100
+++ b/xen/include/asm-x86/smp.h Fri May 14 20:37:02 2010 +0100
@@ -69,7 +69,6 @@ int cpu_add(uint32_t apic_id, uint32_t a
 
 extern cpumask_t cpu_callout_map;
 extern cpumask_t cpu_callin_map;
-/* cpu_possible_map declared in <xen/cpumask.h> */
 
 /* We don't mark CPUs online until __cpu_up(), so we need another measure */
 static inline int num_booting_cpus(void)
diff -r 44f25f7250be -r 6348b2ab5c39 xen/include/xen/tmem.h
--- a/xen/include/xen/tmem.h    Fri May 14 18:39:02 2010 +0100
+++ b/xen/include/xen/tmem.h    Fri May 14 20:37:02 2010 +0100
@@ -9,7 +9,6 @@
 #ifndef __XEN_TMEM_H__
 #define __XEN_TMEM_H__
 
-extern void init_tmem(void);
 extern void tmem_destroy(void *);
 extern void *tmem_relinquish_pages(unsigned int, unsigned int);
 extern int  opt_tmem;
diff -r 44f25f7250be -r 6348b2ab5c39 xen/xsm/flask/flask_op.c
--- a/xen/xsm/flask/flask_op.c  Fri May 14 18:39:02 2010 +0100
+++ b/xen/xsm/flask/flask_op.c  Fri May 14 20:37:02 2010 +0100
@@ -680,7 +680,6 @@ static int flask_security_avc_cachestats
     char *page = NULL;
     int len = 0;
     int length = 0;
-    long long idx = 0;
     int cpu;
     struct avc_cache_stats *st;
 
@@ -701,11 +700,8 @@ static int flask_security_avc_cachestats
     length += len;
     count -= len;
 
-    for ( cpu = idx; cpu < NR_CPUS; ++cpu )
-    {
-        if ( !cpu_possible(cpu) )
-            continue;
-        idx = cpu + 1;
+    for_each_online_cpu ( cpu )
+    {
         st = &per_cpu(avc_cache_stats, cpu);
 
         len = snprintf(page, PAGE_SIZE, "%u %u %u %u %u %u\n", st->lookups,

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] Remove many uses of cpu_possible_map and iterators over NR_CPUS., Xen patchbot-unstable <=