lkml.org 
[lkml]   [2009]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[Patch 25/29] GRU - Fix bug in allocation of kernel contexts
    From: Jack Steiner <steiner@sgi.com>

    Fix a bug in the assignment of GRU contexts used for kernel
    functions. If a sleep occurs on the wait for a semaphore, the thread
    could switch cpus and allocate resources on the wrong blade.

    Signed-off-by: Jack Steiner <steiner@sgi.com>

    ---
    drivers/misc/sgi-gru/grukservices.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    Index: linux/drivers/misc/sgi-gru/grukservices.c
    ===================================================================
    --- linux.orig/drivers/misc/sgi-gru/grukservices.c 2009-11-20 09:32:35.000000000 -0600
    +++ linux/drivers/misc/sgi-gru/grukservices.c 2009-11-20 09:32:37.000000000 -0600
    @@ -221,13 +221,21 @@ static int gru_free_kernel_contexts(void
    static struct gru_blade_state *gru_lock_kernel_context(int blade_id)
    {
    struct gru_blade_state *bs;
    + int bid;

    STAT(lock_kernel_context);
    - bs = gru_base[blade_id];
    +again:
    + bid = blade_id < 0 ? uv_numa_blade_id() : blade_id;
    + bs = gru_base[bid];

    + /* Handle the case where migration occured while waiting for the sema */
    down_read(&bs->bs_kgts_sema);
    + if (blade_id < 0 && bid != uv_numa_blade_id()) {
    + up_read(&bs->bs_kgts_sema);
    + goto again;
    + }
    if (!bs->bs_kgts || !bs->bs_kgts->ts_gru)
    - gru_load_kernel_context(bs, blade_id);
    + gru_load_kernel_context(bs, bid);
    return bs;

    }
    @@ -256,7 +264,7 @@ static int gru_get_cpu_resources(int dsr

    BUG_ON(dsr_bytes > GRU_NUM_KERNEL_DSR_BYTES);
    preempt_disable();
    - bs = gru_lock_kernel_context(uv_numa_blade_id());
    + bs = gru_lock_kernel_context(-1);
    lcpu = uv_blade_processor_id();
    *cb = bs->kernel_cb + lcpu * GRU_HANDLE_STRIDE;
    *dsr = bs->kernel_dsr + lcpu * GRU_NUM_KERNEL_DSR_BYTES;


    \
     
     \ /
      Last update: 2009-11-24 16:13    [W:0.037 / U:0.732 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site