[lkml]   [2007]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    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 <>

    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.


    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)
    + if (entry->proc_handler == NULL)
    + kfree(entry->procname);
    + }

    *tablep = NULL;
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at
     \ /
      Last update: 2007-10-16 01:43    [W:0.020 / U:85.268 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site