svn commit: r186951 - user/luigi/geom_sched/sys/geom
Luigi Rizzo
luigi at FreeBSD.org
Fri Jan 9 06:35:33 PST 2009
Author: luigi
Date: Fri Jan 9 14:35:32 2009
New Revision: 186951
URL: http://svn.freebsd.org/changeset/base/186951
Log:
add missing file
Added:
user/luigi/geom_sched/sys/geom/geom_sched.h
Added: user/luigi/geom_sched/sys/geom/geom_sched.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/luigi/geom_sched/sys/geom/geom_sched.h Fri Jan 9 14:35:32 2009 (r186951)
@@ -0,0 +1,196 @@
+/*-
+ * Copyright (c) 2008 Fabio Checconi
+ * 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 AUTHOR 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 AUTHOR 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.
+ */
+
+#ifndef _GEOM_GEOM_SCHED_H_
+#define _GEOM_GEOM_SCHED_H_
+
+#ifdef _KERNEL
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/queue.h>
+#include <geom/geom_disk.h>
+
+extern u_int g_sched_debug;
+
+#define G_SCHED_DEBUG(lvl, ...) do { \
+ if (g_sched_debug >= (lvl)) { \
+ printf("GEOM_SCHED"); \
+ if (g_sched_debug > 0) \
+ printf("[%u]", (lvl)); \
+ printf(": "); \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+ } \
+} while (0)
+
+/*
+ * Types for the callbacks defined by each I/O scheduler.
+ *
+ * When a scheduler is assigned to a disk its gs_init method is called.
+ * It takes the target disk as input and returns the private data the
+ * scheduler will use for it. It can fail and return NULL, thus making
+ * the scheduler switch fail. It is not called under disk d_sched_lock
+ * nor under g_sched_mtx.
+ */
+typedef void *gs_init_t (struct disk *dp);
+
+/*
+ * Disk shutdown method, called when the scheduler is detached from a
+ * disk. It is not synchronized WRT other scheduler methods, but it is
+ * guaranteed to be executed when no more requests will reach the
+ * scheduler.
+ */
+typedef void gs_fini_t (void *data);
+
+/*
+ * Insert a new request into the scheduler. This method is called only
+ * for requests that can be reordered by the scheduler, and is supposed
+ * to queue the request. It is called under the disk d_sched_lock mutex.
+ */
+typedef void gs_start_t (void *data, struct bio *bp);
+
+/*
+ * Get the next request from the scheduler. This method is called with
+ * the disk d_sched_lock mutex held, from the drivers code. When force
+ * is not zero it is assumed to not return NULL unless the scheduler has
+ * no more queued requests.
+ */
+typedef struct bio *gs_next_t (void *data, int force);
+
+/*
+ * Completion callback for a previously issued request. It gets called
+ * under the disk d_sched_lock mutex. It has no specific task, as
+ * request completion is handled by the generic code, but can be used
+ * by the scheduler to implement anticipation mechanisms. A nonzero
+ * return value means that dispatching has to be restarted.
+ */
+typedef int gs_done_t (void *data, struct bio *bp);
+
+/*
+ * I/O scheduler descriptor. Each scheduler has to register itself
+ * providing a struct g_sched object. (Must not be const, as the
+ * framework needs to modify gs_refs and gs_list.)
+ */
+struct g_sched {
+ const char *gs_name;
+
+ int gs_refs;
+
+ gs_init_t *gs_init;
+ gs_fini_t *gs_fini;
+ gs_start_t *gs_start;
+ gs_next_t *gs_next;
+ gs_done_t *gs_done;
+
+ LIST_ENTRY(g_sched) gs_list;
+};
+
+/*
+ * Lookup the identity of the issuer of the original request.
+ * In the current implementation we use the curthread of the
+ * issuer, but different mechanisms may be implemented later
+ * so we do not make assumptions on the return value which for
+ * us is just an opaque identifier.
+ * For the time being we make this inline.
+ */
+static inline
+u_long g_sched_classify(struct bio *bp)
+{
+
+ if (bp == NULL) {
+ printf("g_sched_classify: NULL bio\n");
+ return (0); /* as good as anything */
+ }
+ while (bp->bio_parent != NULL)
+ bp = bp->bio_parent;
+ return ((u_long)(bp->bio_caller1));
+}
+
+/*
+ * Initialize/cleanup the I/O scheduling subsystem. Interface towards
+ * geom_disk.c, for class init/fini methods.
+ */
+void g_sched_init(void);
+void g_sched_fini(void);
+
+/*
+ * Initialize/cleanup the I/O scheduling fields of the given disk. Interface
+ * towards geom_disk.c, used to signal to the scheduler subsystem the main
+ * events of the disk lifecycle.
+ */
+void g_sched_disk_init(struct disk *dp);
+void g_sched_disk_fini(struct disk *dp);
+void g_sched_disk_gone(struct disk *dp);
+
+/*
+ * Try to enqueue a bio into the scheduler of the given disk. If the
+ * request can be reordered (we reorder only READ and WRITE requests),
+ * the bio is passed to the scheduler, otherwise it is passed directly
+ * to the driver using its d_strategy.
+ */
+void g_sched_start(struct disk *dp, struct bio *bp);
+
+/*
+ * Pick the next request from the scheduler of the given disk. This
+ * function has to be called from the drivers when they want to refill
+ * their internal queue (if any) or if they need a new request.
+ * If force == 0 the scheduler is allowed to return NULL even if it
+ * has requests enqueued, to allow non work-conserving schedulers to
+ * be implemented (the kick mechanism will restart the I/O on the
+ * device).
+ */
+struct bio *g_sched_next(struct disk *dp);
+
+/*
+ * Notify to the scheduler the completion of a request.
+ */
+void g_sched_done(struct bio *bp);
+
+/*
+ * Try to configure dp to use the scheduler identified by name. Used
+ * by the disk class to handle reconfigurations. It may sleep waiting
+ * for pending requests to complete.
+ */
+int g_sched_configure(struct disk *dp, const char *name);
+
+/*
+ * Register a scheduling module. Used by the schedulers to register
+ * themselves to the system.
+ */
+int g_sched_modevent(module_t mod, int cmd, void *arg);
+
+#define DECLARE_GSCHED_MODULE(name, gsched) \
+ static moduledata_t name##_mod = { \
+ #name, \
+ g_sched_modevent, \
+ gsched, \
+ }; \
+ DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); \
+ MODULE_DEPEND(name, g_disk, 0, 0, 0);
+
+#endif /* _KERNEL */
+#endif /* _GEOM_GEOM_SCHED_H_ */
More information about the svn-src-user
mailing list