• Steven Rostedt (Google)'s avatar
    eventfs: Remove eventfs_file and just use eventfs_inode · 5790b1fb
    Steven Rostedt (Google) authored
    Instead of having a descriptor for every file represented in the eventfs
    directory, only have the directory itself represented. Change the API to
    send in a list of entries that represent all the files in the directory
    (but not other directories). The entry list contains a name and a callback
    function that will be used to create the files when they are accessed.
    
    struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry *parent,
    						const struct eventfs_entry *entries,
    						int size, void *data);
    
    is used for the top level eventfs directory, and returns an eventfs_inode
    that will be used by:
    
    struct eventfs_inode *eventfs_create_dir(const char *name, struct eventfs_inode *parent,
    					 const struct eventfs_entry *entries,
    					 int size, void *data);
    
    where both of the above take an array of struct eventfs_entry entries for
    every file that is in the directory.
    
    The entries are defined by:
    
    typedef int (*eventfs_callback)(const char *name, umode_t *mode, void **data,
    				const struct file_operations **fops);
    
    struct eventfs_entry {
    	const char			*name;
    	eventfs_callback		callback;
    };
    
    Where the name is the name of the file and the callback gets called when
    the file is being created. The callback passes in the name (in case the
    same callback is used for multiple files), a pointer to the mode, data and
    fops. The data will be pointing to the data that was passed in
    eventfs_create_dir() or eventfs_create_events_dir() but may be overridden
    to point to something else, as it will be used to point to the
    inode->i_private that is created. The information passed back from the
    callback is used to create the dentry/inode.
    
    If the callback fills the data and the file should be created, it must
    return a positive number. On zero or negative, the file is ignored.
    
    This logic may also be used as a prototype to convert entire pseudo file
    systems into just-in-time allocation.
    
    The "show_events_dentry" file has been updated to show the directories,
    and any files they have.
    
    With just the eventfs_file allocations:
    
     Before after deltas for meminfo (in kB):
    
       MemFree:		-14360
       MemAvailable:	-14260
       Buffers:		40
       Cached:		24
       Active:		44
       Inactive:		48
       Inactive(anon):	28
       Active(file):	44
       Inactive(file):	20
       Dirty:		-4
       AnonPages:		28
       Mapped:		4
       KReclaimable:	132
       Slab:		1604
       SReclaimable:	132
       SUnreclaim:		1472
       Committed_AS:	12
    
     Before after deltas for slabinfo:
    
       <slab>:		<objects>	[ * <size> = <total>]
    
       ext4_inode_cache	27		[* 1184 = 31968 ]
       extent_status	102		[*   40 = 4080 ]
       tracefs_inode_cache	144		[*  656 = 94464 ]
       buffer_head		39		[*  104 = 4056 ]
       shmem_inode_cache	49		[*  800 = 39200 ]
       filp			-53		[*  256 = -13568 ]
       dentry		251		[*  192 = 48192 ]
       lsm_file_cache	277		[*   32 = 8864 ]
       vm_area_struct	-14		[*  184 = -2576 ]
       trace_event_file	1748		[*   88 = 153824 ]
       kmalloc-1k		35		[* 1024 = 35840 ]
       kmalloc-256		49		[*  256 = 12544 ]
       kmalloc-192		-28		[*  192 = -5376 ]
       kmalloc-128		-30		[*  128 = -3840 ]
       kmalloc-96		10581		[*   96 = 1015776 ]
       kmalloc-64		3056		[*   64 = 195584 ]
       kmalloc-32		1291		[*   32 = 41312 ]
       kmalloc-16		2310		[*   16 = 36960 ]
       kmalloc-8		9216		[*    8 = 73728 ]
    
     Free memory dropped by 14,360 kB
     Available memory dropped by 14,260 kB
     Total slab additions in size: 1,771,032 bytes
    
    With this change:
    
     Before after deltas for meminfo (in kB):
    
       MemFree:		-12084
       MemAvailable:	-11976
       Buffers:		32
       Cached:		32
       Active:		72
       Inactive:		168
       Inactive(anon):	176
       Active(file):	72
       Inactive(file):	-8
       Dirty:		24
       AnonPages:		196
       Mapped:		8
       KReclaimable:	148
       Slab:		836
       SReclaimable:	148
       SUnreclaim:		688
       Committed_AS:	324
    
     Before after deltas for slabinfo:
    
       <slab>:		<objects>	[ * <size> = <total>]
    
       tracefs_inode_cache	144		[* 656 = 94464 ]
       shmem_inode_cache	-23		[* 800 = -18400 ]
       filp			-92		[* 256 = -23552 ]
       dentry		179		[* 192 = 34368 ]
       lsm_file_cache	-3		[* 32 = -96 ]
       vm_area_struct	-13		[* 184 = -2392 ]
       trace_event_file	1748		[* 88 = 153824 ]
       kmalloc-1k		-49		[* 1024 = -50176 ]
       kmalloc-256		-27		[* 256 = -6912 ]
       kmalloc-128		1864		[* 128 = 238592 ]
       kmalloc-64		4685		[* 64 = 299840 ]
       kmalloc-32		-72		[* 32 = -2304 ]
       kmalloc-16		256		[* 16 = 4096 ]
       total = 721352
    
     Free memory dropped by 12,084 kB
     Available memory dropped by 11,976 kB
     Total slab additions in size:  721,352 bytes
    
    That's over 2 MB in savings per instance for free and available memory,
    and over 1 MB in savings per instance of slab memory.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20231003184059.4924468e@gandalf.local.home
    Link: https://lore.kernel.org/linux-trace-kernel/20231004165007.43d79161@gandalf.local.home
    
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Ajay Kaher <akaher@vmware.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    5790b1fb
tracefs.h 1.6 KB