Date: Thu, 28 May 2009 19:05:27 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r192990 - in user/kmacy/releng_7_2_xen/sys: conf dev/xen dev/xen/balloon dev/xen/blkback dev/xen/blkfront dev/xen/console dev/xen/evtchn dev/xen/netback dev/xen/netfront dev/xen/pcifron... Message-ID: <200905281905.n4SJ5RBT046990@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kmacy Date: Thu May 28 19:05:26 2009 New Revision: 192990 URL: http://svn.freebsd.org/changeset/base/192990 Log: apply releng_7_xen changes Added: user/kmacy/releng_7_2_xen/sys/dev/xen/ user/kmacy/releng_7_2_xen/sys/dev/xen/balloon/ user/kmacy/releng_7_2_xen/sys/dev/xen/balloon/balloon.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/blkback/ user/kmacy/releng_7_2_xen/sys/dev/xen/blkback/blkback.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/blkfront/ user/kmacy/releng_7_2_xen/sys/dev/xen/blkfront/blkfront.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/blkfront/block.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/console/ user/kmacy/releng_7_2_xen/sys/dev/xen/console/console.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/console/xencons_ring.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/console/xencons_ring.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/evtchn/ user/kmacy/releng_7_2_xen/sys/dev/xen/evtchn/evtchn_dev.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/netback/ user/kmacy/releng_7_2_xen/sys/dev/xen/netback/netback.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/netfront/ user/kmacy/releng_7_2_xen/sys/dev/xen/netfront/mbufq.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/netfront/netfront.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/dev/xen/pcifront/ user/kmacy/releng_7_2_xen/sys/dev/xen/pcifront/pcifront.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/ user/kmacy/releng_7_2_xen/sys/i386/include/xen/features.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/hypercall.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/synch_bitops.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/xen-os.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/xenfunc.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/xenpmap.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/xenstored.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/include/xen/xenvar.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/ user/kmacy/releng_7_2_xen/sys/i386/xen/clock.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/exception.s (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/locore.s (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/mp_machdep.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/mptable.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/pmap.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/i386/xen/xen_machdep.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/libkern/strcspn.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/ user/kmacy/releng_7_2_xen/sys/xen/evtchn/ user/kmacy/releng_7_2_xen/sys/xen/evtchn.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/evtchn/evtchn.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/evtchn/evtchn_dev.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/features.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/gnttab.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/gnttab.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/hypervisor.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/ user/kmacy/releng_7_2_xen/sys/xen/interface/COPYING user/kmacy/releng_7_2_xen/sys/xen/interface/acm.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/acm_ops.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-ia64.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-powerpc.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/ user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/cpuid.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/hvm/ user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/hvm/save.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/xen-mca.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/xen-x86_32.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/xen-x86_64.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86/xen.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86_32.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/arch-x86_64.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/callback.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/dom0_ops.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/domctl.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/elfnote.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/elfstructs.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/event_channel.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/features.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/ user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/Makefile (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/mkchecker.py (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/mkheader.py (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/reference.size user/kmacy/releng_7_2_xen/sys/xen/interface/foreign/structs.py (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/grant_table.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/ user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/e820.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/hvm_info_table.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/hvm_op.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/ioreq.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/params.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/save.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/hvm/vmx_assist.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/ user/kmacy/releng_7_2_xen/sys/xen/interface/io/blkif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/console.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/fbif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/kbdif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/netif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/pciif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/protocols.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/ring.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/tpmif.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/xenbus.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/io/xs_wire.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/kexec.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/libelf.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/memory.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/nmi.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/physdev.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/platform.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/sched.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/sysctl.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/trace.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/vcpu.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/version.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/xen-compat.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/xen.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/xencomm.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/interface/xenoprof.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xen_intr.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/ user/kmacy/releng_7_2_xen/sys/xen/xenbus/init.txt (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_client.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_comms.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_comms.h (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_dev.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_if.m user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_probe.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_probe_backend.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbus_xs.c (contents, props changed) user/kmacy/releng_7_2_xen/sys/xen/xenbus/xenbusvar.h (contents, props changed) Modified: user/kmacy/releng_7_2_xen/sys/conf/files user/kmacy/releng_7_2_xen/sys/conf/files.i386 user/kmacy/releng_7_2_xen/sys/conf/options.i386 user/kmacy/releng_7_2_xen/sys/i386/conf/DEFAULTS user/kmacy/releng_7_2_xen/sys/i386/i386/apic_vector.s user/kmacy/releng_7_2_xen/sys/i386/i386/genassym.c user/kmacy/releng_7_2_xen/sys/i386/i386/intr_machdep.c user/kmacy/releng_7_2_xen/sys/i386/i386/local_apic.c user/kmacy/releng_7_2_xen/sys/i386/i386/machdep.c user/kmacy/releng_7_2_xen/sys/i386/i386/support.s user/kmacy/releng_7_2_xen/sys/i386/i386/swtch.s user/kmacy/releng_7_2_xen/sys/i386/i386/sys_machdep.c user/kmacy/releng_7_2_xen/sys/i386/i386/vm_machdep.c user/kmacy/releng_7_2_xen/sys/i386/include/apicvar.h user/kmacy/releng_7_2_xen/sys/i386/include/asmacros.h user/kmacy/releng_7_2_xen/sys/i386/include/cpufunc.h user/kmacy/releng_7_2_xen/sys/i386/include/param.h user/kmacy/releng_7_2_xen/sys/i386/include/pcpu.h user/kmacy/releng_7_2_xen/sys/i386/include/pmap.h user/kmacy/releng_7_2_xen/sys/i386/include/segments.h user/kmacy/releng_7_2_xen/sys/i386/include/smp.h user/kmacy/releng_7_2_xen/sys/i386/include/vmparam.h user/kmacy/releng_7_2_xen/sys/i386/isa/npx.c user/kmacy/releng_7_2_xen/sys/i386/pci/pci_cfgreg.c user/kmacy/releng_7_2_xen/sys/i386/pci/pci_pir.c user/kmacy/releng_7_2_xen/sys/kern/kern_fork.c user/kmacy/releng_7_2_xen/sys/kern/kern_synch.c user/kmacy/releng_7_2_xen/sys/kern/subr_trap.c user/kmacy/releng_7_2_xen/sys/modules/Makefile user/kmacy/releng_7_2_xen/sys/sys/libkern.h user/kmacy/releng_7_2_xen/sys/vm/vm_page.c Modified: user/kmacy/releng_7_2_xen/sys/conf/files ============================================================================== --- user/kmacy/releng_7_2_xen/sys/conf/files Thu May 28 18:46:43 2009 (r192989) +++ user/kmacy/releng_7_2_xen/sys/conf/files Thu May 28 19:05:26 2009 (r192990) @@ -1764,6 +1764,7 @@ libkern/strcasecmp.c standard libkern/strcat.c standard libkern/strcmp.c standard libkern/strcpy.c standard +libkern/strcspn.c standard libkern/strdup.c standard libkern/strlcat.c standard libkern/strlcpy.c standard @@ -2369,3 +2370,23 @@ gnu/fs/xfs/xfs_iomap.c optional xfs \ compile-with "${NORMAL_C} -I$S/gnu/fs/xfs/FreeBSD -I$S/gnu/fs/xfs/FreeBSD/support -I$S/gnu/fs/xfs" gnu/fs/xfs/xfs_behavior.c optional xfs \ compile-with "${NORMAL_C} -I$S/gnu/fs/xfs/FreeBSD -I$S/gnu/fs/xfs/FreeBSD/support -I$S/gnu/fs/xfs" + + +xen/gnttab.c optional xen +xen/features.c optional xen +xen/evtchn/evtchn.c optional xen +xen/evtchn/evtchn_dev.c optional xen +xen/xenbus/xenbus_client.c optional xen +xen/xenbus/xenbus_comms.c optional xen +xen/xenbus/xenbus_dev.c optional xen +xen/xenbus/xenbus_if.m optional xen +xen/xenbus/xenbus_probe.c optional xen +#xen/xenbus/xenbus_probe_backend.c optional xen +xen/xenbus/xenbus_xs.c optional xen +dev/xen/console/console.c optional xen +dev/xen/console/xencons_ring.c optional xen +dev/xen/blkfront/blkfront.c optional xen +dev/xen/netfront/netfront.c optional xen +#dev/xen/xenpci/xenpci.c optional xen +#xen/xenbus/xenbus_newbus.c optional xenhvm + Modified: user/kmacy/releng_7_2_xen/sys/conf/files.i386 ============================================================================== --- user/kmacy/releng_7_2_xen/sys/conf/files.i386 Thu May 28 18:46:43 2009 (r192989) +++ user/kmacy/releng_7_2_xen/sys/conf/files.i386 Thu May 28 19:05:26 2009 (r192990) @@ -252,8 +252,8 @@ i386/cpufreq/smist.c optional cpufreq i386/i386/atomic.c standard \ compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}" i386/i386/autoconf.c standard -i386/i386/bios.c standard -i386/i386/bioscall.s standard +i386/i386/bios.c optional native +i386/i386/bioscall.s optional native i386/i386/bpf_jit_machdep.c optional bpf_jitter i386/i386/busdma_machdep.c standard i386/i386/db_disasm.c optional ddb @@ -262,7 +262,8 @@ i386/i386/db_trace.c optional ddb i386/i386/dump_machdep.c standard i386/i386/elan-mmcr.c optional cpu_elan | cpu_soekris i386/i386/elf_machdep.c standard -i386/i386/exception.s standard +i386/i386/exception.s optional native +i386/xen/exception.s optional xen i386/i386/gdb_machdep.c optional gdb i386/i386/geode.c optional cpu_geode i386/i386/i686_mem.c optional mem @@ -273,23 +274,28 @@ i386/i386/intr_machdep.c standard i386/i386/io.c optional io i386/i386/io_apic.c optional apic i386/i386/k6_mem.c optional mem -i386/i386/legacy.c standard +i386/i386/legacy.c optional native i386/i386/local_apic.c optional apic -i386/i386/locore.s standard no-obj +i386/i386/locore.s optional native no-obj +i386/xen/locore.s optional xen no-obj i386/i386/longrun.c optional cpu_enable_longrun i386/i386/machdep.c standard +i386/xen/xen_machdep.c optional xen i386/i386/mem.c optional mem i386/i386/minidump_machdep.c standard i386/i386/mp_clock.c optional smp -i386/i386/mp_machdep.c optional smp +i386/i386/mp_machdep.c optional native smp +i386/xen/mp_machdep.c optional xen smp i386/i386/mp_watchdog.c optional mp_watchdog smp -i386/i386/mpboot.s optional smp -i386/i386/mptable.c optional apic +i386/i386/mpboot.s optional smp native +i386/i386/mptable.c optional apic native +i386/xen/mptable.c optional apic xen i386/i386/mptable_pci.c optional apic pci i386/i386/msi.c optional apic pci i386/i386/nexus.c standard i386/i386/perfmon.c optional perfmon -i386/i386/pmap.c standard +i386/i386/pmap.c optional native +i386/xen/pmap.c optional xen i386/i386/ptrace_machdep.c standard i386/i386/stack_machdep.c optional ddb | stack i386/i386/support.s standard @@ -319,9 +325,10 @@ i386/ibcs2/ibcs2_util.c optional ibcs2 i386/ibcs2/ibcs2_xenix.c optional ibcs2 i386/ibcs2/ibcs2_xenix_sysent.c optional ibcs2 i386/ibcs2/imgact_coff.c optional ibcs2 -i386/isa/atpic.c standard +i386/isa/atpic.c optional atpic #i386/isa/atpic_vector.s standard -i386/isa/clock.c standard +i386/isa/clock.c optional native +i386/xen/clock.c optional xen i386/isa/dpms.c optional dpms i386/isa/elcr.c standard i386/isa/elink.c optional ep | ie Modified: user/kmacy/releng_7_2_xen/sys/conf/options.i386 ============================================================================== --- user/kmacy/releng_7_2_xen/sys/conf/options.i386 Thu May 28 18:46:43 2009 (r192989) +++ user/kmacy/releng_7_2_xen/sys/conf/options.i386 Thu May 28 19:05:26 2009 (r192990) @@ -150,3 +150,6 @@ STOP_NMI opt_cpu.h # BPF just-in-time compiler BPF_JITTER opt_bpf.h + +NATIVE opt_global.h +XEN opt_global.h Added: user/kmacy/releng_7_2_xen/sys/dev/xen/balloon/balloon.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/kmacy/releng_7_2_xen/sys/dev/xen/balloon/balloon.c Thu May 28 19:05:26 2009 (r192990) @@ -0,0 +1,446 @@ +/****************************************************************************** + * balloon.c + * + * Xen balloon driver - enables returning/claiming memory to/from Xen. + * + * Copyright (c) 2003, B Dragovic + * Copyright (c) 2003-2004, M Williamson, K Fraser + * Copyright (c) 2005 Dan M. Smith, IBM Corporation + * + * 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 <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/lock.h> +#include <sys/mutex.h> + +#include <machine/hypervisor-ifs.h> +#include <machine/xen-os.h> +#include <machine/xenbus.h> + +/* + * Protects atomic reservation decrease/increase against concurrent increases. + * Also protects non-atomic updates of current_pages and driver_pages, and + * balloon lists. + */ +struct mtx balloon_lock; +#ifdef notyet + +/* We aim for 'current allocation' == 'target allocation'. */ +static unsigned long current_pages; +static unsigned long target_pages; + +/* VM /proc information for memory */ +extern unsigned long totalram_pages; + +/* We may hit the hard limit in Xen. If we do then we remember it. */ +static unsigned long hard_limit; + +/* + * Drivers may alter the memory reservation independently, but they must + * inform the balloon driver so that we can avoid hitting the hard limit. + */ +static unsigned long driver_pages; + +struct balloon_entry { + vm_page_t page; + STAILQ_ENTRY(balloon_entry) list; +}; + +/* List of ballooned pages, threaded through the mem_map array. */ +static STAILQ_HEAD(,balloon_entry) ballooned_pages; + +static unsigned long balloon_low, balloon_high; + + +/* Main work function, always executed in process context. */ +static void balloon_process(void *unused); + +#define IPRINTK(fmt, args...) \ + printk(KERN_INFO "xen_mem: " fmt, ##args) +#define WPRINTK(fmt, args...) \ + printk(KERN_WARNING "xen_mem: " fmt, ##args) + +/* balloon_append: add the given page to the balloon. */ +static void +balloon_append(vm_page_t page) +{ + struct balloon_entry *entry; + + entry = malloc(sizeof(struct balloon_entry), M_WAITOK); + + STAILQ_INSERT_HEAD(&ballooned_pages, entry, list); + balloon_low++; +} + +/* balloon_retrieve: rescue a page from the balloon, if it is not empty. */ +static vm_page_t +balloon_retrieve(void) +{ + vm_page_t page; + struct balloon_entry *entry; + + if (STAILQ_EMPTY(&ballooned_pages)) + return NULL; + + entry = STAILQ_FIRST(&ballooned_pages); + STAILQ_REMOVE_HEAD(&ballooned_pages, list); + + page = entry->page; + free(entry, M_DEVBUF); + + balloon_low--; + + return page; +} + +static void +balloon_alarm(unsigned long unused) +{ + wakeup(balloon_process); +} + +static unsigned long +current_target(void) +{ + unsigned long target = min(target_pages, hard_limit); + if (target > (current_pages + balloon_low + balloon_high)) + target = current_pages + balloon_low + balloon_high; + return target; +} + +static int +increase_reservation(unsigned long nr_pages) +{ + unsigned long *mfn_list, pfn, i, flags; + struct page *page; + long rc; + struct xen_memory_reservation reservation = { + .address_bits = 0, + .extent_order = 0, + .domid = DOMID_SELF + }; + + if (nr_pages > (PAGE_SIZE / sizeof(unsigned long))) + nr_pages = PAGE_SIZE / sizeof(unsigned long); + + mfn_list = (unsigned long *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT); + if (mfn_list == NULL) + return ENOMEM; + + + reservation.extent_start = mfn_list; + reservation.nr_extents = nr_pages; + rc = HYPERVISOR_memory_op( + XENMEM_increase_reservation, &reservation); + if (rc < nr_pages) { + int ret; + /* We hit the Xen hard limit: reprobe. */ + reservation.extent_start = mfn_list; + reservation.nr_extents = rc; + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, + &reservation); + PANIC_IF(ret != rc); + hard_limit = current_pages + rc - driver_pages; + goto out; + } + + for (i = 0; i < nr_pages; i++) { + page = balloon_retrieve(); + PANIC_IF(page == NULL); + + pfn = (VM_PAGE_TO_PHYS(page) >> PAGE_SHIFT); + PANIC_IF(phys_to_machine_mapping_valid(pfn)); + + /* Update P->M and M->P tables. */ + PFNTOMFN(pfn) = mfn_list[i]; + xen_machphys_update(mfn_list[i], pfn); + + /* Relinquish the page back to the allocator. */ + ClearPageReserved(page); + set_page_count(page, 1); + vm_page_free(page); + } + + current_pages += nr_pages; + totalram_pages = current_pages; + + out: + balloon_unlock(flags); + + free((mfn_list); + + return 0; +} + +static int +decrease_reservation(unsigned long nr_pages) +{ + unsigned long *mfn_list, pfn, i, flags; + struct page *page; + void *v; + int need_sleep = 0; + int ret; + struct xen_memory_reservation reservation = { + .address_bits = 0, + .extent_order = 0, + .domid = DOMID_SELF + }; + + if (nr_pages > (PAGE_SIZE / sizeof(unsigned long))) + nr_pages = PAGE_SIZE / sizeof(unsigned long); + + mfn_list = (unsigned long *)malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT); + if (mfn_list == NULL) + return ENOMEM; + + for (i = 0; i < nr_pages; i++) { + int color = 0; + if ((page = vm_page_alloc(NULL, color++, + VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | + VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) { + nr_pages = i; + need_sleep = 1; + break; + } + pfn = (VM_PAGE_TO_PHYS(page) >> PAGE_SHIFT); + mfn_list[i] = PFNTOMFN(pfn); + } + + balloon_lock(flags); + + /* No more mappings: invalidate P2M and add to balloon. */ + for (i = 0; i < nr_pages; i++) { + pfn = MFNTOPFN(mfn_list[i]); + PFNTOMFN(pfn) = INVALID_P2M_ENTRY; + balloon_append(PHYS_TO_VM_PAGE(pfn << PAGE_SHIFT)); + } + + reservation.extent_start = mfn_list; + reservation.nr_extents = nr_pages; + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); + PANIC_IF(ret != nr_pages); + + current_pages -= nr_pages; + totalram_pages = current_pages; + + balloon_unlock(flags); + + free(mfn_list, M_DEVBUF); + + return need_sleep; +} + +/* + * We avoid multiple worker processes conflicting via the balloon mutex. + * We may of course race updates of the target counts (which are protected + * by the balloon lock), or with changes to the Xen hard limit, but we will + * recover from these in time. + */ +static void +balloon_process(void *unused) +{ + int need_sleep = 0; + long credit; + + for (;;) { + do { + credit = current_target() - current_pages; + if (credit > 0) + need_sleep = (increase_reservation(credit) != 0); + if (credit < 0) + need_sleep = (decrease_reservation(-credit) != 0); + +#ifndef CONFIG_PREEMPT + if (need_resched()) + schedule(); +#endif + } while ((credit != 0) && !need_sleep); + + /* Schedule more work if there is some still to be done. */ + if (current_target() != current_pages) + timeout(balloon_alarm, NULL, ticks + HZ); + + msleep(balloon_process, balloon_lock, 0, "balloon", -1); + } + +} + +/* Resets the Xen limit, sets new target, and kicks off processing. */ +static void +set_new_target(unsigned long target) +{ + /* No need for lock. Not read-modify-write updates. */ + hard_limit = ~0UL; + target_pages = target; + wakeup(balloon_process); +} + +static struct xenbus_watch target_watch = +{ + .node = "memory/target" +}; + +/* React to a change in the target key */ +static void +watch_target(struct xenbus_watch *watch, + const char **vec, unsigned int len) +{ + unsigned long long new_target; + int err; + + err = xenbus_scanf(NULL, "memory", "target", "%llu", &new_target); + if (err != 1) { + /* This is ok (for domain0 at least) - so just return */ + return; + } + + /* The given memory/target value is in KiB, so it needs converting to + pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10. + */ + set_new_target(new_target >> (PAGE_SHIFT - 10)); + +} + +static void +balloon_init_watcher(void *) +{ + int err; + + err = register_xenbus_watch(&target_watch); + if (err) + printf("Failed to set balloon watcher\n"); + +} + +static void +balloon_init(void *) +{ + unsigned long pfn; + struct page *page; + + IPRINTK("Initialising balloon driver.\n"); + + if (xen_init() < 0) + return -1; + + current_pages = min(xen_start_info->nr_pages, max_pfn); + target_pages = current_pages; + balloon_low = 0; + balloon_high = 0; + driver_pages = 0UL; + hard_limit = ~0UL; + + init_timer(&balloon_timer); + balloon_timer.data = 0; + balloon_timer.function = balloon_alarm; + + /* Initialise the balloon with excess memory space. */ + for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) { + page = PHYS_TO_VM_PAGE(pfn << PAGE_SHIFT); + balloon_append(page); + } + + target_watch.callback = watch_target; + + return 0; +} + +void +balloon_update_driver_allowance(long delta) +{ + unsigned long flags; + + balloon_lock(flags); + driver_pages += delta; + balloon_unlock(flags); +} + +#if 0 +static int dealloc_pte_fn( + pte_t *pte, struct page *pte_page, unsigned long addr, void *data) +{ + unsigned long mfn = pte_mfn(*pte); + int ret; + struct xen_memory_reservation reservation = { + .extent_start = &mfn, + .nr_extents = 1, + .extent_order = 0, + .domid = DOMID_SELF + }; + set_pte_at(&init_mm, addr, pte, __pte_ma(0)); + set_phys_to_machine(__pa(addr) >> PAGE_SHIFT, INVALID_P2M_ENTRY); + ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); + PANIC_IF(ret != 1); + return 0; +} + +#endif +vm_page_t +balloon_alloc_empty_page_range(unsigned long nr_pages) +{ + unsigned long flags; + vm_page_t pages; + int i; + unsigned long *mfn_list; + struct xen_memory_reservation reservation = { + .address_bits = 0, + .extent_order = 0, + .domid = DOMID_SELF + }; + + pages = vm_page_alloc_contig(nr_pages, 0, -1, 4, 4) + if (pages == NULL) + return NULL; + + mfn_list = malloc(nr_pages*sizeof(unsigned long), M_DEVBUF, M_WAITOK); + + for (i = 0; i < nr_pages; i++) { + mfn_list[i] = PFNTOMFN(VM_PAGE_TO_PHYS(pages[i]) >> PAGE_SHIFT); + PFNTOMFN(i) = INVALID_P2M_ENTRY; + reservation.extent_start = mfn_list; + reservation.nr_extents = nr_pages; + PANIC_IF(HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation) != nr_pages); + } + + current_pages -= nr_pages; + + wakeup(balloon_process); + + return pages; +} + +void +balloon_dealloc_empty_page_range(vm_page_t page, unsigned long nr_pages) +{ + unsigned long i, flags; + + for (i = 0; i < nr_pages; i++) + balloon_append(page + i); + + wakeup(balloon_process); +} + +#endif Added: user/kmacy/releng_7_2_xen/sys/dev/xen/blkback/blkback.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/kmacy/releng_7_2_xen/sys/dev/xen/blkback/blkback.c Thu May 28 19:05:26 2009 (r192990) @@ -0,0 +1,1349 @@ +/* + * Copyright (c) 2006, Cisco Systems, Inc. + * 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. + * 3. Neither the name of Cisco Systems, Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/socket.h> +#include <sys/queue.h> +#include <sys/taskqueue.h> +#include <sys/namei.h> +#include <sys/proc.h> +#include <sys/filedesc.h> +#include <sys/vnode.h> +#include <sys/fcntl.h> +#include <sys/disk.h> +#include <sys/bio.h> + +#include <sys/module.h> +#include <sys/bus.h> +#include <sys/sysctl.h> + +#include <geom/geom.h> + +#include <vm/vm_extern.h> +#include <vm/vm_kern.h> + +#include <machine/xen-os.h> +#include <machine/hypervisor.h> +#include <machine/hypervisor-ifs.h> +#include <machine/xen_intr.h> +#include <machine/evtchn.h> +#include <machine/xenbus.h> +#include <machine/gnttab.h> +#include <machine/xen-public/memory.h> +#include <dev/xen/xenbus/xenbus_comms.h> + + +#if XEN_BLKBACK_DEBUG +#define DPRINTF(fmt, args...) \ + printf("blkback (%s:%d): " fmt, __FUNCTION__, __LINE__, ##args) +#else +#define DPRINTF(fmt, args...) ((void)0) +#endif + +#define WPRINTF(fmt, args...) \ + printf("blkback (%s:%d): " fmt, __FUNCTION__, __LINE__, ##args) + +#define BLKBACK_INVALID_HANDLE (~0) + +struct ring_ref { + vm_offset_t va; + grant_handle_t handle; + uint64_t bus_addr; +}; + +typedef struct blkback_info { + + /* Schedule lists */ + STAILQ_ENTRY(blkback_info) next_req; + int on_req_sched_list; + + struct xenbus_device *xdev; + XenbusState frontend_state; + + domid_t domid; + + int state; + int ring_connected; + struct ring_ref rr; + blkif_back_ring_t ring; + evtchn_port_t evtchn; + int irq; + void *irq_cookie; + + int ref_cnt; + + int handle; + char *mode; + char *type; + char *dev_name; + + struct vnode *vn; + struct cdev *cdev; + struct cdevsw *csw; + u_int sector_size; + int sector_size_shift; + off_t media_size; + u_int media_num_sectors; + int major; + int minor; + int read_only; + + struct mtx blk_ring_lock; + + device_t ndev; + + /* Stats */ + int st_rd_req; + int st_wr_req; + int st_oo_req; + int st_err_req; +} blkif_t; + +/* + * These are rather arbitrary. They are fairly large because adjacent requests + * pulled from a communication ring are quite likely to end up being part of + * the same scatter/gather request at the disc. + * + * ** TRY INCREASING 'blkif_reqs' IF WRITE SPEEDS SEEM TOO LOW ** + * + * This will increase the chances of being able to write whole tracks. + * 64 should be enough to keep us competitive with Linux. + */ +static int blkif_reqs = 64; +TUNABLE_INT("xen.vbd.blkif_reqs", &blkif_reqs); + +static int mmap_pages; + +/* + * Each outstanding request that we've passed to the lower device layers has a + * 'pending_req' allocated to it. Each buffer_head that completes decrements + * the pendcnt towards zero. When it hits zero, the specified domain has a + * response queued for it, with the saved 'id' passed back. + */ +typedef struct pending_req { + blkif_t *blkif; + uint64_t id; + int nr_pages; + int pendcnt; + unsigned short operation; + int status; + STAILQ_ENTRY(pending_req) free_list; +} pending_req_t; + +static pending_req_t *pending_reqs; +static STAILQ_HEAD(pending_reqs_list, pending_req) pending_free = + STAILQ_HEAD_INITIALIZER(pending_free); +static struct mtx pending_free_lock; + +static STAILQ_HEAD(blkback_req_sched_list, blkback_info) req_sched_list = + STAILQ_HEAD_INITIALIZER(req_sched_list); +static struct mtx req_sched_list_lock; + +static unsigned long mmap_vstart; +static unsigned long *pending_vaddrs; +static grant_handle_t *pending_grant_handles; + +static struct task blk_req_task; + +/* Protos */ +static void disconnect_ring(blkif_t *blkif); +static int vbd_add_dev(struct xenbus_device *xdev); + +static inline int vaddr_pagenr(pending_req_t *req, int seg) +{ + return (req - pending_reqs) * BLKIF_MAX_SEGMENTS_PER_REQUEST + seg; +} + +static inline unsigned long vaddr(pending_req_t *req, int seg) +{ + return pending_vaddrs[vaddr_pagenr(req, seg)]; +} + +#define pending_handle(_req, _seg) \ + (pending_grant_handles[vaddr_pagenr(_req, _seg)]) + +static unsigned long +alloc_empty_page_range(unsigned long nr_pages) +{ + void *pages; + int i = 0, j = 0; + multicall_entry_t mcl[17]; + unsigned long mfn_list[16]; + struct xen_memory_reservation reservation = { + .extent_start = mfn_list, + .nr_extents = 0, + .address_bits = 0, + .extent_order = 0, + .domid = DOMID_SELF + }; + + pages = malloc(nr_pages*PAGE_SIZE, M_DEVBUF, M_NOWAIT); + if (pages == NULL) + return 0; + + memset(mcl, 0, sizeof(mcl)); + + while (i < nr_pages) { + unsigned long va = (unsigned long)pages + (i++ * PAGE_SIZE); + + mcl[j].op = __HYPERVISOR_update_va_mapping; + mcl[j].args[0] = va; + + mfn_list[j++] = vtomach(va) >> PAGE_SHIFT; + + xen_phys_machine[(vtophys(va) >> PAGE_SHIFT)] = INVALID_P2M_ENTRY; + + if (j == 16 || i == nr_pages) { + mcl[j-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_LOCAL; + + reservation.nr_extents = j; + + mcl[j].op = __HYPERVISOR_memory_op; + mcl[j].args[0] = XENMEM_decrease_reservation; + mcl[j].args[1] = (unsigned long)&reservation; + + (void)HYPERVISOR_multicall(mcl, j+1); + + mcl[j-1].args[MULTI_UVMFLAGS_INDEX] = 0; + j = 0; + } + } + + return (unsigned long)pages; +} + +static pending_req_t * +alloc_req(void) +{ + pending_req_t *req; + mtx_lock(&pending_free_lock); + if ((req = STAILQ_FIRST(&pending_free))) { + STAILQ_REMOVE(&pending_free, req, pending_req, free_list); + STAILQ_NEXT(req, free_list) = NULL; + } + mtx_unlock(&pending_free_lock); + return req; +} + +static void +free_req(pending_req_t *req) +{ + int was_empty; + + mtx_lock(&pending_free_lock); + was_empty = STAILQ_EMPTY(&pending_free); + STAILQ_INSERT_TAIL(&pending_free, req, free_list); + mtx_unlock(&pending_free_lock); + if (was_empty) + taskqueue_enqueue(taskqueue_swi, &blk_req_task); +} + +static void +fast_flush_area(pending_req_t *req) +{ + struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST]; + unsigned int i, invcount = 0; + grant_handle_t handle; + int ret; + + for (i = 0; i < req->nr_pages; i++) { + handle = pending_handle(req, i); + if (handle == BLKBACK_INVALID_HANDLE) + continue; + unmap[invcount].host_addr = vaddr(req, i); + unmap[invcount].dev_bus_addr = 0; + unmap[invcount].handle = handle; + pending_handle(req, i) = BLKBACK_INVALID_HANDLE; + invcount++; + } + + ret = HYPERVISOR_grant_table_op( + GNTTABOP_unmap_grant_ref, unmap, invcount); + PANIC_IF(ret); +} + +static void +blkif_get(blkif_t *blkif) +{ + atomic_add_int(&blkif->ref_cnt, 1); +} + +static void +blkif_put(blkif_t *blkif) +{ + if (atomic_fetchadd_int(&blkif->ref_cnt, -1) == 1) { + DPRINTF("Removing %x\n", (unsigned int)blkif); + disconnect_ring(blkif); + if (blkif->mode) + free(blkif->mode, M_DEVBUF); + if (blkif->type) + free(blkif->type, M_DEVBUF); + if (blkif->dev_name) + free(blkif->dev_name, M_DEVBUF); + free(blkif, M_DEVBUF); + } +} + +static int +blkif_create(struct xenbus_device *xdev, long handle, char *mode, char *type, char *params) +{ + blkif_t *blkif; + + blkif = (blkif_t *)malloc(sizeof(*blkif), M_DEVBUF, M_NOWAIT | M_ZERO); + if (!blkif) + return ENOMEM; + + DPRINTF("Created %x\n", (unsigned int)blkif); + + blkif->ref_cnt = 1; + blkif->domid = xdev->otherend_id; + blkif->handle = handle; + blkif->mode = mode; + blkif->type = type; + blkif->dev_name = params; + blkif->xdev = xdev; + xdev->data = blkif; + + mtx_init(&blkif->blk_ring_lock, "blk_ring_ock", "blkback ring lock", MTX_DEF); + + if (strcmp(mode, "w")) + blkif->read_only = 1; + + return 0; +} + +static void +add_to_req_schedule_list_tail(blkif_t *blkif) +{ + if (!blkif->on_req_sched_list) { + mtx_lock(&req_sched_list_lock); + if (!blkif->on_req_sched_list && (blkif->state == XenbusStateConnected)) { + blkif_get(blkif); + STAILQ_INSERT_TAIL(&req_sched_list, blkif, next_req); + blkif->on_req_sched_list = 1; + taskqueue_enqueue(taskqueue_swi, &blk_req_task); + } + mtx_unlock(&req_sched_list_lock); + } +} + +/* This routine does not call blkif_get(), does not schedule the blk_req_task to run, + and assumes that the state is connected */ +static void +add_to_req_schedule_list_tail2(blkif_t *blkif) +{ + mtx_lock(&req_sched_list_lock); + if (!blkif->on_req_sched_list) { + STAILQ_INSERT_TAIL(&req_sched_list, blkif, next_req); + blkif->on_req_sched_list = 1; + } + mtx_unlock(&req_sched_list_lock); +} + +/* Removes blkif from front of list and does not call blkif_put() (caller must) */ +static blkif_t * +remove_from_req_schedule_list(void) +{ + blkif_t *blkif; + + mtx_lock(&req_sched_list_lock); + + if ((blkif = STAILQ_FIRST(&req_sched_list))) { + STAILQ_REMOVE(&req_sched_list, blkif, blkback_info, next_req); + STAILQ_NEXT(blkif, next_req) = NULL; + blkif->on_req_sched_list = 0; + } + + mtx_unlock(&req_sched_list_lock); + + return blkif; +} + +static void +make_response(blkif_t *blkif, uint64_t id, + unsigned short op, int st) +{ + blkif_response_t *resp; + blkif_back_ring_t *blk_ring = &blkif->ring; + int more_to_do = 0; + int notify; + + mtx_lock(&blkif->blk_ring_lock); + + + /* Place on the response ring for the relevant domain. */ + resp = RING_GET_RESPONSE(blk_ring, blk_ring->rsp_prod_pvt); + resp->id = id; + resp->operation = op; + resp->status = st; + blk_ring->rsp_prod_pvt++; + RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(blk_ring, notify); + + if (blk_ring->rsp_prod_pvt == blk_ring->req_cons) { + /* + * Tail check for pending requests. Allows frontend to avoid + * notifications if requests are already in flight (lower + * overheads and promotes batching). + */ + RING_FINAL_CHECK_FOR_REQUESTS(blk_ring, more_to_do); + + } else if (RING_HAS_UNCONSUMED_REQUESTS(blk_ring)) + more_to_do = 1; + + mtx_unlock(&blkif->blk_ring_lock); + + if (more_to_do) + add_to_req_schedule_list_tail(blkif); + + if (notify) + notify_remote_via_irq(blkif->irq); +} *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905281905.n4SJ5RBT046990>