aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-06-23 20:16:32 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-06-24 11:59:11 -0400
commit849663430268db63a9c3c7467984e4e530ded901 (patch)
tree376459d03c5be4757813c5d185e364307bbbbd39
parent1e27dbe7746f3bcbcf1f9a37f31df4b886e36ce3 (diff)
SLUB: fix behavior if the text output of list_locations overflows PAGE_SIZE
If slabs are allocated or freed from a large set of call sites (typical for the kmalloc area) then we may create more output than fits into a single PAGE and sysfs only gives us one page. The output should be truncated. This patch fixes the checks to do the truncation properly. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/slub.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/mm/slub.c b/mm/slub.c
index fa28b1623644..202049a45764 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3042,13 +3042,15 @@ static int list_locations(struct kmem_cache *s, char *buf,
3042 n += sprintf(buf + n, " pid=%ld", 3042 n += sprintf(buf + n, " pid=%ld",
3043 l->min_pid); 3043 l->min_pid);
3044 3044
3045 if (num_online_cpus() > 1 && !cpus_empty(l->cpus)) { 3045 if (num_online_cpus() > 1 && !cpus_empty(l->cpus) &&
3046 n < PAGE_SIZE - 60) {
3046 n += sprintf(buf + n, " cpus="); 3047 n += sprintf(buf + n, " cpus=");
3047 n += cpulist_scnprintf(buf + n, PAGE_SIZE - n - 50, 3048 n += cpulist_scnprintf(buf + n, PAGE_SIZE - n - 50,
3048 l->cpus); 3049 l->cpus);
3049 } 3050 }
3050 3051
3051 if (num_online_nodes() > 1 && !nodes_empty(l->nodes)) { 3052 if (num_online_nodes() > 1 && !nodes_empty(l->nodes) &&
3053 n < PAGE_SIZE - 60) {
3052 n += sprintf(buf + n, " nodes="); 3054 n += sprintf(buf + n, " nodes=");
3053 n += nodelist_scnprintf(buf + n, PAGE_SIZE - n - 50, 3055 n += nodelist_scnprintf(buf + n, PAGE_SIZE - n - 50,
3054 l->nodes); 3056 l->nodes);