From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37353) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAdZr-0004io-To for qemu-devel@nongnu.org; Wed, 08 Jun 2016 09:31:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bAdZp-0005uj-Rw for qemu-devel@nongnu.org; Wed, 08 Jun 2016 09:31:22 -0400 Received: from mail-lf0-x234.google.com ([2a00:1450:4010:c07::234]:32790) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAdZp-0005uW-K0 for qemu-devel@nongnu.org; Wed, 08 Jun 2016 09:31:21 -0400 Received: by mail-lf0-x234.google.com with SMTP id s64so5912834lfe.0 for ; Wed, 08 Jun 2016 06:31:21 -0700 (PDT) From: riku.voipio@linaro.org Date: Wed, 8 Jun 2016 16:30:25 +0300 Message-Id: <014628a705bdaf31c09915c29e61f4088956564d.1465392531.git.riku.voipio@linaro.org> In-Reply-To: References: Subject: [Qemu-devel] [PULL 44/44] linux-user: In fork_end(), remove correct CPUs from CPU list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell From: Peter Maydell In fork_end(), we must fix the list of current CPUs to match the fact that the child of the fork has only one thread. Unfortunately we were removing the wrong CPUs from the list, which meant that if the child subsequently did an exclusive operation it would deadlock in start_exclusive() waiting for a sibling CPU which didn't exist. In particular this could cause hangs doing git submodule init operations, as reported in https://bugs.launchpad.net/qemu/+bug/955379 comment #47. Signed-off-by: Peter Maydell Signed-off-by: Riku Voipio --- linux-user/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux-user/main.c b/linux-user/main.c index b6da0ba..150a356 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -130,7 +130,7 @@ void fork_end(int child) Discard information about the parent threads. */ CPU_FOREACH_SAFE(cpu, next_cpu) { if (cpu != thread_cpu) { - QTAILQ_REMOVE(&cpus, thread_cpu, node); + QTAILQ_REMOVE(&cpus, cpu, node); } } pending_cpus = 0; -- 2.1.4