From owner-svn-src-projects@FreeBSD.ORG Tue Oct 15 21:04:19 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 58B5D7FB; Tue, 15 Oct 2013 21:04:19 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 2CB63288E; Tue, 15 Oct 2013 21:04:19 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r9FL4Jh6099689; Tue, 15 Oct 2013 21:04:19 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r9FL4IpR099686; Tue, 15 Oct 2013 21:04:18 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201310152104.r9FL4IpR099686@svn.freebsd.org> From: Alexander Motin Date: Tue, 15 Oct 2013 21:04:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r256560 - in projects/camlock/sys: cddl/contrib/opensolaris/uts/common/fs/zfs geom sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Oct 2013 21:04:19 -0000 Author: mav Date: Tue Oct 15 21:04:18 2013 New Revision: 256560 URL: http://svnweb.freebsd.org/changeset/base/256560 Log: Introduce THREAD_CAN_SLEEP() to check whether current thread is allowed to sleep by checking ((curthread)->td_no_sleeping == 0). Use that to find out whether GEOM and classes code can sleep. Previous check for one of GEOM threads was insufficient because request can be sent from other unrelated request bio_done() method called at interrupt thread, where sleeping is prohibited. Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c projects/camlock/sys/geom/geom_io.c projects/camlock/sys/sys/proc.h Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c ============================================================================== --- projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Tue Oct 15 21:02:02 2013 (r256559) +++ projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Tue Oct 15 21:04:18 2013 (r256560) @@ -2261,14 +2261,14 @@ zvol_geom_start(struct bio *bp) ASSERT(zv != NULL); switch (bp->bio_cmd) { case BIO_FLUSH: - if (g_is_geom_thread(curthread)) + if (!THREAD_CAN_SLEEP()) goto enqueue; zil_commit(zv->zv_zilog, ZVOL_OBJ); g_io_deliver(bp, 0); break; case BIO_READ: case BIO_WRITE: - if (g_is_geom_thread(curthread)) + if (!THREAD_CAN_SLEEP()) goto enqueue; zvol_strategy(bp); break; Modified: projects/camlock/sys/geom/geom_io.c ============================================================================== --- projects/camlock/sys/geom/geom_io.c Tue Oct 15 21:02:02 2013 (r256559) +++ projects/camlock/sys/geom/geom_io.c Tue Oct 15 21:04:18 2013 (r256560) @@ -518,7 +518,9 @@ g_io_request(struct bio *bp, struct g_co #ifdef GET_STACK_USAGE direct = (cp->flags & G_CF_DIRECT_SEND) && (pp->flags & G_PF_DIRECT_RECEIVE) && - !g_is_geom_thread(curthread); + !g_is_geom_thread(curthread) && + (((pp->flags & G_PF_ACCEPT_UNMAPPED) == 0 && + (bp->bio_flags & BIO_UNMAPPED) != 0) || THREAD_CAN_SLEEP()); if (direct) { /* Block direct execution if less then half of stack left. */ size_t st, su; Modified: projects/camlock/sys/sys/proc.h ============================================================================== --- projects/camlock/sys/sys/proc.h Tue Oct 15 21:02:02 2013 (r256559) +++ projects/camlock/sys/sys/proc.h Tue Oct 15 21:04:18 2013 (r256560) @@ -793,6 +793,8 @@ extern pid_t pid_max; #define THREAD_SLEEPING_OK() ((curthread)->td_no_sleeping--) +#define THREAD_CAN_SLEEP() ((curthread)->td_no_sleeping == 0) + #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash]) extern LIST_HEAD(pidhashhead, proc) *pidhashtbl; extern u_long pidhash;