Date: Tue, 15 Oct 2013 21:04:18 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> 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 Message-ID: <201310152104.r9FL4IpR099686@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310152104.r9FL4IpR099686>