cpumask: make irq_set_affinity() take a const struct cpumask
Subsystems (7)
PATCH 1/1 cpumask: make irq_set_affinity() take a const struct cpumask
(Ingo, this is for you directly, not linux-next).
Not much point with gentle transition here: the struct irq_chip's setaffinity method signature needs to change.
Fortunately, not widely used code, but hits a few architectures.
Note: In irq_select_affinity() I save a temporary in by mangling irq_desc[irq].affinity directly. Ingo, does this break anything?
Signed-off-by Rusty Russell <[email protected]>
Signed-off-by Mike Travis <[email protected]>
Cc Ingo Molnar <[email protected]>
--- arch/mips/kernel/cevt-bcm1480.c | 2 arch/mips/kernel/cevt-sb1250.c | 2 arch/x86/kernel/hpet.c | 4 - arch/x86/kernel/io_apic.c | 83 +++++++++++++++++++--------------------- arch/x86/kernel/irq_32.c | 2 drivers/parisc/iosapic.c | 7 +-- drivers/xen/events.c | 6 +- include/linux/interrupt.h | 4 - include/linux/irq.h | 7 +-- kernel/irq/chip.c | 2 kernel/irq/manage.c | 13 ++---- kernel/irq/migration.c | 18 ++++---- kernel/irq/proc.c | 29 +++++++++---- kernel/time/tick-common.c | 6 +- 14 files changed, 97 insertions(+), 88 deletions(-)
arch/mips/kernel/cevt-bcm1480.c +1 -1
@@ -148,6 +148,6 @@ action->name = name; action->dev_id = cd; -irq_set_affinity (irq,cpumask_of_cpu (cpu)); +irq_set_affinity (irq,cpumask_of (cpu));setup_irq (irq, action); }
arch/mips/kernel/cevt-sb1250.c +1 -1
@@ -147,6 +147,6 @@ action->name = name; action->dev_id = cd; -irq_set_affinity (irq,cpumask_of_cpu (cpu)); +irq_set_affinity (irq,cpumask_of (cpu));setup_irq (irq, action); }
arch/x86/kernel/hpet.c +2 -2
@@ -301,7 +301,7 @@struct hpet_dev *hdev =EVT_TO_HPET_DEV (evt);hpet_setup_msi_irq (hdev->irq);disable_irq (hdev->irq); -irq_set_affinity (hdev->irq,cpumask_of_cpu (hdev->cpu)); +irq_set_affinity (hdev->irq,cpumask_of (hdev->cpu));enable_irq (hdev->irq); }break ;
@@ -449,7 +449,7 @@return -1 ;disable_irq (dev->irq); -irq_set_affinity (dev->irq,cpumask_of_cpu (dev->cpu)); +irq_set_affinity (dev->irq,cpumask_of (dev->cpu));enable_irq (dev->irq); printk(KERN_DEBUG "hpet: %s irq %d for MSI\n",
arch/x86/kernel/io_apic.c +41 -42
257 lines not on this page · raw message
arch/x86/kernel/irq_32.c +1 -1
@@ -251,7 +251,7 @@ mask = map; }if (desc->chip->set_affinity) - desc->chip->set_affinity (irq, mask); + desc->chip->set_affinity (irq, &mask);else if (desc->action && !(warned++))printk ("Cannot set affinity for irq %i\n" , irq); }
drivers/parisc/iosapic.c +4 -3
@@ -704,16 +704,17 @@ }#ifdef CONFIG_SMP -static void iosapic_set_affinity_irq (unsigned int irq,cpumask_t dest) +static void iosapic_set_affinity_irq (unsigned int irq, +const struct cpumask *dest) {struct vector_info *vi =iosapic_get_vector (irq);u32 d0, d1, dummy_d0;unsigned long flags; -if (cpu_check_affinity (irq, &dest)) +if (cpu_check_affinity (irq, dest))return ; - vi->txn_addr =txn_affinity_addr (irq,first_cpu (dest)); + vi->txn_addr =txn_affinity_addr (irq,cpumask_first (dest));spin_lock_irqsave (&iosapic_lock, flags);/* d1 contains the destination CPU, so only want to set that
drivers/xen/events.c +3 -3
@@ -579,7 +579,7 @@spin_unlock (&irq_mapping_update_lock);/* new event channels are always bound to cpu 0 */ -irq_set_affinity (irq,cpumask_of_cpu (0 )); +irq_set_affinity (irq,cpumask_of (0 ));/* Unmask the event channel. */ enable_irq (irq);
@@ -608,9 +608,9 @@ } -static void set_affinity_irq (unsigned irq,cpumask_t dest) +static void set_affinity_irq (unsigned irq,const struct cpumask *dest) { -unsigned tcpu =first_cpu (dest); +unsigned tcpu =cpumask_first (dest);rebind_irq_to_cpu (irq, tcpu); }
include/linux/interrupt.h +2 -2
@@ -109,13 +109,13 @@extern cpumask_t irq_default_affinity; -extern int irq_set_affinity (unsigned int irq,cpumask_t cpumask); +extern int irq_set_affinity (unsigned int irq,const struct cpumask *cpumask);extern int irq_can_set_affinity (unsigned int irq);extern int irq_select_affinity (unsigned int irq);#else /* CONFIG_SMP */ -static inline int irq_set_affinity (unsigned int irq,cpumask_t cpumask) +static inline int irq_set_affinity (unsigned int irq,const struct cpumask *m) {return -EINVAL ; }
include/linux/irq.h +4 -3
@@ -112,7 +112,8 @@void (*eoi)(unsigned int irq);void (*end)(unsigned int irq); -void (*set_affinity)(unsigned int irq,cpumask_t dest); +void (*set_affinity)(unsigned int irq, +const cpumask_t *dest);int (*retrigger)(unsigned int irq);int (*set_type)(unsigned int irq,unsigned int flow_type);int (*set_wake)(unsigned int irq,unsigned int on);
@@ -210,7 +211,7 @@#ifdef CONFIG_GENERIC_PENDING_IRQ -void set_pending_irq (unsigned int irq,cpumask_t mask); +void set_pending_irq (unsigned int irq,const cpumask_t *mask);void move_native_irq (int irq);void move_masked_irq (int irq);
@@ -228,7 +229,7 @@ { } -static inline void set_pending_irq (unsigned int irq,cpumask_t mask) +static inline void set_pending_irq (unsigned int irq,const cpumask_t *mask) { }
kernel/irq/chip.c +1 -1
@@ -45,7 +45,7 @@ desc->irq_count =0 ; desc->irqs_unhandled =0 ;#ifdef CONFIG_SMP -cpus_setall (desc->affinity); +cpumask_setall (&desc->affinity);#endif spin_unlock_irqrestore (&desc->lock, flags); }
kernel/irq/manage.c +5 -8
@@ -79,7 +79,7 @@* @cpumask: cpumask * */ -int irq_set_affinity (unsigned int irq,cpumask_t cpumask) +int irq_set_affinity (unsigned int irq,const struct cpumask *cpumask) {struct irq_desc *desc =irq_to_desc (irq);
@@ -91,13 +91,13 @@unsigned long flags;spin_lock_irqsave (&desc->lock, flags); - desc->affinity = cpumask; +cpumask_copy (&desc->affinity, cpumask); desc->chip->set_affinity (irq, cpumask); spin_unlock_irqrestore(&desc->lock, flags); }else set_pending_irq (irq, cpumask);#else - desc->affinity = cpumask; +cpumask_copy (&desc->affinity, cpumask); desc->chip->set_affinity (irq, cpumask);#endif return 0 ;
@@ -109,17 +109,14 @@*/ int irq_select_affinity (unsigned int irq) { -cpumask_t mask;struct irq_desc *desc;if (!irq_can_set_affinity (irq))return 0 ; -cpus_and (mask, cpu_online_map, irq_default_affinity); - desc =irq_to_desc (irq); - desc->affinity = mask; - desc->chip->set_affinity (irq, mask); +cpumask_and (&desc->affinity, cpu_online_mask, &irq_default_affinity); + desc->chip->set_affinity (irq, &desc->affinity);return 0 ; }
kernel/irq/migration.c +10 -8
@@ -1,21 +1,21 @@#include <linux/irq.h> -void set_pending_irq (unsigned int irq,cpumask_t mask) +void set_pending_irq (unsigned int irq,const struct cpumask *mask) {struct irq_desc *desc =irq_to_desc (irq);unsigned long flags;spin_lock_irqsave (&desc->lock, flags); desc->status |=IRQ_MOVE_PENDING ; - desc->pending_mask = mask; +cpumask_copy (&desc->pending_mask, mask);spin_unlock_irqrestore (&desc->lock, flags); }void move_masked_irq (int irq) {struct irq_desc *desc =irq_to_desc (irq); -cpumask_t tmp; +cpumask_var_t tmp;if (likely (!(desc->status &IRQ_MOVE_PENDING )))return ;
@@ -30,7 +30,7 @@ desc->status &= ~IRQ_MOVE_PENDING ; -if (unlikely (cpus_empty (desc->pending_mask))) +if (unlikely (cpumask_empty (&desc->pending_mask)))return ;if (!desc->chip->set_affinity)
@@ -38,7 +38,10 @@assert_spin_locked (&desc->lock); -cpus_and (tmp, desc->pending_mask, cpu_online_map); +if (!alloc_cpumask_var (&tmp,GFP_ATOMIC )) +return ; + +cpumask_and (tmp, &desc->pending_mask, cpu_online_mask);/* * If there was a valid mask to work with, please
@@ -52,10 +55,9 @@* For correct operation this depends on the caller * masking the irqs. */ -if (likely (!cpus_empty (tmp))) { +if (likely (!cpumask_empty (tmp))) desc->chip->set_affinity (irq,tmp); - } -cpus_clear (desc->pending_mask); +cpumask_clear (&desc->pending_mask); }void move_native_irq (int irq)
kernel/irq/proc.c +19 -10
@@ -40,33 +40,42 @@ const char __user *buffer, size_t count, loff_t *pos) { unsigned int irq = (int)(long)PDE(file->f_path.dentry->d_inode)->data; -cpumask_t new_value; +cpumask_var_t new_value;int err;if (!irq_to_desc (irq)->chip->set_affinity || no_irq_affinity ||irq_balancing_disabled (irq))return -EIO ; - err =cpumask_parse_user (buffer, count, &new_value); +if (!alloc_cpumask_var (&new_value,GFP_KERNEL )) +return -ENOMEM ; + + err =cpumask_parse_user (buffer, count, new_value);if (err) -return err; + goto free_cpumask; -if (!is_affinity_mask_valid (new_value)) -return -EINVAL ; +if (!is_affinity_mask_valid (new_value)) { + err = -EINVAL ; + goto free_cpumask; + }/* * Do not allow disabling IRQs completely - it's a too easy * way to make the system unusable accidentally :-) At least * one online CPU still has to be targeted. */ -if (!cpus_intersects (new_value, cpu_online_map)) +if (!cpumask_intersects (new_value, cpu_online_mask)) {/* Special case for empty set - allow the architecture code to set default SMP affinity. */ -return irq_select_affinity (irq) ? -EINVAL : count; + err =irq_select_affinity (irq) ? -EINVAL : count; + }else { +irq_set_affinity (irq, new_value); + err = count; + } -irq_set_affinity (irq, new_value); - -return count; +free_cpumask: +free_cpumask_var (new_value); +return err; }static int irq_affinity_proc_open (struct inode *inode,struct file *file)
kernel/time/tick-common.c +3 -3
@@ -136,7 +136,7 @@*/ static void tick_setup_device (struct tick_device *td,struct clock_event_device *newdev,int cpu, -const cpumask_t *cpumask) +const struct cpumask *cpumask) {ktime_t next_event;void (*handler)(struct clock_event_device *) =NULL ;
@@ -171,8 +171,8 @@* When the device is not per cpu, pin the interrupt to the * current cpu: */ -if (!cpus_equal (newdev->cpumask, *cpumask)) -irq_set_affinity (newdev->irq, *cpumask); +if (!cpumask_equal (&newdev->cpumask, cpumask)) +irq_set_affinity (newdev->irq, cpumask);/* * When global broadcasting is active, check if the current
Quoted 6 lines · Rusty Russell
(Ingo, this is for you directly, not linux-next).
Not much point with gentle transition here: the struct irq_chip's setaffinity method signature needs to change.
Fortunately, not widely used code, but hits a few architectures.
...
Quoted 1 line
...
Quoted 1 line
drivers/parisc/iosapic.c | 7 +--
...
Reviewed-by Grant Grundler <[email protected]>
thanks,
grant