Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/rump/librump/rumpkern Fix multiple virtual cpu support.
details: https://anonhg.NetBSD.org/src/rev/87cff579df7f
branches: trunk
changeset: 754324:87cff579df7f
user: pooka <pooka%NetBSD.org@localhost>
date: Tue Apr 27 23:30:29 2010 +0000
description:
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.
diffstat:
sys/rump/librump/rumpkern/arch/i386/rumpcpu.c | 8 +++-
sys/rump/librump/rumpkern/intr.c | 44 ++++++++++----------------
sys/rump/librump/rumpkern/rump.c | 10 ++++-
sys/rump/librump/rumpkern/rump_private.h | 5 +-
sys/rump/librump/rumpkern/rumpcpu_generic.c | 6 +-
sys/rump/librump/rumpkern/scheduler.c | 26 ++++++++++++---
6 files changed, 57 insertions(+), 42 deletions(-)
diffs (275 lines):
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/arch/i386/rumpcpu.c
--- a/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/arch/i386/rumpcpu.c Tue Apr 27 23:30:29 2010 +0000
@@ -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;
}
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/intr.c
--- a/sys/rump/librump/rumpkern/intr.c Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/intr.c Tue Apr 27 23:30:29 2010 +0000
@@ -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);
}
/*
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/rump.c
--- a/sys/rump/librump/rumpkern/rump.c Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/rump.c Tue Apr 27 23:30:29 2010 +0000
@@ -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;
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/rump_private.h
--- a/sys/rump/librump/rumpkern/rump_private.h Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/rump_private.h Tue Apr 27 23:30:29 2010 +0000
@@ -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 *);
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/rumpcpu_generic.c
--- a/sys/rump/librump/rumpkern/rumpcpu_generic.c Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/rumpcpu_generic.c Tue Apr 27 23:30:29 2010 +0000
@@ -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 */
diff -r 7e197851d612 -r 87cff579df7f sys/rump/librump/rumpkern/scheduler.c
--- a/sys/rump/librump/rumpkern/scheduler.c Tue Apr 27 18:55:12 2010 +0000
+++ b/sys/rump/librump/rumpkern/scheduler.c Tue Apr 27 23:30:29 2010 +0000
@@ -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);
Home |
Main Index |
Thread Index |
Old Index