diff options
Diffstat (limited to 'arch/x86/kernel/apic/x2apic_cluster.c')
-rw-r--r-- | arch/x86/kernel/apic/x2apic_cluster.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 612622c47df..5f86f79335f 100644 --- a/arch/x86/kernel/apic/x2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
@@ -96,24 +96,26 @@ static void x2apic_send_IPI_all(int vector) | |||
96 | __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC); | 96 | __x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC); |
97 | } | 97 | } |
98 | 98 | ||
99 | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) | 99 | static int |
100 | x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask, unsigned int *apicid) | ||
100 | { | 101 | { |
101 | int cpu = cpumask_first(cpumask); | 102 | int cpu = cpumask_first(cpumask); |
102 | u32 dest = 0; | ||
103 | int i; | 103 | int i; |
104 | 104 | ||
105 | if (cpu > nr_cpu_ids) | 105 | if (cpu >= nr_cpu_ids) |
106 | return BAD_APICID; | 106 | return -EINVAL; |
107 | 107 | ||
108 | *apicid = 0; | ||
108 | for_each_cpu_and(i, cpumask, per_cpu(cpus_in_cluster, cpu)) | 109 | for_each_cpu_and(i, cpumask, per_cpu(cpus_in_cluster, cpu)) |
109 | dest |= per_cpu(x86_cpu_to_logical_apicid, i); | 110 | *apicid |= per_cpu(x86_cpu_to_logical_apicid, i); |
110 | 111 | ||
111 | return dest; | 112 | return 0; |
112 | } | 113 | } |
113 | 114 | ||
114 | static unsigned int | 115 | static int |
115 | x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 116 | x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
116 | const struct cpumask *andmask) | 117 | const struct cpumask *andmask, |
118 | unsigned int *apicid) | ||
117 | { | 119 | { |
118 | u32 dest = 0; | 120 | u32 dest = 0; |
119 | u16 cluster; | 121 | u16 cluster; |
@@ -128,7 +130,7 @@ x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
128 | } | 130 | } |
129 | 131 | ||
130 | if (!dest) | 132 | if (!dest) |
131 | return BAD_APICID; | 133 | return -EINVAL; |
132 | 134 | ||
133 | for_each_cpu_and(i, cpumask, andmask) { | 135 | for_each_cpu_and(i, cpumask, andmask) { |
134 | if (!cpumask_test_cpu(i, cpu_online_mask)) | 136 | if (!cpumask_test_cpu(i, cpu_online_mask)) |
@@ -138,7 +140,9 @@ x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
138 | dest |= per_cpu(x86_cpu_to_logical_apicid, i); | 140 | dest |= per_cpu(x86_cpu_to_logical_apicid, i); |
139 | } | 141 | } |
140 | 142 | ||
141 | return dest; | 143 | *apicid = dest; |
144 | |||
145 | return 0; | ||
142 | } | 146 | } |
143 | 147 | ||
144 | static void init_x2apic_ldr(void) | 148 | static void init_x2apic_ldr(void) |