|
@@ -0,0 +1,113 @@
|
|
|
+// SPDX-License-Identifier: GPL-2.0
|
|
|
+/*
|
|
|
+ * Resource Director Technology (RDT)
|
|
|
+ *
|
|
|
+ * Pseudo-locking support built on top of Cache Allocation Technology (CAT)
|
|
|
+ *
|
|
|
+ * Copyright (C) 2018 Intel Corporation
|
|
|
+ *
|
|
|
+ * Author: Reinette Chatre <reinette.chatre@intel.com>
|
|
|
+ */
|
|
|
+
|
|
|
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
+
|
|
|
+#include "intel_rdt.h"
|
|
|
+
|
|
|
+/**
|
|
|
+ * rdtgroup_locksetup_user_restrict - Restrict user access to group
|
|
|
+ * @rdtgrp: resource group needing access restricted
|
|
|
+ *
|
|
|
+ * A resource group used for cache pseudo-locking cannot have cpus or tasks
|
|
|
+ * assigned to it. This is communicated to the user by restricting access
|
|
|
+ * to all the files that can be used to make such changes.
|
|
|
+ *
|
|
|
+ * Permissions restored with rdtgroup_locksetup_user_restore()
|
|
|
+ *
|
|
|
+ * Return: 0 on success, <0 on failure. If a failure occurs during the
|
|
|
+ * restriction of access an attempt will be made to restore permissions but
|
|
|
+ * the state of the mode of these files will be uncertain when a failure
|
|
|
+ * occurs.
|
|
|
+ */
|
|
|
+static int __attribute__ ((unused))
|
|
|
+rdtgroup_locksetup_user_restrict(struct rdtgroup *rdtgrp)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restrict(rdtgrp, "tasks");
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restrict(rdtgrp, "cpus");
|
|
|
+ if (ret)
|
|
|
+ goto err_tasks;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restrict(rdtgrp, "cpus_list");
|
|
|
+ if (ret)
|
|
|
+ goto err_cpus;
|
|
|
+
|
|
|
+ if (rdt_mon_capable) {
|
|
|
+ ret = rdtgroup_kn_mode_restrict(rdtgrp, "mon_groups");
|
|
|
+ if (ret)
|
|
|
+ goto err_cpus_list;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = 0;
|
|
|
+ goto out;
|
|
|
+
|
|
|
+err_cpus_list:
|
|
|
+ rdtgroup_kn_mode_restore(rdtgrp, "cpus_list");
|
|
|
+err_cpus:
|
|
|
+ rdtgroup_kn_mode_restore(rdtgrp, "cpus");
|
|
|
+err_tasks:
|
|
|
+ rdtgroup_kn_mode_restore(rdtgrp, "tasks");
|
|
|
+out:
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * rdtgroup_locksetup_user_restore - Restore user access to group
|
|
|
+ * @rdtgrp: resource group needing access restored
|
|
|
+ *
|
|
|
+ * Restore all file access previously removed using
|
|
|
+ * rdtgroup_locksetup_user_restrict()
|
|
|
+ *
|
|
|
+ * Return: 0 on success, <0 on failure. If a failure occurs during the
|
|
|
+ * restoration of access an attempt will be made to restrict permissions
|
|
|
+ * again but the state of the mode of these files will be uncertain when
|
|
|
+ * a failure occurs.
|
|
|
+ */
|
|
|
+static int __attribute__ ((unused))
|
|
|
+rdtgroup_locksetup_user_restore(struct rdtgroup *rdtgrp)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restore(rdtgrp, "tasks");
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restore(rdtgrp, "cpus");
|
|
|
+ if (ret)
|
|
|
+ goto err_tasks;
|
|
|
+
|
|
|
+ ret = rdtgroup_kn_mode_restore(rdtgrp, "cpus_list");
|
|
|
+ if (ret)
|
|
|
+ goto err_cpus;
|
|
|
+
|
|
|
+ if (rdt_mon_capable) {
|
|
|
+ ret = rdtgroup_kn_mode_restore(rdtgrp, "mon_groups");
|
|
|
+ if (ret)
|
|
|
+ goto err_cpus_list;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = 0;
|
|
|
+ goto out;
|
|
|
+
|
|
|
+err_cpus_list:
|
|
|
+ rdtgroup_kn_mode_restrict(rdtgrp, "cpus_list");
|
|
|
+err_cpus:
|
|
|
+ rdtgroup_kn_mode_restrict(rdtgrp, "cpus");
|
|
|
+err_tasks:
|
|
|
+ rdtgroup_kn_mode_restrict(rdtgrp, "tasks");
|
|
|
+out:
|
|
|
+ return ret;
|
|
|
+}
|