lkml.org 
[lkml]   [2010]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [4/9] SYSCTL: Use RCU strings for core_pattern sysctl
    Date

    Also saves ~220 bytes in the data segment for default kernels.

    As a bonus this removes one use of the BKL.

    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    fs/exec.c | 11 +++++------
    kernel/sysctl.c | 6 +++---
    2 files changed, 8 insertions(+), 9 deletions(-)

    Index: linux-2.6.33-rc2-ak/fs/exec.c
    ===================================================================
    --- linux-2.6.33-rc2-ak.orig/fs/exec.c
    +++ linux-2.6.33-rc2-ak/fs/exec.c
    @@ -62,7 +62,7 @@
    #include "internal.h"

    int core_uses_pid;
    -char core_pattern[CORENAME_MAX_SIZE] = "core";
    +char *core_pattern = "core";
    unsigned int core_pipe_limit;
    int suid_dumpable = 0;

    @@ -1421,7 +1421,7 @@ EXPORT_SYMBOL(set_binfmt);
    static int format_corename(char *corename, long signr)
    {
    const struct cred *cred = current_cred();
    - const char *pat_ptr = core_pattern;
    + const char *pat_ptr = rcu_dereference(core_pattern);
    int ispipe = (*pat_ptr == '|');
    char *out_ptr = corename;
    char *const out_end = corename + CORENAME_MAX_SIZE;
    @@ -1825,12 +1825,11 @@ void do_coredump(long signr, int exit_co
    clear_thread_flag(TIF_SIGPENDING);

    /*
    - * lock_kernel() because format_corename() is controlled by sysctl, which
    - * uses lock_kernel()
    + * Protect corename by RCU vs proc_rcu_string()
    */
    - lock_kernel();
    + rcu_read_lock();
    ispipe = format_corename(corename, signr);
    - unlock_kernel();
    + rcu_read_unlock();

    if ((!ispipe) && (cprm.limit < binfmt->min_coredump))
    goto fail_unlock;
    Index: linux-2.6.33-rc2-ak/kernel/sysctl.c
    ===================================================================
    --- linux-2.6.33-rc2-ak.orig/kernel/sysctl.c
    +++ linux-2.6.33-rc2-ak/kernel/sysctl.c
    @@ -75,7 +75,7 @@ extern int sysctl_oom_dump_tasks;
    extern int max_threads;
    extern int core_uses_pid;
    extern int suid_dumpable;
    -extern char core_pattern[];
    +extern char *core_pattern;
    extern unsigned int core_pipe_limit;
    extern int pid_max;
    extern int min_free_kbytes;
    @@ -399,10 +399,10 @@ static struct ctl_table kern_table[] = {
    },
    {
    .procname = "core_pattern",
    - .data = core_pattern,
    + .data = &core_pattern,
    .maxlen = CORENAME_MAX_SIZE,
    .mode = 0644,
    - .proc_handler = proc_dostring,
    + .proc_handler = proc_rcu_string,
    },
    {
    .procname = "core_pipe_limit",

    \
     
     \ /
      Last update: 2010-01-05 03:17    [W:0.021 / U:95.400 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site