.. | .. |
---|
30 | 30 | #include <asm/desc.h> |
---|
31 | 31 | #include <asm/cpu.h> |
---|
32 | 32 | #include <asm/io_apic.h> |
---|
| 33 | +#include <asm/fpu/internal.h> |
---|
33 | 34 | |
---|
34 | 35 | #include <xen/interface/xen.h> |
---|
35 | 36 | #include <xen/interface/vcpu.h> |
---|
.. | .. |
---|
63 | 64 | |
---|
64 | 65 | cr4_init(); |
---|
65 | 66 | cpu_init(); |
---|
| 67 | + fpu__init_cpu(); |
---|
66 | 68 | touch_softlockup_watchdog(); |
---|
67 | 69 | preempt_disable(); |
---|
68 | 70 | |
---|
.. | .. |
---|
98 | 100 | |
---|
99 | 101 | void xen_smp_intr_free_pv(unsigned int cpu) |
---|
100 | 102 | { |
---|
| 103 | + kfree(per_cpu(xen_irq_work, cpu).name); |
---|
| 104 | + per_cpu(xen_irq_work, cpu).name = NULL; |
---|
101 | 105 | if (per_cpu(xen_irq_work, cpu).irq >= 0) { |
---|
102 | 106 | unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL); |
---|
103 | 107 | per_cpu(xen_irq_work, cpu).irq = -1; |
---|
104 | | - kfree(per_cpu(xen_irq_work, cpu).name); |
---|
105 | | - per_cpu(xen_irq_work, cpu).name = NULL; |
---|
106 | 108 | } |
---|
107 | 109 | |
---|
| 110 | + kfree(per_cpu(xen_pmu_irq, cpu).name); |
---|
| 111 | + per_cpu(xen_pmu_irq, cpu).name = NULL; |
---|
108 | 112 | if (per_cpu(xen_pmu_irq, cpu).irq >= 0) { |
---|
109 | 113 | unbind_from_irqhandler(per_cpu(xen_pmu_irq, cpu).irq, NULL); |
---|
110 | 114 | per_cpu(xen_pmu_irq, cpu).irq = -1; |
---|
111 | | - kfree(per_cpu(xen_pmu_irq, cpu).name); |
---|
112 | | - per_cpu(xen_pmu_irq, cpu).name = NULL; |
---|
113 | 115 | } |
---|
114 | 116 | } |
---|
115 | 117 | |
---|
.. | .. |
---|
119 | 121 | char *callfunc_name, *pmu_name; |
---|
120 | 122 | |
---|
121 | 123 | callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu); |
---|
| 124 | + per_cpu(xen_irq_work, cpu).name = callfunc_name; |
---|
122 | 125 | rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR, |
---|
123 | 126 | cpu, |
---|
124 | 127 | xen_irq_work_interrupt, |
---|
.. | .. |
---|
128 | 131 | if (rc < 0) |
---|
129 | 132 | goto fail; |
---|
130 | 133 | per_cpu(xen_irq_work, cpu).irq = rc; |
---|
131 | | - per_cpu(xen_irq_work, cpu).name = callfunc_name; |
---|
132 | 134 | |
---|
133 | 135 | if (is_xen_pmu) { |
---|
134 | 136 | pmu_name = kasprintf(GFP_KERNEL, "pmu%d", cpu); |
---|
| 137 | + per_cpu(xen_pmu_irq, cpu).name = pmu_name; |
---|
135 | 138 | rc = bind_virq_to_irqhandler(VIRQ_XENPMU, cpu, |
---|
136 | 139 | xen_pmu_irq_handler, |
---|
137 | 140 | IRQF_PERCPU|IRQF_NOBALANCING, |
---|
.. | .. |
---|
139 | 142 | if (rc < 0) |
---|
140 | 143 | goto fail; |
---|
141 | 144 | per_cpu(xen_pmu_irq, cpu).irq = rc; |
---|
142 | | - per_cpu(xen_pmu_irq, cpu).name = pmu_name; |
---|
143 | 145 | } |
---|
144 | 146 | |
---|
145 | 147 | return 0; |
---|