From: Jeremy Fitzhardinge Date: Wed, 11 Feb 2009 19:52:22 +0000 (-0800) Subject: Merge commit 'remotes/tip/x86/paravirt' into x86/untangle2 X-Git-Tag: v2.6.30-rc1~211^2~26^2~2^4~6^2~10 X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=commitdiff_plain;h=9049a11de73d3ecc623f1903100d099f82ede56c Merge commit 'remotes/tip/x86/paravirt' into x86/untangle2 * commit 'remotes/tip/x86/paravirt': (175 commits) xen: use direct ops on 64-bit xen: make direct versions of irq_enable/disable/save/restore to common code xen: setup percpu data pointers xen: fix 32-bit build resulting from mmu move x86/paravirt: return full 64-bit result x86, percpu: fix kexec with vmlinux x86/vmi: fix interrupt enable/disable/save/restore calling convention. x86/paravirt: don't restore second return reg xen: setup percpu data pointers x86: split loading percpu segments from loading gdt x86: pass in cpu number to switch_to_new_gdt() x86: UV fix uv_flush_send_and_wait() x86/paravirt: fix missing callee-save call on pud_val x86/paravirt: use callee-saved convention for pte_val/make_pte/etc x86/paravirt: implement PVOP_CALL macros for callee-save functions x86/paravirt: add register-saving thunks to reduce caller register pressure x86/paravirt: selectively save/restore regs around pvops calls x86: fix paravirt clobber in entry_64.S x86/pvops: add a paravirt_ident functions to allow special patching xen: move remaining mmu-related stuff into mmu.c ... Conflicts: arch/x86/mach-voyager/voyager_smp.c arch/x86/mm/fault.c --- 9049a11de73d3ecc623f1903100d099f82ede56c diff --cc arch/arm/kernel/irq.c index 363db186cb93,4bb723eadad1..45eacb5a2ecd --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@@ -101,9 -101,14 +101,14 @@@ unlock /* Handle bad interrupts */ static struct irq_desc bad_irq_desc = { .handle_irq = handle_bad_irq, - .lock = SPIN_LOCK_UNLOCKED + .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock), }; + #ifdef CONFIG_CPUMASK_OFFSTACK + /* We are not allocating bad_irq_desc.affinity or .pending_mask */ + #error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK." + #endif + /* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not * come via this function. Instead, they should provide their diff --cc arch/x86/kernel/entry_64.S index a1346217e43c,e4c9710cae52..586bed677557 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S @@@ -341,12 -342,11 +342,12 @@@ ENTRY(save_args * a little cheaper to use a separate counter in the PDA (short of * moving irq_enter into assembly, which would be too much work) */ - 1: incl %gs:pda_irqcount + 1: incl PER_CPU_VAR(irq_count) jne 2f popq_cfi %rax /* move return address... */ - mov %gs:pda_irqstackptr,%rsp + mov PER_CPU_VAR(irq_stack_ptr),%rsp EMPTY_FRAME 0 + pushq_cfi %rbp /* backlink for unwinder */ pushq_cfi %rax /* ... to the new stack */ /* * We entered an interrupt context - irqs are off: diff --cc arch/x86/mach-voyager/voyager_smp.c index 7ffcdeec4631,58c7cac3440d..98e3c2bc7563 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c @@@ -1745,14 -1746,13 +1744,14 @@@ static void __init voyager_smp_prepare_ static void __cpuinit voyager_smp_prepare_boot_cpu(void) { - init_gdt(smp_processor_id()); - switch_to_new_gdt(); + int cpu = smp_processor_id(); + switch_to_new_gdt(cpu); - cpu_online_map = cpumask_of_cpu(smp_processor_id()); - cpu_callout_map = cpumask_of_cpu(smp_processor_id()); - cpu_callin_map = CPU_MASK_NONE; - cpu_present_map = cpumask_of_cpu(smp_processor_id()); + cpu_set(cpu, cpu_online_map); + cpu_set(cpu, cpu_callout_map); + cpu_set(cpu, cpu_possible_map); + cpu_set(cpu, cpu_present_map); + } static int __cpuinit voyager_cpu_up(unsigned int cpu) @@@ -1779,12 -1779,11 +1778,11 @@@ static void __init voyager_smp_cpus_don void __init smp_setup_processor_id(void) { current_thread_info()->cpu = hard_smp_processor_id(); - x86_write_percpu(cpu_number, hard_smp_processor_id()); } -static void voyager_send_call_func(cpumask_t callmask) +static void voyager_send_call_func(const struct cpumask *callmask) { - __u32 mask = cpus_addr(callmask)[0] & ~(1 << smp_processor_id()); + __u32 mask = cpus_addr(*callmask)[0] & ~(1 << smp_processor_id()); send_CPI(mask, VIC_CALL_FUNCTION_CPI); } diff --cc arch/x86/mm/fault.c index c76ef1d701c9,65709a6aa6ee..976b5a72ec30 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c @@@ -601,8 -807,8 +807,7 @@@ void __kprobes do_page_fault(struct pt_ /* get the address */ address = read_cr2(); - si_code = SEGV_MAPERR; - + if (unlikely(notify_page_fault(regs))) - return; if (unlikely(kmmio_fault(regs, address))) return; @@@ -629,23 -835,17 +834,23 @@@ return; /* Can handle a stale RO->RW TLB */ - if (spurious_fault(address, error_code)) + if (spurious_fault(error_code, address)) return; + /* kprobes don't want to hook the spurious faults. */ + if (notify_page_fault(regs)) + return; /* * Don't take the mm semaphore here. If we fixup a prefetch * fault we could otherwise deadlock. */ - goto bad_area_nosemaphore; + bad_area_nosemaphore(regs, error_code, address); + return; } + /* kprobes don't want to hook the spurious faults. */ + if (notify_page_fault(regs)) + return; - /* * It's safe to allow irq's after cr2 has been saved and the * vmalloc fault has been handled. diff --cc kernel/irq/numa_migrate.c index acd88356ac76,666260e4c065..7f9b80434e32 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c @@@ -81,10 -95,8 +95,9 @@@ static struct irq_desc *__real_move_irq desc = old_desc; goto out_unlock; } - init_copy_one_irq_desc(irq, old_desc, desc, cpu); irq_desc_ptrs[irq] = desc; + spin_unlock_irqrestore(&sparse_irq_lock, flags); /* free the old one */ free_one_irq_desc(old_desc, desc);