The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/geom/geom_kern.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-3-Clause
    3  *
    4  * Copyright (c) 2002 Poul-Henning Kamp
    5  * Copyright (c) 2002 Networks Associates Technology, Inc.
    6  * All rights reserved.
    7  *
    8  * This software was developed for the FreeBSD Project by Poul-Henning Kamp
    9  * and NAI Labs, the Security Research Division of Network Associates, Inc.
   10  * under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
   11  * DARPA CHATS research program.
   12  *
   13  * Redistribution and use in source and binary forms, with or without
   14  * modification, are permitted provided that the following conditions
   15  * are met:
   16  * 1. Redistributions of source code must retain the above copyright
   17  *    notice, this list of conditions and the following disclaimer.
   18  * 2. Redistributions in binary form must reproduce the above copyright
   19  *    notice, this list of conditions and the following disclaimer in the
   20  *    documentation and/or other materials provided with the distribution.
   21  * 3. The names of the authors may not be used to endorse or promote
   22  *    products derived from this software without specific prior written
   23  *    permission.
   24  *
   25  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   35  * SUCH DAMAGE.
   36  */
   37 
   38 #include <sys/cdefs.h>
   39 __FBSDID("$FreeBSD$");
   40 
   41 #include <sys/param.h>
   42 #include <sys/systm.h>
   43 #include <sys/kernel.h>
   44 #include <sys/eventhandler.h>
   45 #include <sys/malloc.h>
   46 #include <sys/bio.h>
   47 #include <sys/sysctl.h>
   48 #include <sys/proc.h>
   49 #include <sys/unistd.h>
   50 #include <sys/kthread.h>
   51 #include <sys/lock.h>
   52 #include <sys/mutex.h>
   53 #include <sys/sbuf.h>
   54 #include <sys/sched.h>
   55 #include <sys/sx.h>
   56 #include <geom/geom.h>
   57 #include <geom/geom_int.h>
   58 
   59 MALLOC_DEFINE(M_GEOM, "GEOM", "Geom data structures");
   60 
   61 struct sx topology_lock;
   62 
   63 static struct proc *g_proc;
   64 static struct thread __read_mostly *g_up_td;
   65 static struct thread __read_mostly *g_down_td;
   66 static struct thread __read_mostly *g_event_td;
   67 
   68 int __read_mostly g_debugflags;
   69 int __read_mostly g_collectstats = G_STATS_PROVIDERS;
   70 int g_shutdown;
   71 int g_notaste;
   72 
   73 /*
   74  * G_UP and G_DOWN are the two threads which push I/O through the
   75  * stack.
   76  *
   77  * Things are procesed in a FIFO order, but these threads could be
   78  * part of I/O prioritization by deciding which bios/bioqs to service
   79  * in what order.
   80  *
   81  * We have only one thread in each direction, it is believed that until
   82  * a very non-trivial workload in the UP/DOWN path this will be enough,
   83  * but more than one can actually be run without problems.
   84  *
   85  * Holding the "mymutex" is a debugging feature:  It prevents people
   86  * from sleeping in the UP/DOWN I/O path by mistake or design (doing
   87  * so almost invariably result in deadlocks since it stalls all I/O
   88  * processing in the given direction.
   89  */
   90 
   91 static void
   92 g_up_procbody(void *arg)
   93 {
   94 
   95         thread_lock(g_up_td);
   96         sched_prio(g_up_td, PRIBIO);
   97         thread_unlock(g_up_td);
   98         for(;;) {
   99                 g_io_schedule_up(g_up_td);
  100         }
  101 }
  102 
  103 static void
  104 g_down_procbody(void *arg)
  105 {
  106 
  107         thread_lock(g_down_td);
  108         sched_prio(g_down_td, PRIBIO);
  109         thread_unlock(g_down_td);
  110         for(;;) {
  111                 g_io_schedule_down(g_down_td);
  112         }
  113 }
  114 
  115 static void
  116 g_event_procbody(void *arg)
  117 {
  118 
  119         thread_lock(g_event_td);
  120         sched_prio(g_event_td, PRIBIO);
  121         thread_unlock(g_event_td);
  122         g_run_events();
  123         /* NOTREACHED */
  124 }
  125 
  126 int
  127 g_is_geom_thread(struct thread *td)
  128 {
  129 
  130         return (td == g_up_td || td == g_down_td || td == g_event_td);
  131 }
  132 
  133 static void
  134 geom_shutdown(void *foo __unused)
  135 {
  136 
  137         g_shutdown = 1;
  138 }
  139 
  140 void
  141 g_init(void)
  142 {
  143 
  144         g_trace(G_T_TOPOLOGY, "g_ignition");
  145         sx_init(&topology_lock, "GEOM topology");
  146         g_io_init();
  147         g_event_init();
  148         g_ctl_init();
  149         kproc_kthread_add(g_event_procbody, NULL, &g_proc, &g_event_td,
  150             RFHIGHPID, 0, "geom", "g_event");
  151         kproc_kthread_add(g_up_procbody, NULL, &g_proc, &g_up_td,
  152             RFHIGHPID, 0, "geom", "g_up");
  153         kproc_kthread_add(g_down_procbody, NULL, &g_proc, &g_down_td,
  154             RFHIGHPID, 0, "geom", "g_down");
  155         EVENTHANDLER_REGISTER(shutdown_pre_sync, geom_shutdown, NULL,
  156                 SHUTDOWN_PRI_FIRST);
  157 }
  158 
  159 static int
  160 sysctl_kern_geom_confany(struct sysctl_req *req, g_event_t *func, size_t *hint)
  161 {
  162         size_t len = 0;
  163         int error = 0;
  164         struct sbuf *sb;
  165 
  166         if (req->oldptr == NULL) {
  167                 sb = sbuf_new(NULL, NULL, PAGE_SIZE, SBUF_FIXEDLEN |
  168                     SBUF_INCLUDENUL);
  169                 sbuf_set_drain(sb, sbuf_count_drain, &len);
  170                 g_waitfor_event(func, sb, M_WAITOK, NULL);
  171                 req->oldidx = *hint = len;
  172         } else {
  173                 sb = sbuf_new(NULL, NULL, *hint, SBUF_AUTOEXTEND |
  174                     SBUF_INCLUDENUL);
  175                 g_waitfor_event(func, sb, M_WAITOK, NULL);
  176                 *hint = sbuf_len(sb);
  177                 error = SYSCTL_OUT(req, sbuf_data(sb), sbuf_len(sb));
  178         }
  179         sbuf_delete(sb);
  180         return error;
  181 }
  182 
  183 static int
  184 sysctl_kern_geom_conftxt(SYSCTL_HANDLER_ARGS)
  185 {
  186         static size_t hint = PAGE_SIZE;
  187 
  188         return (sysctl_kern_geom_confany(req, g_conftxt, &hint));
  189 }
  190  
  191 static int
  192 sysctl_kern_geom_confdot(SYSCTL_HANDLER_ARGS)
  193 {
  194         static size_t hint = PAGE_SIZE;
  195 
  196         return (sysctl_kern_geom_confany(req, g_confdot, &hint));
  197 }
  198 
  199 static int
  200 sysctl_kern_geom_confxml(SYSCTL_HANDLER_ARGS)
  201 {
  202         static size_t hint = PAGE_SIZE;
  203 
  204         return (sysctl_kern_geom_confany(req, g_confxml, &hint));
  205 }
  206 
  207 SYSCTL_NODE(_kern, OID_AUTO, geom, CTLFLAG_RW, 0, "GEOMetry management");
  208 
  209 SYSCTL_PROC(_kern_geom, OID_AUTO, confxml, CTLTYPE_STRING|CTLFLAG_RD,
  210         0, 0, sysctl_kern_geom_confxml, "",
  211         "Dump the GEOM config in XML");
  212 
  213 SYSCTL_PROC(_kern_geom, OID_AUTO, confdot, CTLTYPE_STRING|CTLFLAG_RD,
  214         0, 0, sysctl_kern_geom_confdot, "",
  215         "Dump the GEOM config in dot");
  216 
  217 SYSCTL_PROC(_kern_geom, OID_AUTO, conftxt, CTLTYPE_STRING|CTLFLAG_RD,
  218         0, 0, sysctl_kern_geom_conftxt, "",
  219         "Dump the GEOM config in txt");
  220 
  221 SYSCTL_INT(_kern_geom, OID_AUTO, debugflags, CTLFLAG_RWTUN,
  222         &g_debugflags, 0, "Set various trace levels for GEOM debugging");
  223 
  224 SYSCTL_INT(_kern_geom, OID_AUTO, notaste, CTLFLAG_RW,
  225         &g_notaste, 0, "Prevent GEOM tasting");
  226 
  227 SYSCTL_INT(_kern_geom, OID_AUTO, collectstats, CTLFLAG_RW,
  228         &g_collectstats, 0,
  229         "Control statistics collection on GEOM providers and consumers");
  230 
  231 SYSCTL_INT(_debug_sizeof, OID_AUTO, g_class, CTLFLAG_RD,
  232         SYSCTL_NULL_INT_PTR, sizeof(struct g_class), "sizeof(struct g_class)");
  233 SYSCTL_INT(_debug_sizeof, OID_AUTO, g_geom, CTLFLAG_RD,
  234         SYSCTL_NULL_INT_PTR, sizeof(struct g_geom), "sizeof(struct g_geom)");
  235 SYSCTL_INT(_debug_sizeof, OID_AUTO, g_provider, CTLFLAG_RD,
  236         SYSCTL_NULL_INT_PTR, sizeof(struct g_provider), "sizeof(struct g_provider)");
  237 SYSCTL_INT(_debug_sizeof, OID_AUTO, g_consumer, CTLFLAG_RD,
  238         SYSCTL_NULL_INT_PTR, sizeof(struct g_consumer), "sizeof(struct g_consumer)");
  239 SYSCTL_INT(_debug_sizeof, OID_AUTO, g_bioq, CTLFLAG_RD,
  240         SYSCTL_NULL_INT_PTR, sizeof(struct g_bioq), "sizeof(struct g_bioq)");

Cache object: c3e20dd266fc7cef5e479cef54dbad6b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.