patches.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Masami Hiramatsu <mhiramat@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Ajay Kaher <akaher@vmware.com>,
	"Steven Rostedt (Google)" <rostedt@goodmis.org>
Subject: [PATCH 6.6 264/331] eventfs: Remove eventfs_file and just use eventfs_inode
Date: Tue, 20 Feb 2024 21:56:20 +0100	[thread overview]
Message-ID: <20240220205646.169799875@linuxfoundation.org> (raw)
In-Reply-To: <20240220205637.572693592@linuxfoundation.org>

6.6-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "Steven Rostedt (Google)" <rostedt@goodmis.org>

commit 5790b1fb3d672d9a1fe3881a7181dfdbe741568f upstream.

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: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 fs/tracefs/event_inode.c     |  853 +++++++++++++++++++++----------------------
 fs/tracefs/inode.c           |    2 
 fs/tracefs/internal.h        |   37 +
 include/linux/trace_events.h |    2 
 include/linux/tracefs.h      |   29 -
 kernel/trace/trace.c         |    7 
 kernel/trace/trace.h         |    4 
 kernel/trace/trace_events.c  |  313 ++++++++++-----
 8 files changed, 708 insertions(+), 539 deletions(-)

--- a/fs/tracefs/event_inode.c
+++ b/fs/tracefs/event_inode.c
@@ -2,8 +2,9 @@
 /*
  *  event_inode.c - part of tracefs, a pseudo file system for activating tracing
  *
- *  Copyright (C) 2020-23 VMware Inc, author: Steven Rostedt (VMware) <rostedt@goodmis.org>
+ *  Copyright (C) 2020-23 VMware Inc, author: Steven Rostedt <rostedt@goodmis.org>
  *  Copyright (C) 2020-23 VMware Inc, author: Ajay Kaher <akaher@vmware.com>
+ *  Copyright (C) 2023 Google, author: Steven Rostedt <rostedt@goodmis.org>
  *
  *  eventfs is used to dynamically create inodes and dentries based on the
  *  meta data provided by the tracing system.
@@ -23,46 +24,6 @@
 #include <linux/delay.h>
 #include "internal.h"
 
-struct eventfs_inode {
-	struct list_head	e_top_files;
-};
-
-/*
- * struct eventfs_file - hold the properties of the eventfs files and
- *                       directories.
- * @name:	the name of the file or directory to create
- * @d_parent:   holds parent's dentry
- * @dentry:     once accessed holds dentry
- * @list:	file or directory to be added to parent directory
- * @ei:		list of files and directories within directory
- * @fop:	file_operations for file or directory
- * @iop:	inode_operations for file or directory
- * @data:	something that the caller will want to get to later on
- * @mode:	the permission that the file or directory should have
- */
-struct eventfs_file {
-	const char			*name;
-	struct dentry			*d_parent;
-	struct dentry			*dentry;
-	struct list_head		list;
-	struct eventfs_inode		*ei;
-	const struct file_operations	*fop;
-	const struct inode_operations	*iop;
-	/*
-	 * Union - used for deletion
-	 * @del_list:	list of eventfs_file to delete
-	 * @rcu:	eventfs_file to delete in RCU
-	 * @is_freed:	node is freed if one of the above is set
-	 */
-	union {
-		struct list_head	del_list;
-		struct rcu_head		rcu;
-		unsigned long		is_freed;
-	};
-	void				*data;
-	umode_t				mode;
-};
-
 static DEFINE_MUTEX(eventfs_mutex);
 DEFINE_STATIC_SRCU(eventfs_srcu);
 
@@ -93,16 +54,9 @@ static const struct file_operations even
  * @data: something that the caller will want to get to later on.
  * @fop: struct file_operations that should be used for this file.
  *
