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;
}