lkml.org 
[lkml]   [2009]   [Oct]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3] x86/apic: limit irq affinity
    Dimitri Sivanich wrote:
    > This patch allows for hard restrictions to irq affinity on x86 systems.
    >
    > Affinity is masked to allow only those cpus which the subarchitecture
    > deems accessible by the given irq.
    >
    > On some UV systems, this domain will be limited to the nodes accessible
    > to the irq's node. Initially other X86 systems will not mask off any cpus
    > so non-UV systems will remain unaffected.
    >
    > Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
    >
    > ---
    >
    > Removed allowed cpumask from irq_cfg. Storing allowed cpumasks in UV
    > specific IRQ code.
    >
    > arch/x86/Kconfig | 1
    > arch/x86/include/asm/hw_irq.h | 3
    > arch/x86/include/asm/uv/uv_irq.h | 1
    > arch/x86/include/asm/uv/uv_mmrs.h | 25 ++++++
    > arch/x86/kernel/apic/io_apic.c | 123 ++++++++++++++++++++++++++-------
    > arch/x86/kernel/apic/x2apic_uv_x.c | 4 -
    > arch/x86/kernel/uv_irq.c | 58 +++++++++++++++
    > 7 files changed, 189 insertions(+), 26 deletions(-)
    >
    > Index: linux/arch/x86/kernel/apic/io_apic.c
    > ===================================================================
    > --- linux.orig/arch/x86/kernel/apic/io_apic.c 2009-10-19 15:22:52.000000000 -0500
    > +++ linux/arch/x86/kernel/apic/io_apic.c 2009-10-19 20:57:29.000000000 -0500
    > @@ -168,6 +168,17 @@ void __init io_apic_disable_legacy(void)
    > nr_irqs_gsi = 0;
    > }
    >
    > +static int default_irq_allowed_and(struct irq_cfg *cfg, struct cpumask *dstp,
    > + const struct cpumask *srcp)
    > +{
    > + cpumask_copy(dstp, srcp);
    > +
    > + return 1;
    > +}
    > +
    > +int (*x86_irq_allowed_and)(struct irq_cfg *, struct cpumask *,
    > + const struct cpumask *) = default_irq_allowed_and;
    > +
    > int __init arch_early_irq_init(void)
    > {
    > struct irq_cfg *cfg;
    > @@ -183,6 +194,7 @@ int __init arch_early_irq_init(void)
    > for (i = 0; i < count; i++) {
    > desc = irq_to_desc(i);
    > desc->chip_data = &cfg[i];
    > + cfg->node = node;
    > zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node);
    > zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node);
    > if (i < nr_legacy_irqs)
    > @@ -231,12 +243,13 @@ int arch_init_chip_data(struct irq_desc
    >
    > cfg = desc->chip_data;
    > if (!cfg) {
    > - desc->chip_data = get_one_free_irq_cfg(node);
    > + cfg = desc->chip_data = get_one_free_irq_cfg(node);
    > if (!desc->chip_data) {
    > printk(KERN_ERR "can not alloc irq_cfg\n");
    > BUG_ON(1);
    > }
    > }
    > + cfg->node = node;

    how about desc->node ?

    YH


    \
     
     \ /
      Last update: 2009-10-20 21:01    [W:0.056 / U:150.136 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site