diff options
Diffstat (limited to 'kernel/irq/numa_migrate.c')
-rw-r--r-- | kernel/irq/numa_migrate.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index aef18ab6b75b..243d6121e50e 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
@@ -33,15 +33,22 @@ static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc) | |||
33 | old_desc->kstat_irqs = NULL; | 33 | old_desc->kstat_irqs = NULL; |
34 | } | 34 | } |
35 | 35 | ||
36 | static void init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, | 36 | static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, |
37 | struct irq_desc *desc, int cpu) | 37 | struct irq_desc *desc, int cpu) |
38 | { | 38 | { |
39 | memcpy(desc, old_desc, sizeof(struct irq_desc)); | 39 | memcpy(desc, old_desc, sizeof(struct irq_desc)); |
40 | if (!init_alloc_desc_masks(desc, cpu, false)) { | ||
41 | printk(KERN_ERR "irq %d: can not get new irq_desc cpumask " | ||
42 | "for migration.\n", irq); | ||
43 | return false; | ||
44 | } | ||
40 | spin_lock_init(&desc->lock); | 45 | spin_lock_init(&desc->lock); |
41 | desc->cpu = cpu; | 46 | desc->cpu = cpu; |
42 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 47 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
43 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); | 48 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); |
49 | init_copy_desc_masks(old_desc, desc); | ||
44 | arch_init_copy_chip_data(old_desc, desc, cpu); | 50 | arch_init_copy_chip_data(old_desc, desc, cpu); |
51 | return true; | ||
45 | } | 52 | } |
46 | 53 | ||
47 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) | 54 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) |
@@ -71,12 +78,18 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
71 | node = cpu_to_node(cpu); | 78 | node = cpu_to_node(cpu); |
72 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); | 79 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); |
73 | if (!desc) { | 80 | if (!desc) { |
74 | printk(KERN_ERR "irq %d: can not get new irq_desc for migration.\n", irq); | 81 | printk(KERN_ERR "irq %d: can not get new irq_desc " |
82 | "for migration.\n", irq); | ||
83 | /* still use old one */ | ||
84 | desc = old_desc; | ||
85 | goto out_unlock; | ||
86 | } | ||
87 | if (!init_copy_one_irq_desc(irq, old_desc, desc, cpu)) { | ||
75 | /* still use old one */ | 88 | /* still use old one */ |
89 | kfree(desc); | ||
76 | desc = old_desc; | 90 | desc = old_desc; |
77 | goto out_unlock; | 91 | goto out_unlock; |
78 | } | 92 | } |
79 | init_copy_one_irq_desc(irq, old_desc, desc, cpu); | ||
80 | 93 | ||
81 | irq_desc_ptrs[irq] = desc; | 94 | irq_desc_ptrs[irq] = desc; |
82 | spin_unlock_irqrestore(&sparse_irq_lock, flags); | 95 | spin_unlock_irqrestore(&sparse_irq_lock, flags); |