diff options
Diffstat (limited to 'drivers/xen/events.c')
| -rw-r--r-- | drivers/xen/events.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index eb0dfdeaa949..3141e149d595 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/irq.h> | 26 | #include <linux/irq.h> |
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/string.h> | 28 | #include <linux/string.h> |
| 29 | #include <linux/bootmem.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/ptrace.h> | 31 | #include <asm/ptrace.h> |
| 31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
| @@ -75,7 +76,14 @@ enum { | |||
| 75 | static int evtchn_to_irq[NR_EVENT_CHANNELS] = { | 76 | static int evtchn_to_irq[NR_EVENT_CHANNELS] = { |
| 76 | [0 ... NR_EVENT_CHANNELS-1] = -1 | 77 | [0 ... NR_EVENT_CHANNELS-1] = -1 |
| 77 | }; | 78 | }; |
| 78 | static unsigned long cpu_evtchn_mask[NR_CPUS][NR_EVENT_CHANNELS/BITS_PER_LONG]; | 79 | struct cpu_evtchn_s { |
| 80 | unsigned long bits[NR_EVENT_CHANNELS/BITS_PER_LONG]; | ||
| 81 | }; | ||
| 82 | static struct cpu_evtchn_s *cpu_evtchn_mask_p; | ||
| 83 | static inline unsigned long *cpu_evtchn_mask(int cpu) | ||
| 84 | { | ||
| 85 | return cpu_evtchn_mask_p[cpu].bits; | ||
| 86 | } | ||
| 79 | static u8 cpu_evtchn[NR_EVENT_CHANNELS]; | 87 | static u8 cpu_evtchn[NR_EVENT_CHANNELS]; |
| 80 | 88 | ||
| 81 | /* Reference counts for bindings to IRQs. */ | 89 | /* Reference counts for bindings to IRQs. */ |
| @@ -115,7 +123,7 @@ static inline unsigned long active_evtchns(unsigned int cpu, | |||
| 115 | unsigned int idx) | 123 | unsigned int idx) |
| 116 | { | 124 | { |
| 117 | return (sh->evtchn_pending[idx] & | 125 | return (sh->evtchn_pending[idx] & |
| 118 | cpu_evtchn_mask[cpu][idx] & | 126 | cpu_evtchn_mask(cpu)[idx] & |
| 119 | ~sh->evtchn_mask[idx]); | 127 | ~sh->evtchn_mask[idx]); |
| 120 | } | 128 | } |
| 121 | 129 | ||
| @@ -125,11 +133,11 @@ static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu) | |||
| 125 | 133 | ||
| 126 | BUG_ON(irq == -1); | 134 | BUG_ON(irq == -1); |
| 127 | #ifdef CONFIG_SMP | 135 | #ifdef CONFIG_SMP |
| 128 | irq_to_desc(irq)->affinity = cpumask_of_cpu(cpu); | 136 | cpumask_copy(irq_to_desc(irq)->affinity, cpumask_of(cpu)); |
| 129 | #endif | 137 | #endif |
| 130 | 138 | ||
| 131 | __clear_bit(chn, cpu_evtchn_mask[cpu_evtchn[chn]]); | 139 | __clear_bit(chn, cpu_evtchn_mask(cpu_evtchn[chn])); |
| 132 | __set_bit(chn, cpu_evtchn_mask[cpu]); | 140 | __set_bit(chn, cpu_evtchn_mask(cpu)); |
| 133 | 141 | ||
| 134 | cpu_evtchn[chn] = cpu; | 142 | cpu_evtchn[chn] = cpu; |
| 135 | } | 143 | } |
| @@ -142,12 +150,12 @@ static void init_evtchn_cpu_bindings(void) | |||
| 142 | 150 | ||
| 143 | /* By default all event channels notify CPU#0. */ | 151 | /* By default all event channels notify CPU#0. */ |
| 144 | for_each_irq_desc(i, desc) { | 152 | for_each_irq_desc(i, desc) { |
| 145 | desc->affinity = cpumask_of_cpu(0); | 153 | cpumask_copy(desc->affinity, cpumask_of(0)); |
| 146 | } | 154 | } |
| 147 | #endif | 155 | #endif |
| 148 | 156 | ||
| 149 | memset(cpu_evtchn, 0, sizeof(cpu_evtchn)); | 157 | memset(cpu_evtchn, 0, sizeof(cpu_evtchn)); |
| 150 | memset(cpu_evtchn_mask[0], ~0, sizeof(cpu_evtchn_mask[0])); | 158 | memset(cpu_evtchn_mask(0), ~0, sizeof(cpu_evtchn_mask(0))); |
| 151 | } | 159 | } |
| 152 | 160 | ||
| 153 | static inline unsigned int cpu_from_evtchn(unsigned int evtchn) | 161 | static inline unsigned int cpu_from_evtchn(unsigned int evtchn) |
| @@ -822,6 +830,10 @@ static struct irq_chip xen_dynamic_chip __read_mostly = { | |||
| 822 | void __init xen_init_IRQ(void) | 830 | void __init xen_init_IRQ(void) |
| 823 | { | 831 | { |
| 824 | int i; | 832 | int i; |
| 833 | size_t size = nr_cpu_ids * sizeof(struct cpu_evtchn_s); | ||
| 834 | |||
| 835 | cpu_evtchn_mask_p = alloc_bootmem(size); | ||
| 836 | BUG_ON(cpu_evtchn_mask_p == NULL); | ||
| 825 | 837 | ||
| 826 | init_evtchn_cpu_bindings(); | 838 | init_evtchn_cpu_bindings(); |
| 827 | 839 | ||
