Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b53bcb6799f8f2c0f385f24a8bb054f142c7d83a
Commit:     b53bcb6799f8f2c0f385f24a8bb054f142c7d83a
Parent:     bd0e11ff221d929b2b711ce3e5712e097e9dd1d8
Author:     David S. Miller <[EMAIL PROTECTED]>
AuthorDate: Sat Jul 14 03:16:13 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jul 16 04:05:11 2007 -0700

    [SPARC64]: Add ->set_affinity IRQ handlers.
    
    dr-cpu unconfigure requests will walk throught he enabled
    IRQs and trigger ->set_affinity so that the going-down
    cpu no longer has INOs targetted to it.
    
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 arch/sparc64/kernel/irq.c |   52 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 52 insertions(+), 0 deletions(-)

diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
index 634194e..a1c916f 100644
--- a/arch/sparc64/kernel/irq.c
+++ b/arch/sparc64/kernel/irq.c
@@ -293,6 +293,11 @@ static void sun4u_irq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4u_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       sun4u_irq_enable(virt_irq);
+}
+
 static void sun4u_irq_disable(unsigned int virt_irq)
 {
        struct irq_handler_data *data = get_irq_chip_data(virt_irq);
@@ -344,6 +349,24 @@ static void sun4v_irq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4v_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
+       unsigned int ino = bucket - &ivector_table[0];
+
+       if (likely(bucket)) {
+               unsigned long cpuid;
+               int err;
+
+               cpuid = irq_choose_cpu(virt_irq);
+
+               err = sun4v_intr_settarget(ino, cpuid);
+               if (err != HV_EOK)
+                       printk("sun4v_intr_settarget(%x,%lu): err(%d)\n",
+                              ino, cpuid, err);
+       }
+}
+
 static void sun4v_irq_disable(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
@@ -426,6 +449,28 @@ static void sun4v_virq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4v_virt_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
+       unsigned int ino = bucket - &ivector_table[0];
+
+       if (likely(bucket)) {
+               unsigned long cpuid, dev_handle, dev_ino;
+               int err;
+
+               cpuid = irq_choose_cpu(virt_irq);
+
+               dev_handle = ino & IMAP_IGN;
+               dev_ino = ino & IMAP_INO;
+
+               err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
+               if (err != HV_EOK)
+                       printk("sun4v_vintr_set_target(%lx,%lx,%lu): "
+                              "err(%d)\n",
+                              dev_handle, dev_ino, cpuid, err);
+       }
+}
+
 static void sun4v_virq_disable(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
@@ -489,6 +534,7 @@ static struct irq_chip sun4u_irq = {
        .enable         = sun4u_irq_enable,
        .disable        = sun4u_irq_disable,
        .end            = sun4u_irq_end,
+       .set_affinity   = sun4u_set_affinity,
 };
 
 static struct irq_chip sun4u_irq_ack = {
@@ -497,6 +543,7 @@ static struct irq_chip sun4u_irq_ack = {
        .disable        = sun4u_irq_disable,
        .ack            = run_pre_handler,
        .end            = sun4u_irq_end,
+       .set_affinity   = sun4u_set_affinity,
 };
 
 static struct irq_chip sun4v_irq = {
@@ -504,6 +551,7 @@ static struct irq_chip sun4v_irq = {
        .enable         = sun4v_irq_enable,
        .disable        = sun4v_irq_disable,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 
 static struct irq_chip sun4v_irq_ack = {
@@ -512,6 +560,7 @@ static struct irq_chip sun4v_irq_ack = {
        .disable        = sun4v_irq_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 
 #ifdef CONFIG_PCI_MSI
@@ -523,6 +572,7 @@ static struct irq_chip sun4v_msi = {
        .disable        = sun4v_msi_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 #endif
 
@@ -531,6 +581,7 @@ static struct irq_chip sun4v_virq = {
        .enable         = sun4v_virq_enable,
        .disable        = sun4v_virq_disable,
        .end            = sun4v_virq_end,
+       .set_affinity   = sun4v_virt_set_affinity,
 };
 
 static struct irq_chip sun4v_virq_ack = {
@@ -539,6 +590,7 @@ static struct irq_chip sun4v_virq_ack = {
        .disable        = sun4v_virq_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_virq_end,
+       .set_affinity   = sun4v_virt_set_affinity,
 };
 
 void irq_install_pre_handler(int virt_irq,
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to