Satoshi Uchida
2007-Jul-30 08:50 UTC
[Xen-devel] [PATCH][1/4][IOMGR] I/O request Manager body
This patch provides a I/O request management framework. This framework can control virtual block device threads at 7 places : * deciding that virtual block devices(threads) is ether going or waiting, * before allocating pending_request variables, * after allocated pending_request variables, * after allocated no pending_request variables (Namely, out of request), * after freed pending_request variables and * starting/stopping virtual block devices(threads). And, iomgr provides the total number of pending requests in blkback and blktap. -------------------------------------------------- Satoshi UCHIDA NEC Corporation, Japan # HG changeset patch # User s-uchida@ap.jp.nec.com # Date 1184302359 -32400 # Node ID aee77a9230c1b19873e60761d080af517bbfb189 # Parent e64625df946b81ac1a5f8be7c5d0ae2aad618d7c [IOMGR] Add I/O request management framework. This is body for I/O request management. Signed-by-off Satoshi UCHIDA <s-uchida@ap.jp.nec.com> diff -r e64625df946b -r aee77a9230c1 drivers/xen/Kconfig --- a/drivers/xen/Kconfig Fri Jun 15 13:33:47 2007 -0600 +++ b/drivers/xen/Kconfig Fri Jul 13 13:45:30 2007 +0900 @@ -65,6 +65,15 @@ config XEN_BLKDEV_TAP high-performance block backends, where disk images may be implemented as files, in memory, or on other hosts across the network. This driver can safely coexist with the existing blockback driver. + +config XEN_IOMGR + tristate "Backend I/O request manager framework" + depends on XEN_BACKEND || XEN_BLKDEV_TAP + default y + help + The Backend I/O request manager framework provides interface + which makes backend driver to control I/O requests by I/O + control modules config XEN_NETDEV_BACKEND tristate "Network-device backend driver" diff -r e64625df946b -r aee77a9230c1 drivers/xen/Makefile --- a/drivers/xen/Makefile Fri Jun 15 13:33:47 2007 -0600 +++ b/drivers/xen/Makefile Fri Jul 13 13:45:30 2007 +0900 @@ -10,6 +10,7 @@ obj-y += util.o obj-y += util.o obj-$(CONFIG_XEN_BLKDEV_BACKEND) += blkback/ obj-$(CONFIG_XEN_BLKDEV_TAP) += blktap/ +obj-$(CONFIG_XEN_IOMGR) += iomgr/ obj-$(CONFIG_XEN_NETDEV_BACKEND) += netback/ obj-$(CONFIG_XEN_TPMDEV_BACKEND) += tpmback/ obj-$(CONFIG_XEN_BLKDEV_FRONTEND) += blkfront/ diff -r e64625df946b -r aee77a9230c1 drivers/xen/iomgr/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/xen/iomgr/Makefile Fri Jul 13 13:52:39 2007 +0900 @@ -0,0 +1,4 @@ +obj-$(CONFIG_XEN_IOMGR) := xeniomgr.o + +xeniomgr-y := iomgr.o + diff -r e64625df946b -r aee77a9230c1 drivers/xen/iomgr/iomgr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drivers/xen/iomgr/iomgr.c Fri Jul 13 13:52:39 2007 +0900 @@ -0,0 +1,188 @@ +/***************************************************************************** + * iomgr.c + * + * Management interface for I/O request. + * + * Copyright(c) 2007, Satoshi UCHIDA, NEC Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation; or, when distributed + * separately from the Linux kernel or incorporated into other + * software packages, subject to the following license: + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this source file (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include <linux/module.h> +#include <linux/stddef.h> +#include <xen/iomgr.h> +#include <asm/atomic.h> + +/* Current manager. */ +struct iomgr *mgr; + +/* + * Default Manager. + * Non Management for I/O request. + */ +static struct iomgr nomgr = { + .ops = { + .iomgr_waiting_request_fn = NULL, + .iomgr_allow_request_fn = NULL, + .iomgr_alloc_request_fn = NULL, + .iomgr_oo_abort_request_fn = NULL, + .iomgr_free_request_fn = NULL, + .iomgr_dev_start_fn = NULL, + .iomgr_dev_stop_fn = NULL, + }, + .iomgr_name = "none", +}; + +/* + * Counter for pending request. + */ +atomic_t pending_req = ATOMIC_INIT(0); + + +/* + * Functions which apply iomgr operations + */ + +/* + * Management for original waiting condition within VBD/TAP thread. + */ +int do_iomgr_waiting_request(struct xenbus_device *dev) +{ + if (mgr->ops.iomgr_waiting_request_fn != NULL) + return mgr->ops.iomgr_waiting_request_fn(dev); + else + return 0; +} + +/* + * Management when new request for VBD/TAP thread is securing. + */ +int do_iomgr_allow_request(struct xenbus_device *dev) +{ + if (mgr->ops.iomgr_allow_request_fn != NULL) + return mgr->ops.iomgr_allow_request_fn(dev); + else + return 0; +} + +/* Management of allocating new request for VBD/TAP thread. */ +int do_iomgr_alloc_request(struct xenbus_device *dev) +{ + atomic_inc(&pending_req); + if (mgr->ops.iomgr_alloc_request_fn != NULL) + return mgr->ops.iomgr_alloc_request_fn(dev); + else + return 0; +} + +/* + * Management when it is failure to allocating new request + * for VBD/TAP thread. + */ +int do_iomgr_oo_abort_request(struct xenbus_device *dev) +{ + if (mgr->ops.iomgr_oo_abort_request_fn != NULL) + return mgr->ops.iomgr_oo_abort_request_fn(dev); + else + return 0; +} + +/* + * Management when request for VBD/TAP thread finishes. + */ +void do_iomgr_free_request(struct xenbus_device *dev) +{ + atomic_dec(&pending_req); + if (mgr->ops.iomgr_free_request_fn != NULL) + mgr->ops.iomgr_free_request_fn(dev); +} + +/* + * Management when new VBD/TAP thread start. + */ +int do_iomgr_dev_start(struct xenbus_device *dev) +{ + if (mgr->ops.iomgr_dev_start_fn != NULL) + return mgr->ops.iomgr_dev_start_fn(dev); + return 0; +} + +/* + * Management when VBD/TAP thread stops. + */ +void do_iomgr_dev_stop(struct xenbus_device *dev) +{ + if (mgr->ops.iomgr_dev_stop_fn != NULL) + mgr->ops.iomgr_dev_stop_fn(dev); +} + + +/* Access to counter for pending requests. */ +atomic_t *num_pending_req(void) +{ + return &pending_req; +} +EXPORT_SYMBOL(num_pending_req); + + +/* + * Registration function for I/O manager. + */ + +/* Registration of I/O Manager.*/ +int xen_iomgr_register(struct iomgr *newmgr) +{ + mgr = newmgr; + + return 0; +} +EXPORT_SYMBOL_GPL(xen_iomgr_register); + +/* + * Unregistration of I/O Manager. + * Change to No operation manager. + */ +void xen_iomgr_unregister(struct iomgr *removemgr) +{ + if (mgr == removemgr) + mgr = &nomgr; +} +EXPORT_SYMBOL_GPL(xen_iomgr_unregister); + + +/* Initializing function */ +static int iomgr_init(void) +{ + mgr = &nomgr; + + return 0; +} + + +module_init(iomgr_init); + +MODULE_AUTHOR("Satoshi UCHIDA"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("Xen IO Manager"); diff -r e64625df946b -r aee77a9230c1 include/xen/iomgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/xen/iomgr.h Fri Jul 13 13:52:39 2007 +0900 @@ -0,0 +1,100 @@ +/***************************************************************************** + * iomgr.h + * + * Management interface for I/O request. + * + * Copyright(c) 2007, Satoshi UCHIDA, NEC Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation; or, when distributed + * separately from the Linux kernel or incorporated into other + * software packages, subject to the following license: + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this source file (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, modify, + * merge, publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef _XEN_IOMER_H +#define _XEN_IOMER_H + +#include <asm/atomic.h> + +#define IOMGR_ALLOW_NG 1 + +struct xenbus_device; + +/* + * Definition of iomgr function. + */ +typedef int (iomgr_waiting_request_fn) (struct xenbus_device *); +typedef int (iomgr_allow_request_fn) (struct xenbus_device *); +typedef int (iomgr_alloc_request_fn) (struct xenbus_device *); +typedef int (iomgr_oo_abort_request_fn) (struct xenbus_device *); +typedef void (iomgr_free_request_fn) (struct xenbus_device *); +typedef int (iomgr_dev_start_fn) (struct xenbus_device *); +typedef void (iomgr_dev_stop_fn) (struct xenbus_device *); + + +/* iomgr operations */ +struct iomgr_ops +{ + iomgr_waiting_request_fn *iomgr_waiting_request_fn; + iomgr_allow_request_fn *iomgr_allow_request_fn; + iomgr_alloc_request_fn *iomgr_alloc_request_fn; + iomgr_oo_abort_request_fn *iomgr_oo_abort_request_fn; + iomgr_free_request_fn *iomgr_free_request_fn; + iomgr_dev_start_fn *iomgr_dev_start_fn; + iomgr_dev_stop_fn *iomgr_dev_stop_fn; +}; + +#define IOMGR_NAME_MAX (16) + + +/* iomgr scheduler structure */ +struct iomgr +{ + struct iomgr_ops ops; + char iomgr_name[IOMGR_NAME_MAX]; +}; + + +/* + * functions which apply iomgr operations + */ +int do_iomgr_waiting_request(struct xenbus_device *dev); +int do_iomgr_allow_request(struct xenbus_device *dev); +int do_iomgr_alloc_request(struct xenbus_device *dev); +int do_iomgr_oo_abort_request(struct xenbus_device *dev); +void do_iomgr_free_request(struct xenbus_device *dev); +int do_iomgr_dev_start(struct xenbus_device *dev); +void do_iomgr_dev_stop(struct xenbus_device *dev); + +/* + * pending rezuest counter + */ +atomic_t *num_pending_req(void); + + +/* + * Xen I/O scheduler registration + */ +extern int xen_iomgr_register(struct iomgr *); +extern void xen_iomgr_unregister(struct iomgr *); + +#endif _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel