aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2010-10-06 16:14:21 -0400
committerThomas Gleixner <tglx@linutronix.de>2010-10-12 10:53:40 -0400
commit08c33db6d044d9dc74ddf8d9ee3cb1fa3eca262b (patch)
tree8fb935dd04e9d65f79aa778de9c29afb21d10814 /arch
parent6e2fff50a5bd72a3f9e6f3ef6e9137efddb2d580 (diff)
x86: Implement new allocator functions
Implement new allocator functions which make use of the core changes. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/apic/io_apic.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 452f781a042e..065c5dc88b8c 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -199,6 +199,13 @@ out_cfg:
199 return NULL; 199 return NULL;
200} 200}
201 201
202static void free_irq_cfg(struct irq_cfg *cfg)
203{
204 free_cpumask_var(cfg->domain);
205 free_cpumask_var(cfg->old_domain);
206 kfree(cfg);
207}
208
202int arch_init_chip_data(struct irq_desc *desc, int node) 209int arch_init_chip_data(struct irq_desc *desc, int node)
203{ 210{
204 struct irq_cfg *cfg; 211 struct irq_cfg *cfg;
@@ -299,13 +306,6 @@ void arch_init_copy_chip_data(struct irq_desc *old_desc,
299 init_copy_irq_2_pin(old_cfg, cfg, node); 306 init_copy_irq_2_pin(old_cfg, cfg, node);
300} 307}
301 308
302static void free_irq_cfg(struct irq_cfg *cfg)
303{
304 free_cpumask_var(cfg->domain);
305 free_cpumask_var(cfg->old_domain);
306 kfree(cfg);
307}
308
309void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc) 309void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc)
310{ 310{
311 struct irq_cfg *old_cfg, *cfg; 311 struct irq_cfg *old_cfg, *cfg;
@@ -325,13 +325,53 @@ void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc)
325/* end for move_irq_desc */ 325/* end for move_irq_desc */
326 326
327#else 327#else
328
328struct irq_cfg *irq_cfg(unsigned int irq) 329struct irq_cfg *irq_cfg(unsigned int irq)
329{ 330{
330 return irq < nr_irqs ? irq_cfgx + irq : NULL; 331 return irq < nr_irqs ? irq_cfgx + irq : NULL;
331} 332}
332 333
334static struct irq_cfg *get_one_free_irq_cfg(unsigned int irq, int node)
335{
336 return irq_cfgx + irq;
337}
338
339static inline void free_irq_cfg(struct irq_cfg *cfg) { }
340
333#endif 341#endif
334 342
343static struct irq_cfg *alloc_irq_and_cfg_at(unsigned int at, int node)
344{
345 int res = irq_alloc_desc_at(at, node);
346 struct irq_cfg *cfg;
347
348 if (res < 0) {
349 if (res != -EEXIST)
350 return NULL;
351 cfg = get_irq_chip_data(at);
352 if (cfg)
353 return cfg;
354 }
355
356 cfg = get_one_free_irq_cfg(node);
357 if (cfg)
358 set_irq_chip_data(at, cfg);
359 else
360 irq_free_desc(at);
361 return cfg;
362}
363
364static int alloc_irq_from(unsigned int from, int node)
365{
366 return irq_alloc_desc_from(from, node);
367}
368
369static void free_irq_at(unsigned int at, struct irq_cfg *cfg)
370{
371 free_irq_cfg(cfg);
372 irq_free_desc(at);
373}
374
335struct io_apic { 375struct io_apic {
336 unsigned int index; 376 unsigned int index;
337 unsigned int unused[3]; 377 unsigned int unused[3];