Message ID | 20180718133620.6205-8-vbabka@suse.cz (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jul 18, 2018 at 03:36:20PM +0200, Vlastimil Babka wrote: > Kmalloc cache names can get quite long for large object sizes, when the sizes > are expressed in bytes. Use 'k' and 'M' prefixes to make the names as short > as possible e.g. in /proc/slabinfo. This works, as we mostly use power-of-two > sizes, with exceptions only below 1k. > > Example: 'kmalloc-4194304' becomes 'kmalloc-4M' > > Suggested-by: Matthew Wilcox <willy@infradead.org> > Signed-off-by: Vlastimil Babka <vbabka@suse.cz> There is a slight chance this will break any external tooling that calculates fragmentation stats for slab/slub if they are particularly stupid parsers but other than that; Acked-by: Mel Gorman <mgorman@techsingularity.net>
On Wed, 18 Jul 2018, Vlastimil Babka wrote: > +static const char * > +kmalloc_cache_name(const char *prefix, unsigned int size) > +{ > + > + static const char units[3] = "\0kM"; > + int idx = 0; > + > + while (size >= 1024 && (size % 1024 == 0)) { > + size /= 1024; > + idx++; > + } > + > + return kasprintf(GFP_NOWAIT, "%s-%u%c", prefix, size, units[idx]); > +} This is likely to occur elsewhere in the kernel. Maybe generalize it a bit? Acked-by: Christoph Lameter <cl@linux.com>
On 07/30/2018 05:48 PM, Christopher Lameter wrote: > On Wed, 18 Jul 2018, Vlastimil Babka wrote: > >> +static const char * >> +kmalloc_cache_name(const char *prefix, unsigned int size) >> +{ >> + >> + static const char units[3] = "\0kM"; >> + int idx = 0; >> + >> + while (size >= 1024 && (size % 1024 == 0)) { >> + size /= 1024; >> + idx++; >> + } >> + >> + return kasprintf(GFP_NOWAIT, "%s-%u%c", prefix, size, units[idx]); >> +} > > This is likely to occur elsewhere in the kernel. Maybe generalize it a > bit? I'll try later on top, as that's generic printf code then. > Acked-by: Christoph Lameter <cl@linux.com> Thanks for all acks. > -- > To unsubscribe from this list: send the line "unsubscribe linux-api" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
diff --git a/mm/slab_common.c b/mm/slab_common.c index 614fb7ab8312..04d71ead7d12 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -1049,15 +1049,15 @@ const struct kmalloc_info_struct kmalloc_info[] __initconst = { {"kmalloc-16", 16}, {"kmalloc-32", 32}, {"kmalloc-64", 64}, {"kmalloc-128", 128}, {"kmalloc-256", 256}, {"kmalloc-512", 512}, - {"kmalloc-1024", 1024}, {"kmalloc-2048", 2048}, - {"kmalloc-4096", 4096}, {"kmalloc-8192", 8192}, - {"kmalloc-16384", 16384}, {"kmalloc-32768", 32768}, - {"kmalloc-65536", 65536}, {"kmalloc-131072", 131072}, - {"kmalloc-262144", 262144}, {"kmalloc-524288", 524288}, - {"kmalloc-1048576", 1048576}, {"kmalloc-2097152", 2097152}, - {"kmalloc-4194304", 4194304}, {"kmalloc-8388608", 8388608}, - {"kmalloc-16777216", 16777216}, {"kmalloc-33554432", 33554432}, - {"kmalloc-67108864", 67108864} + {"kmalloc-1k", 1024}, {"kmalloc-2k", 2048}, + {"kmalloc-4k", 4096}, {"kmalloc-8k", 8192}, + {"kmalloc-16k", 16384}, {"kmalloc-32k", 32768}, + {"kmalloc-64k", 65536}, {"kmalloc-128k", 131072}, + {"kmalloc-256k", 262144}, {"kmalloc-512k", 524288}, + {"kmalloc-1M", 1048576}, {"kmalloc-2M", 2097152}, + {"kmalloc-4M", 4194304}, {"kmalloc-8M", 8388608}, + {"kmalloc-16M", 16777216}, {"kmalloc-32M", 33554432}, + {"kmalloc-64M", 67108864} }; /* @@ -1107,6 +1107,21 @@ void __init setup_kmalloc_cache_index_table(void) } } +static const char * +kmalloc_cache_name(const char *prefix, unsigned int size) +{ + + static const char units[3] = "\0kM"; + int idx = 0; + + while (size >= 1024 && (size % 1024 == 0)) { + size /= 1024; + idx++; + } + + return kasprintf(GFP_NOWAIT, "%s-%u%c", prefix, size, units[idx]); +} + static void __init new_kmalloc_cache(int idx, int type, slab_flags_t flags) { @@ -1114,7 +1129,7 @@ new_kmalloc_cache(int idx, int type, slab_flags_t flags) if (type == KMALLOC_RECLAIM) { flags |= SLAB_RECLAIM_ACCOUNT; - name = kasprintf(GFP_NOWAIT, "kmalloc-rcl-%u", + name = kmalloc_cache_name("kmalloc-rcl", kmalloc_info[idx].size); BUG_ON(!name); } else { @@ -1163,8 +1178,7 @@ void __init create_kmalloc_caches(slab_flags_t flags) if (s) { unsigned int size = kmalloc_size(i); - char *n = kasprintf(GFP_NOWAIT, - "dma-kmalloc-%u", size); + const char *n = kmalloc_cache_name("dma-kmalloc", size); BUG_ON(!n); kmalloc_caches[KMALLOC_DMA][i] = create_kmalloc_cache(
Kmalloc cache names can get quite long for large object sizes, when the sizes are expressed in bytes. Use 'k' and 'M' prefixes to make the names as short as possible e.g. in /proc/slabinfo. This works, as we mostly use power-of-two sizes, with exceptions only below 1k. Example: 'kmalloc-4194304' becomes 'kmalloc-4M' Suggested-by: Matthew Wilcox <willy@infradead.org> Signed-off-by: Vlastimil Babka <vbabka@suse.cz> --- mm/slab_common.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-)