slub: allow stats to be cleared
When collecting slub stats for particular workloads, it's necessary to collect each statistic for all caches before the job is even started because the counters are usually greater than zero just from boot and initialization. This allows a statistic to be cleared on each cpu by writing '0' to its sysfs file. This creates a baseline for statistics of interest before the workload is started. Setting a statistic to a particular value is not supported, so all values written to these files other than '0' returns -EINVAL. Cc: Christoph Lameter <cl@linux-foundation.org> Signed-off-by: David Rientjes <rientjes@google.com> Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
This commit is contained in:
committed by
Pekka Enberg
parent
374576a8b6
commit
78eb00cc57
18
mm/slub.c
18
mm/slub.c
@ -4371,12 +4371,28 @@ static int show_stat(struct kmem_cache *s, char *buf, enum stat_item si)
|
||||
return len + sprintf(buf + len, "\n");
|
||||
}
|
||||
|
||||
static void clear_stat(struct kmem_cache *s, enum stat_item si)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_online_cpu(cpu)
|
||||
get_cpu_slab(s, cpu)->stat[si] = 0;
|
||||
}
|
||||
|
||||
#define STAT_ATTR(si, text) \
|
||||
static ssize_t text##_show(struct kmem_cache *s, char *buf) \
|
||||
{ \
|
||||
return show_stat(s, buf, si); \
|
||||
} \
|
||||
SLAB_ATTR_RO(text); \
|
||||
static ssize_t text##_store(struct kmem_cache *s, \
|
||||
const char *buf, size_t length) \
|
||||
{ \
|
||||
if (buf[0] != '0') \
|
||||
return -EINVAL; \
|
||||
clear_stat(s, si); \
|
||||
return length; \
|
||||
} \
|
||||
SLAB_ATTR(text); \
|
||||
|
||||
STAT_ATTR(ALLOC_FASTPATH, alloc_fastpath);
|
||||
STAT_ATTR(ALLOC_SLOWPATH, alloc_slowpath);
|
||||
|
Reference in New Issue
Block a user