geom_kern.c revision 93250
192108Sphk/*- 292108Sphk * Copyright (c) 2002 Poul-Henning Kamp 392108Sphk * Copyright (c) 2002 Networks Associates Technology, Inc. 492108Sphk * All rights reserved. 592108Sphk * 692108Sphk * This software was developed for the FreeBSD Project by Poul-Henning Kamp 792108Sphk * and NAI Labs, the Security Research Division of Network Associates, Inc. 892108Sphk * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the 992108Sphk * DARPA CHATS research program. 1092108Sphk * 1192108Sphk * Redistribution and use in source and binary forms, with or without 1292108Sphk * modification, are permitted provided that the following conditions 1392108Sphk * are met: 1492108Sphk * 1. Redistributions of source code must retain the above copyright 1592108Sphk * notice, this list of conditions and the following disclaimer. 1692108Sphk * 2. Redistributions in binary form must reproduce the above copyright 1792108Sphk * notice, this list of conditions and the following disclaimer in the 1892108Sphk * documentation and/or other materials provided with the distribution. 1992108Sphk * 3. The names of the authors may not be used to endorse or promote 2092108Sphk * products derived from this software without specific prior written 2192108Sphk * permission. 2292108Sphk * 2392108Sphk * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2492108Sphk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2592108Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2692108Sphk * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2792108Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2892108Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2992108Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3092108Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3192108Sphk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3292108Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3392108Sphk * SUCH DAMAGE. 3492108Sphk * 3592108Sphk * $FreeBSD: head/sys/geom/geom_kern.c 93250 2002-03-26 22:07:38Z phk $ 3692108Sphk */ 3792108Sphk 3892108Sphk#include <sys/param.h> 3992108Sphk#include <sys/systm.h> 4092108Sphk#include <sys/kernel.h> 4192108Sphk#include <sys/malloc.h> 4292108Sphk#include <sys/bio.h> 4392108Sphk#include <sys/sysctl.h> 4492108Sphk#include <sys/proc.h> 4592108Sphk#include <sys/kthread.h> 4692108Sphk#include <sys/lock.h> 4792108Sphk#include <sys/mutex.h> 4892108Sphk#include <sys/sx.h> 4992108Sphk#include <sys/sbuf.h> 5092108Sphk#include <sys/errno.h> 5192108Sphk#include <geom/geom.h> 5293250Sphk#include <geom/geom_int.h> 5392108Sphk 5492108SphkMALLOC_DEFINE(M_GEOM, "GEOM", "Geom data structures"); 5592108Sphk 5692108Sphkstruct sx topology_lock; 5792108Sphk 5892108Sphkstatic struct proc *g_up_proc; 5992108Sphk 6092108Sphkint g_debugflags; 6192108Sphk 6292108Sphkstatic void 6392108Sphkg_up_procbody(void) 6492108Sphk{ 6592108Sphk struct proc *p = g_up_proc; 6692108Sphk struct thread *tp = &p->p_xxthread; 6792108Sphk 6892108Sphk curthread->td_base_pri = PRIBIO; 6992108Sphk for(;;) { 7092108Sphk g_io_schedule_up(tp); 7192108Sphk mtx_lock(&Giant); 7292108Sphk tsleep(&g_wait_up, PRIBIO, "g_up", hz/10); 7392108Sphk mtx_unlock(&Giant); 7492108Sphk } 7592108Sphk} 7692108Sphk 7792108Sphkstruct kproc_desc g_up_kp = { 7892108Sphk "g_up", 7992108Sphk g_up_procbody, 8092108Sphk &g_up_proc, 8192108Sphk}; 8292108Sphk 8392108Sphkstatic struct proc *g_down_proc; 8492108Sphk 8592108Sphkstatic void 8692108Sphkg_down_procbody(void) 8792108Sphk{ 8892108Sphk struct proc *p = g_down_proc; 8992108Sphk struct thread *tp = &p->p_xxthread; 9092108Sphk 9192108Sphk curthread->td_base_pri = PRIBIO; 9292108Sphk for(;;) { 9392108Sphk g_io_schedule_down(tp); 9492108Sphk mtx_lock(&Giant); 9592108Sphk tsleep(&g_wait_down, PRIBIO, "g_down", hz/10); 9692108Sphk mtx_unlock(&Giant); 9792108Sphk } 9892108Sphk} 9992108Sphk 10092108Sphkstruct kproc_desc g_down_kp = { 10192108Sphk "g_down", 10292108Sphk g_down_procbody, 10392108Sphk &g_down_proc, 10492108Sphk}; 10592108Sphk 10692108Sphkstatic struct proc *g_event_proc; 10792108Sphk 10892108Sphkstatic void 10992108Sphkg_event_procbody(void) 11092108Sphk{ 11192108Sphk 11292108Sphk curthread->td_base_pri = PRIBIO; 11392108Sphk for(;;) { 11493250Sphk g_run_events(); 11592108Sphk mtx_lock(&Giant); 11692108Sphk tsleep(&g_wait_event, PRIBIO, "g_events", hz/10); 11792108Sphk mtx_unlock(&Giant); 11892108Sphk } 11992108Sphk} 12092108Sphk 12192108Sphkstruct kproc_desc g_event_kp = { 12292108Sphk "g_event", 12392108Sphk g_event_procbody, 12492108Sphk &g_event_proc, 12592108Sphk}; 12692108Sphk 12792108Sphkvoid 12892108Sphkg_init(void) 12992108Sphk{ 13092108Sphk printf("Initializing GEOMetry subsystem\n"); 13192108Sphk if (bootverbose) 13292108Sphk g_debugflags |= G_T_TOPOLOGY; 13392108Sphk sx_init(&topology_lock, "GEOM topology"); 13492108Sphk g_io_init(); 13592108Sphk g_event_init(); 13692108Sphk mtx_lock(&Giant); 13792108Sphk kproc_start(&g_event_kp); 13892108Sphk kproc_start(&g_up_kp); 13992108Sphk kproc_start(&g_down_kp); 14092108Sphk mtx_unlock(&Giant); 14192108Sphk} 14292108Sphk 14392108Sphkstatic int 14492108Sphksysctl_debug_geomdot(SYSCTL_HANDLER_ARGS) 14592108Sphk{ 14692108Sphk int i, error; 14792108Sphk struct sbuf *sb; 14892108Sphk 14992108Sphk i = 0; 15092108Sphk sb = g_confdot(); 15192108Sphk error = sysctl_handle_opaque(oidp, sbuf_data(sb), sbuf_len(sb), req); 15292108Sphk sbuf_delete(sb); 15392108Sphk return (error); 15492108Sphk} 15592108Sphk 15692108SphkSYSCTL_PROC(_debug, OID_AUTO, geomdot, CTLTYPE_STRING|CTLFLAG_RD, 15792108Sphk 0, 0, sysctl_debug_geomdot, "A", 15892108Sphk "Dump the GEOM config"); 15992108Sphk 16092108Sphkstatic int 16192108Sphksysctl_debug_geomconf(SYSCTL_HANDLER_ARGS) 16292108Sphk{ 16392108Sphk int i, error; 16492108Sphk struct sbuf *sb; 16592108Sphk 16692108Sphk i = 0; 16792108Sphk sb = g_conf(); 16892108Sphk error = sysctl_handle_opaque(oidp, sbuf_data(sb), sbuf_len(sb), req); 16992108Sphk sbuf_delete(sb); 17092108Sphk return (error); 17192108Sphk} 17292108Sphk 17392108SphkSYSCTL_PROC(_debug, OID_AUTO, geomconf, CTLTYPE_STRING|CTLFLAG_RD, 17492108Sphk 0, 0, sysctl_debug_geomconf, "A", 17592108Sphk "Dump the GEOM config"); 17692108Sphk 17792108SphkSYSCTL_INT(_debug, OID_AUTO, geomdebugflags, CTLTYPE_INT|CTLFLAG_RW, 17892108Sphk &g_debugflags, 0, ""); 17992108Sphk 18093248SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_class, CTLTYPE_INT|CTLFLAG_RD, 18193248Sphk 0, sizeof(struct g_class), ""); 18292108SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_geom, CTLTYPE_INT|CTLFLAG_RD, 18392108Sphk 0, sizeof(struct g_geom), ""); 18492108SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_provider, CTLTYPE_INT|CTLFLAG_RD, 18592108Sphk 0, sizeof(struct g_provider), ""); 18692108SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_consumer, CTLTYPE_INT|CTLFLAG_RD, 18792108Sphk 0, sizeof(struct g_consumer), ""); 18892108SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_bioq, CTLTYPE_INT|CTLFLAG_RD, 18992108Sphk 0, sizeof(struct g_bioq), ""); 19092108SphkSYSCTL_INT(_debug_sizeof, OID_AUTO, g_event, CTLTYPE_INT|CTLFLAG_RD, 19192108Sphk 0, sizeof(struct g_event), ""); 192