1295943Ssobomax/*- 2295943Ssobomax * Copyright (c) 2006-2016 Maxim Sobolev <sobomax@FreeBSD.org> 3295943Ssobomax * All rights reserved. 4295943Ssobomax * 5295943Ssobomax * Redistribution and use in source and binary forms, with or without 6295943Ssobomax * modification, are permitted provided that the following conditions 7295943Ssobomax * are met: 8295943Ssobomax * 1. Redistributions of source code must retain the above copyright 9295943Ssobomax * notice, this list of conditions and the following disclaimer. 10295943Ssobomax * 2. Redistributions in binary form must reproduce the above copyright 11295943Ssobomax * notice, this list of conditions and the following disclaimer in the 12295943Ssobomax * documentation and/or other materials provided with the distribution. 13295943Ssobomax * 14295943Ssobomax * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15295943Ssobomax * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16295943Ssobomax * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17295943Ssobomax * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18295943Ssobomax * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19295943Ssobomax * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20295943Ssobomax * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21295943Ssobomax * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22295943Ssobomax * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23295943Ssobomax * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24295943Ssobomax * SUCH DAMAGE. 25295943Ssobomax */ 26295943Ssobomax 27295943Ssobomax#include <sys/cdefs.h> 28295943Ssobomax__FBSDID("$FreeBSD$"); 29295943Ssobomax 30295943Ssobomax#include <sys/types.h> 31295943Ssobomax#include <sys/param.h> 32295943Ssobomax#include <sys/lock.h> 33295943Ssobomax#include <sys/mutex.h> 34295943Ssobomax#include <sys/bio.h> 35295943Ssobomax#include <sys/proc.h> 36295943Ssobomax#include <sys/sched.h> 37295943Ssobomax#include <sys/kthread.h> 38295943Ssobomax#include <sys/malloc.h> 39295943Ssobomax 40295943Ssobomax#include <geom/uzip/g_uzip.h> 41295943Ssobomax#include <geom/uzip/g_uzip_softc.h> 42295943Ssobomax#include <geom/uzip/g_uzip_wrkthr.h> 43295943Ssobomax 44295943Ssobomaxvoid 45295943Ssobomaxg_uzip_wrkthr(void *arg) 46295943Ssobomax{ 47295943Ssobomax struct g_uzip_softc *sc; 48295943Ssobomax struct bio *bp; 49295943Ssobomax 50295943Ssobomax sc = (struct g_uzip_softc *)arg; 51295943Ssobomax thread_lock(curthread); 52295943Ssobomax sched_prio(curthread, PRIBIO); 53295943Ssobomax thread_unlock(curthread); 54295943Ssobomax 55295943Ssobomax for (;;) { 56295943Ssobomax mtx_lock(&sc->queue_mtx); 57295943Ssobomax if (sc->wrkthr_flags & GUZ_SHUTDOWN) { 58295943Ssobomax sc->wrkthr_flags |= GUZ_EXITING; 59295943Ssobomax mtx_unlock(&sc->queue_mtx); 60295943Ssobomax kproc_exit(0); 61295943Ssobomax } 62295943Ssobomax bp = bioq_takefirst(&sc->bio_queue); 63295943Ssobomax if (!bp) { 64295943Ssobomax msleep(sc, &sc->queue_mtx, PRIBIO | PDROP, 65295943Ssobomax "wrkwait", 0); 66295943Ssobomax continue; 67295943Ssobomax } 68295943Ssobomax mtx_unlock(&sc->queue_mtx); 69295943Ssobomax sc->uzip_do(sc, bp); 70295943Ssobomax } 71295943Ssobomax} 72