From owner-freebsd-current@FreeBSD.ORG Fri May 13 15:28:39 2011 Return-Path: Delivered-To: freebsd-current@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 90C44106566C for ; Fri, 13 May 2011 15:28:39 +0000 (UTC) (envelope-from avg@FreeBSD.org) Received: from citadel.icyb.net.ua (citadel.icyb.net.ua [212.40.38.140]) by mx1.freebsd.org (Postfix) with ESMTP id DC0D68FC18 for ; Fri, 13 May 2011 15:28:36 +0000 (UTC) Received: from odyssey.starpoint.kiev.ua (alpha-e.starpoint.kiev.ua [212.40.38.101]) by citadel.icyb.net.ua (8.8.8p3/ICyb-2.3exp) with ESMTP id SAA19499; Fri, 13 May 2011 18:28:34 +0300 (EEST) (envelope-from avg@FreeBSD.org) Message-ID: <4DCD4E21.7020800@FreeBSD.org> Date: Fri, 13 May 2011 18:28:33 +0300 From: Andriy Gapon User-Agent: Mozilla/5.0 (X11; U; FreeBSD amd64; en-US; rv:1.9.2.17) Gecko/20110504 Lightning/1.0b2 Thunderbird/3.1.10 MIME-Version: 1.0 To: Max Laier References: <4DCD357D.6000109@FreeBSD.org> <201105131041.59981.max@love2party.net> In-Reply-To: <201105131041.59981.max@love2party.net> X-Enigmail-Version: 1.1.2 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Cc: freebsd-current@FreeBSD.org Subject: Re: proposed smp_rendezvous change X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 May 2011 15:28:39 -0000 on 13/05/2011 17:41 Max Laier said the following: > this ncpus isn't the one you are looking for. Thank you! Here's an updated patch: Index: sys/kern/subr_smp.c =================================================================== --- sys/kern/subr_smp.c (revision 221835) +++ sys/kern/subr_smp.c (working copy) @@ -316,19 +316,14 @@ void (*local_action_func)(void*) = smp_rv_action_func; void (*local_teardown_func)(void*) = smp_rv_teardown_func; - /* Ensure we have up-to-date values. */ - atomic_add_acq_int(&smp_rv_waiters[0], 1); - while (smp_rv_waiters[0] < smp_rv_ncpus) - cpu_spinwait(); - /* setup function */ if (local_setup_func != smp_no_rendevous_barrier) { if (smp_rv_setup_func != NULL) smp_rv_setup_func(smp_rv_func_arg); /* spin on entry rendezvous */ - atomic_add_int(&smp_rv_waiters[1], 1); - while (smp_rv_waiters[1] < smp_rv_ncpus) + atomic_add_int(&smp_rv_waiters[0], 1); + while (smp_rv_waiters[0] < smp_rv_ncpus) cpu_spinwait(); } @@ -337,12 +332,16 @@ local_action_func(local_func_arg); /* spin on exit rendezvous */ - atomic_add_int(&smp_rv_waiters[2], 1); - if (local_teardown_func == smp_no_rendevous_barrier) + atomic_add_int(&smp_rv_waiters[1], 1); + if (local_teardown_func == smp_no_rendevous_barrier) { + atomic_add_int(&smp_rv_waiters[2], 1); return; - while (smp_rv_waiters[2] < smp_rv_ncpus) + } + while (smp_rv_waiters[1] < smp_rv_ncpus) cpu_spinwait(); + atomic_add_int(&smp_rv_waiters[2], 1); + /* teardown function */ if (local_teardown_func != NULL) local_teardown_func(local_func_arg); @@ -377,6 +376,10 @@ /* obtain rendezvous lock */ mtx_lock_spin(&smp_ipi_mtx); + /* Wait for any previous unwaited rendezvous to finish. */ + while (atomic_load_acq_int(&smp_rv_waiters[2]) < smp_rv_ncpus) + cpu_spinwait(); + /* set static function pointers */ smp_rv_ncpus = ncpus; smp_rv_setup_func = setup_func; @@ -395,7 +398,7 @@ smp_rendezvous_action(); if (teardown_func == smp_no_rendevous_barrier) - while (atomic_load_acq_int(&smp_rv_waiters[2]) < ncpus) + while (atomic_load_acq_int(&smp_rv_waiters[1]) < ncpus) cpu_spinwait(); /* release lock */