|
@@ -22,6 +22,7 @@
|
|
|
|
|
|
#include <linux/cacheinfo.h>
|
|
|
#include <linux/cpu.h>
|
|
|
+#include <linux/debugfs.h>
|
|
|
#include <linux/fs.h>
|
|
|
#include <linux/sysfs.h>
|
|
|
#include <linux/kernfs.h>
|
|
@@ -56,6 +57,8 @@ static struct kernfs_node *kn_mondata;
|
|
|
static struct seq_buf last_cmd_status;
|
|
|
static char last_cmd_status_buf[512];
|
|
|
|
|
|
+struct dentry *debugfs_resctrl;
|
|
|
+
|
|
|
void rdt_last_cmd_clear(void)
|
|
|
{
|
|
|
lockdep_assert_held(&rdtgroup_mutex);
|
|
@@ -2819,6 +2822,29 @@ int __init rdtgroup_init(void)
|
|
|
if (ret)
|
|
|
goto cleanup_mountpoint;
|
|
|
|
|
|
+ /*
|
|
|
+ * Adding the resctrl debugfs directory here may not be ideal since
|
|
|
+ * it would let the resctrl debugfs directory appear on the debugfs
|
|
|
+ * filesystem before the resctrl filesystem is mounted.
|
|
|
+ * It may also be ok since that would enable debugging of RDT before
|
|
|
+ * resctrl is mounted.
|
|
|
+ * The reason why the debugfs directory is created here and not in
|
|
|
+ * rdt_mount() is because rdt_mount() takes rdtgroup_mutex and
|
|
|
+ * during the debugfs directory creation also &sb->s_type->i_mutex_key
|
|
|
+ * (the lockdep class of inode->i_rwsem). Other filesystem
|
|
|
+ * interactions (eg. SyS_getdents) have the lock ordering:
|
|
|
+ * &sb->s_type->i_mutex_key --> &mm->mmap_sem
|
|
|
+ * During mmap(), called with &mm->mmap_sem, the rdtgroup_mutex
|
|
|
+ * is taken, thus creating dependency:
|
|
|
+ * &mm->mmap_sem --> rdtgroup_mutex for the latter that can cause
|
|
|
+ * issues considering the other two lock dependencies.
|
|
|
+ * By creating the debugfs directory here we avoid a dependency
|
|
|
+ * that may cause deadlock (even though file operations cannot
|
|
|
+ * occur until the filesystem is mounted, but I do not know how to
|
|
|
+ * tell lockdep that).
|
|
|
+ */
|
|
|
+ debugfs_resctrl = debugfs_create_dir("resctrl", NULL);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
cleanup_mountpoint:
|
|
@@ -2831,6 +2857,7 @@ cleanup_root:
|
|
|
|
|
|
void __exit rdtgroup_exit(void)
|
|
|
{
|
|
|
+ debugfs_remove_recursive(debugfs_resctrl);
|
|
|
unregister_filesystem(&rdt_fs_type);
|
|
|
sysfs_remove_mount_point(fs_kobj, "resctrl");
|
|
|
kernfs_destroy_root(rdt_root);
|