Commit c6957771 authored by John Keller's avatar John Keller Committed by Tony Luck

[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: default avatarJohn Keller <jpk@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent d61b49c1
...@@ -117,7 +117,10 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment