From mboxrd@z Thu Jan 1 00:00:00 1970 From: ehrhardt@linux.vnet.ibm.com Subject: [PATCH 1/5] user: ppc: fix threading bugs in main-ppc.c Date: Tue, 28 Oct 2008 10:08:18 +0100 Message-ID: <1225184902-25769-2-git-send-email-ehrhardt@linux.vnet.ibm.com> References: <1225184902-25769-1-git-send-email-ehrhardt@linux.vnet.ibm.com> Cc: hollisb@us.ibm.com, ehrhardt@linux.vnet.ibm.com To: kvm-ppc@vger.kernel.org, kvm@vger.kernel.org, avi@qumranet.com Return-path: Received: from mtagate6.de.ibm.com ([195.212.29.155]:64860 "EHLO mtagate6.de.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753394AbYJ1JJS (ORCPT ); Tue, 28 Oct 2008 05:09:18 -0400 In-Reply-To: <1225184902-25769-1-git-send-email-ehrhardt@linux.vnet.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: From: Hollis Blanchard - call io_table_register() before any vcpus have started - wait for all vcpus to exit before exiting the parent thread Signed-off-by: Hollis Blanchard Signed-off-by: Christian Ehrhardt --- [diffstat] main-ppc.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) [diff] diff --git a/user/main-ppc.c b/user/main-ppc.c --- a/user/main-ppc.c +++ b/user/main-ppc.c @@ -51,7 +51,7 @@ struct io_table mmio_table; struct io_table mmio_table; static int ncpus = 1; -static sem_t init_sem; +static sem_t exited_sem; static __thread int vcpu; static sigset_t kernel_sigmask; static sigset_t ipi_sigmask; @@ -220,16 +220,8 @@ void sync_caches(void *mem, unsigned lon asm volatile ("sync; isync"); } -static void init_vcpu(int n, unsigned long entry) +static void init_vcpu(int n) { - /* XXX must set initial TLB state and stack - struct kvm_regs regs = { - .pc = entry, - }; - - kvm_set_regs(kvm, 0, ®s); - */ - sigemptyset(&ipi_sigmask); sigaddset(&ipi_sigmask, IPI_SIGNAL); sigprocmask(SIG_UNBLOCK, &ipi_sigmask, NULL); @@ -237,7 +229,6 @@ static void init_vcpu(int n, unsigned lo vcpus[n].tid = gettid(); vcpu = n; kvm_set_signal_mask(kvm, n, &kernel_sigmask); - sem_post(&init_sem); } static void *do_create_vcpu(void *_n) @@ -245,8 +236,9 @@ static void *do_create_vcpu(void *_n) int n = (long)_n; kvm_create_vcpu(kvm, n); - init_vcpu(n, 0x0); + init_vcpu(n); kvm_run(kvm, n); + sem_post(&exited_sem); return NULL; } @@ -368,14 +360,14 @@ int main(int argc, char **argv) len = load_file(vm_mem, argv[optind], 1); sync_caches(vm_mem, len); - sem_init(&init_sem, 0, 0); - init_vcpu(0, 0x0); - for (i = 1; i < ncpus; ++i) - start_vcpu(i); - for (i = 0; i < ncpus; ++i) - sem_wait(&init_sem); - io_table_register(&mmio_table, 0xf0000000, 64, mmio_handler, NULL); - return kvm_run(kvm, 0); + sem_init(&exited_sem, 0, 0); + for (i = 0; i < ncpus; ++i) + start_vcpu(i); + /* Wait for all vcpus to exit. */ + for (i = 0; i < ncpus; ++i) + sem_wait(&exited_sem); + + return 0; }