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