lkml.org 
[lkml]   [2015]   [Apr]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v5 03/10] module, jump_label: Fix module locking
    As per the module core lockdep annotations:

    [ 18.034047] ---[ end trace 9294429076a9c673 ]---
    [ 18.047760] Hardware name: Intel Corporation S2600GZ/S2600GZ, BIOS SE5C600.86B.02.02.0002.122320131210 12/23/2013
    [ 18.059228] ffffffff817d8676 ffff880036683c38 ffffffff8157e98b 0000000000000001
    [ 18.067541] 0000000000000000 ffff880036683c78 ffffffff8105fbc7 ffff880036683c68
    [ 18.075851] ffffffffa0046b08 0000000000000000 ffffffffa0046d00 ffffffffa0046cc8
    [ 18.084173] Call Trace:
    [ 18.086906] [<ffffffff8157e98b>] dump_stack+0x4f/0x7b
    [ 18.092649] [<ffffffff8105fbc7>] warn_slowpath_common+0x97/0xe0
    [ 18.099361] [<ffffffff8105fc2a>] warn_slowpath_null+0x1a/0x20
    [ 18.105880] [<ffffffff810ee502>] __module_address+0x1d2/0x1e0
    [ 18.112400] [<ffffffff81161153>] jump_label_module_notify+0x143/0x1e0
    [ 18.119710] [<ffffffff810814bf>] notifier_call_chain+0x4f/0x70
    [ 18.126326] [<ffffffff8108160e>] __blocking_notifier_call_chain+0x5e/0x90
    [ 18.134009] [<ffffffff81081656>] blocking_notifier_call_chain+0x16/0x20
    [ 18.141490] [<ffffffff810f0f00>] load_module+0x1b50/0x2660
    [ 18.147720] [<ffffffff810f1ade>] SyS_init_module+0xce/0x100
    [ 18.154045] [<ffffffff81587429>] system_call_fastpath+0x12/0x17
    [ 18.160748] ---[ end trace 9294429076a9c674 ]---

    Jump labels is not doing it right; fix this.

    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: Jason Baron <jbaron@akamai.com>
    Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    kernel/jump_label.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    --- a/kernel/jump_label.c
    +++ b/kernel/jump_label.c
    @@ -302,7 +302,7 @@ static int jump_label_add_module(struct
    continue;

    key = iterk;
    - if (__module_address(iter->key) == mod) {
    + if (within_module(iter->key, mod)) {
    /*
    * Set key->entries to iter, but preserve JUMP_LABEL_TRUE_BRANCH.
    */
    @@ -339,7 +339,7 @@ static void jump_label_del_module(struct

    key = (struct static_key *)(unsigned long)iter->key;

    - if (__module_address(iter->key) == mod)
    + if (within_module(iter->key, mod))
    continue;

    prev = &key->next;
    @@ -443,14 +443,16 @@ static void jump_label_update(struct sta
    {
    struct jump_entry *stop = __stop___jump_table;
    struct jump_entry *entry = jump_label_get_entries(key);
    -
    #ifdef CONFIG_MODULES
    - struct module *mod = __module_address((unsigned long)key);
    + struct module *mod;

    __jump_label_mod_update(key, enable);

    + preempt_disable();
    + mod = __module_address((unsigned long)key);
    if (mod)
    stop = mod->jump_entries + mod->num_jump_entries;
    + preempt_enable();
    #endif
    /* if there are no users, entry can be NULL */
    if (entry)



    \
     
     \ /
      Last update: 2015-04-13 16:41    [W:4.057 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site