- * This is the basic "create a file" function for tracefs.  It allows for a
- * wide range of flexibility in creating a file.
- *
- * This function will return a pointer to a dentry if it succeeds.  This
- * pointer must be passed to the tracefs_remove() function when the file is
- * to be removed (no automatic cleanup happens if your module is unloaded,
- * you are responsible here.)  If an error occurs, %NULL will be returned.
- *
- * If tracefs is not enabled in the kernel, the value -%ENODEV will be
- * returned.
+ * This function creates a dentry that represents a file in the eventsfs_inode
+ * directory. The inode.i_private pointer will point to @data in the open()
+ * call.
  */
 static struct dentry *create_file(const char *name, umode_t mode,
 				  struct dentry *parent, void *data,
@@ -118,6 +72,7 @@ static struct dentry *create_file(const
 	if (WARN_ON_ONCE(!S_ISREG(mode)))
 		return NULL;
 
+	WARN_ON_ONCE(!parent);
 	dentry = eventfs_start_creating(name, parent);
 
 	if (IS_ERR(dentry))
@@ -142,20 +97,11 @@ static struct dentry *create_file(const
  * create_dir - create a dir in the tracefs filesystem
  * @name: the name of the file to create.
  * @parent: parent dentry for this file.
- * @data: something that the caller will want to get to later on.
- *
- * This is the basic "create a dir" function for eventfs.  It allows for a
- * wide range of flexibility in creating a dir.
- *
- * This function will return a pointer to a dentry if it succeeds.  This
- * pointer must be passed to the tracefs_remove() function when the file is
- * to be removed (no automatic cleanup happens if your module is unloaded,
- * you are responsible here.)  If an error occurs, %NULL will be returned.
  *
- * If tracefs is not enabled in the kernel, the value -%ENODEV will be
- * returned.
+ * This function will create a dentry for a directory represented by
+ * a eventfs_inode.
  */
-static struct dentry *create_dir(const char *name, struct dentry *parent, void *data)
+static struct dentry *create_dir(const char *name, struct dentry *parent)
 {
 	struct tracefs_inode *ti;
 	struct dentry *dentry;
@@ -172,7 +118,6 @@ static struct dentry *create_dir(const c
 	inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
 	inode->i_op = &eventfs_root_dir_inode_operations;
 	inode->i_fop = &eventfs_file_operations;
-	inode->i_private = data;
 
 	ti = get_tracefs(inode);
 	ti->flags |= TRACEFS_EVENT_INODE;
@@ -185,18 +130,18 @@ static struct dentry *create_dir(const c
 }
 
 /**
- * eventfs_set_ef_status_free - set the ef->status to free
+ * eventfs_set_ei_status_free - remove the dentry reference from an eventfs_inode
  * @ti: the tracefs_inode of the dentry
- * @dentry: dentry who's status to be freed
+ * @dentry: dentry which has the reference to remove.
  *
- * eventfs_set_ef_status_free will be called if no more
- * references remain
+ * Remove the association between a dentry from an eventfs_inode.
  */
-void eventfs_set_ef_status_free(struct tracefs_inode *ti, struct dentry *dentry)
+void eventfs_set_ei_status_free(struct tracefs_inode *ti, struct dentry *dentry)
 {
 	struct tracefs_inode *ti_parent;
+	struct eventfs_inode *ei_child, *tmp;
 	struct eventfs_inode *ei;
-	struct eventfs_file *ef, *tmp;
+	int i;
 
 	/* The top level events directory may be freed by this */
 	if (unlikely(ti->flags & TRACEFS_EVENT_TOP_INODE)) {
@@ -207,9 +152,9 @@ void eventfs_set_ef_status_free(struct t
 		ei = ti->private;
 
 		/* Record all the top level files */
-		list_for_each_entry_srcu(ef, &ei->e_top_files, list,
+		list_for_each_entry_srcu(ei_child, &ei->children, list,
 					 lockdep_is_held(&eventfs_mutex)) {
-			list_add_tail(&ef->del_list, &ef_del_list);
+			list_add_tail(&ei_child->del_list, &ef_del_list);
 		}
 
 		/* Nothing should access this, but just in case! */
@@ -218,11 +163,13 @@ void eventfs_set_ef_status_free(struct t
 		mutex_unlock(&eventfs_mutex);
 
 		/* Now safely free the top level files and their children */
-		list_for_each_entry_safe(ef, tmp, &ef_del_list, del_list) {
-			list_del(&ef->del_list);
-			eventfs_remove(ef);
+		list_for_each_entry_safe(ei_child, tmp, &ef_del_list, del_list) {
+			list_del(&ei_child->del_list);
+			eventfs_remove_dir(ei_child);
 		}
 
+		kfree_const(ei->name);
+		kfree(ei->d_children);
 		kfree(ei);
 		return;
 	}
@@ -233,68 +180,162 @@ void eventfs_set_ef_status_free(struct t
 	if (!ti_parent || !(ti_parent->flags & TRACEFS_EVENT_INODE))
 		goto out;
 
-	ef = dentry->d_fsdata;
-	if (!ef)
+	ei = dentry->d_fsdata;
+	if (!ei)
 		goto out;
 
 	/*
-	 * If ef was freed, then the LSB bit is set for d_fsdata.
+	 * If ei was freed, then the LSB bit is set for d_fsdata.
 	 * But this should not happen, as it should still have a
 	 * ref count that prevents it. Warn in case it does.
 	 */
-	if (WARN_ON_ONCE((unsigned long)ef & 1))
+	if (WARN_ON_ONCE((unsigned long)ei & 1))
 		goto out;
 
+	/* This could belong to one of the files of the ei */
+	if (ei->dentry != dentry) {
+		for (i = 0; i < ei->nr_entries; i++) {
+			if (ei->d_children[i] == dentry)
+				break;
+		}
+		if (WARN_ON_ONCE(i == ei->nr_entries))
+			goto out;
+		ei->d_children[i] = NULL;
+	} else {
+		ei->dentry = NULL;
+	}
+
 	dentry->d_fsdata = NULL;
-	ef->dentry = NULL;
-out:
+ out:
 	mutex_unlock(&eventfs_mutex);
 }
 
 /**
+ * create_file_dentry - create a dentry for a file of an eventfs_inode
+ * @ei: the eventfs_inode that the file will be created under
+ * @e_dentry: a pointer to the d_children[] of the @ei
+ * @parent: The parent dentry of the created file.
+ * @name: The name of the file to create
+ * @mode: The mode of the file.
+ * @data: The data to use to set the inode of the file with on open()
+ * @fops: The fops of the file to be created.
+ * @lookup: If called by the lookup routine, in which case, dput() the created dentry.
+ *
+ * Create a dentry for a file of an eventfs_inode @ei and place it into the
+ * address located at @e_dentry. If the @e_dentry already has a dentry, then
+ * just do a dget() on it and return. Otherwise create the dentry and attach it.
+ */
+static struct dentry *
+create_file_dentry(struct eventfs_inode *ei, struct dentry **e_dentry,
+		   struct dentry *parent, const char *name, umode_t mode, void *data,
+		   const struct file_operations *fops, bool lookup)
+{
+	struct dentry *dentry;
+	bool invalidate = false;
+
+	mutex_lock(&eventfs_mutex);
+	/* If the e_dentry already has a dentry, use it */
+	if (*e_dentry) {
+		/* lookup does not need to up the ref count */
+		if (!lookup)
+			dget(*e_dentry);
+		mutex_unlock(&eventfs_mutex);
+		return *e_dentry;
+	}
+	mutex_unlock(&eventfs_mutex);
+
+	/* The lookup already has the parent->d_inode locked */
+	if (!lookup)
+		inode_lock(parent->d_inode);
+
+	dentry = create_file(name, mode, parent, data, fops);
+
+	if (!lookup)
+		inode_unlock(parent->d_inode);
+
+	mutex_lock(&eventfs_mutex);
+
+	if (IS_ERR_OR_NULL(dentry)) {
+		/*
+		 * When the mutex was released, something else could have
+		 * created the dentry for this e_dentry. In which case
+		 * use that one.
+		 *
+		 * Note, with the mutex held, the e_dentry cannot have content
+		 * and the ei->is_freed be true at the same time.
+		 */
+		WARN_ON_ONCE(ei->is_freed);
+		dentry = *e_dentry;
+		/* The lookup does not need to up the dentry refcount */
+		if (dentry && !lookup)
+			dget(dentry);
+		mutex_unlock(&eventfs_mutex);
+		return dentry;
+	}
+
+	if (!*e_dentry && !ei->is_freed) {
+		*e_dentry = dentry;
+		dentry->d_fsdata = ei;
+	} else {
+		/*
+		 * Should never happen unless we get here due to being freed.
+		 * Otherwise it means two dentries exist with the same name.
+		 */
+		WARN_ON_ONCE(!ei->is_freed);
+		invalidate = true;
+	}
+	mutex_unlock(&eventfs_mutex);
+
+	if (invalidate)
+		d_invalidate(dentry);
+
+	if (lookup || invalidate)
+		dput(dentry);
+
+	return invalidate ? NULL : dentry;
+}
+
+/**
  * eventfs_post_create_dir - post create dir routine
- * @ef: eventfs_file of recently created dir
+ * @ei: eventfs_inode of recently created dir
  *
  * Map the meta-data of files within an eventfs dir to their parent dentry
  */
-static void eventfs_post_create_dir(struct eventfs_file *ef)
+static void eventfs_post_create_dir(struct eventfs_inode *ei)
 {
-	struct eventfs_file *ef_child;
+	struct eventfs_inode *ei_child;
 	struct tracefs_inode *ti;
 
 	/* srcu lock already held */
 	/* fill parent-child relation */
-	list_for_each_entry_srcu(ef_child, &ef->ei->e_top_files, list,
+	list_for_each_entry_srcu(ei_child, &ei->children, list,
 				 srcu_read_lock_held(&eventfs_srcu)) {
-		ef_child->d_parent = ef->dentry;
+		ei_child->d_parent = ei->dentry;
 	}
 
-	ti = get_tracefs(ef->dentry->d_inode);
-	ti->private = ef->ei;
+	ti = get_tracefs(ei->dentry->d_inode);
+	ti->private = ei;
 }
 
 /**
- * create_dentry - helper function to create dentry
- * @ef: eventfs_file of file or directory to create
- * @parent: parent dentry
- * @lookup: true if called from lookup routine
+ * create_dir_dentry - Create a directory dentry for the eventfs_inode
+ * @ei: The eventfs_inode to create the directory for
+ * @parent: The dentry of the parent of this directory
+ * @lookup: True if this is called by the lookup code
  *
- * Used to create a dentry for file/dir, executes post dentry creation routine
+ * This creates and attaches a directory dentry to the eventfs_inode @ei.
  */
 static struct dentry *
-create_dentry(struct eventfs_file *ef, struct dentry *parent, bool lookup)
+create_dir_dentry(struct eventfs_inode *ei, struct dentry *parent, bool lookup)
 {
 	bool invalidate = false;
-	struct dentry *dentry;
+	struct dentry *dentry = NULL;
 
 	mutex_lock(&eventfs_mutex);
-	if (ef->is_freed) {
-		mutex_unlock(&eventfs_mutex);
-		return NULL;
-	}
-	if (ef->dentry) {
-		dentry = ef->dentry;
-		/* On dir open, up the ref count */
+	if (ei->dentry) {
+		/* If the dentry already has a dentry, use it */
+		dentry = ei->dentry;
+		/* lookup does not need to up the ref count */
 		if (!lookup)
 			dget(dentry);
 		mutex_unlock(&eventfs_mutex);
@@ -302,42 +343,44 @@ create_dentry(struct eventfs_file *ef, s
 	}
 	mutex_unlock(&eventfs_mutex);
 
+	/* The lookup already has the parent->d_inode locked */
 	if (!lookup)
 		inode_lock(parent->d_inode);
 
-	if (ef->ei)
-		dentry = create_dir(ef->name, parent, ef->data);
-	else
-		dentry = create_file(ef->name, ef->mode, parent,
-				     ef->data, ef->fop);
+	dentry = create_dir(ei->name, parent);
 
 	if (!lookup)
 		inode_unlock(parent->d_inode);
 
 	mutex_lock(&eventfs_mutex);
-	if (IS_ERR_OR_NULL(dentry)) {
-		/* If the ef was already updated get it */
-		dentry = ef->dentry;
+
+	if (IS_ERR_OR_NULL(dentry) && !ei->is_freed) {
+		/*
+		 * When the mutex was released, something else could have
+		 * created the dentry for this e_dentry. In which case
+		 * use that one.
+		 *
+		 * Note, with the mutex held, the e_dentry cannot have content
+		 * and the ei->is_freed be true at the same time.
+		 */
+		dentry = ei->dentry;
 		if (dentry && !lookup)
 			dget(dentry);
 		mutex_unlock(&eventfs_mutex);
 		return dentry;
 	}
 
-	if (!ef->dentry && !ef->is_freed) {
-		ef->dentry = dentry;
-		if (ef->ei)
-			eventfs_post_create_dir(ef);
-		dentry->d_fsdata = ef;
+	if (!ei->dentry && !ei->is_freed) {
+		ei->dentry = dentry;
+		eventfs_post_create_dir(ei);
+		dentry->d_fsdata = ei;
 	} else {
-		/* A race here, should try again (unless freed) */
-		invalidate = true;
-
 		/*
 		 * Should never happen unless we get here due to being freed.
 		 * Otherwise it means two dentries exist with the same name.
 		 */
-		WARN_ON_ONCE(!ef->is_freed);
+		WARN_ON_ONCE(!ei->is_freed);
+		invalidate = true;
 	}
 	mutex_unlock(&eventfs_mutex);
 	if (invalidate)
@@ -349,50 +392,85 @@ create_dentry(struct eventfs_file *ef, s
 	return invalidate ? NULL : dentry;
 }
 
-static bool match_event_file(struct eventfs_file *ef, const char *name)
-{
-	bool ret;
-
-	mutex_lock(&eventfs_mutex);
-	ret = !ef->is_freed && strcmp(ef->name, name) == 0;
-	mutex_unlock(&eventfs_mutex);
-
-	return ret;
-}
-
 /**
  * eventfs_root_lookup - lookup routine to create file/dir
  * @dir: in which a lookup is being done
  * @dentry: file/dir dentry
- * @flags: to pass as flags parameter to simple lookup
+ * @flags: Just passed to simple_lookup()
  *
- * Used to create a dynamic file/dir within @dir. Use the eventfs_inode
- * list of meta data to find the information needed to create the file/dir.
+ * Used to create dynamic file/dir with-in @dir, search with-in @ei
+ * list, if @dentry found go ahead and create the file/dir
  */
+
 static struct dentry *eventfs_root_lookup(struct inode *dir,
 					  struct dentry *dentry,
 					  unsigned int flags)
 {
+	const struct file_operations *fops;
+	const struct eventfs_entry *entry;
+	struct eventfs_inode *ei_child;
 	struct tracefs_inode *ti;
 	struct eventfs_inode *ei;
-	struct eventfs_file *ef;
+	struct dentry *ei_dentry = NULL;
 	struct dentry *ret = NULL;
+	const char *name = dentry->d_name.name;
+	bool created = false;
+	umode_t mode;
+	void *data;
 	int idx;
+	int i;
+	int r;
 
 	ti = get_tracefs(dir);
 	if (!(ti->flags & TRACEFS_EVENT_INODE))
 		return NULL;
 
-	ei = ti->private;
+	/* Grab srcu to prevent the ei from going away */
 	idx = srcu_read_lock(&eventfs_srcu);
-	list_for_each_entry_srcu(ef, &ei->e_top_files, list,
+
+	/*
+	 * Grab the eventfs_mutex to consistent value from ti->private.
+	 * This s
+	 */
+	mutex_lock(&eventfs_mutex);
+	ei = READ_ONCE(ti->private);
+	if (ei)
+		ei_dentry = READ_ONCE(ei->dentry);
+	mutex_unlock(&eventfs_mutex);
+
+	if (!ei || !ei_dentry)
+		goto out;
+
+	data = ei->data;
+
+	list_for_each_entry_srcu(ei_child, &ei->children, list,
 				 srcu_read_lock_held(&eventfs_srcu)) {
-		if (!match_event_file(ef, dentry->d_name.name))
+		if (strcmp(ei_child->name, name) != 0)
 			continue;
 		ret = simple_lookup(dir, dentry, flags);
-		create_dentry(ef, ef->d_parent, true);
+		create_dir_dentry(ei_child, ei_dentry, true);
+		created = true;
 		break;
 	}
+
+	if (created)
+		goto out;
+
+	for (i = 0; i < ei->nr_entries; i++) {
+		entry = &ei->entries[i];
+		if (strcmp(name, entry->name) == 0) {
+			void *cdata = data;
+			r = entry->callback(name, &mode, &cdata, &fops);
+			if (r <= 0)
+				continue;
+			ret = simple_lookup(dir, dentry, flags);
+			create_file_dentry(ei, &ei->d_children[i],
+					   ei_dentry, name, mode, cdata,
+					   fops, true);
+			break;
+		}
+	}
+ out:
 	srcu_read_unlock(&eventfs_srcu, idx);
 	return ret;
 }
@@ -432,29 +510,48 @@ static int eventfs_release(struct inode
 	return dcache_dir_close(inode, file);
 }
 
+static int add_dentries(struct dentry ***dentries, struct dentry *d, int cnt)
+{
+	struct dentry **tmp;
+
+	tmp = krealloc(*dentries, sizeof(d) * (cnt + 2), GFP_KERNEL);
+	if (!tmp)
+		return -1;
+	tmp[cnt] = d;
+	tmp[cnt + 1] = NULL;
+	*dentries = tmp;
+	return 0;
+}
+
 /**
  * dcache_dir_open_wrapper - eventfs open wrapper
  * @inode: not used
- * @file: dir to be opened (to create its child)
+ * @file: dir to be opened (to create it's children)
  *
- * Used to dynamically create the file/dir within @file. @file is really a
- * directory and all the files/dirs of the children within @file will be
- * created. If any of the files/dirs have already been created, their
- * reference count will be incremented.
+ * Used to dynamic create file/dir with-in @file, all the
+ * file/dir will be created. If already created then references
+ * will be increased
  */
 static int dcache_dir_open_wrapper(struct inode *inode, struct file *file)
 {
+	const struct file_operations *fops;
+	const struct eventfs_entry *entry;
+	struct eventfs_inode *ei_child;
 	struct tracefs_inode *ti;
 	struct eventfs_inode *ei;
-	struct eventfs_file *ef;
 	struct dentry_list *dlist;
 	struct dentry **dentries = NULL;
-	struct dentry *dentry = file_dentry(file);
+	struct dentry *parent = file_dentry(file);
 	struct dentry *d;
 	struct inode *f_inode = file_inode(file);
+	const char *name = parent->d_name.name;
+	umode_t mode;
+	void *data;
 	int cnt = 0;
 	int idx;
 	int ret;
+	int i;
+	int r;
 
 	ti = get_tracefs(f_inode);
 	if (!(ti->flags & TRACEFS_EVENT_INODE))
@@ -463,25 +560,51 @@ static int dcache_dir_open_wrapper(struc
 	if (WARN_ON_ONCE(file->private_data))
 		return -EINVAL;
 
+	idx = srcu_read_lock(&eventfs_srcu);
+
+	mutex_lock(&eventfs_mutex);
+	ei = READ_ONCE(ti->private);
+	mutex_unlock(&eventfs_mutex);
+
+	if (!ei) {
+		srcu_read_unlock(&eventfs_srcu, idx);
+		return -EINVAL;
+	}
+
+
+	data = ei->data;
+
 	dlist = kmalloc(sizeof(*dlist), GFP_KERNEL);
-	if (!dlist)
+	if (!dlist) {
+		srcu_read_unlock(&eventfs_srcu, idx);
 		return -ENOMEM;
+	}
 
-	ei = ti->private;
-	idx = srcu_read_lock(&eventfs_srcu);
-	list_for_each_entry_srcu(ef, &ei->e_top_files, list,
+	list_for_each_entry_srcu(ei_child, &ei->children, list,
 				 srcu_read_lock_held(&eventfs_srcu)) {
-		d = create_dentry(ef, dentry, false);
+		d = create_dir_dentry(ei_child, parent, false);
 		if (d) {
-			struct dentry **tmp;
+			ret = add_dentries(&dentries, d, cnt);
+			if (ret < 0)
+				break;
+			cnt++;
+		}
+	}
 
-			tmp = krealloc(dentries, sizeof(d) * (cnt + 2), GFP_KERNEL);
-			if (!tmp)
+	for (i = 0; i < ei->nr_entries; i++) {
+		void *cdata = data;
+		entry = &ei->entries[i];
+		name = entry->name;
+		r = entry->callback(name, &mode, &cdata, &fops);
+		if (r <= 0)
+			continue;
+		d = create_file_dentry(ei, &ei->d_children[i],
+				       parent, name, mode, cdata, fops, false);
+		if (d) {
+			ret = add_dentries(&dentries, d, cnt);
+			if (ret < 0)
 				break;
-			tmp[cnt] = d;
-			tmp[cnt + 1] = NULL;
 			cnt++;
-			dentries = tmp;
 		}
 	}
 	srcu_read_unlock(&eventfs_srcu, idx);
@@ -514,63 +637,90 @@ static int dcache_readdir_wrapper(struct
 }
 
 /**
- * eventfs_prepare_ef - helper function to prepare eventfs_file
- * @name: the name of the file/directory to create.
- * @mode: the permission that the file should have.
- * @fop: struct file_operations that should be used for this file/directory.
- * @iop: struct inode_operations that should be used for this file/directory.
- * @data: something that the caller will want to get to later on. The
- *        inode.i_private pointer will point to this value on the open() call.
- *
- * This function allocates and fills the eventfs_file structure.
- */
-static struct eventfs_file *eventfs_prepare_ef(const char *name, umode_t mode,
-					const struct file_operations *fop,
-					const struct inode_operations *iop,
-					void *data)
+ * eventfs_create_dir - Create the eventfs_inode for this directory
+ * @name: The name of the directory to create.
+ * @parent: The eventfs_inode of the parent directory.
+ * @entries: A list of entries that represent the files under this directory
+ * @size: The number of @entries
+ * @data: The default data to pass to the files (an entry may override it).
+ *
+ * This function creates the descriptor to represent a directory in the
+ * eventfs. This descriptor is an eventfs_inode, and it is returned to be
+ * used to create other children underneath.
+ *
+ * The @entries is an array of eventfs_entry structures which has:
+ *	const char		 *name
+ *	eventfs_callback	callback;
+ *
+ * The name is the name of the file, and the callback is a pointer to a function
+ * that will be called when the file is reference (either by lookup or by
+ * reading a directory). The callback is of the prototype:
+ *
+ *    int callback(const char *name, umode_t *mode, void **data,
+ *		   const struct file_operations **fops);
+ *
+ * When a file needs to be created, this callback will be called with
+ *   name = the name of the file being created (so that the same callback
+ *          may be used for multiple files).
+ *   mode = a place to set the file's mode
+ *   data = A pointer to @data, and the callback may replace it, which will
+ *         cause the file created to pass the new data to the open() call.
+ *   fops = the fops to use for the created file.
+ */
+struct eventfs_inode *eventfs_create_dir(const char *name, struct eventfs_inode *parent,
+					 const struct eventfs_entry *entries,
+					 int size, void *data)
 {
-	struct eventfs_file *ef;
+	struct eventfs_inode *ei;
+
+	if (!parent)
+		return ERR_PTR(-EINVAL);
 
-	ef = kzalloc(sizeof(*ef), GFP_KERNEL);
-	if (!ef)
+	ei = kzalloc(sizeof(*ei), GFP_KERNEL);
+	if (!ei)
 		return ERR_PTR(-ENOMEM);
 
-	ef->name = kstrdup(name, GFP_KERNEL);
-	if (!ef->name) {
-		kfree(ef);
+	ei->name = kstrdup_const(name, GFP_KERNEL);
+	if (!ei->name) {
+		kfree(ei);
 		return ERR_PTR(-ENOMEM);
 	}
 
-	if (S_ISDIR(mode)) {
-		ef->ei = kzalloc(sizeof(*ef->ei), GFP_KERNEL);
-		if (!ef->ei) {
-			kfree(ef->name);
-			kfree(ef);
+	if (size) {
+		ei->d_children = kzalloc(sizeof(*ei->d_children) * size, GFP_KERNEL);
+		if (!ei->d_children) {
+			kfree_const(ei->name);
+			kfree(ei);
 			return ERR_PTR(-ENOMEM);
 		}
-		INIT_LIST_HEAD(&ef->ei->e_top_files);
-	} else {
-		ef->ei = NULL;
 	}
 
-	ef->iop = iop;
-	ef->fop = fop;
-	ef->mode = mode;
-	ef->data = data;
-	return ef;
+	ei->entries = entries;
+	ei->nr_entries = size;
+	ei->data = data;
+	INIT_LIST_HEAD(&ei->children);
+
+	mutex_lock(&eventfs_mutex);
+	list_add_tail(&ei->list, &parent->children);
+	ei->d_parent = parent->dentry;
+	mutex_unlock(&eventfs_mutex);
+
+	return ei;
 }
 
 /**
- * eventfs_create_events_dir - create the trace event structure
- * @name: the name of the directory to create.
- * @parent: parent dentry for this file.  This should be a directory dentry
- *          if set.  If this parameter is NULL, then the directory will be
- *          created in the root of the tracefs filesystem.
+ * eventfs_create_events_dir - create the top level events directory
+ * @name: The name of the top level directory to create.
+ * @parent: Parent dentry for this file in the tracefs directory.
+ * @entries: A list of entries that represent the files under this directory
+ * @size: The number of @entries
+ * @data: The default data to pass to the files (an entry may override it).
  *
  * This function creates the top of the trace event directory.
  */
-struct dentry *eventfs_create_events_dir(const char *name,
-					 struct dentry *parent)
+struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry *parent,
+						const struct eventfs_entry *entries,
+						int size, void *data)
 {
 	struct dentry *dentry = tracefs_start_creating(name, parent);
 	struct eventfs_inode *ei;
@@ -581,19 +731,32 @@ struct dentry *eventfs_create_events_dir
 		return NULL;
 
 	if (IS_ERR(dentry))
-		return dentry;
+		return (struct eventfs_inode *)dentry;
 
 	ei = kzalloc(sizeof(*ei), GFP_KERNEL);
 	if (!ei)
-		return ERR_PTR(-ENOMEM);
+		goto fail;
+
 	inode = tracefs_get_inode(dentry->d_sb);
-	if (unlikely(!inode)) {
-		kfree(ei);
-		tracefs_failed_creating(dentry);
-		return ERR_PTR(-ENOMEM);
-	}
+	if (unlikely(!inode))
+		goto fail;
+
+	if (size) {
+		ei->d_children = kzalloc(sizeof(*ei->d_children) * size, GFP_KERNEL);
+		if (!ei->d_children)
+			goto fail;
+	}
+
+	ei->dentry = dentry;
+	ei->entries = entries;
+	ei->nr_entries = size;
+	ei->data = data;
+	ei->name = kstrdup_const(name, GFP_KERNEL);
+	if (!ei->name)
+		goto fail;
 
-	INIT_LIST_HEAD(&ei->e_top_files);
+	INIT_LIST_HEAD(&ei->children);
+	INIT_LIST_HEAD(&ei->list);
 
 	ti = get_tracefs(inode);
 	ti->flags |= TRACEFS_EVENT_INODE | TRACEFS_EVENT_TOP_INODE;
@@ -608,193 +771,41 @@ struct dentry *eventfs_create_events_dir
 	d_instantiate(dentry, inode);
 	inc_nlink(dentry->d_parent->d_inode);
 	fsnotify_mkdir(dentry->d_parent->d_inode, dentry);
-	return tracefs_end_creating(dentry);
-}
+	tracefs_end_creating(dentry);
 
-/**
- * eventfs_add_subsystem_dir - add eventfs subsystem_dir to list to create later
- * @name: the name of the file to create.
- * @parent: parent dentry for this dir.
- *
- * This function adds eventfs subsystem dir to list.
- * And all these dirs are created on the fly when they are looked up,
- * and the dentry and inodes will be removed when they are done.
- */
-struct eventfs_file *eventfs_add_subsystem_dir(const char *name,
-					       struct dentry *parent)
-{
-	struct tracefs_inode *ti_parent;
-	struct eventfs_inode *ei_parent;
-	struct eventfs_file *ef;
+	/* Will call dput when the directory is removed */
+	dget(dentry);
 
-	if (security_locked_down(LOCKDOWN_TRACEFS))
-		return NULL;
-
-	if (!parent)
-		return ERR_PTR(-EINVAL);
+	return ei;
 
-	ti_parent = get_tracefs(parent->d_inode);
-	ei_parent = ti_parent->private;
-
-	ef = eventfs_prepare_ef(name, S_IFDIR, NULL, NULL, NULL);
-	if (IS_ERR(ef))
-		return ef;
-
-	mutex_lock(&eventfs_mutex);
-	list_add_tail(&ef->list, &ei_parent->e_top_files);
-	ef->d_parent = parent;
-	mutex_unlock(&eventfs_mutex);
-	return ef;
+ fail:
+	kfree(ei->d_children);
+	kfree(ei);
+	tracefs_failed_creating(dentry);
+	return ERR_PTR(-ENOMEM);
 }
 
-/**
- * eventfs_add_dir - add eventfs dir to list to create later
- * @name: the name of the file to create.
- * @ef_parent: parent eventfs_file for this dir.
- *
- * This function adds eventfs dir to list.
- * And all these dirs are created on the fly when they are looked up,
- * and the dentry and inodes will be removed when they are done.
- */
-struct eventfs_file *eventfs_add_dir(const char *name,
-				     struct eventfs_file *ef_parent)
+static void free_ei(struct rcu_head *head)
 {
-	struct eventfs_file *ef;
+	struct eventfs_inode *ei = container_of(head, struct eventfs_inode, rcu);
 
-	if (security_locked_down(LOCKDOWN_TRACEFS))
-		return NULL;
-
-	if (!ef_parent)
-		return ERR_PTR(-EINVAL);
-
-	ef = eventfs_prepare_ef(name, S_IFDIR, NULL, NULL, NULL);
-	if (IS_ERR(ef))
-		return ef;
-
-	mutex_lock(&eventfs_mutex);
-	list_add_tail(&ef->list, &ef_parent->ei->e_top_files);
-	ef->d_parent = ef_parent->dentry;
-	mutex_unlock(&eventfs_mutex);
-	return ef;
-}
-
-/**
- * eventfs_add_events_file - add the data needed to create a file for later reference
- * @name: the name of the file to create.
- * @mode: the permission that the file should have.
- * @parent: parent dentry for this file.
- * @data: something that the caller will want to get to later on.
- * @fop: struct file_operations that should be used for this file.
- *
- * This function is used to add the information needed to create a
- * dentry/inode within the top level events directory. The file created
- * will have the @mode permissions. The @data will be used to fill the
- * inode.i_private when the open() call is done. The dentry and inodes are
- * all created when they are referenced, and removed when they are no
- * longer referenced.
- */
-int eventfs_add_events_file(const char *name, umode_t mode,
-			 struct dentry *parent, void *data,
-			 const struct file_operations *fop)
-{
-	struct tracefs_inode *ti;
-	struct eventfs_inode *ei;
-	struct eventfs_file *ef;
-
-	if (security_locked_down(LOCKDOWN_TRACEFS))
-		return -ENODEV;
-
-	if (!parent)
-		return -EINVAL;
-
-	if (!(mode & S_IFMT))
-		mode |= S_IFREG;
-
-	if (!parent->d_inode)
-		return -EINVAL;
-
-	ti = get_tracefs(parent->d_inode);
-	if (!(ti->flags & TRACEFS_EVENT_INODE))
-		return -EINVAL;
-
-	ei = ti->private;
-	ef = eventfs_prepare_ef(name, mode, fop, NULL, data);
-
-	if (IS_ERR(ef))
-		return -ENOMEM;
-
-	mutex_lock(&eventfs_mutex);
-	list_add_tail(&ef->list, &ei->e_top_files);
-	ef->d_parent = parent;
-	mutex_unlock(&eventfs_mutex);
-	return 0;
-}
-
-/**
- * eventfs_add_file - add eventfs file to list to create later
- * @name: the name of the file to create.
- * @mode: the permission that the file should have.
- * @ef_parent: parent eventfs_file for this file.
- * @data: something that the caller will want to get to later on.
- * @fop: struct file_operations that should be used for this file.
- *
- * This function is used to add the information needed to create a
- * file within a subdirectory of the events directory. The file created
- * will have the @mode permissions. The @data will be used to fill the
- * inode.i_private when the open() call is done. The dentry and inodes are
- * all created when they are referenced, and removed when they are no
- * longer referenced.
- */
-int eventfs_add_file(const char *name, umode_t mode,
-		     struct eventfs_file *ef_parent,
-		     void *data,
-		     const struct file_operations *fop)
-{
-	struct eventfs_file *ef;
-
-	if (security_locked_down(LOCKDOWN_TRACEFS))
-		return -ENODEV;
-
-	if (!ef_parent)
-		return -EINVAL;
-
-	if (!(mode & S_IFMT))
-		mode |= S_IFREG;
-
-	ef = eventfs_prepare_ef(name, mode, fop, NULL, data);
-	if (IS_ERR(ef))
-		return -ENOMEM;
-
-	mutex_lock(&eventfs_mutex);
-	list_add_tail(&ef->list, &ef_parent->ei->e_top_files);
-	ef->d_parent = ef_parent->dentry;
-	mutex_unlock(&eventfs_mutex);
-	return 0;
-}
-
-static void free_ef(struct rcu_head *head)
-{
-	struct eventfs_file *ef = container_of(head, struct eventfs_file, rcu);
-
-	kfree(ef->name);
-	kfree(ef->ei);
-	kfree(ef);
+	kfree_const(ei->name);
+	kfree(ei->d_children);
+	kfree(ei);
 }
 
 /**
  * eventfs_remove_rec - remove eventfs dir or file from list
- * @ef: eventfs_file to be removed.
- * @head: to create list of eventfs_file to be deleted
- * @level: to check recursion depth
+ * @ei: eventfs_inode to be removed.
  *
- * The helper function eventfs_remove_rec() is used to clean up and free the
- * associated data from eventfs for both of the added functions.
+ * This function recursively remove eventfs_inode which
+ * contains info of file or dir.
  */
-static void eventfs_remove_rec(struct eventfs_file *ef, struct list_head *head, int level)
+static void eventfs_remove_rec(struct eventfs_inode *ei, struct list_head *head, int level)
 {
-	struct eventfs_file *ef_child;
+	struct eventfs_inode *ei_child;
 
-	if (!ef)
+	if (!ei)
 		return;
 	/*
 	 * Check recursion depth. It should never be greater than 3:
@@ -806,62 +817,68 @@ static void eventfs_remove_rec(struct ev
 	if (WARN_ON_ONCE(level > 3))
 		return;
 
-	if (ef->ei) {
-		/* search for nested folders or files */
-		list_for_each_entry_srcu(ef_child, &ef->ei->e_top_files, list,
-					 lockdep_is_held(&eventfs_mutex)) {
-			eventfs_remove_rec(ef_child, head, level + 1);
-		}
+	/* search for nested folders or files */
+	list_for_each_entry_srcu(ei_child, &ei->children, list,
+				 lockdep_is_held(&eventfs_mutex)) {
+		eventfs_remove_rec(ei_child, head, level + 1);
 	}
 
-	list_del_rcu(&ef->list);
-	list_add_tail(&ef->del_list, head);
+	list_del_rcu(&ei->list);
+	list_add_tail(&ei->del_list, head);
 }
 
+static void unhook_dentry(struct dentry **dentry, struct dentry **list)
+{
+	if (*dentry) {
+		unsigned long ptr = (unsigned long)*list;
+
+		/* Keep the dentry from being freed yet */
+		dget(*dentry);
+
+		/*
+		 * Paranoid: The dget() above should prevent the dentry
+		 * from being freed and calling eventfs_set_ei_status_free().
+		 * But just in case, set the link list LSB pointer to 1
+		 * and have eventfs_set_ei_status_free() check that to
+		 * make sure that if it does happen, it will not think
+		 * the d_fsdata is an eventfs_inode.
+		 *
+		 * For this to work, no eventfs_inode should be allocated
+		 * on a odd space, as the ef should always be allocated
+		 * to be at least word aligned. Check for that too.
+		 */
+		WARN_ON_ONCE(ptr & 1);
+
+		(*dentry)->d_fsdata = (void *)(ptr | 1);
+		*list = *dentry;
+		*dentry = NULL;
+	}
+}
 /**
  * eventfs_remove - remove eventfs dir or file from list
- * @ef: eventfs_file to be removed.
+ * @ei: eventfs_inode to be removed.
  *
  * This function acquire the eventfs_mutex lock and call eventfs_remove_rec()
  */
-void eventfs_remove(struct eventfs_file *ef)
+void eventfs_remove_dir(struct eventfs_inode *ei)
 {
-	struct eventfs_file *tmp;
-	LIST_HEAD(ef_del_list);
+	struct eventfs_inode *tmp;
+	LIST_HEAD(ei_del_list);
 	struct dentry *dentry_list = NULL;
 	struct dentry *dentry;
+	int i;
 
-	if (!ef)
+	if (!ei)
 		return;
 
 	mutex_lock(&eventfs_mutex);
-	eventfs_remove_rec(ef, &ef_del_list, 0);
-	list_for_each_entry_safe(ef, tmp, &ef_del_list, del_list) {
-		if (ef->dentry) {
-			unsigned long ptr = (unsigned long)dentry_list;
-
-			/* Keep the dentry from being freed yet */
-			dget(ef->dentry);
-
-			/*
-			 * Paranoid: The dget() above should prevent the dentry
-			 * from being freed and calling eventfs_set_ef_status_free().
-			 * But just in case, set the link list LSB pointer to 1
-			 * and have eventfs_set_ef_status_free() check that to
-			 * make sure that if it does happen, it will not think
-			 * the d_fsdata is an event_file.
-			 *
-			 * For this to work, no event_file should be allocated
-			 * on a odd space, as the ef should always be allocated
-			 * to be at least word aligned. Check for that too.
-			 */
-			WARN_ON_ONCE(ptr & 1);
-
-			ef->dentry->d_fsdata = (void *)(ptr | 1);
-			dentry_list = ef->dentry;
-			ef->dentry = NULL;
-		}
-		call_srcu(&eventfs_srcu, &ef->rcu, free_ef);
+	eventfs_remove_rec(ei, &ei_del_list, 0);
+
+	list_for_each_entry_safe(ei, tmp, &ei_del_list, del_list) {
+		for (i = 0; i < ei->nr_entries; i++)
+			unhook_dentry(&ei->d_children[i], &dentry_list);
+		unhook_dentry(&ei->dentry, &dentry_list);
+		call_srcu(&eventfs_srcu, &ei->rcu, free_ei);
 	}
 	mutex_unlock(&eventfs_mutex);
 
@@ -876,8 +893,8 @@ void eventfs_remove(struct eventfs_file
 		mutex_lock(&eventfs_mutex);
 		/* dentry should now have at least a single reference */
 		WARN_ONCE((int)d_count(dentry) < 1,
-			  "dentry %p less than one reference (%d) after invalidate\n",
-			  dentry, d_count(dentry));
+			  "dentry %px (%s) less than one reference (%d) after invalidate\n",
+			  dentry, dentry->d_name.name, d_count(dentry));
 		mutex_unlock(&eventfs_mutex);
 		dput(dentry);
 	}
--- a/fs/tracefs/inode.c
+++ b/fs/tracefs/inode.c
@@ -385,7 +385,7 @@ static void tracefs_dentry_iput(struct d
 
 	ti = get_tracefs(inode);
 	if (ti && ti->flags & TRACEFS_EVENT_INODE)
-		eventfs_set_ef_status_free(ti, dentry);
+		eventfs_set_ei_status_free(ti, dentry);
 	iput(inode);
 }
 
--- a/fs/tracefs/internal.h
+++ b/fs/tracefs/internal.h
@@ -13,6 +13,41 @@ struct tracefs_inode {
 	struct inode            vfs_inode;
 };
 
+/*
+ * struct eventfs_inode - hold the properties of the eventfs directories.
+ * @list:	link list into the parent directory
+ * @entries:	the array of entries representing the files in the directory
+ * @name:	the name of the directory to create
+ * @children:	link list into the child eventfs_inode
+ * @dentry:     the dentry of the directory
+ * @d_parent:   pointer to the parent's dentry
+ * @d_children: The array of dentries to represent the files when created
+ * @data:	The private data to pass to the callbacks
+ * @nr_entries: The number of items in @entries
+ */
+struct eventfs_inode {
+	struct list_head		list;
+	const struct eventfs_entry	*entries;
+	const char			*name;
+	struct list_head		children;
+	struct dentry			*dentry;
+	struct dentry			*d_parent;
+	struct dentry			**d_children;
+	void				*data;
+	/*
+	 * Union - used for deletion
+	 * @del_list:	list of eventfs_inode to delete
+	 * @rcu:	eventfs_indoe to delete in RCU
+	 * @is_freed:	node is freed if one of the above is set
+	 */
+	union {
+		struct list_head	del_list;
+		struct rcu_head		rcu;
+		unsigned long		is_freed;
+	};
+	int				nr_entries;
+};
+
 static inline struct tracefs_inode *get_tracefs(const struct inode *inode)
 {
 	return container_of(inode, struct tracefs_inode, vfs_inode);
@@ -25,6 +60,6 @@ struct inode *tracefs_get_inode(struct s
 struct dentry *eventfs_start_creating(const char *name, struct dentry *parent);
 struct dentry *eventfs_failed_creating(struct dentry *dentry);
 struct dentry *eventfs_end_creating(struct dentry *dentry);
-void eventfs_set_ef_status_free(struct tracefs_inode *ti, struct dentry *dentry);
+void eventfs_set_ei_status_free(struct tracefs_inode *ti, struct dentry *dentry);
 
 #endif /* _TRACEFS_INTERNAL_H */
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -652,7 +652,7 @@ struct trace_event_file {
 	struct list_head		list;
 	struct trace_event_call		*event_call;
 	struct event_filter __rcu	*filter;
-	struct eventfs_file             *ef;
+	struct eventfs_inode		*ei;
 	struct trace_array		*tr;
 	struct trace_subsystem_dir	*system;
 	struct list_head		triggers;
--- a/include/linux/tracefs.h
+++ b/include/linux/tracefs.h
@@ -23,26 +23,25 @@ struct file_operations;
 
 struct eventfs_file;
 
-struct dentry *eventfs_create_events_dir(const char *name,
-					 struct dentry *parent);
+typedef int (*eventfs_callback)(const char *name, umode_t *mode, void **data,
+				const struct file_operations **fops);
 
-struct eventfs_file *eventfs_add_subsystem_dir(const char *name,
-					       struct dentry *parent);
+struct eventfs_entry {
+	const char			*name;
+	eventfs_callback		callback;
+};
 
-struct eventfs_file *eventfs_add_dir(const char *name,
-				     struct eventfs_file *ef_parent);
+struct eventfs_inode;
 
-int eventfs_add_file(const char *name, umode_t mode,
-		     struct eventfs_file *ef_parent, void *data,
-		     const struct file_operations *fops);
+struct eventfs_inode *eventfs_create_events_dir(const char *name, struct dentry *parent,
+						const struct eventfs_entry *entries,
+						int size, void *data);
 
-int eventfs_add_events_file(const char *name, umode_t mode,
-			 struct dentry *parent, void *data,
-			 const struct file_operations *fops);
+struct eventfs_inode *eventfs_create_dir(const char *name, struct eventfs_inode *parent,
+					 const struct eventfs_entry *entries,
+					 int size, void *data);
 
-void eventfs_remove(struct eventfs_file *ef);
-
-void eventfs_remove_events_dir(struct dentry *dentry);
+void eventfs_remove_dir(struct eventfs_inode *ei);
 
 struct dentry *tracefs_create_file(const char *name, umode_t mode,
 				   struct dentry *parent, void *data,
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -9760,7 +9760,6 @@ static __init void create_trace_instance
 static void
 init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer)
 {
-	struct trace_event_file *file;
 	int cpu;
 
 	trace_create_file("available_tracers", TRACE_MODE_READ, d_tracer,
@@ -9793,11 +9792,7 @@ init_tracer_tracefs(struct trace_array *
 	trace_create_file("trace_marker", 0220, d_tracer,
 			  tr, &tracing_mark_fops);
 
-	file = __find_event_file(tr, "ftrace", "print");
-	if (file && file->ef)
-		eventfs_add_file("trigger", TRACE_MODE_WRITE, file->ef,
-				  file, &event_trigger_fops);
-	tr->trace_marker_file = file;
+	tr->trace_marker_file = __find_event_file(tr, "ftrace", "print");
 
 	trace_create_file("trace_marker_raw", 0220, d_tracer,
 			  tr, &tracing_mark_raw_fops);
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -381,7 +381,7 @@ struct trace_array {
 	struct dentry		*dir;
 	struct dentry		*options;
 	struct dentry		*percpu_dir;
-	struct dentry		*event_dir;
+	struct eventfs_inode	*event_dir;
 	struct trace_options	*topts;
 	struct list_head	systems;
 	struct list_head	events;
@@ -1345,7 +1345,7 @@ struct trace_subsystem_dir {
 	struct list_head		list;
 	struct event_subsystem		*subsystem;
 	struct trace_array		*tr;
-	struct eventfs_file             *ef;
+	struct eventfs_inode		*ei;
 	int				ref_count;
 	int				nr_events;
 };
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -984,7 +984,7 @@ static void remove_subsystem(struct trac
 		return;
 
 	if (!--dir->nr_events) {
-		eventfs_remove(dir->ef);
+		eventfs_remove_dir(dir->ei);
 		list_del(&dir->list);
 		__put_system_dir(dir);
 	}
@@ -1013,7 +1013,7 @@ void event_file_put(struct trace_event_f
 
 static void remove_event_file_dir(struct trace_event_file *file)
 {
-	eventfs_remove(file->ef);
+	eventfs_remove_dir(file->ei);
 	list_del(&file->list);
 	remove_subsystem(file->system);
 	free_event_filter(file->filter);
@@ -2302,14 +2302,40 @@ create_new_subsystem(const char *name)
 	return NULL;
 }
 
-static struct eventfs_file *
+int system_callback(const char *name, umode_t *mode, void **data,
+		    const struct file_operations **fops)
+{
+	if (strcmp(name, "filter") == 0)
+		*fops = &ftrace_subsystem_filter_fops;
+
+	else if (strcmp(name, "enable") == 0)
+		*fops = &ftrace_system_enable_fops;
+
+	else
+		return 0;
+
+	*mode = TRACE_MODE_WRITE;
+	return 1;
+}
+
+static struct eventfs_inode *
 event_subsystem_dir(struct trace_array *tr, const char *name,
-		    struct trace_event_file *file, struct dentry *parent)
+		    struct trace_event_file *file, struct eventfs_inode *parent)
 {
 	struct event_subsystem *system, *iter;
 	struct trace_subsystem_dir *dir;
-	struct eventfs_file *ef;
-	int res;
+	struct eventfs_inode *ei;
+	int nr_entries;
+	static struct eventfs_entry system_entries[] = {
+		{
+			.name		= "filter",
+			.callback	= system_callback,
+		},
+		{
+			.name		= "enable",
+			.callback	= system_callback,
+		}
+	};
 
 	/* First see if we did not already create this dir */
 	list_for_each_entry(dir, &tr->systems, list) {
@@ -2317,7 +2343,7 @@ event_subsystem_dir(struct trace_array *
 		if (strcmp(system->name, name) == 0) {
 			dir->nr_events++;
 			file->system = dir;
-			return dir->ef;
+			return dir->ei;
 		}
 	}
 
@@ -2341,39 +2367,29 @@ event_subsystem_dir(struct trace_array *
 	} else
 		__get_system(system);
 
-	ef = eventfs_add_subsystem_dir(name, parent);
-	if (IS_ERR(ef)) {
+	/* ftrace only has directories no files */
+	if (strcmp(name, "ftrace") == 0)
+		nr_entries = 0;
+	else
+		nr_entries = ARRAY_SIZE(system_entries);
+
+	ei = eventfs_create_dir(name, parent, system_entries, nr_entries, dir);
+	if (!ei) {
 		pr_warn("Failed to create system directory %s\n", name);
 		__put_system(system);
 		goto out_free;
 	}
 
-	dir->ef = ef;
+	dir->ei = ei;
 	dir->tr = tr;
 	dir->ref_count = 1;
 	dir->nr_events = 1;
 	dir->subsystem = system;
 	file->system = dir;
 
-	/* the ftrace system is special, do not create enable or filter files */
-	if (strcmp(name, "ftrace") != 0) {
-
-		res = eventfs_add_file("filter", TRACE_MODE_WRITE,
-					    dir->ef, dir,
-					    &ftrace_subsystem_filter_fops);
-		if (res) {
-			kfree(system->filter);
-			system->filter = NULL;
-			pr_warn("Could not create tracefs '%s/filter' entry\n", name);
-		}
-
-		eventfs_add_file("enable", TRACE_MODE_WRITE, dir->ef, dir,
-				  &ftrace_system_enable_fops);
-	}
-
 	list_add(&dir->list, &tr->systems);
 
-	return dir->ef;
+	return dir->ei;
 
  out_free:
 	kfree(dir);
@@ -2422,15 +2438,134 @@ event_define_fields(struct trace_event_c
 	return ret;
 }
 
+static int event_callback(const char *name, umode_t *mode, void **data,
+			  const struct file_operations **fops)
+{
+	struct trace_event_file *file = *data;
+	struct trace_event_call *call = file->event_call;
+
+	if (strcmp(name, "format") == 0) {
+		*mode = TRACE_MODE_READ;
+		*fops = &ftrace_event_format_fops;
+		*data = call;
+		return 1;
+	}
+
+	/*
+	 * Only event directories that can be enabled should have
+	 * triggers or filters, with the exception of the "print"
+	 * event that can have a "trigger" file.
+	 */
+	if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) {
+		if (call->class->reg && strcmp(name, "enable") == 0) {
+			*mode = TRACE_MODE_WRITE;
+			*fops = &ftrace_enable_fops;
+			return 1;
+		}
+
+		if (strcmp(name, "filter") == 0) {
+			*mode = TRACE_MODE_WRITE;
+			*fops = &ftrace_event_filter_fops;
+			return 1;
+		}
+	}
+
+	if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) ||
+	    strcmp(trace_event_name(call), "print") == 0) {
+		if (strcmp(name, "trigger") == 0) {
+			*mode = TRACE_MODE_WRITE;
+			*fops = &event_trigger_fops;
+			return 1;
+		}
+	}
+
+#ifdef CONFIG_PERF_EVENTS
+	if (call->event.type && call->class->reg &&
+	    strcmp(name, "id") == 0) {
+		*mode = TRACE_MODE_READ;
+		*data = (void *)(long)call->event.type;
+		*fops = &ftrace_event_id_fops;
+		return 1;
+	}
+#endif
+
+#ifdef CONFIG_HIST_TRIGGERS
+	if (strcmp(name, "hist") == 0) {
+		*mode = TRACE_MODE_READ;
+		*fops = &event_hist_fops;
+		return 1;
+	}
+#endif
+#ifdef CONFIG_HIST_TRIGGERS_DEBUG
+	if (strcmp(name, "hist_debug") == 0) {
+		*mode = TRACE_MODE_READ;
+		*fops = &event_hist_debug_fops;
+		return 1;
+	}
+#endif
+#ifdef CONFIG_TRACE_EVENT_INJECT
+	if (call->event.type && call->class->reg &&
+	    strcmp(name, "inject") == 0) {
+		*mode = 0200;
+		*fops = &event_inject_fops;
+		return 1;
+	}
+#endif
+	return 0;
+}
+
 static int
-event_create_dir(struct dentry *parent, struct trace_event_file *file)
+event_create_dir(struct eventfs_inode *parent, struct trace_event_file *file)
 {
 	struct trace_event_call *call = file->event_call;
-	struct eventfs_file *ef_subsystem = NULL;
 	struct trace_array *tr = file->tr;
-	struct eventfs_file *ef;
+	struct eventfs_inode *e_events;
+	struct eventfs_inode *ei;
 	const char *name;
+	int nr_entries;
 	int ret;
+	static struct eventfs_entry event_entries[] = {
+		{
+			.name		= "enable",
+			.callback	= event_callback,
+		},
+		{
+			.name		= "filter",
+			.callback	= event_callback,
+		},
+		{
+			.name		= "trigger",
+			.callback	= event_callback,
+		},
+		{
+			.name		= "format",
+			.callback	= event_callback,
+		},
+#ifdef CONFIG_PERF_EVENTS
+		{
+			.name		= "id",
+			.callback	= event_callback,
+		},
+#endif
+#ifdef CONFIG_HIST_TRIGGERS
+		{
+			.name		= "hist",
+			.callback	= event_callback,
+		},
+#endif
+#ifdef CONFIG_HIST_TRIGGERS_DEBUG
+		{
+			.name		= "hist_debug",
+			.callback	= event_callback,
+		},
+#endif
+#ifdef CONFIG_TRACE_EVENT_INJECT
+		{
+			.name		= "inject",
+			.callback	= event_callback,
+		},
+#endif
+	};
 
 	/*
 	 * If the trace point header did not define TRACE_SYSTEM
@@ -2440,29 +2575,20 @@ event_create_dir(struct dentry *parent,
 	if (WARN_ON_ONCE(strcmp(call->class->system, TRACE_SYSTEM) == 0))
 		return -ENODEV;
 
-	ef_subsystem = event_subsystem_dir(tr, call->class->system, file, parent);
-	if (!ef_subsystem)
+	e_events = event_subsystem_dir(tr, call->class->system, file, parent);
+	if (!e_events)
 		return -ENOMEM;
 
+	nr_entries = ARRAY_SIZE(event_entries);
+
 	name = trace_event_name(call);
-	ef = eventfs_add_dir(name, ef_subsystem);
-	if (IS_ERR(ef)) {
+	ei = eventfs_create_dir(name, e_events, event_entries, nr_entries, file);
+	if (IS_ERR(ei)) {
 		pr_warn("Could not create tracefs '%s' directory\n", name);
 		return -1;
 	}
 
-	file->ef = ef;
-
-	if (call->class->reg && !(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE))
-		eventfs_add_file("enable", TRACE_MODE_WRITE, file->ef, file,
-				  &ftrace_enable_fops);
-
-#ifdef CONFIG_PERF_EVENTS
-	if (call->event.type && call->class->reg)
-		eventfs_add_file("id", TRACE_MODE_READ, file->ef,
-				  (void *)(long)call->event.type,
-				  &ftrace_event_id_fops);
-#endif
+	file->ei = ei;
 
 	ret = event_define_fields(call);
 	if (ret < 0) {
@@ -2470,35 +2596,6 @@ event_create_dir(struct dentry *parent,
 		return ret;
 	}
 
-	/*
-	 * Only event directories that can be enabled should have
-	 * triggers or filters.
-	 */
-	if (!(call->flags & TRACE_EVENT_FL_IGNORE_ENABLE)) {
-		eventfs_add_file("filter", TRACE_MODE_WRITE, file->ef,
-				  file, &ftrace_event_filter_fops);
-
-		eventfs_add_file("trigger", TRACE_MODE_WRITE, file->ef,
-				  file, &event_trigger_fops);
-	}
-
-#ifdef CONFIG_HIST_TRIGGERS
-	eventfs_add_file("hist", TRACE_MODE_READ, file->ef, file,
-			  &event_hist_fops);
-#endif
-#ifdef CONFIG_HIST_TRIGGERS_DEBUG
-	eventfs_add_file("hist_debug", TRACE_MODE_READ, file->ef, file,
-			  &event_hist_debug_fops);
-#endif
-	eventfs_add_file("format", TRACE_MODE_READ, file->ef, call,
-			  &ftrace_event_format_fops);
-
-#ifdef CONFIG_TRACE_EVENT_INJECT
-	if (call->event.type && call->class->reg)
-		eventfs_add_file("inject", 0200, file->ef, file,
-				  &event_inject_fops);
-#endif
-
 	return 0;
 }
 
@@ -3644,30 +3741,65 @@ static __init int setup_trace_event(char
 }
 __setup("trace_event=", setup_trace_event);
 
+static int events_callback(const char *name, umode_t *mode, void **data,
+			   const struct file_operations **fops)
+{
+	if (strcmp(name, "enable") == 0) {
+		*mode = TRACE_MODE_WRITE;
+		*fops = &ftrace_tr_enable_fops;
+		return 1;
+	}
+
+	if (strcmp(name, "header_page") == 0)
+		*data = ring_buffer_print_page_header;
+
+	else if (strcmp(name, "header_event") == 0)
+		*data = ring_buffer_print_entry_header;
+
+	else
+		return 0;
+
+	*mode = TRACE_MODE_READ;
+	*fops = &ftrace_show_header_fops;
+	return 1;
+}
+
 /* Expects to have event_mutex held when called */
 static int
 create_event_toplevel_files(struct dentry *parent, struct trace_array *tr)
 {
-	struct dentry *d_events;
+	struct eventfs_inode *e_events;
 	struct dentry *entry;
-	int error = 0;
+	int nr_entries;
+	static struct eventfs_entry events_entries[] = {
+		{
+			.name		= "enable",
+			.callback	= events_callback,
+		},
+		{
+			.name		= "header_page",
+			.callback	= events_callback,
+		},
+		{
+			.name		= "header_event",
+			.callback	= events_callback,
+		},
+	};
 
 	entry = trace_create_file("set_event", TRACE_MODE_WRITE, parent,
 				  tr, &ftrace_set_event_fops);
 	if (!entry)
 		return -ENOMEM;
 
-	d_events = eventfs_create_events_dir("events", parent);
-	if (IS_ERR(d_events)) {
+	nr_entries = ARRAY_SIZE(events_entries);
+
+	e_events = eventfs_create_events_dir("events", parent, events_entries,
+					     nr_entries, tr);
+	if (IS_ERR(e_events)) {
 		pr_warn("Could not create tracefs 'events' directory\n");
 		return -ENOMEM;
 	}
 
-	error = eventfs_add_events_file("enable", TRACE_MODE_WRITE, d_events,
-				  tr, &ftrace_tr_enable_fops);
-	if (error)
-		return -ENOMEM;
-
 	/* There are not as crucial, just warn if they are not created */
 
 	trace_create_file("set_event_pid", TRACE_MODE_WRITE, parent,
@@ -3677,16 +3809,7 @@ create_event_toplevel_files(struct dentr
 			  TRACE_MODE_WRITE, parent, tr,
 			  &ftrace_set_event_notrace_pid_fops);
 
-	/* ring buffer internal formats */
-	eventfs_add_events_file("header_page", TRACE_MODE_READ, d_events,
-				  ring_buffer_print_page_header,
-				  &ftrace_show_header_fops);
-
-	eventfs_add_events_file("header_event", TRACE_MODE_READ, d_events,
-				  ring_buffer_print_entry_header,
-				  &ftrace_show_header_fops);
-
-	tr->event_dir = d_events;
+	tr->event_dir = e_events;
 
 	return 0;
 }
@@ -3770,7 +3893,7 @@ int event_trace_del_tracer(struct trace_
 
 	down_write(&trace_event_sem);
 	__trace_remove_event_dirs(tr);
-	eventfs_remove_events_dir(tr->event_dir);
+	eventfs_remove_dir(tr->event_dir);
 	up_write(&trace_event_sem);
 
 	tr->event_dir = NULL;



  parent reply	other threads:[~2024-02-20 21:22 UTC|newest]

Thread overview: 339+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-20 20:51 [PATCH 6.6 000/331] 6.6.18-rc1 review Greg Kroah-Hartman
2024-02-20 20:51 ` [PATCH 6.6 001/331] work around gcc bugs with asm goto with outputs Greg Kroah-Hartman
2024-02-20 20:51 ` [PATCH 6.6 002/331] update workarounds for gcc "asm goto" issue Greg Kroah-Hartman
2024-02-20 20:51 ` [PATCH 6.6 003/331] btrfs: add and use helper to check if block group is used Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 004/331] btrfs: do not delete unused block group if it may be used soon Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 005/331] btrfs: forbid creating subvol qgroups Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 006/331] btrfs: do not ASSERT() if the newly created subvolume already got read Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 007/331] btrfs: forbid deleting live subvol qgroup Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 008/331] btrfs: send: return EOPNOTSUPP on unknown flags Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 009/331] btrfs: dont reserve space for checksums when writing to nocow files Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 010/331] btrfs: reject encoded write if inode has nodatasum flag set Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 011/331] btrfs: dont drop extent_map for free space inode on write error Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 012/331] driver core: Fix device_link_flag_is_sync_state_only() Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 013/331] selftests/landlock: Fix fs_test build with old libc Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 014/331] KVM: selftests: Delete superfluous, unused "stage" variable in AMX test Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 015/331] KVM: selftests: Avoid infinite loop in hyperv_features when invtsc is missing Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 016/331] of: unittest: Fix compile in the non-dynamic case Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 017/331] drm/msm/gem: Fix double resv lock aquire Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 018/331] spi: imx: fix the burst length at DMA mode and CPU mode Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 019/331] KVM: selftests: Fix a semaphore imbalance in the dirty ring logging test Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 020/331] wifi: iwlwifi: Fix some error codes Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 021/331] wifi: iwlwifi: uninitialized variable in iwl_acpi_get_ppag_table() Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 022/331] ASoC: SOF: ipc3-topology: Fix pipeline tear down logic Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 023/331] net/handshake: Fix handshake_req_destroy_test1 Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 024/331] bonding: do not report NETDEV_XDP_ACT_XSK_ZEROCOPY Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 025/331] devlink: Fix command annotation documentation Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 026/331] of: property: Improve finding the consumer of a remote-endpoint property Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 027/331] of: property: Improve finding the supplier " Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 028/331] ALSA: hda/cs35l56: select intended config FW_CS_DSP Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 029/331] perf: CXL: fix mismatched cpmu event opcode Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 030/331] selftests/net: convert test_bridge_backup_port.sh to run it in unique namespace Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 031/331] selftests: net: Fix bridge backup port test flakiness Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 032/331] selftests: forwarding: Fix layer 2 miss " Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 033/331] selftests: forwarding: Fix bridge MDB " Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 034/331] selftests: bridge_mdb: Use MDB get instead of dump Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 035/331] selftests: forwarding: Suppress grep warnings Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 036/331] selftests: forwarding: Fix bridge locked port test flakiness Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 037/331] net: openvswitch: limit the number of recursions from action sets Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 038/331] lan966x: Fix crash when adding interface under a lag Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 039/331] tls: extract context alloc/initialization out of tls_set_sw_offload Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 040/331] net: tls: factor out tls_*crypt_async_wait() Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 041/331] tls: fix race between async notify and socket close Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 042/331] tls: fix race between tx work scheduling " Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 043/331] net: tls: handle backlogging of crypto requests Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 044/331] net: tls: fix use-after-free with partial reads and async decrypt Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 045/331] net: tls: fix returned read length with " Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 046/331] spi: ppc4xx: Drop write-only variable Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 047/331] ASoC: rt5645: Fix deadlock in rt5645_jack_detect_work() Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 048/331] net: sysfs: Fix /sys/class/net/<iface> path for statistics Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 049/331] nouveau/svm: fix kvcalloc() argument order Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 050/331] MIPS: Add memory clobber to csum_ipv6_magic() inline assembler Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 051/331] ptrace: Introduce exception_ip arch hook Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 052/331] mm/memory: Use exception ip to search exception tables Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 053/331] i40e: Do not allow untrusted VF to remove administratively set MAC Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 054/331] i40e: Fix waiting for queues of all VSIs to be disabled Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 055/331] userfaultfd: fix mmap_changing checking in mfill_atomic_hugetlb Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 056/331] selftests/mm: ksm_tests should only MADV_HUGEPAGE valid memory Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 057/331] scs: add CONFIG_MMU dependency for vfree_atomic() Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 058/331] tracing/trigger: Fix to return error if failed to alloc snapshot Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 059/331] selftests/mm: switch to bash from sh Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 060/331] readahead: avoid multiple marked readahead pages Greg Kroah-Hartman
2024-02-20 21:25   ` Matthew Wilcox
2024-02-20 20:52 ` [PATCH 6.6 061/331] mm/writeback: fix possible divide-by-zero in wb_dirty_limits(), again Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 062/331] selftests/mm: Update va_high_addr_switch.sh to check CPU for la57 flag Greg Kroah-Hartman
2024-02-20 20:52 ` [PATCH 6.6 063/331] selftests: mm: fix map_hugetlb failure on 64K page size systems Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 064/331] scsi: storvsc: Fix ring buffer size calculation Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 065/331] nouveau: offload fence uevents work to workqueue Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 066/331] dm-crypt, dm-verity: disable tasklets Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 067/331] ASoC: amd: yc: Add DMI quirk for MSI Bravo 15 C7VF Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 068/331] parisc: Prevent hung tasks when printing inventory on serial console Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 069/331] ALSA: hda/realtek: Fix the external mic not being recognised for Acer Swift 1 SF114-32 Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 070/331] ALSA: hda/realtek: Enable Mute LED on HP Laptop 14-fq0xxx Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 071/331] HID: bpf: remove double fdget() Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 072/331] HID: bpf: actually free hdev memory after attaching a HID-BPF program Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 073/331] HID: i2c-hid-of: fix NULL-deref on failed power up Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 074/331] HID: wacom: generic: Avoid reporting a serial of 0 to userspace Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 075/331] HID: wacom: Do not register input devices until after hid_hw_start Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 076/331] iio: hid-sensor-als: Return 0 for HID_USAGE_SENSOR_TIME_TIMESTAMP Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 077/331] usb: ucsi: Add missing ppm_lock Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 078/331] usb: ulpi: Fix debugfs directory leak Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 079/331] usb: ucsi_acpi: Fix command completion handling Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 080/331] USB: hub: check for alternate port before enabling A_ALT_HNP_SUPPORT Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 081/331] usb: f_mass_storage: forbid async queue when shutdown happen Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 082/331] usb: chipidea: core: handle power lost in workqueue Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 083/331] usb: core: Prevent null pointer dereference in update_port_device_state Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 084/331] usb: dwc3: gadget: Fix NULL pointer dereference in dwc3_gadget_suspend Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 085/331] interconnect: qcom: sc8180x: Mark CO0 BCM keepalive Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 086/331] interconnect: qcom: sm8550: Enable sync_state Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 087/331] media: ir_toy: fix a memleak in irtoy_tx Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 088/331] driver core: fw_devlink: Improve detection of overlapping cycles Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 089/331] powerpc/pseries/iommu: Fix iommu initialisation during DLPAR add Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 090/331] powerpc/6xx: set High BAT Enable flag on G2_LE cores Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 091/331] powerpc/kasan: Fix addr error caused by page alignment Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 092/331] Revert "kobject: Remove redundant checks for whether ktype is NULL" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 093/331] PCI: Fix active state requirement in PME polling Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 094/331] iio: adc: ad4130: zero-initialize clock init data Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 095/331] iio: adc: ad4130: only set GPIO_CTRL if pin is unused Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 096/331] cifs: fix underflow in parse_server_interfaces() Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 097/331] i2c: qcom-geni: Correct I2C TRE sequence Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 098/331] irqchip/loongson-eiointc: Use correct struct type in eiointc_domain_alloc() Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 099/331] irqchip/gic-v3-its: Handle non-coherent GICv4 redistributors Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 100/331] powerpc/kasan: Limit KASAN thread size increase to 32KB Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 101/331] i2c: pasemi: split driver into two separate modules Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 102/331] i2c: i801: Fix block process call transactions Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 103/331] modpost: trim leading spaces when processing source files list Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 104/331] kallsyms: ignore ARMv4 thunks along with others Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 105/331] mptcp: fix data re-injection from stale subflow Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 106/331] selftests: mptcp: add missing kconfig for NF Filter Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 107/331] selftests: mptcp: add missing kconfig for NF Filter in v6 Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 108/331] selftests: mptcp: add missing kconfig for NF Mangle Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 109/331] selftests: mptcp: increase timeout to 30 min Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 110/331] selftests: mptcp: allow changing subtests prefix Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 111/331] selftests: mptcp: add mptcp_lib_kill_wait Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 112/331] mptcp: drop the push_pending field Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 113/331] mptcp: fix rcv space initialization Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 114/331] mptcp: check addrs list in userspace_pm_get_local_id Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 115/331] mptcp: really cope with fastopen race Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 116/331] Revert "powerpc/pseries/iommu: Fix iommu initialisation during DLPAR add" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 117/331] media: Revert "media: rkisp1: Drop IRQF_SHARED" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 118/331] scsi: Revert "scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 119/331] Revert "drm/amd: flush any delayed gfxoff on suspend entry" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 120/331] Revert "drm/msm/gpu: Push gpu lock down past runpm" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 121/331] connector/cn_proc: revert "connector: Fix proc_event_num_listeners count not cleared" Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 122/331] drm/virtio: Set segment size for virtio_gpu device Greg Kroah-Hartman
2024-02-20 20:53 ` [PATCH 6.6 123/331] drm/amdgpu: Reset IH OVERFLOW_CLEAR bit Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 124/331] drm/amd: Dont init MEC2 firmware when it fails to load Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 125/331] lsm: fix default return value of the socket_getpeersec_*() hooks Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 126/331] lsm: fix the logic in security_inode_getsecctx() Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 127/331] firewire: core: correct documentation of fw_csr_string() kernel API Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 128/331] ALSA: hda/realtek: Apply headset jack quirk for non-bass alc287 thinkpads Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 129/331] kbuild: Fix changing ELF file type for output of gen_btf for big endian Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 130/331] nfc: nci: free rx_data_reassembly skb on NCI device cleanup Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 131/331] net: hsr: remove WARN_ONCE() in send_hsr_supervision_frame() Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 132/331] net: stmmac: do not clear TBS enable bit on link up/down Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 133/331] parisc: BTLB: Fix crash when setting up BTLB at CPU bringup Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 134/331] xen-netback: properly sync TX responses Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 135/331] um: Fix adding -no-pie for clang Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 136/331] linux/init: remove __memexit* annotations Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 137/331] modpost: Add .ltext and .ltext.* to TEXT_SECTIONS Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 138/331] usb: typec: tpcm: Fix issues with power being removed during reset Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 139/331] ALSA: hda/realtek: Enable headset mic on Vaio VJFE-ADL Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 140/331] ALSA: hda/realtek - Add speaker pin verbtable for Dell dual speaker platform Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 141/331] ASoC: codecs: wcd938x: handle deferred probe Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 142/331] ALSA: hda/cs8409: Suppress vmaster control for Dolphin models Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 143/331] ALSA: hda/realtek: fix mute/micmute LEDs for HP ZBook Power Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 144/331] binder: signal epoll threads of self-work Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 145/331] misc: fastrpc: Mark all sessions as invalid in cb_remove Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 146/331] ext4: fix double-free of blocks due to wrong extents moved_len Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 147/331] ext4: avoid bb_free and bb_fragments inconsistency in mb_free_blocks() Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 148/331] tracing/timerlat: Move hrtimer_init to timerlat_fd open() Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 149/331] tracing: Fix wasted memory in saved_cmdlines logic Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 150/331] tracing/synthetic: Fix trace_string() return value Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 151/331] tracing/probes: Fix to show a parse error for bad type for $comm Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 152/331] tracing/probes: Fix to set arg size and fmt after setting type from BTF Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 153/331] tracing/probes: Fix to search structure fields correctly Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 154/331] Revert "workqueue: Override implicit ordered attribute in workqueue_apply_unbound_cpumask()" Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 155/331] staging: iio: ad5933: fix type mismatch regression Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 156/331] iio: magnetometer: rm3100: add boundary check for the value read from RM3100_REG_TMRC Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 157/331] iio: core: fix memleak in iio_device_register_sysfs Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 158/331] iio: commom: st_sensors: ensure proper DMA alignment Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 159/331] iio: accel: bma400: Fix a compilation problem Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 160/331] iio: adc: ad_sigma_delta: ensure proper DMA alignment Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 161/331] iio: imu: adis: " Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 162/331] iio: imu: bno055: serdev requires REGMAP Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 163/331] iio: pressure: bmp280: Add missing bmp085 to SPI id table Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 164/331] pmdomain: mediatek: fix race conditions with genpd Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 165/331] media: rc: bpf attach/detach requires write permission Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 166/331] ksmbd: free aux buffer if ksmbd_iov_pin_rsp_read fails Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 167/331] drm/msm: Wire up tlb ops Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 168/331] drm/amd/display: Add align done check Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 169/331] drm/prime: Support page array >= 4GB Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 170/331] drm/amdgpu/soc21: update VCN 4 max HEVC encoding resolution Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 171/331] drm/amd/display: Fix MST Null Ptr for RV Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 172/331] drm/amd/display: Increase frame-larger-than for all display_mode_vba files Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 173/331] drm/amd/display: Preserve original aspect ratio in create stream Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 174/331] hv_netvsc: Fix race condition between netvsc_probe and netvsc_remove Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 175/331] ring-buffer: Clean ring_buffer_poll_wait() error return Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 176/331] net: dsa: mv88e6xxx: Fix failed probe due to unsupported C45 reads Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 177/331] nfp: flower: add hardware offload check for post ct entry Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 178/331] nfp: flower: fix hardware offload for the transfer layer port Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 179/331] serial: max310x: set default value when reading clock ready bit Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 180/331] serial: max310x: improve crystal stable clock detection Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 181/331] serial: max310x: fail probe if clock crystal is unstable Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 182/331] serial: max310x: prevent infinite while() loop in port startup Greg Kroah-Hartman
2024-02-20 20:54 ` [PATCH 6.6 183/331] ftrace: Fix DIRECT_CALLS to use SAVE_REGS by default Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 184/331] powerpc/64: Set task pt_regs->link to the LR value on scv entry Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 185/331] powerpc/cputable: Add missing PPC_FEATURE_BOOKE on PPC64 Book-E Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 186/331] powerpc/pseries: fix accuracy of stolen time Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 187/331] serial: core: introduce uart_port_tx_flags() Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 188/331] serial: mxs-auart: fix tx Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 189/331] x86/Kconfig: Transmeta Crusoe is CPU family 5, not 6 Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 190/331] x86/fpu: Stop relying on userspace for info to fault in xsave buffer Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 191/331] KVM: x86: make KVM_REQ_NMI request iff NMI pending for vcpu Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 192/331] KVM: x86/pmu: Fix type length error when reading pmu->fixed_ctr_ctrl Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 193/331] x86/mm/ident_map: Use gbpages only where full GB page should be mapped Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 194/331] io_uring/net: fix multishot accept overflow handling Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 195/331] mmc: slot-gpio: Allow non-sleeping GPIO ro Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 196/331] ALSA: hda/realtek: fix mute/micmute LED For HP mt645 Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 197/331] ALSA: hda/conexant: Add quirk for SWS JS201D Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 198/331] ALSA: hda/realtek: add IDs for Dell dual spk platform Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 199/331] nilfs2: fix data corruption in dsync block recovery for small block sizes Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 200/331] nilfs2: fix hang in nilfs_lookup_dirty_data_buffers() Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 201/331] crypto: ccp - Fix null pointer dereference in __sev_platform_shutdown_locked Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 202/331] crypto: algif_hash - Remove bogus SGL free on zero-length error path Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 203/331] nfp: use correct macro for LengthSelect in BAR config Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 204/331] nfp: enable NETDEV_XDP_ACT_REDIRECT feature flag Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 205/331] nfp: flower: prevent re-adding mac index for bonded port Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 206/331] wifi: iwlwifi: fix double-free bug Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 207/331] wifi: cfg80211: fix wiphy delayed work queueing Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 208/331] wifi: mac80211: reload info pointer in ieee80211_tx_dequeue() Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 209/331] wifi: iwlwifi: mvm: fix a crash when we run out of stations Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 210/331] irqchip/irq-brcmstb-l2: Add write memory barrier before exit Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 211/331] irqchip/gic-v3-its: Restore quirk probing for ACPI-based systems Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 212/331] irqchip/gic-v3-its: Fix GICv4.1 VPE affinity update Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 213/331] thunderbolt: Fix setting the CNS bit in ROUTER_CS_5 Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 214/331] smb: client: set correct id, uid and cruid for multiuser automounts Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 215/331] smb: Fix regression in writes when non-standard maximum write size negotiated Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 216/331] KVM: arm64: Fix circular locking dependency Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 217/331] zonefs: Improve error handling Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 218/331] mmc: sdhci-pci-o2micro: Fix a warm reboot issue that disk cant be detected by BIOS Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 219/331] arm64/signal: Dont assume that TIF_SVE means we saved SVE state Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 220/331] arm64: Subscribe Microsoft Azure Cobalt 100 to ARM Neoverse N2 errata Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 221/331] ASoC: SOF: IPC3: fix message bounds on ipc ops Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 222/331] ASoC: tas2781: add module parameter to tascodec_init() Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 223/331] ASoC: amd: yc: Add DMI quirk for Lenovo Ideapad Pro 5 16ARP8 Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 224/331] tools/rv: Fix curr_reactor uninitialized variable Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 225/331] tools/rv: Fix Makefile compiler options for clang Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 226/331] tools/rtla: Remove unused sched_getattr() function Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 227/331] tools/rtla: Replace setting prio with nice for SCHED_OTHER Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 228/331] tools/rtla: Fix clang warning about mount_point var size Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 229/331] tools/rtla: Exit with EXIT_SUCCESS when help is invoked Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 230/331] tools/rtla: Fix uninitialized bucket/data->bucket_size warning Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 231/331] tools/rtla: Fix Makefile compiler options for clang Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 232/331] fs: relax mount_setattr() permission checks Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 233/331] net: ethernet: ti: cpsw: enable mac_managed_pm to fix mdio Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 234/331] s390/qeth: Fix potential loss of L3-IP@ in case of network issues Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 235/331] net: ethernet: ti: cpsw_new: enable mac_managed_pm to fix mdio Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 236/331] pmdomain: renesas: r8a77980-sysc: CR7 must be always on Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 237/331] net: stmmac: protect updates of 64-bit statistics counters Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 238/331] hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 239/331] ceph: prevent use-after-free in encode_cap_msg() Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 240/331] fs,hugetlb: fix NULL pointer dereference in hugetlbs_fill_super Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 241/331] mm: hugetlb pages should not be reserved by shmat() if SHM_NORESERVE Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 242/331] LoongArch: Fix earlycon parameter if KASAN enabled Greg Kroah-Hartman
2024-02-20 20:55 ` [PATCH 6.6 243/331] blk-wbt: Fix detection of dirty-throttled tasks Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 244/331] docs: kernel_feat.py: fix build error for missing files Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 245/331] of: property: fix typo in io-channels Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 246/331] can: netlink: Fix TDCO calculation using the old data bittiming Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 247/331] can: j1939: prevent deadlock by changing j1939_socks_lock to rwlock Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 248/331] can: j1939: Fix UAF in j1939_sk_match_filter during setsockopt(SO_J1939_FILTER) Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 249/331] pmdomain: core: Move the unused cleanup to a _sync initcall Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 250/331] fs/proc: do_task_stat: move thread_group_cputime_adjusted() outside of lock_task_sighand() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 251/331] tracing: Fix HAVE_DYNAMIC_FTRACE_WITH_REGS ifdef Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 252/331] tracing: Inform kmemleak of saved_cmdlines allocation Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 253/331] md: bypass block throttle for superblock update Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 254/331] block: fix partial zone append completion handling in req_bio_endio() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 255/331] netfilter: ipset: fix performance regression in swap operation Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 256/331] netfilter: ipset: Missing gc cancellations fixed Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 257/331] parisc: Fix random data corruption from exception handler Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 258/331] Revert "eventfs: Do not allow NULL parent to eventfs_start_creating()" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 259/331] Revert "eventfs: Check for NULL ef in eventfs_set_attr()" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 260/331] Revert "eventfs: Use simple_recursive_removal() to clean up dentries" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 261/331] Revert "eventfs: Delete eventfs_inode when the last dentry is freed" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 262/331] Revert "eventfs: Save ownership and mode" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 263/331] Revert "eventfs: Remove "is_freed" union with rcu head" Greg Kroah-Hartman
2024-02-20 20:56 ` Greg Kroah-Hartman [this message]
2024-02-20 20:56 ` [PATCH 6.6 265/331] eventfs: Use eventfs_remove_events_dir() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 266/331] eventfs: Use ERR_CAST() in eventfs_create_events_dir() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 267/331] eventfs: Fix failure path " Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 268/331] tracefs/eventfs: Modify mismatched function name Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 269/331] eventfs: Fix WARN_ON() in create_file_dentry() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 270/331] eventfs: Fix typo in eventfs_inode union comment Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 271/331] eventfs: Remove extra dget() in eventfs_create_events_dir() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 272/331] eventfs: Fix kerneldoc of eventfs_remove_rec() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 273/331] eventfs: Remove "is_freed" union with rcu head Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 274/331] eventfs: Have a free_ei() that just frees the eventfs_inode Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 275/331] eventfs: Test for ei->is_freed when accessing ei->dentry Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 276/331] eventfs: Save ownership and mode Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 277/331] eventfs: Hold eventfs_mutex when calling callback functions Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 278/331] eventfs: Delete eventfs_inode when the last dentry is freed Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 279/331] eventfs: Remove special processing of dput() of events directory Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 280/331] eventfs: Use simple_recursive_removal() to clean up dentries Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 281/331] eventfs: Remove expectation that ei->is_freed means ei->dentry == NULL Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 282/331] eventfs: Do not invalidate dentry in create_file/dir_dentry() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 283/331] eventfs: Use GFP_NOFS for allocation when eventfs_mutex is held Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 284/331] eventfs: Move taking of inode_lock into dcache_dir_open_wrapper() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 285/331] eventfs: Do not allow NULL parent to eventfs_start_creating() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 286/331] eventfs: Make sure that parent->d_inode is locked in creating files/dirs Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 287/331] eventfs: Fix events beyond NAME_MAX blocking tasks Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 288/331] eventfs: Have event files and directories default to parent uid and gid Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 289/331] eventfs: Fix file and directory uid and gid ownership Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 290/331] tracefs: Check for dentry->d_inode exists in set_gid() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 291/331] eventfs: Fix bitwise fields for "is_events" Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 292/331] eventfs: Remove "lookup" parameter from create_dir/file_dentry() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 293/331] eventfs: Stop using dcache_readdir() for getdents() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 294/331] tracefs/eventfs: Use root and instance inodes as default ownership Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 295/331] eventfs: Have eventfs_iterate() stop immediately if ei->is_freed is set Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 296/331] eventfs: Do ctx->pos update for all iterations in eventfs_iterate() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 297/331] eventfs: Read ei->entries before ei->children " Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 298/331] eventfs: Shortcut eventfs_iterate() by skipping entries already read Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 299/331] eventfs: Have the inodes all for files and directories all be the same Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 300/331] eventfs: Do not create dentries nor inodes in iterate_shared Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 301/331] eventfs: Use kcalloc() instead of kzalloc() Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 302/331] eventfs: Save directory inodes in the eventfs_inode structure Greg Kroah-Hartman
2024-02-20 20:56 ` [PATCH 6.6 303/331] tracefs: remove stale update_gid code Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 304/331] tracefs: Zero out the tracefs_inode when allocating it Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 305/331] eventfs: Initialize the tracefs inode properly Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 306/331] tracefs: Avoid using the ei->dentry pointer unnecessarily Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 307/331] tracefs: dentry lookup crapectomy Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 308/331] eventfs: Remove unused d_parent pointer field Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 309/331] eventfs: Clean up dentry ops and add revalidate function Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 310/331] eventfs: Get rid of dentry pointers without refcounts Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 311/331] eventfs: Warn if an eventfs_inode is freed without is_freed being set Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 312/331] eventfs: Restructure eventfs_inode structure to be more condensed Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 313/331] eventfs: Remove fsnotify*() functions from lookup() Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 314/331] eventfs: Keep all directory links at 1 Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 315/331] nfsd: dont take fi_lock in nfsd_break_deleg_cb() Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 316/331] x86/efi: Drop EFI stub .bss from .data section Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 317/331] x86/efi: Disregard setup header of loaded image Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 318/331] x86/efi: Drop alignment flags from PE section headers Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 319/331] x86/boot: Remove the bugger off message Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 320/331] x86/boot: Omit compression buffer from PE/COFF image memory footprint Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 321/331] x86/boot: Drop redundant code setting the root device Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 322/331] x86/boot: Drop references to startup_64 Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 323/331] x86/boot: Grab kernel_info offset from zoffset header directly Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 324/331] x86/boot: Set EFI handover offset directly in header asm Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 325/331] x86/boot: Define setup size in linker script Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 326/331] x86/boot: Derive file size from _edata symbol Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 327/331] x86/boot: Construct PE/COFF .text section from assembler Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 328/331] x86/boot: Drop PE/COFF .reloc section Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 329/331] x86/boot: Split off PE/COFF .data section Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 330/331] x86/boot: Increase section and file alignment to 4k/512 Greg Kroah-Hartman
2024-02-20 20:57 ` [PATCH 6.6 331/331] x86/efistub: Use 1:1 file:memory mapping for PE/COFF .compat section Greg Kroah-Hartman
2024-02-21  0:16 ` [PATCH 6.6 000/331] 6.6.18-rc1 review SeongJae Park
2024-02-21  0:46 ` Allen
2024-02-21  6:42 ` Bagas Sanjaya
2024-02-21 10:57 ` Takeshi Ogasawara
2024-02-21 12:02 ` Jon Hunter
2024-02-21 15:37 ` Shuah Khan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240220205646.169799875@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=akaher@vmware.com \
    --cc=akpm@linux-foundation.org \
    --cc=mark.rutland@arm.com \
    --cc=mhiramat@kernel.org \
    --cc=patches@lists.linux.dev \
    --cc=rostedt@goodmis.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).