diff options
Diffstat (limited to 'kernel/irq/numa_migrate.c')
-rw-r--r-- | kernel/irq/numa_migrate.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index 089c3746358a..666260e4c065 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
@@ -38,14 +38,22 @@ static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc) | |||
38 | old_desc->kstat_irqs = NULL; | 38 | old_desc->kstat_irqs = NULL; |
39 | } | 39 | } |
40 | 40 | ||
41 | static void init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, | 41 | static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, |
42 | struct irq_desc *desc, int cpu) | 42 | struct irq_desc *desc, int cpu) |
43 | { | 43 | { |
44 | memcpy(desc, old_desc, sizeof(struct irq_desc)); | 44 | memcpy(desc, old_desc, sizeof(struct irq_desc)); |
45 | if (!init_alloc_desc_masks(desc, cpu, false)) { | ||
46 | printk(KERN_ERR "irq %d: can not get new irq_desc cpumask " | ||
47 | "for migration.\n", irq); | ||
48 | return false; | ||
49 | } | ||
50 | spin_lock_init(&desc->lock); | ||
45 | desc->cpu = cpu; | 51 | desc->cpu = cpu; |
46 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 52 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
47 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); | 53 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); |
54 | init_copy_desc_masks(old_desc, desc); | ||
48 | arch_init_copy_chip_data(old_desc, desc, cpu); | 55 | arch_init_copy_chip_data(old_desc, desc, cpu); |
56 | return true; | ||
49 | } | 57 | } |
50 | 58 | ||
51 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) | 59 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) |
@@ -74,15 +82,19 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
74 | 82 | ||
75 | node = cpu_to_node(cpu); | 83 | node = cpu_to_node(cpu); |
76 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); | 84 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); |
77 | printk(KERN_DEBUG " move irq_desc for %d to cpu %d node %d\n", | ||
78 | irq, cpu, node); | ||
79 | if (!desc) { | 85 | if (!desc) { |
80 | printk(KERN_ERR "can not get new irq_desc for moving\n"); | 86 | printk(KERN_ERR "irq %d: can not get new irq_desc " |
87 | "for migration.\n", irq); | ||
88 | /* still use old one */ | ||
89 | desc = old_desc; | ||
90 | goto out_unlock; | ||
91 | } | ||
92 | if (!init_copy_one_irq_desc(irq, old_desc, desc, cpu)) { | ||
81 | /* still use old one */ | 93 | /* still use old one */ |
94 | kfree(desc); | ||
82 | desc = old_desc; | 95 | desc = old_desc; |
83 | goto out_unlock; | 96 | goto out_unlock; |
84 | } | 97 | } |
85 | init_copy_one_irq_desc(irq, old_desc, desc, cpu); | ||
86 | 98 | ||
87 | irq_desc_ptrs[irq] = desc; | 99 | irq_desc_ptrs[irq] = desc; |
88 | 100 | ||
@@ -106,8 +118,6 @@ struct irq_desc *move_irq_desc(struct irq_desc *desc, int cpu) | |||
106 | return desc; | 118 | return desc; |
107 | 119 | ||
108 | old_cpu = desc->cpu; | 120 | old_cpu = desc->cpu; |
109 | printk(KERN_DEBUG | ||
110 | "try to move irq_desc from cpu %d to %d\n", old_cpu, cpu); | ||
111 | if (old_cpu != cpu) { | 121 | if (old_cpu != cpu) { |
112 | node = cpu_to_node(cpu); | 122 | node = cpu_to_node(cpu); |
113 | old_node = cpu_to_node(old_cpu); | 123 | old_node = cpu_to_node(old_cpu); |