| .. | .. |
|---|
| 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; |
|---|