lkml.org 
[lkml]   [2007]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [4/58] x86_64: Don't rely on a unique IO-APIC ID
    Date

    Linux 64bit only uses the IO-APIC ID as an internal cookie. In the future
    there could be some cases where the IO-APIC IDs are not unique because
    they share an 8 bit space with CPUs and if there are enough CPUs
    it is difficult to get them that. But Linux needs the io apic ID
    internally for its data structures. Assign unique IO APIC ids on
    table parsing.

    TBD do for 32bit too

    Signed-off-by: Andi Kleen <ak@suse.de>

    ---
    arch/x86_64/kernel/mpparse.c | 20 ++++++++++++++++++--
    1 file changed, 18 insertions(+), 2 deletions(-)

    Index: linux/arch/x86_64/kernel/mpparse.c
    ===================================================================
    --- linux.orig/arch/x86_64/kernel/mpparse.c
    +++ linux/arch/x86_64/kernel/mpparse.c
    @@ -649,6 +649,20 @@ static int mp_find_ioapic(int gsi)
    return -1;
    }

    +static u8 uniq_ioapic_id(u8 id)
    +{
    + int i;
    + DECLARE_BITMAP(used, 256);
    + bitmap_zero(used, 256);
    + for (i = 0; i < nr_ioapics; i++) {
    + struct mpc_config_ioapic *ia = &mp_ioapics[i];
    + __set_bit(ia->mpc_apicid, used);
    + }
    + if (!test_bit(id, used))
    + return id;
    + return find_first_zero_bit(used, 256);
    +}
    +
    void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base)
    {
    int idx = 0;
    @@ -656,14 +670,14 @@ void __init mp_register_ioapic(u8 id, u3
    if (bad_ioapic(address))
    return;

    - idx = nr_ioapics++;
    + idx = nr_ioapics;

    mp_ioapics[idx].mpc_type = MP_IOAPIC;
    mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
    mp_ioapics[idx].mpc_apicaddr = address;

    set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
    - mp_ioapics[idx].mpc_apicid = id;
    + mp_ioapics[idx].mpc_apicid = uniq_ioapic_id(id);
    mp_ioapics[idx].mpc_apicver = 0;

    /*
    @@ -680,6 +694,8 @@ void __init mp_register_ioapic(u8 id, u3
    mp_ioapics[idx].mpc_apicaddr,
    mp_ioapic_routing[idx].gsi_start,
    mp_ioapic_routing[idx].gsi_end);
    +
    + nr_ioapics++;
    }

    void __init
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-07-19 12:01    [W:0.023 / U:1.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site