lkml.org 
[lkml]   [2012]   [Sep]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 079/108] powerpc: Keep thread.dscr and thread.dscr_inherit in sync
    Date
    From: Greg KH <gregkh@linuxfoundation.org>

    3.5-stable review patch. If anyone has any objections, please let me know.

    ------------------

    From: Anton Blanchard <anton@samba.org>

    commit 00ca0de02f80924dfff6b4f630e1dff3db005e35 upstream.

    When we update the DSCR either via emulation of mtspr(DSCR) or via
    a change to dscr_default in sysfs we don't update thread.dscr.
    We will eventually update it at context switch time but there is
    a period where thread.dscr is incorrect.

    If we fork at this point we will copy the old value of thread.dscr
    into the child. To avoid this, always keep thread.dscr in sync with
    reality.

    This issue was found with the following testcase:

    http://ozlabs.org/~anton/junkcode/dscr_inherit_test.c

    Signed-off-by: Anton Blanchard <anton@samba.org>
    Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/kernel/sysfs.c | 4 +++-
    arch/powerpc/kernel/traps.c | 3 ++-
    2 files changed, 5 insertions(+), 2 deletions(-)

    --- a/arch/powerpc/kernel/sysfs.c
    +++ b/arch/powerpc/kernel/sysfs.c
    @@ -196,8 +196,10 @@ static ssize_t show_dscr_default(struct

    static void update_dscr(void *dummy)
    {
    - if (!current->thread.dscr_inherit)
    + if (!current->thread.dscr_inherit) {
    + current->thread.dscr = dscr_default;
    mtspr(SPRN_DSCR, dscr_default);
    + }
    }

    static ssize_t __used store_dscr_default(struct device *dev,
    --- a/arch/powerpc/kernel/traps.c
    +++ b/arch/powerpc/kernel/traps.c
    @@ -972,8 +972,9 @@ static int emulate_instruction(struct pt
    cpu_has_feature(CPU_FTR_DSCR)) {
    PPC_WARN_EMULATED(mtdscr, regs);
    rd = (instword >> 21) & 0x1f;
    - mtspr(SPRN_DSCR, regs->gpr[rd]);
    + current->thread.dscr = regs->gpr[rd];
    current->thread.dscr_inherit = 1;
    + mtspr(SPRN_DSCR, current->thread.dscr);
    return 0;
    }
    #endif



    \
     
     \ /
      Last update: 2012-09-13 05:01    [W:4.058 / U:0.968 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site