aboutsummaryrefslogtreecommitdiffstats
path: root/include/xen
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@xensource.com>2007-07-17 21:37:06 -0400
committerJeremy Fitzhardinge <jeremy@goop.org>2007-07-18 11:47:44 -0400
commitf87e4cac4f4e940b328d3deb5b53e642e3881f43 (patch)
tree7409f86561e5f97459378abd2ae21e9a5c82bfea /include/xen
parentab55028886dd1dd54585f22bf19a00eb23869340 (diff)
xen: SMP guest support
This is a fairly straightforward Xen implementation of smp_ops. Xen has its own IPI mechanisms, and has no dependency on any APIC-based IPI. The smp_ops hooks and the flush_tlb_others pv_op allow a Xen guest to avoid all APIC code in arch/i386 (the only apic operation is a single apic_read for the apic version number). One subtle point which needs to be addressed is unpinning pagetables when another cpu may have a lazy tlb reference to the pagetable. Xen will not allow an in-use pagetable to be unpinned, so we must find any other cpus with a reference to the pagetable and get them to shoot down their references. Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Chris Wright <chrisw@sous-sol.org> Cc: Benjamin LaHaise <bcrl@kvack.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Andi Kleen <ak@suse.de>
Diffstat (limited to 'include/xen')
-rw-r--r--include/xen/events.h27
1 files changed, 23 insertions, 4 deletions
diff --git a/include/xen/events.h b/include/xen/events.h
index 77f71c906823..7abe4ddfac54 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -1,15 +1,32 @@
1#ifndef _XEN_EVENTS_H 1#ifndef _XEN_EVENTS_H
2#define _XEN_EVENTS_H 2#define _XEN_EVENTS_H
3 3
4#include <linux/irq.h> 4#include <linux/interrupt.h>
5
6#include <xen/interface/event_channel.h>
7#include <asm/xen/hypercall.h>
8
9enum ipi_vector {
10 XEN_RESCHEDULE_VECTOR,
11 XEN_CALL_FUNCTION_VECTOR,
12
13 XEN_NR_IPIS,
14};
5 15
6int bind_evtchn_to_irqhandler(unsigned int evtchn, 16int bind_evtchn_to_irqhandler(unsigned int evtchn,
7 irqreturn_t (*handler)(int, void *), 17 irq_handler_t handler,
8 unsigned long irqflags, const char *devname, 18 unsigned long irqflags, const char *devname,
9 void *dev_id); 19 void *dev_id);
10int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu, 20int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
11 irqreturn_t (*handler)(int, void *), 21 irq_handler_t handler,
12 unsigned long irqflags, const char *devname, void *dev_id); 22 unsigned long irqflags, const char *devname,
23 void *dev_id);
24int bind_ipi_to_irqhandler(enum ipi_vector ipi,
25 unsigned int cpu,
26 irq_handler_t handler,
27 unsigned long irqflags,
28 const char *devname,
29 void *dev_id);
13 30
14/* 31/*
15 * Common unbind function for all event sources. Takes IRQ to unbind from. 32 * Common unbind function for all event sources. Takes IRQ to unbind from.
@@ -18,6 +35,8 @@ int bind_virq_to_irqhandler(unsigned int virq, unsigned int cpu,
18 */ 35 */
19void unbind_from_irqhandler(unsigned int irq, void *dev_id); 36void unbind_from_irqhandler(unsigned int irq, void *dev_id);
20 37
38void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
39
21static inline void notify_remote_via_evtchn(int port) 40static inline void notify_remote_via_evtchn(int port)
22{ 41{
23 struct evtchn_send send = { .port = port }; 42 struct evtchn_send send = { .port = port };