lkml.org 
[lkml]   [2012]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/7] module: take rcu_read_lock_sched for find_symbol
    Date
    find_symbol() iterates module list with list_for_each_entry_rcu()
    should its caller should hold rcu_read_lock_sched().

    This patch changes the module_mutex to rcu_read_lock_sched in
    resolve_symbol() and adds rcu_read_lock_sched in verify_export_symbols().

    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
    ---
    kernel/module.c | 7 +++++--
    1 files changed, 5 insertions(+), 2 deletions(-)

    diff --git a/kernel/module.c b/kernel/module.c
    index 6f6a3fd..b31b23f 100644
    --- a/kernel/module.c
    +++ b/kernel/module.c
    @@ -1174,7 +1174,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
    const unsigned long *crc;
    int err;

    - mutex_lock(&module_mutex);
    + rcu_read_lock_sched();
    sym = find_symbol(name, &owner, &crc,
    !(mod->taints & (1 << TAINT_PROPRIETARY_MODULE)), true);
    if (!sym)
    @@ -1196,7 +1196,7 @@ getname:
    /* We must make copy under the lock if we failed to get ref. */
    strncpy(ownername, module_name(owner), MODULE_NAME_LEN);
    unlock:
    - mutex_unlock(&module_mutex);
    + rcu_read_unlock_sched();
    return sym;
    }

    @@ -1844,6 +1844,7 @@ static int verify_export_symbols(struct module *mod)
    #endif
    };

    + rcu_read_lock_sched();
    for (i = 0; i < ARRAY_SIZE(arr); i++) {
    for (s = arr[i].sym; s < arr[i].sym + arr[i].num; s++) {
    if (find_symbol(s->name, &owner, NULL, true, false)) {
    @@ -1851,10 +1852,12 @@ static int verify_export_symbols(struct module *mod)
    "%s: exports duplicate symbol %s"
    " (owned by %s)\n",
    mod->name, s->name, module_name(owner));
    + rcu_read_unlock_sched();
    return -ENOEXEC;
    }
    }
    }
    + rcu_read_unlock_sched();
    return 0;
    }

    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-03-15 15:53    [W:0.035 / U:124.296 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site