# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1201015906 25200
# Node ID c779f9e01072a95ded3edb2b5ec3d5a915b07828
# Parent 71a415f9179bbd2bf630520949fd5da24187c119
# Parent 346ab9d4d2acd135630c316e8d244c63066900ca
merge with linux-2.6.18-xen.hg (staging)
---
arch/i386/kernel/cpu/mtrr/main-xen.c | 3 -
arch/i386/kernel/fixup.c | 8 +--
arch/i386/kernel/io_apic-xen.c | 4 -
arch/i386/kernel/ioport-xen.c | 3 -
arch/i386/kernel/process-xen.c | 10 ++--
arch/i386/kernel/quirks-xen.c | 2
arch/i386/kernel/setup-xen.c | 9 ++-
arch/i386/kernel/time-xen.c | 42 ++++++++++++++----
arch/i386/kernel/traps-xen.c | 6 ++
arch/i386/mm/hypervisor.c | 6 +-
arch/i386/oprofile/xenoprof.c | 4 -
arch/x86_64/kernel/io_apic-xen.c | 2
arch/x86_64/kernel/ioport-xen.c | 5 +-
arch/x86_64/kernel/process-xen.c | 17 ++++---
arch/x86_64/kernel/setup-xen.c | 6 +-
arch/x86_64/kernel/setup64-xen.c | 4 +
arch/x86_64/kernel/traps-xen.c | 4 -
arch/x86_64/mm/init-xen.c | 10 ++--
drivers/xen/blkback/blkback.c | 10 +++-
drivers/xen/blktap/blktap.c | 15 ++++++
drivers/xen/core/evtchn.c | 12 +++--
drivers/xen/core/machine_kexec.c | 4 -
drivers/xen/core/machine_reboot.c | 10 ++--
drivers/xen/netback/netback.c | 26 +++++++----
drivers/xen/netfront/netfront.c | 11 +++-
drivers/xen/xenoprof/xenoprofile.c | 12 +++--
include/asm-i386/mach-xen/asm/desc.h | 8 ++-
include/asm-i386/mach-xen/asm/hypercall.h | 62 ++++++++++++++-------------
include/asm-i386/mach-xen/asm/hypervisor.h | 25 +++++-----
include/asm-i386/mach-xen/asm/processor.h | 10 ++--
include/asm-x86_64/mach-xen/asm/desc.h | 8 ++-
include/asm-x86_64/mach-xen/asm/hypercall.h | 64 ++++++++++++++--------------
include/asm-x86_64/mach-xen/asm/processor.h | 6 +-
include/xen/evtchn.h | 2
include/xen/hypercall.h | 7 ++-
35 files changed, 264 insertions(+), 173 deletions(-)
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/cpu/mtrr/main-xen.c
--- a/arch/i386/kernel/cpu/mtrr/main-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/cpu/mtrr/main-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -18,7 +18,8 @@ void generic_get_mtrr(unsigned int reg,
op.cmd = XENPF_read_memtype;
op.u.read_memtype.reg = reg;
- (void)HYPERVISOR_platform_op(&op);
+ if (unlikely(HYPERVISOR_platform_op(&op)))
+ memset(&op.u.read_memtype, 0, sizeof(op.u.read_memtype));
*size = op.u.read_memtype.nr_mfns;
*base = op.u.read_memtype.mfn;
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/fixup.c
--- a/arch/i386/kernel/fixup.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/fixup.c Tue Jan 22 08:31:46 2008 -0700
@@ -46,8 +46,8 @@ fastcall void do_fixup_4gb_segment(struc
if (current->tgid == 1)
return;
- HYPERVISOR_vm_assist(
- VMASST_CMD_disable, VMASST_TYPE_4gb_segments_notify);
+ VOID(HYPERVISOR_vm_assist(VMASST_CMD_disable,
+ VMASST_TYPE_4gb_segments_notify));
if (test_and_set_bit(0, &printed))
return;
@@ -81,8 +81,8 @@ fastcall void do_fixup_4gb_segment(struc
static int __init fixup_init(void)
{
- HYPERVISOR_vm_assist(
- VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
+ WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+ VMASST_TYPE_4gb_segments_notify));
return 0;
}
__initcall(fixup_init);
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/io_apic-xen.c
--- a/arch/i386/kernel/io_apic-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/io_apic-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -75,7 +75,7 @@ static inline void xen_io_apic_write(uns
apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
apic_op.reg = reg;
apic_op.value = value;
- HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
}
#define io_apic_read(a,r) xen_io_apic_read(a,r)
@@ -2506,7 +2506,7 @@ static int __init io_apic_bug_finalize(v
struct xen_platform_op op = { .cmd = XENPF_platform_quirk };
op.u.platform_quirk.quirk_id = sis_apic_bug ?
QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
- HYPERVISOR_platform_op(&op);
+ VOID(HYPERVISOR_platform_op(&op));
}
return 0;
}
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/ioport-xen.c
--- a/arch/i386/kernel/ioport-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/ioport-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -83,7 +83,8 @@ asmlinkage long sys_ioperm(unsigned long
set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
set_iobitmap.nr_ports = IO_BITMAP_BITS;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+ &set_iobitmap));
}
set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/process-xen.c
--- a/arch/i386/kernel/process-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/process-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -137,8 +137,7 @@ static inline void play_dead(void)
idle_task_exit();
local_irq_disable();
cpu_clear(smp_processor_id(), cpu_initialized);
- preempt_enable_no_resched();
- HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+ xen_halt();
cpu_bringup();
}
#else
@@ -309,7 +308,8 @@ void exit_thread(void)
struct thread_struct *t = &tsk->thread;
struct physdev_set_iobitmap set_iobitmap;
memset(&set_iobitmap, 0, sizeof(set_iobitmap));
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+ &set_iobitmap));
kfree(t->io_bitmap_ptr);
t->io_bitmap_ptr = NULL;
clear_thread_flag(TIF_IO_BITMAP);
@@ -616,7 +616,9 @@ struct task_struct fastcall * __switch_t
mcl++;
}
- (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
+ BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
+ if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
+ BUG();
/*
* Restore %fs and %gs if needed.
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/quirks-xen.c
--- a/arch/i386/kernel/quirks-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/quirks-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -34,7 +34,7 @@ static void __devinit quirk_intel_irqbal
printk(KERN_INFO "Disabling irq balancing and affinity\n");
op.cmd = XENPF_platform_quirk;
op.u.platform_quirk.quirk_id = QUIRK_NOIRQBALANCING;
- (void)HYPERVISOR_platform_op(&op);
+ WARN_ON(HYPERVISOR_platform_op(&op));
}
/* put back the original value for config space*/
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/setup-xen.c
--- a/arch/i386/kernel/setup-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/setup-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -1621,9 +1621,10 @@ void __init setup_arch(char **cmdline_p)
/* Register a call for panic conditions. */
atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
- HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_writable_pagetables);
+ WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+ VMASST_TYPE_4gb_segments));
+ WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+ VMASST_TYPE_writable_pagetables));
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
early_cpu_init();
@@ -1827,7 +1828,7 @@ void __init setup_arch(char **cmdline_p)
efi_map_memmap();
set_iopl.iopl = 1;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
#ifdef CONFIG_ACPI
if (!is_initial_xendomain()) {
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/time-xen.c
--- a/arch/i386/kernel/time-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/time-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -519,7 +519,7 @@ static void sync_xen_wallclock(unsigned
op.u.settime.secs = sec;
op.u.settime.nsecs = nsec;
op.u.settime.system_time = processed_system_time;
- HYPERVISOR_platform_op(&op);
+ WARN_ON(HYPERVISOR_platform_op(&op));
update_wallclock();
@@ -914,8 +914,16 @@ void __init time_init(void)
}
#endif
- HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
- &xen_set_periodic_tick);
+ switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
+ &xen_set_periodic_tick)) {
+ case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+ case -ENOSYS:
+#endif
+ break;
+ default:
+ BUG();
+ }
get_time_values_from_xen(0);
@@ -1026,7 +1034,7 @@ void halt(void)
void halt(void)
{
if (irqs_disabled())
- HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+ VOID(HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL));
}
EXPORT_SYMBOL(halt);
@@ -1038,8 +1046,16 @@ void time_resume(void)
init_cpu_khz();
for_each_online_cpu(cpu) {
- HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
- &xen_set_periodic_tick);
+ switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
+ &xen_set_periodic_tick)) {
+ case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+ case -ENOSYS:
+#endif
+ break;
+ default:
+ BUG();
+ }
get_time_values_from_xen(cpu);
per_cpu(processed_system_time, cpu) =
per_cpu(shadow_time, 0).system_timestamp;
@@ -1060,8 +1076,16 @@ int __cpuinit local_setup_timer(unsigned
BUG_ON(cpu == 0);
- HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
- &xen_set_periodic_tick);
+ switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
+ &xen_set_periodic_tick)) {
+ case 0:
+#if CONFIG_XEN_COMPAT <= 0x030004
+ case -ENOSYS:
+#endif
+ break;
+ default:
+ BUG();
+ }
do {
seq = read_seqbegin(&xtime_lock);
@@ -1109,7 +1133,7 @@ static int time_cpufreq_notifier(struct
op.u.change_freq.flags = 0;
op.u.change_freq.cpu = freq->cpu;
op.u.change_freq.freq = (u64)freq->new * 1000;
- HYPERVISOR_platform_op(&op);
+ WARN_ON(HYPERVISOR_platform_op(&op));
return 0;
}
diff -r 71a415f9179b -r c779f9e01072 arch/i386/kernel/traps-xen.c
--- a/arch/i386/kernel/traps-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/kernel/traps-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -1121,7 +1121,11 @@ static trap_info_t trap_table[] = {
void __init trap_init(void)
{
- HYPERVISOR_set_trap_table(trap_table);
+ int ret;
+
+ ret = HYPERVISOR_set_trap_table(trap_table);
+ if (ret)
+ printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
if (cpu_has_fxsr) {
/*
diff -r 71a415f9179b -r c779f9e01072 arch/i386/mm/hypervisor.c
--- a/arch/i386/mm/hypervisor.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/mm/hypervisor.c Tue Jan 22 08:31:46 2008 -0700
@@ -181,12 +181,12 @@ void xen_pgd_unpin(unsigned long ptr)
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
}
-void xen_set_ldt(unsigned long ptr, unsigned long len)
+void xen_set_ldt(const void *ptr, unsigned int ents)
{
struct mmuext_op op;
op.cmd = MMUEXT_SET_LDT;
- op.arg1.linear_addr = ptr;
- op.arg2.nr_ents = len;
+ op.arg1.linear_addr = (unsigned long)ptr;
+ op.arg2.nr_ents = ents;
BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
}
diff -r 71a415f9179b -r c779f9e01072 arch/i386/oprofile/xenoprof.c
--- a/arch/i386/oprofile/xenoprof.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/i386/oprofile/xenoprof.c Tue Jan 22 08:31:46 2008 -0700
@@ -52,8 +52,8 @@ void xenoprof_arch_counter(void)
counter.kernel = (uint32_t)counter_config[i].kernel;
counter.user = (uint32_t)counter_config[i].user;
counter.unit_mask = (uint64_t)counter_config[i].unit_mask;
- HYPERVISOR_xenoprof_op(XENOPROF_counter,
- &counter);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_counter,
+ &counter));
}
}
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/io_apic-xen.c
--- a/arch/x86_64/kernel/io_apic-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/io_apic-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -123,7 +123,7 @@ static inline void xen_io_apic_write(uns
apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
apic_op.reg = reg;
apic_op.value = value;
- HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
}
#define io_apic_read(a,r) xen_io_apic_read(a,r)
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/ioport-xen.c
--- a/arch/x86_64/kernel/ioport-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/ioport-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -61,7 +61,8 @@ asmlinkage long sys_ioperm(unsigned long
set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
set_iobitmap.nr_ports = IO_BITMAP_BITS;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+ &set_iobitmap));
}
set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
@@ -93,7 +94,7 @@ asmlinkage long sys_iopl(unsigned int ne
/* Force the change at ring 0. */
set_iopl.iopl = (new_iopl == 0) ? 1 : new_iopl;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
return 0;
}
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/process-xen.c
--- a/arch/x86_64/kernel/process-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/process-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -151,8 +151,7 @@ static inline void play_dead(void)
idle_task_exit();
local_irq_disable();
cpu_clear(smp_processor_id(), cpu_initialized);
- preempt_enable_no_resched();
- HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
+ xen_halt();
cpu_bringup();
}
#else
@@ -318,7 +317,8 @@ void exit_thread(void)
put_cpu();
#endif
#ifdef CONFIG_XEN
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &iobmp_op);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
+ &iobmp_op));
#endif
t->io_bitmap_max = 0;
}
@@ -326,7 +326,7 @@ void exit_thread(void)
void load_gs_index(unsigned gs)
{
- HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs);
+ WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs));
}
void flush_thread(void)
@@ -550,7 +550,10 @@ __switch_to(struct task_struct *prev_p,
mcl++;
}
- (void)HYPERVISOR_multicall(_mcl, mcl - _mcl);
+ BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
+ if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
+ BUG();
+
/*
* Switch DS and ES.
* This won't pick up thread selector changes, but I guess that is ok.
@@ -568,13 +571,13 @@ __switch_to(struct task_struct *prev_p,
loadsegment(fs, next->fsindex);
if (next->fs)
- HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs);
+ WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs));
if (unlikely(next->gsindex))
load_gs_index(next->gsindex);
if (next->gs)
- HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs);
+ WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs));
/*
* Switch the PDA context.
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/setup-xen.c
--- a/arch/x86_64/kernel/setup-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/setup-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -607,8 +607,8 @@ void __init setup_arch(char **cmdline_p)
copy_edid();
- HYPERVISOR_vm_assist(VMASST_CMD_enable,
- VMASST_TYPE_writable_pagetables);
+ WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
+ VMASST_TYPE_writable_pagetables));
ARCH_SETUP
#else
@@ -940,7 +940,7 @@ void __init setup_arch(char **cmdline_p)
struct physdev_set_iopl set_iopl;
set_iopl.iopl = 1;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
if (is_initial_xendomain()) {
#ifdef CONFIG_VT
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/setup64-xen.c
--- a/arch/x86_64/kernel/setup64-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/setup64-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -171,7 +171,9 @@ void pda_init(int cpu)
#ifndef CONFIG_XEN
wrmsrl(MSR_GS_BASE, pda);
#else
- HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL, (unsigned long)pda);
+ if (HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL,
+ (unsigned long)pda))
+ BUG();
#endif
pda->cpunumber = cpu;
pda->irqcount = -1;
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/kernel/traps-xen.c
--- a/arch/x86_64/kernel/traps-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/kernel/traps-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -1120,10 +1120,8 @@ void __init trap_init(void)
int ret;
ret = HYPERVISOR_set_trap_table(trap_table);
-
if (ret)
- printk("HYPERVISOR_set_trap_table faild: error %d\n",
- ret);
+ printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
/*
* Should be a barrier for any external CPU state.
diff -r 71a415f9179b -r c779f9e01072 arch/x86_64/mm/init-xen.c
--- a/arch/x86_64/mm/init-xen.c Fri Jan 18 14:20:59 2008 -0700
+++ b/arch/x86_64/mm/init-xen.c Tue Jan 22 08:31:46 2008 -0700
@@ -593,7 +593,8 @@ static void __init extend_init_mapping(u
/* Kill mapping of low 1MB. */
while (va < (unsigned long)&_text) {
- HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
+ if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+ BUG();
va += PAGE_SIZE;
}
@@ -626,7 +627,8 @@ static void __init extend_init_mapping(u
pmd = (pmd_t *)&page[pmd_index(va)];
if (pmd_none(*pmd))
break;
- HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0);
+ if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
+ BUG();
va += PAGE_SIZE;
}
}
@@ -679,8 +681,8 @@ static void xen_finish_init_mapping(void
start = PAGE_ALIGN((unsigned long)_end);
end = __START_KERNEL_map + (table_end << PAGE_SHIFT);
for (; start < end; start += PAGE_SIZE)
- WARN_ON(HYPERVISOR_update_va_mapping(
- start, __pte_ma(0), 0));
+ if (HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0))
+ BUG();
/* Allocate pte's for initial fixmaps from 'start_pfn' allocator. */
table_end = ~0UL;
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/blkback/blkback.c
--- a/drivers/xen/blkback/blkback.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/blkback/blkback.c Tue Jan 22 08:31:46 2008 -0700
@@ -312,7 +312,7 @@ static int do_block_io_op(blkif_t *blkif
rp = blk_rings->common.sring->req_prod;
rmb(); /* Ensure we see queued requests up to 'rp'. */
- while ((rc != rp)) {
+ while (rc != rp) {
if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc))
break;
@@ -320,6 +320,11 @@ static int do_block_io_op(blkif_t *blkif
pending_req = alloc_req();
if (NULL == pending_req) {
blkif->st_oo_req++;
+ more_to_do = 1;
+ break;
+ }
+
+ if (kthread_should_stop()) {
more_to_do = 1;
break;
}
@@ -354,7 +359,7 @@ static int do_block_io_op(blkif_t *blkif
default:
/* A good sign something is wrong: sleep for a while to
* avoid excessive CPU consumption by a bad guest. */
- mdelay(1);
+ msleep(1);
DPRINTK("error: unknown block io operation [%d]\n",
req.operation);
make_response(blkif, req.id, req.operation,
@@ -517,6 +522,7 @@ static void dispatch_rw_block_io(blkif_t
fail_response:
make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
free_req(pending_req);
+ msleep(1); /* back off a bit */
}
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/blktap/blktap.c
--- a/drivers/xen/blktap/blktap.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/blktap/blktap.c Tue Jan 22 08:31:46 2008 -0700
@@ -52,6 +52,7 @@
#include <linux/major.h>
#include <linux/gfp.h>
#include <linux/poll.h>
+#include <linux/delay.h>
#include <asm/tlbflush.h>
#define MAX_TAP_DEV 256 /*the maximum number of tapdisk ring devices */
@@ -1242,6 +1243,11 @@ static int do_block_io_op(blkif_t *blkif
break;
}
+ if (kthread_should_stop()) {
+ more_to_do = 1;
+ break;
+ }
+
switch (blkif->blk_protocol) {
case BLKIF_PROTOCOL_NATIVE:
memcpy(&req, RING_GET_REQUEST(&blk_rings->native, rc),
@@ -1270,6 +1276,9 @@ static int do_block_io_op(blkif_t *blkif
break;
default:
+ /* A good sign something is wrong: sleep for a while to
+ * avoid excessive CPU consumption by a bad guest. */
+ msleep(1);
WPRINTK("unknown operation [%d]\n",
req.operation);
make_response(blkif, req.id, req.operation,
@@ -1277,6 +1286,9 @@ static int do_block_io_op(blkif_t *blkif
free_req(pending_req);
break;
}
+
+ /* Yield point for this unbounded loop. */
+ cond_resched();
}
blktap_kick_user(blkif->dev_num);
@@ -1503,7 +1515,8 @@ static void dispatch_rw_block_io(blkif_t
fail_response:
make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
free_req(pending_req);
-}
+ msleep(1); /* back off a bit */
+}
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/core/evtchn.c
--- a/drivers/xen/core/evtchn.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/core/evtchn.c Tue Jan 22 08:31:46 2008 -0700
@@ -215,7 +215,7 @@ static inline void exit_idle(void) {}
*/
void force_evtchn_callback(void)
{
- (void)HYPERVISOR_xen_version(0, NULL);
+ VOID(HYPERVISOR_xen_version(0, NULL));
}
/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
EXPORT_SYMBOL(force_evtchn_callback);
@@ -749,14 +749,15 @@ static inline void pirq_unmask_notify(in
{
struct physdev_eoi eoi = { .irq = pirq };
if (unlikely(test_bit(pirq, pirq_needs_eoi)))
- (void)HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi);
+ VOID(HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi));
}
static inline void pirq_query_unmask(int pirq)
{
struct physdev_irq_status_query irq_status;
irq_status.irq = pirq;
- (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
+ if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
+ irq_status.flags = 0;
clear_bit(pirq, pirq_needs_eoi);
if (irq_status.flags & XENIRQSTAT_needs_eoi)
set_bit(pirq, pirq_needs_eoi);
@@ -874,7 +875,8 @@ int irq_ignore_unhandled(unsigned int ir
if (!is_running_on_xen())
return 0;
- (void)HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status);
+ if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
+ return 0;
return !!(irq_status.flags & XENIRQSTAT_shared);
}
@@ -911,7 +913,7 @@ void unmask_evtchn(int port)
/* Slow path (hypercall) if this is a non-local port. */
if (unlikely(cpu != cpu_from_evtchn(port))) {
struct evtchn_unmask unmask = { .port = port };
- (void)HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask);
+ VOID(HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask));
return;
}
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/core/machine_kexec.c
--- a/drivers/xen/core/machine_kexec.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/core/machine_kexec.c Tue Jan 22 08:31:46 2008 -0700
@@ -151,7 +151,7 @@ void xen_machine_kexec_unload(struct kim
memset(&xkl, 0, sizeof(xkl));
xkl.type = image->type;
- HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl);
+ WARN_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl));
}
/*
@@ -168,7 +168,7 @@ NORET_TYPE void machine_kexec(struct kim
memset(&xke, 0, sizeof(xke));
xke.type = image->type;
- HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke);
+ VOID(HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke));
panic("KEXEC_CMD_kexec hypercall should not return\n");
}
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/core/machine_reboot.c
--- a/drivers/xen/core/machine_reboot.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/core/machine_reboot.c Tue Jan 22 08:31:46 2008 -0700
@@ -60,8 +60,8 @@ static void pre_suspend(void)
static void pre_suspend(void)
{
HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
- HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
- __pte_ma(0), 0);
+ WARN_ON(HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
+ __pte_ma(0), 0));
xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
xen_start_info->console.domU.mfn =
@@ -88,8 +88,10 @@ static void post_suspend(int suspend_can
}
shinfo_mfn = xen_start_info->shared_info >> PAGE_SHIFT;
- HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
- pfn_pte_ma(shinfo_mfn, PAGE_KERNEL), 0);
+ if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
+ pfn_pte_ma(shinfo_mfn, PAGE_KERNEL),
+ 0))
+ BUG();
HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
memset(empty_zero_page, 0, PAGE_SIZE);
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/netback/netback.c
--- a/drivers/xen/netback/netback.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/netback/netback.c Tue Jan 22 08:31:46 2008 -0700
@@ -142,14 +142,16 @@ static int check_mfn(int nr)
.extent_order = 0,
.domid = DOMID_SELF
};
+ int rc;
if (likely(alloc_index >= nr))
return 0;
set_xen_guest_handle(reservation.extent_start, mfn_list + alloc_index);
reservation.nr_extents = MAX_MFN_ALLOC - alloc_index;
- alloc_index += HYPERVISOR_memory_op(XENMEM_increase_reservation,
- &reservation);
+ rc = HYPERVISOR_memory_op(XENMEM_increase_reservation, &reservation);
+ if (likely(rc > 0))
+ alloc_index += rc;
return alloc_index >= nr ? 0 : -ENOMEM;
}
@@ -345,7 +347,7 @@ int xen_network_done(void)
struct netrx_pending_operations {
unsigned trans_prod, trans_cons;
- unsigned mmu_prod, mmu_cons;
+ unsigned mmu_prod, mmu_mcl;
unsigned mcl_prod, mcl_cons;
unsigned copy_prod, copy_cons;
unsigned meta_prod, meta_cons;
@@ -601,8 +603,12 @@ static void net_rx_action(unsigned long
break;
}
- if (npo.mcl_prod &&
- !xen_feature(XENFEAT_auto_translated_physmap)) {
+ BUG_ON(npo.meta_prod > ARRAY_SIZE(meta));
+
+ npo.mmu_mcl = npo.mcl_prod;
+ if (npo.mcl_prod) {
+ BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap));
+ BUG_ON(npo.mmu_prod > ARRAY_SIZE(rx_mmu));
mcl = npo.mcl + npo.mcl_prod++;
BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
@@ -616,6 +622,7 @@ static void net_rx_action(unsigned long
}
if (npo.trans_prod) {
+ BUG_ON(npo.trans_prod > ARRAY_SIZE(grant_trans_op));
mcl = npo.mcl + npo.mcl_prod++;
mcl->op = __HYPERVISOR_grant_table_op;
mcl->args[0] = GNTTABOP_transfer;
@@ -624,6 +631,7 @@ static void net_rx_action(unsigned long
}
if (npo.copy_prod) {
+ BUG_ON(npo.copy_prod > ARRAY_SIZE(grant_copy_op));
mcl = npo.mcl + npo.mcl_prod++;
mcl->op = __HYPERVISOR_grant_table_op;
mcl->args[0] = GNTTABOP_copy;
@@ -635,14 +643,12 @@ static void net_rx_action(unsigned long
if (!npo.mcl_prod)
return;
- BUG_ON(npo.copy_prod > NET_RX_RING_SIZE);
- BUG_ON(npo.mmu_prod > NET_RX_RING_SIZE);
- BUG_ON(npo.trans_prod > NET_RX_RING_SIZE);
- BUG_ON(npo.mcl_prod > NET_RX_RING_SIZE+3);
- BUG_ON(npo.meta_prod > NET_RX_RING_SIZE);
+ BUG_ON(npo.mcl_prod > ARRAY_SIZE(rx_mcl));
ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
BUG_ON(ret != 0);
+ /* The mmu_machphys_update() must not fail. */
+ BUG_ON(npo.mmu_mcl && npo.mcl[npo.mmu_mcl].result != 0);
while ((skb = __skb_dequeue(&rxq)) != NULL) {
nr_frags = *(int *)skb->cb;
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/netfront/netfront.c
--- a/drivers/xen/netfront/netfront.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/netfront/netfront.c Tue Jan 22 08:31:46 2008 -0700
@@ -840,11 +840,14 @@ no_skb:
/* Zap PTEs and give away pages in one big
* multicall. */
- (void)HYPERVISOR_multicall(np->rx_mcl, i+1);
+ if (unlikely(HYPERVISOR_multicall(np->rx_mcl, i+1)))
+ BUG();
/* Check return status of HYPERVISOR_memory_op(). */
if (unlikely(np->rx_mcl[i].result != i))
panic("Unable to reduce memory reservation\n");
+ while (i--)
+ BUG_ON(np->rx_mcl[i].result);
} else {
if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
&reservation) != i)
@@ -1447,8 +1450,10 @@ err:
mcl->args[1] = pages_flipped;
mcl->args[2] = 0;
mcl->args[3] = DOMID_SELF;
- (void)HYPERVISOR_multicall(np->rx_mcl,
- pages_flipped + 1);
+ err = HYPERVISOR_multicall_check(np->rx_mcl,
+ pages_flipped + 1,
+ NULL);
+ BUG_ON(err);
}
}
diff -r 71a415f9179b -r c779f9e01072 drivers/xen/xenoprof/xenoprofile.c
--- a/drivers/xen/xenoprof/xenoprofile.c Fri Jan 18 14:20:59 2008 -0700
+++ b/drivers/xen/xenoprof/xenoprofile.c Tue Jan 22 08:31:46 2008 -0700
@@ -346,10 +346,11 @@ static void xenoprof_shutdown(void)
{
xenoprof_enabled = 0;
- HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL));
if (xenoprof_is_primary) {
- HYPERVISOR_xenoprof_op(XENOPROF_release_counters, NULL);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_release_counters,
+ NULL));
active_defined = 0;
}
@@ -376,7 +377,7 @@ static void xenoprof_stop(void)
static void xenoprof_stop(void)
{
if (xenoprof_is_primary)
- HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL));
xenoprof_arch_stop();
}
@@ -419,7 +420,8 @@ static int xenoprof_set_active(int * act
out:
if (ret)
- HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list,
+ NULL));
active_defined = !ret;
return ret;
}
@@ -539,6 +541,6 @@ void xenoprofile_exit(void)
xenoprof_arch_unmap_shared_buffer(&shared_buffer);
if (xenoprof_is_primary) {
unmap_passive_list();
- HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL);
+ WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL));
}
}
diff -r 71a415f9179b -r c779f9e01072 include/asm-i386/mach-xen/asm/desc.h
--- a/include/asm-i386/mach-xen/asm/desc.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/asm-i386/mach-xen/asm/desc.h Tue Jan 22 08:31:46 2008 -0700
@@ -111,7 +111,9 @@ extern int write_ldt_entry(void *ldt, in
static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
{
-#define C(i)
HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN
+ i]), *(u64 *)&t->tls_array[i])
+#define C(i) if
(HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN
+ i]), \
+ *(u64 *)&t->tls_array[i])) \
+ BUG();
C(0); C(1); C(2);
#undef C
}
@@ -125,7 +127,7 @@ static inline void clear_LDT(void)
* it slows down context switching. Noone uses it anyway.
*/
cpu = cpu; /* XXX avoid compiler warning */
- xen_set_ldt(0UL, 0);
+ xen_set_ldt(NULL, 0);
put_cpu();
}
@@ -140,7 +142,7 @@ static inline void load_LDT_nolock(mm_co
if (likely(!count))
segments = NULL;
- xen_set_ldt((unsigned long)segments, count);
+ xen_set_ldt(segments, count);
}
static inline void load_LDT(mm_context_t *pc)
diff -r 71a415f9179b -r c779f9e01072 include/asm-i386/mach-xen/asm/hypercall.h
--- a/include/asm-i386/mach-xen/asm/hypercall.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/asm-i386/mach-xen/asm/hypercall.h Tue Jan 22 08:31:46 2008 -0700
@@ -123,14 +123,14 @@
(type)__res; \
})
-static inline int
+static inline int __must_check
HYPERVISOR_set_trap_table(
const trap_info_t *table)
{
return _hypercall1(int, set_trap_table, table);
}
-static inline int
+static inline int __must_check
HYPERVISOR_mmu_update(
mmu_update_t *req, unsigned int count, unsigned int *success_count,
domid_t domid)
@@ -138,7 +138,7 @@ HYPERVISOR_mmu_update(
return _hypercall4(int, mmu_update, req, count, success_count, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_mmuext_op(
struct mmuext_op *op, unsigned int count, unsigned int *success_count,
domid_t domid)
@@ -146,21 +146,21 @@ HYPERVISOR_mmuext_op(
return _hypercall4(int, mmuext_op, op, count, success_count, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_gdt(
unsigned long *frame_list, unsigned int entries)
{
return _hypercall2(int, set_gdt, frame_list, entries);
}
-static inline int
+static inline int __must_check
HYPERVISOR_stack_switch(
unsigned long ss, unsigned long esp)
{
return _hypercall2(int, stack_switch, ss, esp);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_callbacks(
unsigned long event_selector, unsigned long event_address,
unsigned long failsafe_selector, unsigned long failsafe_address)
@@ -177,21 +177,21 @@ HYPERVISOR_fpu_taskswitch(
return _hypercall1(int, fpu_taskswitch, set);
}
-static inline int
+static inline int __must_check
HYPERVISOR_sched_op_compat(
int cmd, unsigned long arg)
{
return _hypercall2(int, sched_op_compat, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_sched_op(
int cmd, void *arg)
{
return _hypercall2(int, sched_op, cmd, arg);
}
-static inline long
+static inline long __must_check
HYPERVISOR_set_timer_op(
u64 timeout)
{
@@ -200,7 +200,7 @@ HYPERVISOR_set_timer_op(
return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
}
-static inline int
+static inline int __must_check
HYPERVISOR_platform_op(
struct xen_platform_op *platform_op)
{
@@ -208,42 +208,42 @@ HYPERVISOR_platform_op(
return _hypercall1(int, platform_op, platform_op);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_debugreg(
unsigned int reg, unsigned long value)
{
return _hypercall2(int, set_debugreg, reg, value);
}
-static inline unsigned long
+static inline unsigned long __must_check
HYPERVISOR_get_debugreg(
unsigned int reg)
{
return _hypercall1(unsigned long, get_debugreg, reg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_descriptor(
u64 ma, u64 desc)
{
return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
}
-static inline int
+static inline int __must_check
HYPERVISOR_memory_op(
unsigned int cmd, void *arg)
{
return _hypercall2(int, memory_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_multicall(
multicall_entry_t *call_list, unsigned int nr_calls)
{
return _hypercall2(int, multicall, call_list, nr_calls);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_va_mapping(
unsigned long va, pte_t new_val, unsigned long flags)
{
@@ -255,7 +255,7 @@ HYPERVISOR_update_va_mapping(
new_val.pte_low, pte_hi, flags);
}
-static inline int
+static inline int __must_check
HYPERVISOR_event_channel_op(
int cmd, void *arg)
{
@@ -274,28 +274,28 @@ HYPERVISOR_event_channel_op(
return rc;
}
-static inline int
+static inline int __must_check
HYPERVISOR_acm_op(
int cmd, void *arg)
{
return _hypercall2(int, acm_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_xen_version(
int cmd, void *arg)
{
return _hypercall2(int, xen_version, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_console_io(
int cmd, unsigned int count, char *str)
{
return _hypercall3(int, console_io, cmd, count, str);
}
-static inline int
+static inline int __must_check
HYPERVISOR_physdev_op(
int cmd, void *arg)
{
@@ -314,14 +314,14 @@ HYPERVISOR_physdev_op(
return rc;
}
-static inline int
+static inline int __must_check
HYPERVISOR_grant_table_op(
unsigned int cmd, void *uop, unsigned int count)
{
return _hypercall3(int, grant_table_op, cmd, uop, count);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_va_mapping_otherdomain(
unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
{
@@ -333,21 +333,21 @@ HYPERVISOR_update_va_mapping_otherdomain
new_val.pte_low, pte_hi, flags, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_vm_assist(
unsigned int cmd, unsigned int type)
{
return _hypercall2(int, vm_assist, cmd, type);
}
-static inline int
+static inline int __must_check
HYPERVISOR_vcpu_op(
int cmd, unsigned int vcpuid, void *extra_args)
{
return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
}
-static inline int
+static inline int __must_check
HYPERVISOR_suspend(
unsigned long srec)
{
@@ -367,15 +367,17 @@ HYPERVISOR_suspend(
return rc;
}
+#if CONFIG_XEN_COMPAT <= 0x030002
static inline int
HYPERVISOR_nmi_op(
unsigned long op, void *arg)
{
return _hypercall2(int, nmi_op, op, arg);
}
+#endif
#ifndef CONFIG_XEN
-static inline unsigned long
+static inline unsigned long __must_check
HYPERVISOR_hvm_op(
int op, void *arg)
{
@@ -383,21 +385,21 @@ HYPERVISOR_hvm_op(
}
#endif
-static inline int
+static inline int __must_check
HYPERVISOR_callback_op(
int cmd, const void *arg)
{
return _hypercall2(int, callback_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_xenoprof_op(
int op, void *arg)
{
return _hypercall2(int, xenoprof_op, op, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_kexec_op(
unsigned long op, void *args)
{
diff -r 71a415f9179b -r c779f9e01072 include/asm-i386/mach-xen/asm/hypervisor.h
--- a/include/asm-i386/mach-xen/asm/hypervisor.h Fri Jan 18 14:20:59
2008 -0700
+++ b/include/asm-i386/mach-xen/asm/hypervisor.h Tue Jan 22 08:31:46
2008 -0700
@@ -105,7 +105,7 @@ void xen_pgd_pin(unsigned long ptr);
void xen_pgd_pin(unsigned long ptr);
void xen_pgd_unpin(unsigned long ptr);
-void xen_set_ldt(unsigned long ptr, unsigned long bytes);
+void xen_set_ldt(const void *ptr, unsigned int ents);
#ifdef CONFIG_SMP
#include <linux/cpumask.h>
@@ -175,7 +175,7 @@ HYPERVISOR_block(
return rc;
}
-static inline int
+static inline void __noreturn
HYPERVISOR_shutdown(
unsigned int reason)
{
@@ -183,17 +183,16 @@ HYPERVISOR_shutdown(
.reason = reason
};
- int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
-
-#if CONFIG_XEN_COMPAT <= 0x030002
- if (rc == -ENOSYS)
- rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason);
-#endif
-
- return rc;
-}
-
-static inline int
+ VOID(HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown));
+#if CONFIG_XEN_COMPAT <= 0x030002
+ VOID(HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason));
+#endif
+ /* Don't recurse needlessly. */
+ BUG_ON(reason != SHUTDOWN_crash);
+ for(;;);
+}
+
+static inline int __must_check
HYPERVISOR_poll(
evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
{
diff -r 71a415f9179b -r c779f9e01072 include/asm-i386/mach-xen/asm/processor.h
--- a/include/asm-i386/mach-xen/asm/processor.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/asm-i386/mach-xen/asm/processor.h Tue Jan 22 08:31:46 2008 -0700
@@ -513,8 +513,10 @@ static inline void __load_esp0(struct ts
#define load_esp0(tss, thread) \
__load_esp0(tss, thread)
#else
-#define load_esp0(tss, thread) \
- HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)
+#define load_esp0(tss, thread) do { \
+ if (HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)) \
+ BUG(); \
+} while (0)
#endif
#define start_thread(regs, new_eip, new_esp) do { \
@@ -534,7 +536,7 @@ static inline void __load_esp0(struct ts
#define get_debugreg(var, register) \
(var) = HYPERVISOR_get_debugreg((register))
#define set_debugreg(value, register) \
- HYPERVISOR_set_debugreg((register), (value))
+ WARN_ON(HYPERVISOR_set_debugreg((register), (value)))
/*
* Set IOPL bits in EFLAGS from given mask
@@ -545,7 +547,7 @@ static inline void set_iopl_mask(unsigne
/* Force the change at ring 0. */
set_iopl.iopl = (mask == 0) ? 1 : (mask >> 12) & 3;
- HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
+ WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
}
/* Forward declaration, a strange C thing */
diff -r 71a415f9179b -r c779f9e01072 include/asm-x86_64/mach-xen/asm/desc.h
--- a/include/asm-x86_64/mach-xen/asm/desc.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/asm-x86_64/mach-xen/asm/desc.h Tue Jan 22 08:31:46 2008 -0700
@@ -81,7 +81,7 @@ static inline void clear_LDT(void)
* it slows down context switching. Noone uses it anyway.
*/
cpu = cpu; /* XXX avoid compiler warning */
- xen_set_ldt(0UL, 0);
+ xen_set_ldt(NULL, 0);
put_cpu();
}
@@ -229,7 +229,9 @@ static inline void load_TLS(struct threa
gdt[2] = t->tls_array[2];
#endif
#define C(i) \
-
HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN +
i]), t->tls_array[i])
+ if
(HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN +
i]), \
+ t->tls_array[i])) \
+ BUG();
C(0); C(1); C(2);
#undef C
@@ -246,7 +248,7 @@ static inline void load_LDT_nolock (mm_c
if (likely(!count))
segments = NULL;
- xen_set_ldt((unsigned long)segments, count);
+ xen_set_ldt(segments, count);
}
static inline void load_LDT(mm_context_t *pc)
diff -r 71a415f9179b -r c779f9e01072 include/asm-x86_64/mach-xen/asm/hypercall.h
--- a/include/asm-x86_64/mach-xen/asm/hypercall.h Fri Jan 18 14:20:59
2008 -0700
+++ b/include/asm-x86_64/mach-xen/asm/hypercall.h Tue Jan 22 08:31:46
2008 -0700
@@ -129,14 +129,14 @@
(type)__res; \
})
-static inline int
+static inline int __must_check
HYPERVISOR_set_trap_table(
const trap_info_t *table)
{
return _hypercall1(int, set_trap_table, table);
}
-static inline int
+static inline int __must_check
HYPERVISOR_mmu_update(
mmu_update_t *req, unsigned int count, unsigned int *success_count,
domid_t domid)
@@ -144,7 +144,7 @@ HYPERVISOR_mmu_update(
return _hypercall4(int, mmu_update, req, count, success_count, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_mmuext_op(
struct mmuext_op *op, unsigned int count, unsigned int *success_count,
domid_t domid)
@@ -152,21 +152,21 @@ HYPERVISOR_mmuext_op(
return _hypercall4(int, mmuext_op, op, count, success_count, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_gdt(
unsigned long *frame_list, unsigned int entries)
{
return _hypercall2(int, set_gdt, frame_list, entries);
}
-static inline int
+static inline int __must_check
HYPERVISOR_stack_switch(
unsigned long ss, unsigned long esp)
{
return _hypercall2(int, stack_switch, ss, esp);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_callbacks(
unsigned long event_address, unsigned long failsafe_address,
unsigned long syscall_address)
@@ -182,28 +182,28 @@ HYPERVISOR_fpu_taskswitch(
return _hypercall1(int, fpu_taskswitch, set);
}
-static inline int
+static inline int __must_check
HYPERVISOR_sched_op_compat(
int cmd, unsigned long arg)
{
return _hypercall2(int, sched_op_compat, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_sched_op(
int cmd, void *arg)
{
return _hypercall2(int, sched_op, cmd, arg);
}
-static inline long
+static inline long __must_check
HYPERVISOR_set_timer_op(
u64 timeout)
{
return _hypercall1(long, set_timer_op, timeout);
}
-static inline int
+static inline int __must_check
HYPERVISOR_platform_op(
struct xen_platform_op *platform_op)
{
@@ -211,49 +211,49 @@ HYPERVISOR_platform_op(
return _hypercall1(int, platform_op, platform_op);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_debugreg(
unsigned int reg, unsigned long value)
{
return _hypercall2(int, set_debugreg, reg, value);
}
-static inline unsigned long
+static inline unsigned long __must_check
HYPERVISOR_get_debugreg(
unsigned int reg)
{
return _hypercall1(unsigned long, get_debugreg, reg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_descriptor(
unsigned long ma, unsigned long word)
{
return _hypercall2(int, update_descriptor, ma, word);
}
-static inline int
+static inline int __must_check
HYPERVISOR_memory_op(
unsigned int cmd, void *arg)
{
return _hypercall2(int, memory_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_multicall(
multicall_entry_t *call_list, unsigned int nr_calls)
{
return _hypercall2(int, multicall, call_list, nr_calls);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_va_mapping(
unsigned long va, pte_t new_val, unsigned long flags)
{
return _hypercall3(int, update_va_mapping, va, new_val.pte, flags);
}
-static inline int
+static inline int __must_check
HYPERVISOR_event_channel_op(
int cmd, void *arg)
{
@@ -272,28 +272,28 @@ HYPERVISOR_event_channel_op(
return rc;
}
-static inline int
+static inline int __must_check
HYPERVISOR_acm_op(
int cmd, void *arg)
{
return _hypercall2(int, acm_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_xen_version(
int cmd, void *arg)
{
return _hypercall2(int, xen_version, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_console_io(
int cmd, unsigned int count, char *str)
{
return _hypercall3(int, console_io, cmd, count, str);
}
-static inline int
+static inline int __must_check
HYPERVISOR_physdev_op(
int cmd, void *arg)
{
@@ -312,14 +312,14 @@ HYPERVISOR_physdev_op(
return rc;
}
-static inline int
+static inline int __must_check
HYPERVISOR_grant_table_op(
unsigned int cmd, void *uop, unsigned int count)
{
return _hypercall3(int, grant_table_op, cmd, uop, count);
}
-static inline int
+static inline int __must_check
HYPERVISOR_update_va_mapping_otherdomain(
unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
{
@@ -327,28 +327,28 @@ HYPERVISOR_update_va_mapping_otherdomain
new_val.pte, flags, domid);
}
-static inline int
+static inline int __must_check
HYPERVISOR_vm_assist(
unsigned int cmd, unsigned int type)
{
return _hypercall2(int, vm_assist, cmd, type);
}
-static inline int
+static inline int __must_check
HYPERVISOR_vcpu_op(
int cmd, unsigned int vcpuid, void *extra_args)
{
return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
}
-static inline int
+static inline int __must_check
HYPERVISOR_set_segment_base(
int reg, unsigned long value)
{
return _hypercall2(int, set_segment_base, reg, value);
}
-static inline int
+static inline int __must_check
HYPERVISOR_suspend(
unsigned long srec)
{
@@ -368,15 +368,17 @@ HYPERVISOR_suspend(
return rc;
}
+#if CONFIG_XEN_COMPAT <= 0x030002
static inline int
HYPERVISOR_nmi_op(
unsigned long op, void *arg)
{
return _hypercall2(int, nmi_op, op, arg);
}
+#endif
#ifndef CONFIG_XEN
-static inline unsigned long
+static inline unsigned long __must_check
HYPERVISOR_hvm_op(
int op, void *arg)
{
@@ -384,21 +386,21 @@ HYPERVISOR_hvm_op(
}
#endif
-static inline int
+static inline int __must_check
HYPERVISOR_callback_op(
int cmd, const void *arg)
{
return _hypercall2(int, callback_op, cmd, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_xenoprof_op(
int op, void *arg)
{
return _hypercall2(int, xenoprof_op, op, arg);
}
-static inline int
+static inline int __must_check
HYPERVISOR_kexec_op(
unsigned long op, void *args)
{
diff -r 71a415f9179b -r c779f9e01072 include/asm-x86_64/mach-xen/asm/processor.h
--- a/include/asm-x86_64/mach-xen/asm/processor.h Fri Jan 18 14:20:59
2008 -0700
+++ b/include/asm-x86_64/mach-xen/asm/processor.h Tue Jan 22 08:31:46
2008 -0700
@@ -317,8 +317,10 @@ struct thread_struct {
#define get_debugreg(var, register) \
var = HYPERVISOR_get_debugreg(register)
-#define set_debugreg(value, register) \
- HYPERVISOR_set_debugreg(register, value)
+#define set_debugreg(value, register) do { \
+ if (HYPERVISOR_set_debugreg(register, value)) \
+ BUG(); \
+} while (0)
struct task_struct;
struct mm_struct;
diff -r 71a415f9179b -r c779f9e01072 include/xen/evtchn.h
--- a/include/xen/evtchn.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/xen/evtchn.h Tue Jan 22 08:31:46 2008 -0700
@@ -126,7 +126,7 @@ static inline void notify_remote_via_evt
static inline void notify_remote_via_evtchn(int port)
{
struct evtchn_send send = { .port = port };
- (void)HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
+ VOID(HYPERVISOR_event_channel_op(EVTCHNOP_send, &send));
}
/*
diff -r 71a415f9179b -r c779f9e01072 include/xen/hypercall.h
--- a/include/xen/hypercall.h Fri Jan 18 14:20:59 2008 -0700
+++ b/include/xen/hypercall.h Tue Jan 22 08:31:46 2008 -0700
@@ -3,7 +3,7 @@
#include <asm/hypercall.h>
-static inline int
+static inline int __must_check
HYPERVISOR_multicall_check(
multicall_entry_t *call_list, unsigned int nr_calls,
const unsigned long *rc_list)
@@ -22,4 +22,9 @@ HYPERVISOR_multicall_check(
return 0;
}
+/* A construct to ignore the return value of hypercall wrappers in a few
+ * exceptional cases (simply casting the function result to void doesn't
+ * avoid the compiler warning): */
+#define VOID(expr) ((void)((expr)?:0))
+
#endif /* __XEN_HYPERCALL_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|