mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[IA64] SN: Correctly update smp_affinty mask
On Altix systems, the /proc/irq/nn/smp_affinity mask is not being setup at device iniitalization, or updated after an interrupt redirection. This patch resolves those issues. Signed-off-by: John Keller <jpk@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
d61b49c1aa
commit
c69577711a
@ -117,7 +117,10 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,
|
|||||||
nasid_t nasid, int slice)
|
nasid_t nasid, int slice)
|
||||||
{
|
{
|
||||||
int vector;
|
int vector;
|
||||||
|
int cpuid;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
int cpuphys;
|
int cpuphys;
|
||||||
|
#endif
|
||||||
int64_t bridge;
|
int64_t bridge;
|
||||||
int local_widget, status;
|
int local_widget, status;
|
||||||
nasid_t local_nasid;
|
nasid_t local_nasid;
|
||||||
@ -146,7 +149,6 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,
|
|||||||
vector = sn_irq_info->irq_irq;
|
vector = sn_irq_info->irq_irq;
|
||||||
/* Free the old PROM new_irq_info structure */
|
/* Free the old PROM new_irq_info structure */
|
||||||
sn_intr_free(local_nasid, local_widget, new_irq_info);
|
sn_intr_free(local_nasid, local_widget, new_irq_info);
|
||||||
/* Update kernels new_irq_info with new target info */
|
|
||||||
unregister_intr_pda(new_irq_info);
|
unregister_intr_pda(new_irq_info);
|
||||||
|
|
||||||
/* allocate a new PROM new_irq_info struct */
|
/* allocate a new PROM new_irq_info struct */
|
||||||
@ -160,8 +162,10 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpuphys = nasid_slice_to_cpuid(nasid, slice);
|
/* Update kernels new_irq_info with new target info */
|
||||||
new_irq_info->irq_cpuid = cpuphys;
|
cpuid = nasid_slice_to_cpuid(new_irq_info->irq_nasid,
|
||||||
|
new_irq_info->irq_slice);
|
||||||
|
new_irq_info->irq_cpuid = cpuid;
|
||||||
register_intr_pda(new_irq_info);
|
register_intr_pda(new_irq_info);
|
||||||
|
|
||||||
pci_provider = sn_pci_provider[new_irq_info->irq_bridge_type];
|
pci_provider = sn_pci_provider[new_irq_info->irq_bridge_type];
|
||||||
@ -180,6 +184,7 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,
|
|||||||
call_rcu(&sn_irq_info->rcu, sn_irq_info_free);
|
call_rcu(&sn_irq_info->rcu, sn_irq_info_free);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
cpuphys = cpu_physical_id(cpuid);
|
||||||
set_irq_affinity_info((vector & 0xff), cpuphys, 0);
|
set_irq_affinity_info((vector & 0xff), cpuphys, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -299,6 +304,9 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)
|
|||||||
nasid_t nasid = sn_irq_info->irq_nasid;
|
nasid_t nasid = sn_irq_info->irq_nasid;
|
||||||
int slice = sn_irq_info->irq_slice;
|
int slice = sn_irq_info->irq_slice;
|
||||||
int cpu = nasid_slice_to_cpuid(nasid, slice);
|
int cpu = nasid_slice_to_cpuid(nasid, slice);
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
int cpuphys;
|
||||||
|
#endif
|
||||||
|
|
||||||
pci_dev_get(pci_dev);
|
pci_dev_get(pci_dev);
|
||||||
sn_irq_info->irq_cpuid = cpu;
|
sn_irq_info->irq_cpuid = cpu;
|
||||||
@ -311,6 +319,10 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)
|
|||||||
spin_unlock(&sn_irq_info_lock);
|
spin_unlock(&sn_irq_info_lock);
|
||||||
|
|
||||||
register_intr_pda(sn_irq_info);
|
register_intr_pda(sn_irq_info);
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
cpuphys = cpu_physical_id(cpu);
|
||||||
|
set_irq_affinity_info(sn_irq_info->irq_irq, cpuphys, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void sn_irq_unfixup(struct pci_dev *pci_dev)
|
void sn_irq_unfixup(struct pci_dev *pci_dev)
|
||||||
|
@ -136,10 +136,6 @@ int sn_setup_msi_irq(unsigned int irq, struct pci_dev *pdev)
|
|||||||
*/
|
*/
|
||||||
msg.data = 0x100 + irq;
|
msg.data = 0x100 + irq;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
set_irq_affinity_info(irq, sn_irq_info->irq_cpuid, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
write_msi_msg(irq, &msg);
|
write_msi_msg(irq, &msg);
|
||||||
set_irq_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq);
|
set_irq_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user