[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merged.
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID edefe24d78bd5e6e51bdd002f3ee7721d6dc2ce5 # Parent 7ad21a787d3f648e5bb434c9b613b949c6b7581e # Parent 4d4b41264b849c1350e0755a58c32111bb828e49 Merged. diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_ia64 --- a/buildconfigs/linux-defconfig_xen0_ia64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen0_ia64 Tue Apr 11 11:51:48 2006 @@ -95,6 +95,7 @@ CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_BACKEND=y CONFIG_XEN_BLKDEV_BACKEND=y CONFIG_XEN_SYSFS=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_x86_32 --- a/buildconfigs/linux-defconfig_xen0_x86_32 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen0_x86_32 Tue Apr 11 11:51:48 2006 @@ -1316,6 +1316,7 @@ # CONFIG_XEN_PRIVILEGED_GUEST=y # CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_BACKEND=y CONFIG_XEN_PCIDEV_BACKEND=y # CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set CONFIG_XEN_PCIDEV_BACKEND_PASS=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen0_x86_64 --- a/buildconfigs/linux-defconfig_xen0_x86_64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen0_x86_64 Tue Apr 11 11:51:48 2006 @@ -1246,6 +1246,7 @@ # CONFIG_XEN_PRIVILEGED_GUEST=y # CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_BACKEND=y CONFIG_XEN_PCIDEV_BACKEND=y # CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set CONFIG_XEN_PCIDEV_BACKEND_PASS=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_ia64 --- a/buildconfigs/linux-defconfig_xenU_ia64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xenU_ia64 Tue Apr 11 11:51:48 2006 @@ -92,6 +92,7 @@ CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_BACKEND=y CONFIG_XEN_BLKDEV_BACKEND=y CONFIG_XEN_SYSFS=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_x86_32 --- a/buildconfigs/linux-defconfig_xenU_x86_32 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xenU_x86_32 Tue Apr 11 11:51:48 2006 @@ -859,13 +859,9 @@ # # CONFIG_XEN_PRIVILEGED_GUEST is not set CONFIG_XEN_UNPRIVILEGED_GUEST=y -# CONFIG_XEN_PCIDEV_BACKEND is not set -# CONFIG_XEN_BLKDEV_BACKEND is not set -# CONFIG_XEN_NETDEV_BACKEND is not set -# CONFIG_XEN_TPMDEV_BACKEND is not set +# CONFIG_XEN_BACKEND is not set CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_TPMDEV_FRONTEND is not set CONFIG_XEN_SCRUB_PAGES=y CONFIG_XEN_DISABLE_SERIAL=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xenU_x86_64 --- a/buildconfigs/linux-defconfig_xenU_x86_64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xenU_x86_64 Tue Apr 11 11:51:48 2006 @@ -1135,13 +1135,9 @@ # # CONFIG_XEN_PRIVILEGED_GUEST is not set CONFIG_XEN_UNPRIVILEGED_GUEST=y -# CONFIG_XEN_PCIDEV_BACKEND is not set -# CONFIG_XEN_BLKDEV_BACKEND is not set -# CONFIG_XEN_NETDEV_BACKEND is not set -# CONFIG_XEN_TPMDEV_BACKEND is not set +# CONFIG_XEN_BACKEND is not set CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_TPMDEV_FRONTEND is not set CONFIG_XEN_SCRUB_PAGES=y CONFIG_XEN_DISABLE_SERIAL=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_ia64 --- a/buildconfigs/linux-defconfig_xen_ia64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen_ia64 Tue Apr 11 11:51:48 2006 @@ -95,6 +95,7 @@ CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y +CONFIG_XEN_BACKEND=y CONFIG_XEN_BLKDEV_BACKEND=y CONFIG_XEN_SYSFS=y CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_x86_32 --- a/buildconfigs/linux-defconfig_xen_x86_32 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen_x86_32 Tue Apr 11 11:51:48 2006 @@ -2979,6 +2979,7 @@ # CONFIG_XEN_PRIVILEGED_GUEST=y # CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_BACKEND=y CONFIG_XEN_PCIDEV_BACKEND=y # CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set CONFIG_XEN_PCIDEV_BACKEND_PASS=y diff -r 7ad21a787d3f -r edefe24d78bd buildconfigs/linux-defconfig_xen_x86_64 --- a/buildconfigs/linux-defconfig_xen_x86_64 Tue Apr 11 11:46:39 2006 +++ b/buildconfigs/linux-defconfig_xen_x86_64 Tue Apr 11 11:51:48 2006 @@ -2656,6 +2656,7 @@ # CONFIG_XEN_PRIVILEGED_GUEST=y # CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_BACKEND=y CONFIG_XEN_PCIDEV_BACKEND=y # CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set CONFIG_XEN_PCIDEV_BACKEND_PASS=y diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/arch/ia64/Kconfig --- a/linux-2.6-xen-sparse/arch/ia64/Kconfig Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/arch/ia64/Kconfig Tue Apr 11 11:51:48 2006 @@ -79,8 +79,13 @@ bool default y +config XEN_BACKEND + depends on XEN + bool + default y + config XEN_BLKDEV_BACKEND - depends on XEN + depends on XEN && XEN_BACKEND bool default y diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/Kconfig --- a/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/Kconfig Tue Apr 11 11:51:48 2006 @@ -28,9 +28,16 @@ bool default !XEN_PRIVILEGED_GUEST +config XEN_BACKEND + tristate "Backend driver support" + default y + help + Support for backend device drivers that provide I/O services + to other virtual machines. + config XEN_PCIDEV_BACKEND tristate "PCI device backend driver" - depends PCI + depends on PCI && XEN_BACKEND default XEN_PRIVILEGED_GUEST help The PCI device backend driver allows the kernel to export arbitrary @@ -70,6 +77,7 @@ config XEN_BLKDEV_BACKEND tristate "Block-device backend driver" + depends on XEN_BACKEND default y help The block-device backend driver allows the kernel to export its @@ -91,6 +99,7 @@ config XEN_NETDEV_BACKEND tristate "Network-device backend driver" + depends on XEN_BACKEND default y help The network-device backend driver allows the kernel to export its @@ -120,6 +129,7 @@ config XEN_TPMDEV_BACKEND tristate "TPM-device backend driver" + depends on XEN_BACKEND default n help The TPM-device backend driver @@ -155,6 +165,7 @@ config XEN_BLKDEV_TAP tristate "Block device tap driver" + depends on XEN_BACKEND default n help This driver allows a VM to interact on block device channels diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Apr 11 11:51:48 2006 @@ -300,13 +300,6 @@ goto abort_transaction; } - err = xenbus_printf(xbt, dev->nodename, - "state", "%d", XenbusStateConnected); - if (err) { - message = "writing frontend XenbusStateConnected"; - goto abort_transaction; - } - err = xenbus_transaction_end(xbt, 0); if (err) { if (err == -EAGAIN) @@ -314,6 +307,8 @@ xenbus_dev_fatal(dev, err, "completing transaction"); goto destroy_ring; } + + xenbus_switch_state(dev, XenbusStateConnected); return 0; diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/Makefile Tue Apr 11 11:51:48 2006 @@ -1,4 +1,8 @@ obj-y += xenbus.o +obj-$(CONFIG_XEN_BACKEND) += xenbus_be.o + +xenbus_be-objs = +xenbus_be-objs += xenbus_backend_client.o xenbus-objs = xenbus-objs += xenbus_client.o diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c Tue Apr 11 11:51:48 2006 @@ -259,134 +259,6 @@ xenbus_dev_error(dev, err, "freeing event channel %d", port); return err; } - - -/* Based on Rusty Russell's skeleton driver's map_page */ -int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr) -{ - struct gnttab_map_grant_ref op = { - .flags = GNTMAP_host_map, - .ref = gnt_ref, - .dom = dev->otherend_id, - }; - struct vm_struct *area; - - *vaddr = NULL; - - area = alloc_vm_area(PAGE_SIZE); - if (!area) - return -ENOMEM; - - op.host_addr = (unsigned long)area->addr; - - lock_vm_area(area); - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); - unlock_vm_area(area); - - if (op.status != GNTST_okay) { - free_vm_area(area); - xenbus_dev_fatal(dev, op.status, - "mapping in shared page %d from domain %d", - gnt_ref, dev->otherend_id); - return op.status; - } - - /* Stuff the handle in an unused field */ - area->phys_addr = (unsigned long)op.handle; - - *vaddr = area->addr; - return 0; -} -EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc); - - -int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref, - grant_handle_t *handle, void *vaddr) -{ - struct gnttab_map_grant_ref op = { - .host_addr = (unsigned long)vaddr, - .flags = GNTMAP_host_map, - .ref = gnt_ref, - .dom = dev->otherend_id, - }; - - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); - - if (op.status != GNTST_okay) { - xenbus_dev_fatal(dev, op.status, - "mapping in shared page %d from domain %d", - gnt_ref, dev->otherend_id); - } else - *handle = op.handle; - - return op.status; -} -EXPORT_SYMBOL_GPL(xenbus_map_ring); - - -/* Based on Rusty Russell's skeleton driver's unmap_page */ -int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr) -{ - struct vm_struct *area; - struct gnttab_unmap_grant_ref op = { - .host_addr = (unsigned long)vaddr, - }; - - /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr) - * method so that we don't have to muck with vmalloc internals here. - * We could force the user to hang on to their struct vm_struct from - * xenbus_map_ring_valloc, but these 6 lines considerably simplify - * this API. - */ - read_lock(&vmlist_lock); - for (area = vmlist; area != NULL; area = area->next) { - if (area->addr == vaddr) - break; - } - read_unlock(&vmlist_lock); - - if (!area) { - xenbus_dev_error(dev, -ENOENT, - "can't find mapped virtual address %p", vaddr); - return GNTST_bad_virt_addr; - } - - op.handle = (grant_handle_t)area->phys_addr; - - lock_vm_area(area); - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); - unlock_vm_area(area); - - if (op.status == GNTST_okay) - free_vm_area(area); - else - xenbus_dev_error(dev, op.status, - "unmapping page at handle %d error %d", - (int16_t)area->phys_addr, op.status); - - return op.status; -} -EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree); - - -int xenbus_unmap_ring(struct xenbus_device *dev, - grant_handle_t handle, void *vaddr) -{ - struct gnttab_unmap_grant_ref op = { - .host_addr = (unsigned long)vaddr, - .handle = handle, - }; - - BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); - - if (op.status != GNTST_okay) - xenbus_dev_error(dev, op.status, - "unmapping page at handle %d error %d", - handle, op.status); - - return op.status; -} -EXPORT_SYMBOL_GPL(xenbus_unmap_ring); XenbusState xenbus_read_driver_state(const char *path) diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Apr 11 11:51:48 2006 @@ -1065,19 +1065,16 @@ */ static int __init wait_for_devices(void) { - int i; - - for (i = 0; i < 10 * HZ; i++) { - if (all_devices_ready()) { - return; - } - - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(1); - } - - printk(KERN_WARNING - "XENBUS: Timeout connecting to devices!\n"); + unsigned long timeout = jiffies + 10*HZ; + + while (time_before(jiffies, timeout)) { + if (all_devices_ready()) + return 0; + schedule_timeout_interruptible(HZ/10); + } + + printk(KERN_WARNING "XENBUS: Timeout connecting to devices!\n"); + return 0; } late_initcall(wait_for_devices); diff -r 7ad21a787d3f -r edefe24d78bd tools/xenstat/xentop/Makefile --- a/tools/xenstat/xentop/Makefile Tue Apr 11 11:46:39 2006 +++ b/tools/xenstat/xentop/Makefile Tue Apr 11 11:51:48 2006 @@ -34,9 +34,6 @@ .PHONY: all all: xentop -.PHONY: xentop -xentop: xentop.o - .PHONY: install install: xentop xentop.1 $(INSTALL_PROG) xentop $(DESTDIR)$(sbindir)/xentop diff -r 7ad21a787d3f -r edefe24d78bd tools/xenstore/Makefile --- a/tools/xenstore/Makefile Tue Apr 11 11:46:39 2006 +++ b/tools/xenstore/Makefile Tue Apr 11 11:51:48 2006 @@ -57,14 +57,12 @@ xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ -.PHONY: xs_test xs_random xs_stress xs_crashme xs_test xs_random xs_stress xs_crashme: LDFLAGS+=-lpthread xs_test: xs_test.o xs_lib.o utils.o xs_random: xs_random.o xs_test_lib.o xs_lib.o talloc.o utils.o xs_stress: xs_stress.o xs_test_lib.o xs_lib.o talloc.o utils.o xs_crashme: xs_crashme.o xs_lib.o talloc.o utils.o -.PHONY: speedtest speedtest: speedtest.o xs.o xs_lib.o utils.o talloc.o .PHONY: check-speed diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/ia64/tools/privop/Makefile --- a/xen/arch/ia64/tools/privop/Makefile Tue Apr 11 11:46:39 2006 +++ b/xen/arch/ia64/tools/privop/Makefile Tue Apr 11 11:51:48 2006 @@ -4,7 +4,6 @@ .PHONY: all all: postat -.PHONY: postat postat: postat.c pohcalls.o .PHONY: clean diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/x86/hvm/platform.c --- a/xen/arch/x86/hvm/platform.c Tue Apr 11 11:46:39 2006 +++ b/xen/arch/x86/hvm/platform.c Tue Apr 11 11:51:48 2006 @@ -401,6 +401,11 @@ GET_OP_SIZE_FOR_NONEBYTE(instr->op_size); return reg_mem(instr->op_size, opcode, instr, rex); + case 0x3B: /* cmp m32/16, r32/16 */ + instr->instr = INSTR_CMP; + GET_OP_SIZE_FOR_NONEBYTE(instr->op_size); + return mem_reg(instr->op_size, opcode, instr, rex); + case 0x80: case 0x81: { diff -r 7ad21a787d3f -r edefe24d78bd xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Tue Apr 11 11:46:39 2006 +++ b/xen/arch/x86/hvm/vmx/vmx.c Tue Apr 11 11:51:48 2006 @@ -1947,7 +1947,7 @@ && !(vector & INTR_INFO_VALID_MASK)) __hvm_bug(regs); - vector &= 0xff; + vector &= INTR_INFO_VECTOR_MASK; local_irq_disable(); TRACE_VMEXIT(1,vector); @@ -2077,10 +2077,8 @@ return; } - { - __vmread(GUEST_RIP, &eip); - TRACE_VMEXIT(0,exit_reason); - } + __vmread(GUEST_RIP, &eip); + TRACE_VMEXIT(0,exit_reason); switch (exit_reason) { case EXIT_REASON_EXCEPTION_NMI: @@ -2097,7 +2095,7 @@ if ((error = __vmread(VM_EXIT_INTR_INFO, &vector)) || !(vector & INTR_INFO_VALID_MASK)) __hvm_bug(®s); - vector &= 0xff; + vector &= INTR_INFO_VECTOR_MASK; TRACE_VMEXIT(1,vector); perfc_incra(cause_vector, vector); diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-ia64/event.h --- a/xen/include/asm-ia64/event.h Tue Apr 11 11:46:39 2006 +++ b/xen/include/asm-ia64/event.h Tue Apr 11 11:51:48 2006 @@ -32,4 +32,9 @@ vcpu_pend_interrupt(v, v->vcpu_info->arch.evtchn_vector); } +/* Note: Bitwise operations result in fast code with no branches. */ +#define event_pending(v) \ + (!!(v)->vcpu_info->evtchn_upcall_pending & \ + !(v)->vcpu_info->evtchn_upcall_mask) + #endif diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-x86/event.h --- a/xen/include/asm-x86/event.h Tue Apr 11 11:46:39 2006 +++ b/xen/include/asm-x86/event.h Tue Apr 11 11:51:48 2006 @@ -26,4 +26,9 @@ smp_send_event_check_cpu(v->processor); } +/* Note: Bitwise operations result in fast code with no branches. */ +#define event_pending(v) \ + (!!(v)->vcpu_info->evtchn_upcall_pending & \ + !(v)->vcpu_info->evtchn_upcall_mask) + #endif diff -r 7ad21a787d3f -r edefe24d78bd xen/include/asm-x86/hvm/io.h --- a/xen/include/asm-x86/hvm/io.h Tue Apr 11 11:46:39 2006 +++ b/xen/include/asm-x86/hvm/io.h Tue Apr 11 11:51:48 2006 @@ -77,7 +77,7 @@ __u32 flags; }; -#define MAX_INST_LEN 32 +#define MAX_INST_LEN 15 /* Maximum instruction length = 15 bytes */ struct mmio_op { int flags; diff -r 7ad21a787d3f -r edefe24d78bd xen/include/xen/event.h --- a/xen/include/xen/event.h Tue Apr 11 11:46:39 2006 +++ b/xen/include/xen/event.h Tue Apr 11 11:51:48 2006 @@ -38,11 +38,6 @@ */ extern void send_guest_pirq(struct domain *d, int pirq); -/* Note: Bitwise operations result in fast code with no branches. */ -#define event_pending(v) \ - (!!(v)->vcpu_info->evtchn_upcall_pending & \ - !(v)->vcpu_info->evtchn_upcall_mask) - #define evtchn_pending(d, p) \ (test_bit((p), &(d)->shared_info->evtchn_pending[0])) diff -r 7ad21a787d3f -r edefe24d78bd xen/tools/Makefile --- a/xen/tools/Makefile Tue Apr 11 11:46:39 2006 +++ b/xen/tools/Makefile Tue Apr 11 11:51:48 2006 @@ -11,6 +11,5 @@ $(MAKE) -C figlet clean rm -f *.o symbols -.PHONY: symbols symbols: symbols.c $(HOSTCC) $(HOSTCFLAGS) -o $@ $< diff -r 7ad21a787d3f -r edefe24d78bd linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c --- /dev/null Tue Apr 11 11:46:39 2006 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_backend_client.c Tue Apr 11 11:51:48 2006 @@ -0,0 +1,173 @@ +/****************************************************************************** + * Backend-client-facing interface for the Xenbus driver. In other words, the + * interface between the Xenbus and the device-specific code in the backend + * driver. + * + * Copyright (C) 2005-2006 XenSource Ltd + * + * 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 <xen/gnttab.h> +#include <xen/xenbus.h> +#include <xen/driver_util.h> + +/* Based on Rusty Russell's skeleton driver's map_page */ +int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr) +{ + struct gnttab_map_grant_ref op = { + .flags = GNTMAP_host_map, + .ref = gnt_ref, + .dom = dev->otherend_id, + }; + struct vm_struct *area; + + *vaddr = NULL; + + area = alloc_vm_area(PAGE_SIZE); + if (!area) + return -ENOMEM; + + op.host_addr = (unsigned long)area->addr; + + lock_vm_area(area); + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); + unlock_vm_area(area); + + if (op.status != GNTST_okay) { + free_vm_area(area); + xenbus_dev_fatal(dev, op.status, + "mapping in shared page %d from domain %d", + gnt_ref, dev->otherend_id); + return op.status; + } + + /* Stuff the handle in an unused field */ + area->phys_addr = (unsigned long)op.handle; + + *vaddr = area->addr; + return 0; +} +EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc); + + +int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref, + grant_handle_t *handle, void *vaddr) +{ + struct gnttab_map_grant_ref op = { + .host_addr = (unsigned long)vaddr, + .flags = GNTMAP_host_map, + .ref = gnt_ref, + .dom = dev->otherend_id, + }; + + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1)); + + if (op.status != GNTST_okay) { + xenbus_dev_fatal(dev, op.status, + "mapping in shared page %d from domain %d", + gnt_ref, dev->otherend_id); + } else + *handle = op.handle; + + return op.status; +} +EXPORT_SYMBOL_GPL(xenbus_map_ring); + + +/* Based on Rusty Russell's skeleton driver's unmap_page */ +int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr) +{ + struct vm_struct *area; + struct gnttab_unmap_grant_ref op = { + .host_addr = (unsigned long)vaddr, + }; + + /* It'd be nice if linux/vmalloc.h provided a find_vm_area(void *addr) + * method so that we don't have to muck with vmalloc internals here. + * We could force the user to hang on to their struct vm_struct from + * xenbus_map_ring_valloc, but these 6 lines considerably simplify + * this API. + */ + read_lock(&vmlist_lock); + for (area = vmlist; area != NULL; area = area->next) { + if (area->addr == vaddr) + break; + } + read_unlock(&vmlist_lock); + + if (!area) { + xenbus_dev_error(dev, -ENOENT, + "can't find mapped virtual address %p", vaddr); + return GNTST_bad_virt_addr; + } + + op.handle = (grant_handle_t)area->phys_addr; + + lock_vm_area(area); + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); + unlock_vm_area(area); + + if (op.status == GNTST_okay) + free_vm_area(area); + else + xenbus_dev_error(dev, op.status, + "unmapping page at handle %d error %d", + (int16_t)area->phys_addr, op.status); + + return op.status; +} +EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree); + + +int xenbus_unmap_ring(struct xenbus_device *dev, + grant_handle_t handle, void *vaddr) +{ + struct gnttab_unmap_grant_ref op = { + .host_addr = (unsigned long)vaddr, + .handle = handle, + }; + + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); + + if (op.status != GNTST_okay) + xenbus_dev_error(dev, op.status, + "unmapping page at handle %d error %d", + handle, op.status); + + return op.status; +} +EXPORT_SYMBOL_GPL(xenbus_unmap_ring); + + +/* + * Local variables: + * c-file-style: "linux" + * indent-tabs-mode: t + * c-indent-level: 8 + * c-basic-offset: 8 + * tab-width: 8 + * End: + */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |