This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / arch / um / kernel / smp.c
index 6ffb4d0..7c9737c 100644 (file)
@@ -39,6 +39,14 @@ EXPORT_SYMBOL(cpu_online_map);
  */
 struct cpuinfo_um cpu_data[NR_CPUS];
 
+spinlock_t um_bh_lock = SPIN_LOCK_UNLOCKED;
+
+atomic_t global_bh_count;
+
+/* Not used by UML */
+unsigned char global_irq_holder = NO_PROC_ID;
+unsigned volatile long global_irq_lock;
+
 /* Set when the idlers are all forked */
 int smp_threads_ready = 0;
 
@@ -57,6 +65,41 @@ void smp_send_reschedule(int cpu)
        num_reschedules_sent++;
 }
 
+static void show(char * str)
+{
+       int cpu = smp_processor_id();
+
+       printk(KERN_INFO "\n%s, CPU %d:\n", str, cpu);
+}
+       
+#define MAXCOUNT 100000000
+
+static inline void wait_on_bh(void)
+{
+       int count = MAXCOUNT;
+       do {
+               if (!--count) {
+                       show("wait_on_bh");
+                       count = ~0;
+               }
+               /* nothing .. wait for the other bh's to go away */
+       } while (atomic_read(&global_bh_count) != 0);
+}
+
+/*
+ * This is called when we want to synchronize with
+ * bottom half handlers. We need to wait until
+ * no other CPU is executing any bottom half handler.
+ *
+ * Don't wait if we're already running in an interrupt
+ * context or are inside a bh handler. 
+ */
+void synchronize_bh(void)
+{
+       if (atomic_read(&global_bh_count) && !in_interrupt())
+               wait_on_bh();
+}
+
 void smp_send_stop(void)
 {
        int i;
@@ -116,7 +159,8 @@ static struct task_struct *idle_thread(int cpu)
                            .task =     new_task } );
        idle_threads[cpu] = new_task;
        CHOOSE_MODE(os_write_file(new_task->thread.mode.tt.switch_pipe[1], &c, 
-                                 sizeof(c)),
+                         sizeof(c)),
+                   ({ panic("skas mode doesn't support SMP"); }));
        wake_up_forked_process(new_task);
        return(new_task);
 }