[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Remove control interface in kernels and domain builder.
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID 549f4256ab3ceddc0abfba4f52de4a92bf74f766 # Parent 32cc65db459ad6f4c43d58a27e5b2d05f15fbcee Remove control interface in kernels and domain builder. Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/arch/xen/kernel/Makefile --- a/linux-2.6-xen-sparse/arch/xen/kernel/Makefile Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/Makefile Wed Sep 7 17:43:56 2005 @@ -11,7 +11,7 @@ extra-y += vmlinux.lds -obj-y := ctrl_if.o evtchn.o fixup.o reboot.o gnttab.o devmem.o +obj-y := evtchn.o fixup.o reboot.o gnttab.o devmem.o obj-$(CONFIG_PROC_FS) += xen_proc.o obj-$(CONFIG_NET) += skbuff.o diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c Wed Sep 7 17:43:56 2005 @@ -40,7 +40,6 @@ #include <asm-xen/synch_bitops.h> #include <asm-xen/xen-public/event_channel.h> #include <asm-xen/xen-public/physdev.h> -#include <asm-xen/ctrl_if.h> #include <asm-xen/hypervisor.h> #include <asm-xen/evtchn.h> @@ -732,7 +731,4 @@ irq_desc[pirq_to_irq(i)].depth = 1; irq_desc[pirq_to_irq(i)].handler = &pirq_type; } - - /* This needs to be done early, but after the IRQ subsystem is alive. */ - ctrl_if_init(); -} +} diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/arch/xen/kernel/reboot.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Wed Sep 7 17:43:56 2005 @@ -14,7 +14,6 @@ #include <asm-xen/xen-public/dom0_ops.h> #include <asm-xen/queues.h> #include <asm-xen/xenbus.h> -#include <asm-xen/ctrl_if.h> #include <linux/cpu.h> #include <linux/kthread.h> @@ -168,8 +167,6 @@ xencons_suspend(); - ctrl_if_suspend(); - irq_suspend(); gnttab_suspend(); @@ -214,8 +211,6 @@ irq_resume(); - ctrl_if_resume(); - xencons_resume(); xenbus_resume(); diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h --- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.h Wed Sep 7 17:43:56 2005 @@ -15,7 +15,6 @@ #include <linux/config.h> #include <linux/sched.h> #include <linux/interrupt.h> -#include <asm-xen/ctrl_if.h> #include <linux/slab.h> #include <linux/blkdev.h> #include <asm/io.h> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/netback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Wed Sep 7 17:43:56 2005 @@ -14,7 +14,6 @@ #include <linux/in.h> #include <linux/netdevice.h> #include <linux/etherdevice.h> -#include <asm-xen/ctrl_if.h> #include <asm-xen/evtchn.h> #include <asm-xen/xen-public/io/netif.h> #include <asm/io.h> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c --- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Wed Sep 7 17:43:56 2005 @@ -80,13 +80,6 @@ } break; - case IOCTL_PRIVCMD_INITDOMAIN_EVTCHN: - { - extern int initdom_ctrlif_domcontroller_port; - ret = initdom_ctrlif_domcontroller_port; - } - break; - #if defined(CONFIG_XEN_PRIVILEGED_GUEST) case IOCTL_PRIVCMD_MMAP: { diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/tpmback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h Wed Sep 7 17:43:56 2005 @@ -10,7 +10,6 @@ #include <linux/module.h> #include <linux/interrupt.h> #include <linux/slab.h> -#include <asm-xen/ctrl_if.h> #include <asm-xen/evtchn.h> #include <asm-xen/xen-public/io/tpmif.h> #include <asm/io.h> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c Wed Sep 7 17:43:56 2005 @@ -43,7 +43,6 @@ #include <asm/semaphore.h> #include <asm/io.h> #include <asm-xen/evtchn.h> -#include <asm-xen/ctrl_if.h> #include <asm-xen/xen-public/io/tpmif.h> #include <asm/uaccess.h> #include <asm-xen/xenbus.h> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/usbback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/usbback/common.h Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/usbback/common.h Wed Sep 7 17:43:56 2005 @@ -12,7 +12,6 @@ #include <asm/io.h> #include <asm/setup.h> #include <asm/pgalloc.h> -#include <asm-xen/ctrl_if.h> #include <asm-xen/hypervisor.h> #include <asm-xen/xen-public/io/usbif.h> diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/drivers/xen/usbfront/usbfront.c --- a/linux-2.6-xen-sparse/drivers/xen/usbfront/usbfront.c Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/usbfront/usbfront.c Wed Sep 7 17:43:56 2005 @@ -70,7 +70,6 @@ #include "../../../../../drivers/usb/hcd.h" #include <asm-xen/xen-public/io/usbif.h> -#include <asm/ctrl_if.h> #include <asm/xen-public/io/domain_controller.h> /* diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h --- a/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Wed Sep 7 17:26:27 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/linux-public/privcmd.h Wed Sep 7 17:43:56 2005 @@ -70,14 +70,6 @@ #define IOCTL_PRIVCMD_HYPERCALL \ _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t)) -/* - * @cmd: IOCTL_PRIVCMD_INITDOMAIN_EVTCHN - * @arg: n/a - * Return: Port associated with domain-controller end of control event channel - * for the initial domain. - */ -#define IOCTL_PRIVCMD_INITDOMAIN_EVTCHN \ - _IOC(_IOC_NONE, 'P', 1, 0) #define IOCTL_PRIVCMD_MMAP \ _IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t)) #define IOCTL_PRIVCMD_MMAPBATCH \ diff -r 32cc65db459a -r 549f4256ab3c tools/libxc/xc_linux_build.c --- a/tools/libxc/xc_linux_build.c Wed Sep 7 17:26:27 2005 +++ b/tools/libxc/xc_linux_build.c Wed Sep 7 17:43:56 2005 @@ -275,7 +275,6 @@ unsigned long *pvss, vcpu_guest_context_t *ctxt, const char *cmdline, unsigned long shared_info_frame, - unsigned int control_evtchn, unsigned long flags, unsigned int vcpus, unsigned int store_evtchn, unsigned long *store_mfn) @@ -333,7 +332,6 @@ unsigned long *pvss, vcpu_guest_context_t *ctxt, const char *cmdline, unsigned long shared_info_frame, - unsigned int control_evtchn, unsigned long flags, unsigned int vcpus, unsigned int store_evtchn, unsigned long *store_mfn, @@ -587,7 +585,6 @@ start_info->pt_base = vpt_start; start_info->nr_pt_frames = nr_pt_pages; start_info->mfn_list = vphysmap_start; - start_info->domain_controller_evtchn = control_evtchn; start_info->store_mfn = *store_mfn; start_info->store_evtchn = store_evtchn; start_info->console_mfn = *console_mfn; @@ -639,7 +636,6 @@ const char *image_name, const char *ramdisk_name, const char *cmdline, - unsigned int control_evtchn, unsigned long flags, unsigned int vcpus, unsigned int store_evtchn, @@ -720,7 +716,7 @@ &vstartinfo_start, &vkern_entry, &vstack_start, ctxt, cmdline, op.u.getdomaininfo.shared_info_frame, - control_evtchn, flags, vcpus, + flags, vcpus, store_evtchn, store_mfn, console_evtchn, console_mfn) < 0 ) { @@ -742,7 +738,6 @@ ctxt->regs.ar_fpsr = FPSR_DEFAULT; /* ctxt->regs.r28 = dom_fw_setup(); currently done by hypervisor, should move here */ ctxt->vcpu.privregs = 0; - ctxt->shared.domain_controller_evtchn = control_evtchn; ctxt->shared.flags = flags; i = 0; /* silence unused variable warning */ #else /* x86 */ diff -r 32cc65db459a -r 549f4256ab3c tools/libxc/xenguest.h --- a/tools/libxc/xenguest.h Wed Sep 7 17:26:27 2005 +++ b/tools/libxc/xenguest.h Wed Sep 7 17:43:56 2005 @@ -45,7 +45,6 @@ const char *image_name, const char *ramdisk_name, const char *cmdline, - unsigned int control_evtchn, unsigned long flags, unsigned int vcpus, unsigned int store_evtchn, diff -r 32cc65db459a -r 549f4256ab3c tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Wed Sep 7 17:26:27 2005 +++ b/tools/python/xen/lowlevel/xc/xc.c Wed Sep 7 17:43:56 2005 @@ -268,18 +268,18 @@ u32 dom; char *image, *ramdisk = NULL, *cmdline = ""; int flags = 0, vcpus = 1; - int control_evtchn, store_evtchn, console_evtchn; + int store_evtchn, console_evtchn; unsigned long store_mfn = 0; unsigned long console_mfn = 0; - static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn", + static char *kwd_list[] = { "dom", "store_evtchn", "console_evtchn", "image", /* optional */ "ramdisk", "cmdline", "flags", "vcpus", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiis|ssii", kwd_list, - &dom, &control_evtchn, &store_evtchn, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiis|ssii", kwd_list, + &dom, &store_evtchn, &console_evtchn, &image, /* optional */ &ramdisk, &cmdline, &flags, @@ -287,7 +287,7 @@ return NULL; if ( xc_linux_build(xc->xc_handle, dom, image, - ramdisk, cmdline, control_evtchn, flags, vcpus, + ramdisk, cmdline, flags, vcpus, store_evtchn, &store_mfn, console_evtchn, &console_mfn) != 0 ) return PyErr_SetFromErrno(xc_error); diff -r 32cc65db459a -r 549f4256ab3c tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Wed Sep 7 17:26:27 2005 +++ b/tools/python/xen/xend/image.py Wed Sep 7 17:43:56 2005 @@ -249,7 +249,6 @@ log.debug("dom = %d", self.vm.getDomain()) log.debug("image = %s", self.kernel) - log.debug("control_evtchn = %s", self.vm.channel.getRemotePort()) log.debug("store_evtchn = %d", store_evtchn) log.debug("console_evtchn = %d", console_evtchn) log.debug("cmdline = %s", self.cmdline) @@ -259,7 +258,6 @@ ret = xc.linux_build(dom = self.vm.getDomain(), image = self.kernel, - control_evtchn = self.vm.channel.getRemotePort(), store_evtchn = store_evtchn, console_evtchn = console_evtchn, cmdline = self.cmdline, diff -r 32cc65db459a -r 549f4256ab3c tools/xcs/ctrl_interface.c --- a/tools/xcs/ctrl_interface.c Wed Sep 7 17:26:27 2005 +++ b/tools/xcs/ctrl_interface.c Wed Sep 7 17:43:56 2005 @@ -214,18 +214,7 @@ if ( dom == 0 ) { - /* - * The control-interface event channel for DOM0 is already set up. - * We use an ioctl to discover the port at our end of the channel. - */ - local_port = ioctl(xc_handle, IOCTL_PRIVCMD_INITDOMAIN_EVTCHN, - NULL); - remote_port = -1; /* We don't need the remote end of the DOM0 link. */ - if ( local_port < 0 ) - { - DPRINTF("Could not open channel to DOM0"); - goto fail; - } + goto fail; } else if ( xc_evtchn_bind_interdomain(xc_handle, DOMID_SELF, dom, diff -r 32cc65db459a -r 549f4256ab3c xen/include/public/xen.h --- a/xen/include/public/xen.h Wed Sep 7 17:26:27 2005 +++ b/xen/include/public/xen.h Wed Sep 7 17:43:56 2005 @@ -435,7 +435,10 @@ unsigned long nr_pages; /* Total pages allocated to this domain. */ unsigned long shared_info; /* MACHINE address of shared info struct. */ u32 flags; /* SIF_xxx flags. */ - u16 domain_controller_evtchn; + unsigned long store_mfn; /* MACHINE page number of shared page. */ + u16 store_evtchn; /* Event channel for store communication. */ + unsigned long console_mfn; /* MACHINE address of console page. */ + u16 console_evtchn; /* Event channel for console messages. */ /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ unsigned long pt_base; /* VIRTUAL address of page directory. */ unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */ @@ -443,10 +446,6 @@ unsigned long mod_start; /* VIRTUAL address of pre-loaded module. */ unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ s8 cmd_line[MAX_GUEST_CMDLINE]; - unsigned long store_mfn; /* MACHINE page number of shared page. */ - u16 store_evtchn; /* Event channel for store communication. */ - unsigned long console_mfn; /* MACHINE address of console page. */ - u16 console_evtchn; /* Event channel for console messages. */ } start_info_t; /* These flags are passed in the 'flags' field of start_info_t. */ diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/arch/xen/kernel/ctrl_if.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/ctrl_if.c Wed Sep 7 17:26:27 2005 +++ /dev/null Wed Sep 7 17:43:56 2005 @@ -1,569 +0,0 @@ -/****************************************************************************** - * ctrl_if.c - * - * Management functions for special interface to the domain controller. - * - * Copyright (c) 2004, K A Fraser - * - * This file may be 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/config.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/string.h> -#include <linux/errno.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/module.h> -#include <asm-xen/ctrl_if.h> -#include <asm-xen/evtchn.h> - -#if 0 -#define DPRINTK(_f, _a...) printk(KERN_ALERT "(file=%s, line=%d) " _f, \ - __FILE__ , __LINE__ , ## _a ) -#else -#define DPRINTK(_f, _a...) ((void)0) -#endif - -/* - * Extra ring macros to sync a consumer index up to the public producer index. - * Generally UNSAFE, but we use it for recovery and shutdown in some cases. - */ -#define RING_DROP_PENDING_REQUESTS(_r) \ - do { \ - (_r)->req_cons = (_r)->sring->req_prod; \ - } while (0) -#define RING_DROP_PENDING_RESPONSES(_r) \ - do { \ - (_r)->rsp_cons = (_r)->sring->rsp_prod; \ - } while (0) - -/* - * Only used by initial domain which must create its own control-interface - * event channel. This value is picked up by the user-space domain controller - * via an ioctl. - */ -int initdom_ctrlif_domcontroller_port = -1; - -static int ctrl_if_evtchn; -static int ctrl_if_irq; -static spinlock_t ctrl_if_lock; - -static struct irqaction ctrl_if_irq_action; - -static ctrl_front_ring_t ctrl_if_tx_ring; -static ctrl_back_ring_t ctrl_if_rx_ring; - -/* Incoming message requests. */ - /* Primary message type -> message handler. */ -static ctrl_msg_handler_t ctrl_if_rxmsg_handler[256]; - /* Primary message type -> callback in process context? */ -static unsigned long ctrl_if_rxmsg_blocking_context[256/sizeof(unsigned long)]; - /* Is it late enough during bootstrap to use schedule_task()? */ -static int safe_to_schedule_task; - /* Queue up messages to be handled in process context. */ -static ctrl_msg_t ctrl_if_rxmsg_deferred[CONTROL_RING_SIZE]; -static CONTROL_RING_IDX ctrl_if_rxmsg_deferred_prod; -static CONTROL_RING_IDX ctrl_if_rxmsg_deferred_cons; - -/* Incoming message responses: message identifier -> message handler/id. */ -static struct { - ctrl_msg_handler_t fn; - unsigned long id; -} ctrl_if_txmsg_id_mapping[CONTROL_RING_SIZE]; - -/* For received messages that must be deferred to process context. */ -static void __ctrl_if_rxmsg_deferred(void *unused); -static DECLARE_WORK(ctrl_if_rxmsg_deferred_work, - __ctrl_if_rxmsg_deferred, - NULL); - -/* Deferred callbacks for people waiting for space in the transmit ring. */ -static DECLARE_TASK_QUEUE(ctrl_if_tx_tq); - -static DECLARE_WAIT_QUEUE_HEAD(ctrl_if_tx_wait); -static void __ctrl_if_tx_tasklet(unsigned long data); -static DECLARE_TASKLET(ctrl_if_tx_tasklet, __ctrl_if_tx_tasklet, 0); - -static void __ctrl_if_rx_tasklet(unsigned long data); -static DECLARE_TASKLET(ctrl_if_rx_tasklet, __ctrl_if_rx_tasklet, 0); - -#define get_ctrl_if() ((control_if_t *)((char *)HYPERVISOR_shared_info + 2048)) - -static void ctrl_if_notify_controller(void) -{ - notify_via_evtchn(ctrl_if_evtchn); -} - -static void ctrl_if_rxmsg_default_handler(ctrl_msg_t *msg, unsigned long id) -{ - msg->length = 0; - ctrl_if_send_response(msg); -} - -static void __ctrl_if_tx_tasklet(unsigned long data) -{ - ctrl_msg_t *msg; - int was_full = RING_FULL(&ctrl_if_tx_ring); - RING_IDX i, rp; - - i = ctrl_if_tx_ring.rsp_cons; - rp = ctrl_if_tx_ring.sring->rsp_prod; - rmb(); /* Ensure we see all requests up to 'rp'. */ - - for ( ; i != rp; i++ ) - { - msg = RING_GET_RESPONSE(&ctrl_if_tx_ring, i); - - DPRINTK("Rx-Rsp %u/%u :: %d/%d\n", i-1, - ctrl_if_tx_ring.sring->rsp_prod, - msg->type, msg->subtype); - - /* Execute the callback handler, if one was specified. */ - if ( msg->id != 0xFF ) - { - (*ctrl_if_txmsg_id_mapping[msg->id].fn)( - msg, ctrl_if_txmsg_id_mapping[msg->id].id); - smp_mb(); /* Execute, /then/ free. */ - ctrl_if_txmsg_id_mapping[msg->id].fn = NULL; - } - } - - /* - * Step over messages in the ring /after/ finishing reading them. As soon - * as the index is updated then the message may get blown away. - */ - smp_mb(); - ctrl_if_tx_ring.rsp_cons = i; - - if ( was_full && !RING_FULL(&ctrl_if_tx_ring) ) - { - wake_up(&ctrl_if_tx_wait); - run_task_queue(&ctrl_if_tx_tq); - } -} - -static void __ctrl_if_rxmsg_deferred(void *unused) -{ - ctrl_msg_t *msg; - CONTROL_RING_IDX dp; - - dp = ctrl_if_rxmsg_deferred_prod; - rmb(); /* Ensure we see all deferred requests up to 'dp'. */ - - while ( ctrl_if_rxmsg_deferred_cons != dp ) - { - msg = &ctrl_if_rxmsg_deferred[MASK_CONTROL_IDX( - ctrl_if_rxmsg_deferred_cons++)]; - (*ctrl_if_rxmsg_handler[msg->type])(msg, 0); - } -} - -static void __ctrl_if_rx_tasklet(unsigned long data) -{ - ctrl_msg_t msg, *pmsg; - CONTROL_RING_IDX dp; - RING_IDX rp, i; - - i = ctrl_if_rx_ring.req_cons; - rp = ctrl_if_rx_ring.sring->req_prod; - dp = ctrl_if_rxmsg_deferred_prod; - rmb(); /* Ensure we see all requests up to 'rp'. */ - - for ( ; i != rp; i++) - { - pmsg = RING_GET_REQUEST(&ctrl_if_rx_ring, i); - memcpy(&msg, pmsg, offsetof(ctrl_msg_t, msg)); - - DPRINTK("Rx-Req %u/%u :: %d/%d\n", i-1, - ctrl_if_rx_ring.sring->req_prod, - msg.type, msg.subtype); - - if ( msg.length > sizeof(msg.msg) ) - msg.length = sizeof(msg.msg); - - if ( msg.length != 0 ) - memcpy(msg.msg, pmsg->msg, msg.length); - - if ( test_bit(msg.type, - (unsigned long *)&ctrl_if_rxmsg_blocking_context) ) - memcpy(&ctrl_if_rxmsg_deferred[MASK_CONTROL_IDX(dp++)], - &msg, offsetof(ctrl_msg_t, msg) + msg.length); - else - (*ctrl_if_rxmsg_handler[msg.type])(&msg, 0); - } - - ctrl_if_rx_ring.req_cons = i; - - if ( dp != ctrl_if_rxmsg_deferred_prod ) - { - wmb(); - ctrl_if_rxmsg_deferred_prod = dp; - schedule_work(&ctrl_if_rxmsg_deferred_work); - } -} - -static irqreturn_t ctrl_if_interrupt(int irq, void *dev_id, - struct pt_regs *regs) -{ - if ( RING_HAS_UNCONSUMED_RESPONSES(&ctrl_if_tx_ring) ) - tasklet_schedule(&ctrl_if_tx_tasklet); - - if ( RING_HAS_UNCONSUMED_REQUESTS(&ctrl_if_rx_ring) ) - tasklet_schedule(&ctrl_if_rx_tasklet); - - return IRQ_HANDLED; -} - -int -ctrl_if_send_message_noblock( - ctrl_msg_t *msg, - ctrl_msg_handler_t hnd, - unsigned long id) -{ - unsigned long flags; - ctrl_msg_t *dmsg; - int i; - - spin_lock_irqsave(&ctrl_if_lock, flags); - - if ( RING_FULL(&ctrl_if_tx_ring) ) - { - spin_unlock_irqrestore(&ctrl_if_lock, flags); - return -EAGAIN; - } - - msg->id = 0xFF; - if ( hnd != NULL ) - { - for ( i = 0; ctrl_if_txmsg_id_mapping[i].fn != NULL; i++ ) - continue; - ctrl_if_txmsg_id_mapping[i].fn = hnd; - ctrl_if_txmsg_id_mapping[i].id = id; - msg->id = i; - } - - DPRINTK("Tx-Req %u/%u :: %d/%d\n", - ctrl_if_tx_ring.req_prod_pvt, - ctrl_if_tx_ring.rsp_cons, - msg->type, msg->subtype); - - dmsg = RING_GET_REQUEST(&ctrl_if_tx_ring, - ctrl_if_tx_ring.req_prod_pvt); - memcpy(dmsg, msg, sizeof(*msg)); - ctrl_if_tx_ring.req_prod_pvt++; - RING_PUSH_REQUESTS(&ctrl_if_tx_ring); - - spin_unlock_irqrestore(&ctrl_if_lock, flags); - - ctrl_if_notify_controller(); - - return 0; -} - -int -ctrl_if_send_message_block( - ctrl_msg_t *msg, - ctrl_msg_handler_t hnd, - unsigned long id, - long wait_state) -{ - DECLARE_WAITQUEUE(wait, current); - int rc; - - /* Fast path. */ - if ( (rc = ctrl_if_send_message_noblock(msg, hnd, id)) != -EAGAIN ) - return rc; - - add_wait_queue(&ctrl_if_tx_wait, &wait); - - for ( ; ; ) - { - set_current_state(wait_state); - - if ( (rc = ctrl_if_send_message_noblock(msg, hnd, id)) != -EAGAIN ) - break; - - rc = -ERESTARTSYS; - if ( signal_pending(current) && (wait_state == TASK_INTERRUPTIBLE) ) - break; - - schedule(); - } - - set_current_state(TASK_RUNNING); - remove_wait_queue(&ctrl_if_tx_wait, &wait); - - return rc; -} - -/* Allow a reponse-callback handler to find context of a blocked requester. */ -struct rsp_wait { - ctrl_msg_t *msg; /* Buffer for the response message. */ - struct task_struct *task; /* The task that is blocked on the response. */ - int done; /* Indicate to 'task' that response is rcv'ed. */ -}; - -static void __ctrl_if_get_response(ctrl_msg_t *msg, unsigned long id) -{ - struct rsp_wait *wait = (struct rsp_wait *)id; - struct task_struct *task = wait->task; - - memcpy(wait->msg, msg, sizeof(*msg)); - wmb(); - wait->done = 1; - - wake_up_process(task); -} - -int -ctrl_if_send_message_and_get_response( - ctrl_msg_t *msg, - ctrl_msg_t *rmsg, - long wait_state) -{ - struct rsp_wait wait; - int rc; - - wait.msg = rmsg; - wait.done = 0; - wait.task = current; - - if ( (rc = ctrl_if_send_message_block(msg, __ctrl_if_get_response, - (unsigned long)&wait, - wait_state)) != 0 ) - return rc; - - for ( ; ; ) - { - /* NB. Can't easily support TASK_INTERRUPTIBLE here. */ - set_current_state(TASK_UNINTERRUPTIBLE); - if ( wait.done ) - break; - schedule(); - } - - set_current_state(TASK_RUNNING); - return 0; -} - -int -ctrl_if_enqueue_space_callback( - struct tq_struct *task) -{ - /* Fast path. */ - if ( !RING_FULL(&ctrl_if_tx_ring) ) - return 0; - - (void)queue_task(task, &ctrl_if_tx_tq); - - /* - * We may race execution of the task queue, so return re-checked status. If - * the task is not executed despite the ring being non-full then we will - * certainly return 'not full'. - */ - smp_mb(); - return RING_FULL(&ctrl_if_tx_ring); -} - -void -ctrl_if_send_response( - ctrl_msg_t *msg) -{ - unsigned long flags; - ctrl_msg_t *dmsg; - - /* - * NB. The response may the original request message, modified in-place. - * In this situation we may have src==dst, so no copying is required. - */ - spin_lock_irqsave(&ctrl_if_lock, flags); - - DPRINTK("Tx-Rsp %u :: %d/%d\n", - ctrl_if_rx_ring.rsp_prod_pvt, - msg->type, msg->subtype); - - dmsg = RING_GET_RESPONSE(&ctrl_if_rx_ring, - ctrl_if_rx_ring.rsp_prod_pvt); - if ( dmsg != msg ) - memcpy(dmsg, msg, sizeof(*msg)); - - ctrl_if_rx_ring.rsp_prod_pvt++; - RING_PUSH_RESPONSES(&ctrl_if_rx_ring); - - spin_unlock_irqrestore(&ctrl_if_lock, flags); - - ctrl_if_notify_controller(); -} - -int -ctrl_if_register_receiver( - u8 type, - ctrl_msg_handler_t hnd, - unsigned int flags) -{ - unsigned long _flags; - int inuse; - - spin_lock_irqsave(&ctrl_if_lock, _flags); - - inuse = (ctrl_if_rxmsg_handler[type] != ctrl_if_rxmsg_default_handler); - - if ( inuse ) - { - printk(KERN_INFO "Receiver %p already established for control " - "messages of type %d.\n", ctrl_if_rxmsg_handler[type], type); - } - else - { - ctrl_if_rxmsg_handler[type] = hnd; - clear_bit(type, (unsigned long *)&ctrl_if_rxmsg_blocking_context); - if ( flags == CALLBACK_IN_BLOCKING_CONTEXT ) - { - set_bit(type, (unsigned long *)&ctrl_if_rxmsg_blocking_context); - if ( !safe_to_schedule_task ) - BUG(); - } - } - - spin_unlock_irqrestore(&ctrl_if_lock, _flags); - - return !inuse; -} - -void -ctrl_if_unregister_receiver( - u8 type, - ctrl_msg_handler_t hnd) -{ - unsigned long flags; - - spin_lock_irqsave(&ctrl_if_lock, flags); - - if ( ctrl_if_rxmsg_handler[type] != hnd ) - printk(KERN_INFO "Receiver %p is not registered for control " - "messages of type %d.\n", hnd, type); - else - ctrl_if_rxmsg_handler[type] = ctrl_if_rxmsg_default_handler; - - spin_unlock_irqrestore(&ctrl_if_lock, flags); - - /* Ensure that @hnd will not be executed after this function returns. */ - tasklet_unlock_wait(&ctrl_if_rx_tasklet); -} - -void ctrl_if_suspend(void) -{ - teardown_irq(ctrl_if_irq, &ctrl_if_irq_action); - unbind_evtchn_from_irq(ctrl_if_evtchn); -} - -void ctrl_if_resume(void) -{ - control_if_t *ctrl_if = get_ctrl_if(); - - if ( xen_start_info->flags & SIF_INITDOMAIN ) - { - /* - * The initial domain must create its own domain-controller link. - * The controller is probably not running at this point, but will - * pick up its end of the event channel from - */ - evtchn_op_t op; - extern void bind_evtchn_to_cpu(unsigned port, unsigned cpu); - - op.cmd = EVTCHNOP_bind_interdomain; - op.u.bind_interdomain.dom1 = DOMID_SELF; - op.u.bind_interdomain.dom2 = DOMID_SELF; - op.u.bind_interdomain.port1 = 0; - op.u.bind_interdomain.port2 = 0; - if ( HYPERVISOR_event_channel_op(&op) != 0 ) - BUG(); - xen_start_info->domain_controller_evtchn = op.u.bind_interdomain.port1; - initdom_ctrlif_domcontroller_port = op.u.bind_interdomain.port2; - bind_evtchn_to_cpu(op.u.bind_interdomain.port1, 0); - } - - /* Sync up with shared indexes. */ - FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM); - BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM); - - ctrl_if_evtchn = xen_start_info->domain_controller_evtchn; - ctrl_if_irq = bind_evtchn_to_irq(ctrl_if_evtchn); - - memset(&ctrl_if_irq_action, 0, sizeof(ctrl_if_irq_action)); - ctrl_if_irq_action.handler = ctrl_if_interrupt; - ctrl_if_irq_action.name = "ctrl-if"; - (void)setup_irq(ctrl_if_irq, &ctrl_if_irq_action); -} - -void __init ctrl_if_init(void) -{ - control_if_t *ctrl_if = get_ctrl_if(); - int i; - - for ( i = 0; i < 256; i++ ) - ctrl_if_rxmsg_handler[i] = ctrl_if_rxmsg_default_handler; - - FRONT_RING_ATTACH(&ctrl_if_tx_ring, &ctrl_if->tx_ring, CONTROL_RING_MEM); - BACK_RING_ATTACH(&ctrl_if_rx_ring, &ctrl_if->rx_ring, CONTROL_RING_MEM); - - spin_lock_init(&ctrl_if_lock); - - ctrl_if_resume(); -} - - -/* This is called after it is safe to call schedule_task(). */ -static int __init ctrl_if_late_setup(void) -{ - safe_to_schedule_task = 1; - return 0; -} -__initcall(ctrl_if_late_setup); - - -/* - * !! The following are DANGEROUS FUNCTIONS !! - * Use with care [for example, see xencons_force_flush()]. - */ - -int ctrl_if_transmitter_empty(void) -{ - return (ctrl_if_tx_ring.sring->req_prod == ctrl_if_tx_ring.rsp_cons); - -} - -void ctrl_if_discard_responses(void) -{ - RING_DROP_PENDING_RESPONSES(&ctrl_if_tx_ring); -} - -EXPORT_SYMBOL(ctrl_if_send_message_noblock); -EXPORT_SYMBOL(ctrl_if_send_message_block); -EXPORT_SYMBOL(ctrl_if_send_message_and_get_response); -EXPORT_SYMBOL(ctrl_if_enqueue_space_callback); -EXPORT_SYMBOL(ctrl_if_send_response); -EXPORT_SYMBOL(ctrl_if_register_receiver); -EXPORT_SYMBOL(ctrl_if_unregister_receiver); diff -r 32cc65db459a -r 549f4256ab3c linux-2.6-xen-sparse/include/asm-xen/ctrl_if.h --- a/linux-2.6-xen-sparse/include/asm-xen/ctrl_if.h Wed Sep 7 17:26:27 2005 +++ /dev/null Wed Sep 7 17:43:56 2005 @@ -1,160 +0,0 @@ -/****************************************************************************** - * ctrl_if.h - * - * Management functions for special interface to the domain controller. - * - * Copyright (c) 2004, K A Fraser - * - * This file may be 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 __ASM_XEN__CTRL_IF_H__ -#define __ASM_XEN__CTRL_IF_H__ - -#include <asm-xen/hypervisor.h> -#include <asm-xen/queues.h> - -typedef control_msg_t ctrl_msg_t; - -/* - * Callback function type. Called for asynchronous processing of received - * request messages, and responses to previously-transmitted request messages. - * The parameters are (@msg, @id). - * @msg: Original request/response message (not a copy). The message can be - * modified in-place by the handler (e.g., a response callback can - * turn a request message into a response message in place). The message - * is no longer accessible after the callback handler returns -- if the - * message is required to persist for longer then it must be copied. - * @id: (Response callbacks only) The 'id' that was specified when the - * original request message was queued for transmission. - */ -typedef void (*ctrl_msg_handler_t)(ctrl_msg_t *, unsigned long); - -/* - * Send @msg to the domain controller. Execute @hnd when a response is - * received, passing the response message and the specified @id. This - * operation will not block: it will return -EAGAIN if there is no space. - * Notes: - * 1. The @msg is copied if it is transmitted and so can be freed after this - * function returns. - * 2. If @hnd is NULL then no callback is executed. - */ -int -ctrl_if_send_message_noblock( - ctrl_msg_t *msg, - ctrl_msg_handler_t hnd, - unsigned long id); - -/* - * Send @msg to the domain controller. Execute @hnd when a response is - * received, passing the response message and the specified @id. This - * operation will block until the message is sent, or a signal is received - * for the calling process (unless @wait_state is TASK_UNINTERRUPTIBLE). - * Notes: - * 1. The @msg is copied if it is transmitted and so can be freed after this - * function returns. - * 2. If @hnd is NULL then no callback is executed. - */ -int -ctrl_if_send_message_block( - ctrl_msg_t *msg, - ctrl_msg_handler_t hnd, - unsigned long id, - long wait_state); - -/* - * Send @msg to the domain controller. Block until the response is received, - * and then copy it into the provided buffer, @rmsg. - */ -int -ctrl_if_send_message_and_get_response( - ctrl_msg_t *msg, - ctrl_msg_t *rmsg, - long wait_state); - -/* - * Request a callback when there is /possibly/ space to immediately send a - * message to the domain controller. This function returns 0 if there is - * already space to trasnmit a message --- in this case the callback task /may/ - * still be executed. If this function returns 1 then the callback /will/ be - * executed when space becomes available. - */ -int -ctrl_if_enqueue_space_callback( - struct tq_struct *task); - -/* - * Send a response (@msg) to a message from the domain controller. This will - * never block. - * Notes: - * 1. The @msg is copied and so can be freed after this function returns. - * 2. The @msg may be the original request message, modified in-place. - */ -void -ctrl_if_send_response( - ctrl_msg_t *msg); - -/* - * Register a receiver for typed messages from the domain controller. The - * handler (@hnd) is called for every received message of specified @type. - * Returns TRUE (non-zero) if the handler was successfully registered. - * If CALLBACK_IN_BLOCKING CONTEXT is specified in @flags then callbacks will - * occur in a context in which it is safe to yield (i.e., process context). - */ -#define CALLBACK_IN_BLOCKING_CONTEXT 1 -int ctrl_if_register_receiver( - u8 type, - ctrl_msg_handler_t hnd, - unsigned int flags); - -/* - * Unregister a receiver for typed messages from the domain controller. The - * handler (@hnd) will not be executed after this function returns. - */ -void -ctrl_if_unregister_receiver( - u8 type, ctrl_msg_handler_t hnd); - -/* Suspend/resume notifications. */ -void ctrl_if_suspend(void); -void ctrl_if_resume(void); - -/* Start-of-day setup. */ -void ctrl_if_init(void); - -/* - * Returns TRUE if there are no outstanding message requests at the domain - * controller. This can be used to ensure that messages have really flushed - * through when it is not possible to use the response-callback interface. - * WARNING: If other subsystems are using the control interface then this - * function might never return TRUE! - */ -int ctrl_if_transmitter_empty(void); /* !! DANGEROUS FUNCTION !! */ - -/* - * Manually discard response messages from the domain controller. - * WARNING: This is usually done automatically -- this function should only - * be called when normal interrupt mechanisms are disabled! - */ -void ctrl_if_discard_responses(void); /* !! DANGEROUS FUNCTION !! */ - -#endif /* __ASM_XEN__CONTROL_IF_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |