From owner-svn-src-all@FreeBSD.ORG Wed May 20 16:54:48 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 1F3A7193; Wed, 20 May 2015 16:54:48 +0000 (UTC) Received: from mail-la0-x233.google.com (mail-la0-x233.google.com [IPv6:2a00:1450:4010:c03::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 9911213DA; Wed, 20 May 2015 16:54:47 +0000 (UTC) Received: by lagv1 with SMTP id v1so83455512lag.3; Wed, 20 May 2015 09:54:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=Owpo9W10Xkyfd6JLlWI+VFFJ21SJts9mZ2Pzvb4lLmY=; b=W5KYcGrjsFisO1Y4FcOMCP2t/+7rAcayroBJpOfHT+oJ2iSLRJeDVfxml5zSWop5pE 2oGSk0zFOK4c75ah2TpuRUMRrBfcGaJsZgL91pq8TewSLr87RudvGlhEAB10qHwGcakC fSa1372FsxEZu23WuJ8QyxDnwyEFdt9ihyMeIZyQtwj6xdrlEKml+U8vE9X0caAxAkE0 Eg0GUwanjy7CoiGA7vnXt7hqS5wMM6EHayLHwmgzCGCMXwqyja4D8GDCwk3sZ75u8Aye 5JrU85BMl4ZM29nhK2+/GWy6QnhKspctAPiFVePyBW8asmbKt5k6LNN80sBuk6oxEngr g1Pg== MIME-Version: 1.0 X-Received: by 10.152.87.13 with SMTP id t13mr18911493laz.66.1432140885726; Wed, 20 May 2015 09:54:45 -0700 (PDT) Sender: mahrens@gmail.com Received: by 10.112.188.164 with HTTP; Wed, 20 May 2015 09:54:45 -0700 (PDT) In-Reply-To: <20150520120046.268dde86@kan> References: <201505151350.t4FDocQT054144@svn.freebsd.org> <20150520120046.268dde86@kan> Date: Wed, 20 May 2015 09:54:45 -0700 X-Google-Sender-Auth: ieM0oatELuoy8IdWwcJb--liBUE Message-ID: Subject: Re: svn commit: r282971 - in head/sys: kern sys From: Matthew Ahrens To: Alexander Kabaev Cc: John Baldwin , "src-committers@freebsd.org" , svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset=UTF-8 X-Content-Filtered-By: Mailman/MimeDel 2.1.20 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 May 2015 16:54:48 -0000 On Wed, May 20, 2015 at 9:00 AM, Alexander Kabaev wrote: > On Fri, 15 May 2015 13:50:38 +0000 (UTC) > John Baldwin wrote: > > > Author: jhb > > Date: Fri May 15 13:50:37 2015 > > New Revision: 282971 > > URL: https://svnweb.freebsd.org/changeset/base/282971 > > > > Log: > > Previously, cv_waiters was only updated by cv_signal or cv_wait. If > > a thread awakened due to a time out, then cv_waiters was not > > decremented. If INT_MAX threads timed out on a cv without an > > intervening cv_broadcast, then cv_waiters could overflow. To fix > > this, have each sleeping thread decrement cv_waiters when it resumes. > > > > Note that previously cv_waiters was protected by the sleepq chain > > lock. However, that lock is not held when threads resume from sleep. > > In addition, the interlock is also not always reacquired after > > resuming (cv_wait_unlock), nor is it always held by callers of > > cv_signal() or cv_broadcast(). Instead, use atomic ops to update > > cv_waiters. Since the sleepq chain lock is still held on every > > increment, it should still be safe to compare cv_waiters against zero > > while holding the lock in the wakeup routines as the only way the > > race should be lost would result in extra calls to sleepq_signal() or > > sleepq_broadcast(). > > Differential Revision: https://reviews.freebsd.org/D2427 > > Reviewed by: benno > > Reported by: benno (wrap of cv_waiters in the field) > > MFC after: 2 weeks > > > > Modified: > > head/sys/kern/kern_condvar.c > > head/sys/sys/condvar.h > > > > This breaks ZFS range locking code, which expects to be able to wakeup > everyone on the condition variable and then free the structure that > contains it. Having woken up threads modify cv_waiters results in a > race that leads to already freed memory to be accessed. > > It is debatable just how correct ZFS code in its expectations, but I > think this commit should probably be reverted until either ZFS is > changed not to expect cv modifiable by waking threads or until > alternative solution is found to the cv_waiters overflow issue fixed by > this commit. > > It isn't clear to me how the zfs_range_unlock() code could know when all the waiters have woken up and updated the CV, and thus it's safe to destroy/free the CV. Would the woken threads ask, "was I the last thread to be woken by this CV" and if so free the struct containing the CV? Obviously such a check would need to ensure that the other threads have completed their updates to the CV. --matt