aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilton Miller <miltonm@bga.com>2007-10-17 10:55:11 -0400
committerIngo Molnar <mingo@elte.hu>2007-10-17 10:55:11 -0400
commitcd79007634854f9e936e2369890f2512f94b8759 (patch)
tree904e9d4f406bf5d48699027f415e6acd12cc9121
parentebb3e820b83e426ee331bae6d8fb0e54f472a25d (diff)
sched: more robust sd-sysctl entry freeing
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. Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/sched.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 0da2b2635c54..5e220bf7d4c4 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -5272,11 +5272,20 @@ static struct ctl_table *sd_alloc_ctl_entry(int n)
5272 5272
5273static void sd_free_ctl_entry(struct ctl_table **tablep) 5273static void sd_free_ctl_entry(struct ctl_table **tablep)
5274{ 5274{
5275 struct ctl_table *entry = *tablep; 5275 struct ctl_table *entry;
5276 5276
5277 for (entry = *tablep; entry->procname; entry++) 5277 /*
5278 * In the intermediate directories, both the child directory and
5279 * procname are dynamically allocated and could fail but the mode
5280 * will always be set. In the lowest directory the names are
5281 * static strings and all have proc handlers.
5282 */
5283 for (entry = *tablep; entry->mode; entry++) {
5278 if (entry->child) 5284 if (entry->child)
5279 sd_free_ctl_entry(&entry->child); 5285 sd_free_ctl_entry(&entry->child);
5286 if (entry->proc_handler == NULL)
5287 kfree(entry->procname);
5288 }
5280 5289
5281 kfree(*tablep); 5290 kfree(*tablep);
5282 *tablep = NULL; 5291 *tablep = NULL;