07 Feb, 2007

1 commit

  • It's not efficient to use a per-cpu variable just to store
    how many physical stack register a cpu has. Ever since the
    incarnation of ia64 up till upcoming Montecito processor, that
    variable has "glued" to 96. Having a variable in memory means
    that the kernel is burning an extra cacheline access on every
    syscall and kernel exit path. Such "static" value is better
    served with the instruction patching utility exists today.
    Convert ia64_phys_stacked_size_p8 into dynamic insn patching.

    This also has a pleasant side effect of eliminating access to
    per-cpu area while psr.ic=0 in the kernel exit path. (fixable
    for per-cpu DTC work, but why bother?)

    There are some concerns with the default value that the instruc-
    tion encoded in the kernel image. It shouldn't be concerned.
    The reasons are:

    (1) cpu_init() is called at CPU initialization. In there, we
    find out physical stack register size from PAL and patch
    two instructions in kernel exit code. The code in question
    can not be executed before the patching is done.

    (2) current implementation stores zero in ia64_phys_stacked_size_p8,
    and that's what the current kernel exit path loads the value with.
    With the new code, it is equivalent that we store reg size 96
    in ia64_phys_stacked_size_p8, thus creating a better safety net.
    Given (1) above can never fail, having (2) is just a bonus.

    All in all, this patch allow one less memory reference in the kernel
    exit path, thus reducing syscall and interrupt return latency; and
    avoid polluting potential useful data in the CPU cache.

    Signed-off-by: Ken Chen
    Signed-off-by: Tony Luck

    Chen, Kenneth W
     

26 Apr, 2006

1 commit


31 Mar, 2006

1 commit

  • Add __mca_table to the DISCARD list for the gate.lds linker script to
    avoid broken linker references when linking the final vmlinux file.

    Also add comment to include/asm-ia64/asmmacros.h to avoid anyone else
    hitting this problem in the future.

    Credits to James Bottomley for spotting
    the DISCARD list in gate.lds.S

    Signed-off-by: Jes Sorensen
    Signed-off-by: Tony Luck

    Jes Sorensen
     

25 Mar, 2006

1 commit

  • Memory errors encountered by user applications may surface
    when the CPU is running in kernel context. The current code
    will not attempt recovery if the MCA surfaces in kernel
    context (privilage mode 0). This patch adds a check for cases
    where the user initiated the load that surfaces in kernel
    interrupt code.

    An example is a user process lauching a load from memory
    and the data in memory had bad ECC. Before the bad data
    gets to the CPU register, and interrupt comes in. The
    code jumps to the IVT interrupt entry point and begins
    execution in kernel context. The process of saving the
    user registers (SAVE_REST) causes the bad data to be loaded
    into a CPU register, triggering the MCA. The MCA surfaces in
    kernel context, even though the load was initiated from
    user context.

    As suggested by David and Tony, this patch uses an exception
    table like approach, puting the tagged recovery addresses in
    a searchable table. One difference from the exception table
    is that MCAs do not surface in precise places (such as with
    a TLB miss), so instead of tagging specific instructions,
    address ranges are registers. A single macro is used to do
    the tagging, with the input parameter being the label
    of the starting address and the macro being the ending
    address. This limits clutter in the code.

    This patch only tags one spot, the interrupt ivt entry.
    Testing showed that spot to be a "heavy hitter" with
    MCAs surfacing while saving user registers. Other spots
    can be added as needed by adding a single macro.

    Signed-off-by: Russ Anderson (rja@sgi.com)
    Signed-off-by: Tony Luck

    Russ Anderson
     

17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds