Module Name:    src
Committed By:   pooka
Date:           Tue Apr 27 23:30:30 UTC 2010

Modified Files:
        src/sys/rump/librump/rumpkern: intr.c rump.c rump_private.h
            rumpcpu_generic.c scheduler.c
        src/sys/rump/librump/rumpkern/arch/i386: rumpcpu.c

Log Message:
Fix multiple virtual cpu support.

... or at least on x86.  CPU_INFO_FOREACH() still isn't MI, and I
don't want to support 2^n different versions.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/rump/librump/rumpkern/intr.c
cvs rdiff -u -r1.164 -r1.165 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.43 -r1.44 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.1 -r1.2 src/sys/rump/librump/rumpkern/rumpcpu_generic.c
cvs rdiff -u -r1.11 -r1.12 src/sys/rump/librump/rumpkern/scheduler.c
cvs rdiff -u -r1.7 -r1.8 src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/rump/librump/rumpkern/intr.c
diff -u src/sys/rump/librump/rumpkern/intr.c:1.24 src/sys/rump/librump/rumpkern/intr.c:1.25
--- src/sys/rump/librump/rumpkern/intr.c:1.24	Wed Apr 14 10:27:53 2010
+++ src/sys/rump/librump/rumpkern/intr.c	Tue Apr 27 23:30:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.24 2010/04/14 10:27:53 pooka Exp $	*/
+/*	$NetBSD: intr.c,v 1.25 2010/04/27 23:30:29 pooka Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.24 2010/04/14 10:27:53 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.25 2010/04/27 23:30:29 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -108,8 +108,6 @@
 	thetick.tv_nsec = 1000000000/hz;
 
 	rumpuser_mutex_enter(clockmtx);
-	rumpuser_cv_signal(clockcv);
-
 	for (;;) {
 		callout_hardclock();
 
@@ -117,16 +115,17 @@
 		while (rumpuser_cv_timedwait(clockcv, clockmtx,
 		    curtime.tv_sec, curtime.tv_nsec) == 0)
 			continue;
+		timespecadd(&clockup, &thetick, &clockup);
+		timespecadd(&clockup, &clockbase, &curtime);
 		
 		/* if !maincpu: continue */
+		if (curcpu()->ci_index != 0)
+			continue;
 
 		if ((++ticks % hz) == 0) {
 			cv_broadcast(&lbolt);
 		}
 		tc_ticktock();
-
-		timespecadd(&clockup, &thetick, &clockup);
-		timespecadd(&clockup, &clockbase, &curtime);
 	}
 }
 
@@ -213,6 +212,12 @@
 	if (!rump_threads)
 		return;
 
+	/* XXX */
+	if (ci->ci_index == 0) {
+		rumptc.tc_frequency = hz;
+		tc_init(&rumptc);
+	}
+
 	slev = kmem_alloc(sizeof(struct softint_lev) * SOFTINT_COUNT, KM_SLEEP);
 	for (i = 0; i < SOFTINT_COUNT; i++) {
 		rumpuser_cv_init(&slev[i].si_cv);
@@ -222,30 +227,15 @@
 
 	for (i = 0; i < SOFTINT_COUNT; i++) {
 		rv = kthread_create(PRI_NONE,
-		    KTHREAD_MPSAFE | KTHREAD_INTR, NULL,
+		    KTHREAD_MPSAFE | KTHREAD_INTR, ci,
 		    sithread, (void *)(uintptr_t)i,
 		    NULL, "rumpsi%d", i);
 	}
 
-	rumpuser_mutex_enter(clockmtx);
-	for (i = 0; i < ncpu; i++) {
-		rv = kthread_create(PRI_NONE,
-		    KTHREAD_MPSAFE | KTHREAD_INTR,
-		    cpu_lookup(i), doclock, NULL, NULL,
-		    "rumpclk%d", i);
-		if (rv)
-			panic("clock thread creation failed: %d", rv);
-	}
-
-	rumptc.tc_frequency = hz;
-	tc_init(&rumptc);
-
-	/*
-	 * Make sure we have a clocktime before returning.
-	 * XXX: mp
-	 */
-	rumpuser_cv_wait(clockcv, clockmtx);
-	rumpuser_mutex_exit(clockmtx);
+	rv = kthread_create(PRI_NONE, KTHREAD_MPSAFE | KTHREAD_INTR,
+	    ci, doclock, NULL, NULL, "rumpclk%d", i);
+	if (rv)
+		panic("clock thread creation failed: %d", rv);
 }
 
 /*

Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.164 src/sys/rump/librump/rumpkern/rump.c:1.165
--- src/sys/rump/librump/rumpkern/rump.c:1.164	Mon Apr 26 20:10:23 2010
+++ src/sys/rump/librump/rumpkern/rump.c	Tue Apr 27 23:30:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump.c,v 1.164 2010/04/26 20:10:23 pooka Exp $	*/
+/*	$NetBSD: rump.c,v 1.165 2010/04/27 23:30:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.164 2010/04/26 20:10:23 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.165 2010/04/27 23:30:30 pooka Exp $");
+
+#include <sys/systm.h>
+#define ELFSIZE ARCH_ELFSIZE
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -216,6 +219,9 @@
 			boothowto = AB_VERBOSE;
 	}
 
+	/* get our CPUs initialized */
+	rump_cpus_bootstrap(1);
+
 	rumpuser_gettime(&sec, &nsec, &error);
 	boottime.tv_sec = sec;
 	boottime.tv_nsec = nsec;

Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.43 src/sys/rump/librump/rumpkern/rump_private.h:1.44
--- src/sys/rump/librump/rumpkern/rump_private.h:1.43	Mon Mar  1 13:12:20 2010
+++ src/sys/rump/librump/rumpkern/rump_private.h	Tue Apr 27 23:30:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_private.h,v 1.43 2010/03/01 13:12:20 pooka Exp $	*/
+/*	$NetBSD: rump_private.h,v 1.44 2010/04/27 23:30:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -104,6 +104,7 @@
 int		rump_sysproxy_copyout(const void *, void *, size_t);
 int		rump_sysproxy_copyin(const void *, void *, size_t);
 
+void	rump_cpus_bootstrap(int);
 void	rump_scheduler_init(void);
 void	rump_schedule(void);
 void	rump_unschedule(void);
@@ -114,7 +115,7 @@
 void	rump_user_schedule(int);
 void	rump_user_unschedule(int, int *);
 
-void	rump_cpu_bootstrap(struct cpu_info *);
+void	rump_cpu_attach(struct cpu_info *);
 
 bool	kernel_biglocked(void);
 void	kernel_unlock_allbutone(int *);

Index: src/sys/rump/librump/rumpkern/rumpcpu_generic.c
diff -u src/sys/rump/librump/rumpkern/rumpcpu_generic.c:1.1 src/sys/rump/librump/rumpkern/rumpcpu_generic.c:1.2
--- src/sys/rump/librump/rumpkern/rumpcpu_generic.c:1.1	Thu Oct 15 01:29:06 2009
+++ src/sys/rump/librump/rumpkern/rumpcpu_generic.c	Tue Apr 27 23:30:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpcpu_generic.c,v 1.1 2009/10/15 01:29:06 pooka Exp $	*/
+/*	$NetBSD: rumpcpu_generic.c,v 1.2 2010/04/27 23:30:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -29,14 +29,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpcpu_generic.c,v 1.1 2009/10/15 01:29:06 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpcpu_generic.c,v 1.2 2010/04/27 23:30:30 pooka Exp $");
 
 #include <sys/param.h>
 
 #include "rump_private.h"
 
 void
-rump_cpu_bootstrap(struct cpu_info *ci)
+rump_cpu_attach(struct cpu_info *ci)
 {
 
 	/* nada */

