lkml.org 
[lkml]   [2003]   [Apr]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] __try_module_get()
    Date
    Linus, please apply.

    Name: __try_module_get
    Author: Rusty Russell
    Status: Trivial

    D: Introduces __try_module_get for places where we know we already hold
    D: a reference and ignoring the fact that the module is being "rmmod --wait"ed
    D: is simpler.

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .5936-linux-2.5.66-bk2/fs/filesystems.c .5936-linux-2.5.66-bk2.updated/fs/filesystems.c
    --- .5936-linux-2.5.66-bk2/fs/filesystems.c 2003-03-18 12:21:38.000000000 +1100
    +++ .5936-linux-2.5.66-bk2.updated/fs/filesystems.c 2003-03-27 12:58:34.000000000 +1100
    @@ -32,17 +32,7 @@ static rwlock_t file_systems_lock = RW_L
    /* WARNING: This can be used only if we _already_ own a reference */
    void get_filesystem(struct file_system_type *fs)
    {
    - if (!try_module_get(fs->owner)) {
    -#ifdef CONFIG_MODULE_UNLOAD
    - unsigned int cpu = get_cpu();
    - local_inc(&fs->owner->ref[cpu].count);
    - put_cpu();
    -#else
    - /* Getting filesystem while it's starting up? We're
    - already supposed to have a reference. */
    - BUG();
    -#endif
    - }
    + __try_module_get(fs->owner);
    }

    void put_filesystem(struct file_system_type *fs)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .5936-linux-2.5.66-bk2/include/linux/module.h .5936-linux-2.5.66-bk2.updated/include/linux/module.h
    --- .5936-linux-2.5.66-bk2/include/linux/module.h 2003-03-25 12:17:31.000000000 +1100
    +++ .5936-linux-2.5.66-bk2.updated/include/linux/module.h 2003-03-27 12:58:34.000000000 +1100
    @@ -272,6 +272,7 @@ int module_text_address(unsigned long ad

    #ifdef CONFIG_MODULE_UNLOAD

    +unsigned int module_refcount(struct module *mod);
    void __symbol_put(const char *symbol);
    #define symbol_put(x) __symbol_put(MODULE_SYMBOL_PREFIX #x)
    void symbol_put_addr(void *addr);
    @@ -282,6 +283,17 @@ void symbol_put_addr(void *addr);
    #define local_dec(x) atomic_dec(x)
    #endif

    +/* Sometimes we know we already have a refcount, and it's easier not
    + to handle the error case (which only happens with rmmod --wait). */
    +static inline void __try_module_get(struct module *module)
    +{
    + if (module) {
    + BUG_ON(module_refcount(module) == 0);
    + local_inc(&module->ref[get_cpu()].count);
    + put_cpu();
    + }
    +}
    +
    static inline int try_module_get(struct module *module)
    {
    int ret = 1;
    @@ -317,6 +329,9 @@ static inline int try_module_get(struct
    static inline void module_put(struct module *module)
    {
    }
    +static inline void __try_module_get(struct module *module)
    +{
    +}
    #define symbol_put(x) do { } while(0)
    #define symbol_put_addr(p) do { } while(0)

    @@ -371,6 +386,10 @@ static inline int module_text_address(un
    #define symbol_put(x) do { } while(0)
    #define symbol_put_addr(x) do { } while(0)

    +static inline void __try_module_get(struct module *module)
    +{
    +}
    +
    static inline int try_module_get(struct module *module)
    {
    return 1;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .5936-linux-2.5.66-bk2/kernel/module.c .5936-linux-2.5.66-bk2.updated/kernel/module.c
    --- .5936-linux-2.5.66-bk2/kernel/module.c 2003-03-18 05:01:52.000000000 +1100
    +++ .5936-linux-2.5.66-bk2.updated/kernel/module.c 2003-03-27 12:59:06.000000000 +1100
    @@ -374,7 +374,7 @@ static inline void restart_refcounts(voi
    }
    #endif

    -static unsigned int module_refcount(struct module *mod)
    +unsigned int module_refcount(struct module *mod)
    {
    unsigned int i, total = 0;

    @@ -382,6 +382,7 @@ static unsigned int module_refcount(stru
    total += atomic_read(&mod->ref[i].count);
    return total;
    }
    +EXPORT_SYMBOL(module_refcount);

    /* This exists whether we can unload or not */
    static void free_module(struct module *mod);
    --
    Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:34    [W:0.022 / U:0.732 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site