freebsd-dev/sbin/geom/class/sched/geom_sched.c
Luigi Rizzo 1831a90ac5 Bring in geom_sched, support for scheduling disk I/O requests
in a device independent manner. Also include an example anticipatory
scheduler, gsched_rr, which gives very nice performance improvements
in presence of competing random access patterns.

This is joint work with Fabio Checconi, developed last year
and presented at BSDCan 2009. You can find details in the
README file or at

http://info.iet.unipi.it/~luigi/geom_sched/
2010-04-12 16:37:45 +00:00

124 lines
3.4 KiB
C

/*-
* Copyright (c) 2009 Fabio Checconi, Luigi Rizzo
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* $Id$
* $FreeBSD$
*
* This file implements the userspace library used by the 'geom'
* command to load and manipulate disk schedulers.
*/
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/linker.h>
#include <sys/module.h>
#include <stdio.h>
#include <stdint.h>
#include <libgeom.h>
#include "core/geom.h"
#include "misc/subr.h"
#define G_SCHED_VERSION 0
uint32_t lib_version = G_LIB_VERSION;
uint32_t version = G_SCHED_VERSION;
/*
* storage for parameters used by this geom class.
* Right now only the scheduler name is used.
*/
static char algo[] = "rr"; /* default scheduler */
/*
* Adapt to differences in geom library.
* in V1 struct g_command misses gc_argname, eld, and G_BOOL is undefined
*/
#if G_LIB_VERSION == 1
#define G_ARGNAME
#define G_TYPE_BOOL G_TYPE_NUMBER
#else
#define G_ARGNAME NULL,
#endif
static void
gcmd_createinsert(struct gctl_req *req, unsigned flags __unused)
{
const char *reqalgo;
char name[64];
if (gctl_has_param(req, "algo"))
reqalgo = gctl_get_ascii(req, "algo");
else
reqalgo = algo;
snprintf(name, sizeof(name), "gsched_%s", reqalgo);
/*
* Do not complain about errors here, gctl_issue()
* will fail anyway.
*/
if (modfind(name) < 0)
kldload(name);
gctl_issue(req);
}
struct g_command class_commands[] = {
{ "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, gcmd_createinsert,
{
{ 'a', "algo", algo, G_TYPE_STRING },
G_OPT_SENTINEL
},
G_ARGNAME "[-v] [-a algorithm_name] dev ..."
},
{ "insert", G_FLAG_VERBOSE | G_FLAG_LOADKLD, gcmd_createinsert,
{
{ 'a', "algo", algo, G_TYPE_STRING },
G_OPT_SENTINEL
},
G_ARGNAME "[-v] [-a algorithm_name] dev ..."
},
{ "configure", G_FLAG_VERBOSE, NULL,
{
{ 'a', "algo", algo, G_TYPE_STRING },
G_OPT_SENTINEL
},
G_ARGNAME "[-v] [-a algorithm_name] prov ..."
},
{ "destroy", G_FLAG_VERBOSE, NULL,
{
{ 'f', "force", NULL, G_TYPE_BOOL },
G_OPT_SENTINEL
},
G_ARGNAME "[-fv] prov ..."
},
{ "reset", G_FLAG_VERBOSE, NULL, G_NULL_OPTS,
G_ARGNAME "[-v] prov ..."
},
G_CMD_SENTINEL
};