lkml.org 
[lkml]   [2007]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] sched domain sysctl: free kstrdup allocations
    The procnames for the cpu and domain were allocated via kstrdup and so
    should also be freed. The names for the files are static, but we
    can differentiate them by the presence of the proc_handler. If a
    kstrdup (of < 32 characters) fails the sysctl code will not see the
    procname or remaining table entries, but any child tables and names
    will be reclaimed upon free.

    Signed-off-by: Milton Miller <miltonm@bga.com>
    ---

    Hi Ingo.

    It occurred to me this morning that the procname field was dynamically
    allocated and needed to be freed. I started to put in break statements
    when allocation failed but it was approaching 50% error handling code.

    I came up with this alternative of looping while entry->mode is set and
    checking proc_handler instead of ->table. Alternatively, the string
    version of the domain name and cpu number could be stored the structs.

    I verified by compiling CONFIG_DEBUG_SLAB and checking the allocation
    counts after taking a cpuset exclusive and back.

    milton

    Index: kernel/kernel/sched.c
    ===================================================================
    --- kernel.orig/kernel/sched.c 2007-10-15 12:21:38.000000000 -0500
    +++ kernel/kernel/sched.c 2007-10-15 12:22:12.000000000 -0500
    @@ -5290,11 +5290,20 @@ static struct ctl_table *sd_alloc_ctl_en

    static void sd_free_ctl_entry(struct ctl_table **tablep)
    {
    - struct ctl_table *entry = *tablep;
    + struct ctl_table *entry;

    - for (entry = *tablep; entry->procname; entry++)
    + /*
    + * In the intermediate directories, both the child directory and
    + * procname are dynamically allocated and could fail but the mode
    + * will always be set. In the lowest directory the names are
    + * static strings and all have proc handlers.
    + */
    + for (entry = *tablep; entry->mode; entry++) {
    if (entry->child)
    sd_free_ctl_entry(&entry->child);
    + if (entry->proc_handler == NULL)
    + kfree(entry->procname);
    + }

    kfree(*tablep);
    *tablep = NULL;
    -
    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: 2007-10-16 01:43    [W:0.027 / U:0.448 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site