History

ARCv2: MCIP: Use IDU_M_DISTRI_DEST mode if there is only 1 destination core

ARC linux uses 2 distribution modes for common interrupts: round robin mode (IDU_M_DISTRI_RR) and a simple destination mode (IDU_M_DISTRI_DEST). The first one is used when more than 1 cores may handle a common interrupt and the second one is used when only 1 core may handle a common interrupt. However idu_irq_set_affinity() always sets IDU_M_DISTRI_RR for all affinity values. But there is no sense in setting of such mode if only 1 core must handle a common interrupt.

Yuriy Kolerov committed 10 years ago

Commit 0a0a0471 parent 34e71e41 file · +11 −2Browse files

Unified · Split

arch/arc/kernel/mcip.c+11−2
@@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask, · 180 unmodified lines
181181 {
182182 unsigned long flags;
183183 cpumask_t online;
184+ unsigned int destination_bits;
185+ unsigned int distribution_mode;
184186
185187 /* errout if no online cpu per @cpumask */
186188 if (!cpumask_and(&online, cpumask, cpu_online_mask))
@@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask, · 1 unmodified line
188190
189191 raw_spin_lock_irqsave(&mcip_lock, flags);
190192
191− idu_set_dest(data->hwirq, cpumask_bits(&online)[0]);
192− idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR);
193+ destination_bits = cpumask_bits(&online)[0];
194+ idu_set_dest(data->hwirq, destination_bits);
195+
196+ if (ffs(destination_bits) == fls(destination_bits))
197+ distribution_mode = IDU_M_DISTRI_DEST;
198+ else
199+ distribution_mode = IDU_M_DISTRI_RR;
200+
201+ idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
193202
194203 raw_spin_unlock_irqrestore(&mcip_lock, flags);
195204