2006-03-25 14:07:36 +03:00
# include <linux/irq.h>
# if defined(CONFIG_GENERIC_PENDING_IRQ)
void set_pending_irq ( unsigned int irq , cpumask_t mask )
{
irq_desc_t * desc = irq_desc + irq ;
unsigned long flags ;
spin_lock_irqsave ( & desc - > lock , flags ) ;
desc - > move_irq = 1 ;
pending_irq_cpumask [ irq ] = mask ;
spin_unlock_irqrestore ( & desc - > lock , flags ) ;
}
void move_native_irq ( int irq )
{
cpumask_t tmp ;
irq_desc_t * desc = irq_descp ( irq ) ;
2006-03-25 14:07:37 +03:00
if ( likely ( ! desc - > move_irq ) )
2006-03-25 14:07:36 +03:00
return ;
2006-03-25 14:07:37 +03:00
/*
* Paranoia : cpu - local interrupts shouldn ' t be calling in here anyway .
*/
if ( CHECK_IRQ_PER_CPU ( desc - > status ) ) {
WARN_ON ( 1 ) ;
return ;
}
2006-03-25 14:07:36 +03:00
desc - > move_irq = 0 ;
if ( likely ( cpus_empty ( pending_irq_cpumask [ irq ] ) ) )
return ;
if ( ! desc - > handler - > set_affinity )
return ;
2006-03-25 14:07:37 +03:00
assert_spin_locked ( & desc - > lock ) ;
2006-03-25 14:07:36 +03:00
cpus_and ( tmp , pending_irq_cpumask [ irq ] , cpu_online_map ) ;
/*
* If there was a valid mask to work with , please
* do the disable , re - program , enable sequence .
* This is * not * particularly important for level triggered
* but in a edge trigger case , we might be setting rte
* when an active trigger is comming in . This could
* cause some ioapics to mal - function .
* Being paranoid i guess !
*/
if ( unlikely ( ! cpus_empty ( tmp ) ) ) {
2006-03-25 14:07:37 +03:00
if ( likely ( ! ( desc - > status & IRQ_DISABLED ) ) )
desc - > handler - > disable ( irq ) ;
2006-03-25 14:07:36 +03:00
desc - > handler - > set_affinity ( irq , tmp ) ;
2006-03-25 14:07:37 +03:00
if ( likely ( ! ( desc - > status & IRQ_DISABLED ) ) )
desc - > handler - > enable ( irq ) ;
2006-03-25 14:07:36 +03:00
}
cpus_clear ( pending_irq_cpumask [ irq ] ) ;
}
# endif