Index: src/sys/rump/librump/rumpkern/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.11 src/sys/rump/librump/rumpkern/scheduler.c:1.12
--- src/sys/rump/librump/rumpkern/scheduler.c:1.11	Wed Apr 21 16:16:31 2010
+++ src/sys/rump/librump/rumpkern/scheduler.c	Tue Apr 27 23:30:30 2010
@@ -1,4 +1,4 @@
-/*      $NetBSD: scheduler.c,v 1.11 2010/04/21 16:16:31 pooka Exp $	*/
+/*      $NetBSD: scheduler.c,v 1.12 2010/04/27 23:30:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.11 2010/04/21 16:16:31 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.12 2010/04/27 23:30:30 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -53,7 +53,7 @@
 	LIST_ENTRY(rumpcpu) rcpu_entries;
 } rcpu_storage[MAXCPUS];
 struct cpu_info *rump_cpu = &rump_cpus[0];
-int ncpu = 1;
+int ncpu;
 
 #define RCPU_WANTED	0x01	/* someone wants this specific CPU */
 #define RCPU_BUSY	0x02	/* CPU is busy */
@@ -72,6 +72,23 @@
 	return &rump_cpus[index];
 }
 
+/* this could/should be mi_attach_cpu? */
+void
+rump_cpus_bootstrap(int num)
+{
+	struct rumpcpu *rcpu;
+	struct cpu_info *ci;
+	int i;
+
+	for (i = 0; i < num; i++) {
+		rcpu = &rcpu_storage[i];
+		ci = &rump_cpus[i];
+		ci->ci_index = i;
+		rump_cpu_attach(ci);
+		ncpu++;
+	}
+}
+
 void
 rump_scheduler_init()
 {
@@ -85,11 +102,10 @@
 	for (i = 0; i < ncpu; i++) {
 		rcpu = &rcpu_storage[i];
 		ci = &rump_cpus[i];
-		rump_cpu_bootstrap(ci);
+		rcpu->rcpu_ci = ci;
 		ci->ci_schedstate.spc_mutex =
 		    mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
 		ci->ci_schedstate.spc_flags = SPCF_RUNNING;
-		rcpu->rcpu_ci = ci;
 		LIST_INSERT_HEAD(&cpu_freelist, rcpu, rcpu_entries);
 		rcpu->rcpu_flags = RCPU_FREELIST;
 		rumpuser_cv_init(&rcpu->rcpu_cv);

Index: src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c
diff -u src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.7 src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.8
--- src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c:1.7	Thu Oct 15 16:39:22 2009
+++ src/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c	Tue Apr 27 23:30:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpcpu.c,v 1.7 2009/10/15 16:39:22 pooka Exp $	*/
+/*	$NetBSD: rumpcpu.c,v 1.8 2010/04/27 23:30:30 pooka Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpcpu.c,v 1.7 2009/10/15 16:39:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpcpu.c,v 1.8 2010/04/27 23:30:30 pooka Exp $");
 
 #include <sys/param.h>
 
@@ -40,9 +40,11 @@
 struct cpu_info *cpu_info_list;
 
 void
-rump_cpu_bootstrap(struct cpu_info *ci)
+rump_cpu_attach(struct cpu_info *ci)
 {
 
+	/* XXX: wrong order, but ... */
+	ci->ci_next = cpu_info_list;
 	cpu_info_list = ci;
 }
 

Reply via email to