eventfs: Move tracing/events to eventfs
authorAjay Kaher <akaher@vmware.com>
Fri, 28 Jul 2023 18:20:51 +0000 (23:50 +0530)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Mon, 31 Jul 2023 15:55:55 +0000 (11:55 -0400)
commit27152bceea1df27ffebb12ac9cd9adbf2c4c3f35
tree5a20f2405f50bcacbd3803f5b68d7827aed11b3a
parent5bdcd5f5331a276a3ddf1fba8605986d0d15298a
eventfs: Move tracing/events to eventfs

Up until now, /sys/kernel/tracing/events was no different than any other
part of tracefs. The files and directories within the events directory was
created when the tracefs was mounted, and also created for the instances in
/sys/kernel/tracing/instances/<instance>/events. Most of these files and
directories will never be referenced. Since there are thousands of these
files and directories they spend their time wasting precious memory
resources.

Move the "events" directory to the new eventfs. The eventfs will take the
meta data of the events that they represent and store that. When the files
in the events directory are referenced, the dentry and inodes to represent
them are then created. When the files are no longer referenced, they are
freed. This saves the precious memory resources that were wasted on these
seldom referenced dentries and inodes.

Running the following:

 ~# cat /proc/meminfo /proc/slabinfo  > before.out
 ~# mkdir /sys/kernel/tracing/instances/foo
 ~# cat /proc/meminfo /proc/slabinfo  > after.out

to test the changes produces the following deltas:

Before this change:

 Before after deltas for meminfo:

   MemFree: -32260
   MemAvailable: -21496
   KReclaimable: 21528
   Slab: 22440
   SReclaimable: 21528
   SUnreclaim: 912
   VmallocUsed: 16

 Before after deltas for slabinfo:

   <slab>: <objects> [ * <size> = <total>]

   tracefs_inode_cache: 14472 [* 1184 = 17134848]
   buffer_head: 24 [* 168 = 4032]
   hmem_inode_cache: 28 [* 1480 = 41440]
   dentry: 14450 [* 312 = 4508400]
   lsm_inode_cache: 14453 [* 32 = 462496]
   vma_lock: 11 [* 152 = 1672]
   vm_area_struct: 2 [* 184 = 368]
   trace_event_file: 1748 [* 88 = 153824]
   kmalloc-256: 1072 [* 256 = 274432]
   kmalloc-64: 2842 [* 64 = 181888]

 Total slab additions in size: 22,763,400 bytes

With this change:

 Before after deltas for meminfo:

   MemFree: -12600
   MemAvailable: -12580
   Cached: 24
   Active: 12
   Inactive: 68
   Inactive(anon): 48
   Active(file): 12
   Inactive(file): 20
   Dirty: -4
   AnonPages: 68
   KReclaimable: 12
   Slab: 1856
   SReclaimable: 12
   SUnreclaim: 1844
   KernelStack: 16
   PageTables: 36
   VmallocUsed: 16

 Before after deltas for slabinfo:

   <slab>: <objects> [ * <size> = <total>]

   tracefs_inode_cache: 108 [* 1184 = 127872]
   buffer_head: 24 [* 168 = 4032]
   hmem_inode_cache: 18 [* 1480 = 26640]
   dentry: 127 [* 312 = 39624]
   lsm_inode_cache: 152 [* 32 = 4864]
   vma_lock: 67 [* 152 = 10184]
   vm_area_struct: -12 [* 184 = -2208]
   trace_event_file:  1764 [* 96 = 169344]
   kmalloc-96: 14322 [* 96 = 1374912]
   kmalloc-64: 2814 [* 64 = 180096]
   kmalloc-32: 1103 [* 32 = 35296]
   kmalloc-16: 2308 [* 16 = 36928]
   kmalloc-8: 12800 [* 8 = 102400]

 Total slab additions in size: 2,109,984 bytes

Which is a savings of 20,653,416 bytes (20 MB) per tracing instance.

Link: https://lkml.kernel.org/r/1690568452-46553-10-git-send-email-akaher@vmware.com
Signed-off-by: Ajay Kaher <akaher@vmware.com>
Co-developed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Tested-by: Ching-lin Yu <chinglinyu@google.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
fs/tracefs/inode.c
include/linux/trace_events.h
kernel/trace/trace.h
kernel/trace/trace_events.c