Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 243215
b: refs/heads/master
c: c2d0c55
h: refs/heads/master
i:
  243213: b08a8f2
  243211: 61d1a19
  243207: 347eed8
  243199: c9c8f67
v: v3
  • Loading branch information
David Daney authored and Thomas Gleixner committed Mar 27, 2011
1 parent ae60e0a commit 92973ce
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b3d422329f2e061d66af4f933ef316e50e5edcac
refs/heads/master: c2d0c555c22242c3a76e366074c4d83ef9fa3b8c
1 change: 1 addition & 0 deletions trunk/include/linux/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ extern void remove_irq(unsigned int irq, struct irqaction *act);

extern void irq_cpu_online(void);
extern void irq_cpu_offline(void);
extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask);

#ifdef CONFIG_GENERIC_HARDIRQS

Expand Down
48 changes: 30 additions & 18 deletions trunk/kernel/irq/manage.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,35 +139,26 @@ static inline void
irq_get_pending(struct cpumask *mask, struct irq_desc *desc) { }
#endif

/**
* irq_set_affinity - Set the irq affinity of a given irq
* @irq: Interrupt to set affinity
* @cpumask: cpumask
*
*/
int irq_set_affinity(unsigned int irq, const struct cpumask *mask)
int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask)
{
struct irq_desc *desc = irq_to_desc(irq);
struct irq_chip *chip = desc->irq_data.chip;
unsigned long flags;
struct irq_chip *chip = irq_data_get_irq_chip(data);
struct irq_desc *desc = irq_data_to_desc(data);
int ret = 0;

if (!chip->irq_set_affinity)
if (!chip || !chip->irq_set_affinity)
return -EINVAL;

raw_spin_lock_irqsave(&desc->lock, flags);

if (irq_can_move_pcntxt(desc)) {
ret = chip->irq_set_affinity(&desc->irq_data, mask, false);
if (irqd_can_move_in_process_context(data)) {
ret = chip->irq_set_affinity(data, mask, false);
switch (ret) {
case IRQ_SET_MASK_OK:
cpumask_copy(desc->irq_data.affinity, mask);
cpumask_copy(data->affinity, mask);
case IRQ_SET_MASK_OK_NOCOPY:
irq_set_thread_affinity(desc);
ret = 0;
}
} else {
irqd_set_move_pending(&desc->irq_data);
irqd_set_move_pending(data);
irq_copy_pending(desc, mask);
}

Expand All @@ -176,7 +167,28 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *mask)
schedule_work(&desc->affinity_notify->work);
}
irq_compat_set_affinity(desc);
irqd_set(&desc->irq_data, IRQD_AFFINITY_SET);
irqd_set(data, IRQD_AFFINITY_SET);

return ret;
}

/**
* irq_set_affinity - Set the irq affinity of a given irq
* @irq: Interrupt to set affinity
* @cpumask: cpumask
*
*/
int irq_set_affinity(unsigned int irq, const struct cpumask *mask)
{
struct irq_desc *desc = irq_to_desc(irq);
unsigned long flags;
int ret;

if (!desc)
return -EINVAL;

raw_spin_lock_irqsave(&desc->lock, flags);
ret = __irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask);
raw_spin_unlock_irqrestore(&desc->lock, flags);
return ret;
}
Expand Down

0 comments on commit 92973ce

Please sign in to comment.