From owner-svn-src-head@FreeBSD.ORG Sat Aug 11 00:06:57 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 3E10B106566B; Sat, 11 Aug 2012 00:06:57 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 28F638FC08; Sat, 11 Aug 2012 00:06:57 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q7B06vsc092726; Sat, 11 Aug 2012 00:06:57 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q7B06uPR092724; Sat, 11 Aug 2012 00:06:56 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <201208110006.q7B06uPR092724@svn.freebsd.org> From: David Xu Date: Sat, 11 Aug 2012 00:06:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r239187 - head/sys/kern X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 11 Aug 2012 00:06:57 -0000 Author: davidxu Date: Sat Aug 11 00:06:56 2012 New Revision: 239187 URL: http://svn.freebsd.org/changeset/base/239187 Log: tvtohz will print out an error message if a negative value is given to it, avoid this problem by detecting timeout earlier. Reported by: pho Modified: head/sys/kern/kern_umtx.c Modified: head/sys/kern/kern_umtx.c ============================================================================== --- head/sys/kern/kern_umtx.c Fri Aug 10 21:11:00 2012 (r239186) +++ head/sys/kern/kern_umtx.c Sat Aug 11 00:06:56 2012 (r239187) @@ -587,11 +587,10 @@ abs_timeout_init2(struct abs_timeout *ti &umtxtime->_timeout); } -static int +static void abs_timeout_update(struct abs_timeout *timo) { kern_clock_gettime(curthread, timo->clockid, &timo->cur); - return (timespeccmp(&timo->cur, &timo->end, >=)); } static int @@ -601,6 +600,8 @@ abs_timeout_gethz(struct abs_timeout *ti tts = timo->end; timespecsub(&tts, &timo->cur); + if (tts.tv_sec < 0 || (tts.tv_sec == 0 && tts.tv_nsec == 0)) + return (-1); return (tstohz(&tts)); } @@ -613,22 +614,25 @@ umtxq_sleep(struct umtx_q *uq, const cha { struct umtxq_chain *uc; int error; + int pulse; uc = umtxq_getchain(&uq->uq_key); UMTXQ_LOCKED_ASSERT(uc); for (;;) { if (!(uq->uq_flags & UQF_UMTXQ)) return (0); - error = msleep(uq, &uc->uc_lock, PCATCH, wmesg, - timo == NULL ? 0 : abs_timeout_gethz(timo)); - if (error != EWOULDBLOCK) - break; - umtxq_unlock(&uq->uq_key); - if (abs_timeout_update(timo)) { - error = ETIMEDOUT; + if (timo != NULL) { + pulse = abs_timeout_gethz(timo); + if (pulse < 0) + return (ETIMEDOUT); + } else + pulse = 0; + error = msleep(uq, &uc->uc_lock, PCATCH|PDROP, wmesg, pulse); + if (error != EWOULDBLOCK) { umtxq_lock(&uq->uq_key); break; } + abs_timeout_update(timo); umtxq_lock(&uq->uq_key); } return (error);