patch to fix SMP vkernel reboots
Joe Talbott
josepht at cstone.net
Thu Jul 12 08:51:42 PDT 2007
Rebooting an SMP vkernel currently doesn't work since kern_execve()
won't exec if multiple LWPs are present. The attached patch adds a
signal handler for SIGUSR2 which calls pthread_exit() on the current
thread and a function kill_vcpus() that sends SIGUSR2 to each of the
virtual CPU threads. I'm not sure if I need to do some memory
clean-up or not, so let me know if I'm missing something.
Joe
Index: sys/platform/vkernel/i386/exception.c
===================================================================
RCS file: /home/dcvs/src/sys/platform/vkernel/i386/exception.c,v
retrieving revision 1.8
diff -u -r1.8 exception.c
--- sys/platform/vkernel/i386/exception.c 1 Jul 2007 03:04:14 -0000 1.8
+++ sys/platform/vkernel/i386/exception.c 12 Jul 2007 15:24:31 -0000
@@ -85,6 +85,15 @@
--mycpu->gd_intr_nesting_level;
}
+static
+void
+halt_vcpu(int nada, siginfo_t *info, void *ctxp)
+{
+ int ret = 0;
+
+ pthread_exit(&ret);
+}
+
#endif
void
@@ -106,6 +115,8 @@
#ifdef SMP
sa.sa_sigaction = ipisig;
sigaction(SIGUSR1, &sa, NULL);
+ sa.sa_sigaction = halt_vcpu;
+ sigaction(SIGUSR2, &sa, NULL);
#endif
}
Index: sys/platform/vkernel/i386/mp.c
===================================================================
RCS file: /home/dcvs/src/sys/platform/vkernel/i386/mp.c,v
retrieving revision 1.6
diff -u -r1.6 mp.c
--- sys/platform/vkernel/i386/mp.c 10 Jul 2007 18:35:38 -0000 1.6
+++ sys/platform/vkernel/i386/mp.c 12 Jul 2007 15:24:48 -0000
@@ -455,3 +455,17 @@
return(ncpus - 1);
}
+
+#ifdef SMP
+
+void
+kill_cpus(void)
+{
+ int i;
+
+ for (i = 1; i < MAXCPU; i++)
+ if (ap_tids[i] != NULL)
+ pthread_kill(ap_tids[i], SIGUSR2);
+}
+
+#endif
Index: sys/platform/vkernel/include/smp.h
===================================================================
RCS file: /home/dcvs/src/sys/platform/vkernel/include/smp.h,v
retrieving revision 1.3
diff -u -r1.3 smp.h
--- sys/platform/vkernel/include/smp.h 2 Jul 2007 02:37:04 -0000 1.3
+++ sys/platform/vkernel/include/smp.h 12 Jul 2007 15:37:35 -0000
@@ -123,6 +123,7 @@
int stop_cpus (u_int);
void ap_init (void);
int restart_cpus (u_int);
+void kill_cpus (void);
#if 0
void forward_signal (struct proc *);
Index: sys/platform/vkernel/platform/init.c
===================================================================
RCS file: /home/dcvs/src/sys/platform/vkernel/platform/init.c,v
retrieving revision 1.44
diff -u -r1.44 init.c
--- sys/platform/vkernel/platform/init.c 10 Jul 2007 18:35:38 -0000 1.44
+++ sys/platform/vkernel/platform/init.c 12 Jul 2007 15:37:08 -0000
@@ -54,6 +54,7 @@
#include <machine/cpu.h>
#include <machine/globaldata.h>
+#include <machine/smp.h>
#include <machine/tls.h>
#include <machine/md_var.h>
#include <machine/vmparam.h>
@@ -1148,6 +1149,9 @@
kprintf("cpu reset, rebooting vkernel\n");
closefrom(3);
cleanpid();
+#ifdef SMP
+ kill_cpus();
+#endif
execv(save_av[0], save_av);
}
More information about the Submit
mailing list