aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Shivappa <vikas.shivappa@linux.intel.com>2017-07-25 17:14:31 -0400
committerThomas Gleixner <tglx@linutronix.de>2017-08-01 16:41:23 -0400
commit65b4f403057e32da73c36e33d403890173c4c324 (patch)
tree779d1883eaff508ddd0a9543229b73d77c8b4d29
parentd4ab33201029913b594ae785a9665f45040396ab (diff)
x86/intel_rdt: Prepare for RDT monitoring mkdir support
Separate the ctrl mkdir code from the rest in order to prepare for adding support for RDT monitoring mkdir support as well. Signed-off-by: Vikas Shivappa <vikas.shivappa@linux.intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: ravi.v.shankar@intel.com Cc: tony.luck@intel.com Cc: fenghua.yu@intel.com Cc: peterz@infradead.org Cc: eranian@google.com Cc: vikas.shivappa@intel.com Cc: ak@linux.intel.com Cc: davidcc@google.com Cc: reinette.chatre@intel.com Link: http://lkml.kernel.org/r/1501017287-28083-13-git-send-email-vikas.shivappa@linux.intel.com
-rw-r--r--arch/x86/kernel/cpu/intel_rdt_rdtgroup.c111
1 files changed, 79 insertions, 32 deletions
diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
index 14489a5ecf12..b3c901a8295e 100644
--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
@@ -1082,46 +1082,35 @@ static struct file_system_type rdt_fs_type = {
1082 .kill_sb = rdt_kill_sb, 1082 .kill_sb = rdt_kill_sb,
1083}; 1083};
1084 1084
1085static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name, 1085static int mkdir_rdt_prepare(struct kernfs_node *parent_kn,
1086 umode_t mode) 1086 struct kernfs_node *prgrp_kn,
1087 const char *name, umode_t mode,
1088 struct rdtgroup **r)
1087{ 1089{
1088 struct rdtgroup *parent, *rdtgrp; 1090 struct rdtgroup *prdtgrp, *rdtgrp;
1089 struct kernfs_node *kn; 1091 struct kernfs_node *kn;
1090 int ret, closid; 1092 uint files = 0;
1091 1093 int ret;
1092 /* Only allow mkdir in the root directory */
1093 if (parent_kn != rdtgroup_default.kn)
1094 return -EPERM;
1095
1096 /* Do not accept '\n' to avoid unparsable situation. */
1097 if (strchr(name, '\n'))
1098 return -EINVAL;
1099 1094
1100 parent = rdtgroup_kn_lock_live(parent_kn); 1095 prdtgrp = rdtgroup_kn_lock_live(prgrp_kn);
1101 if (!parent) { 1096 if (!prdtgrp) {
1102 ret = -ENODEV; 1097 ret = -ENODEV;
1103 goto out_unlock; 1098 goto out_unlock;
1104 } 1099 }
1105 1100
1106 ret = closid_alloc();
1107 if (ret < 0)
1108 goto out_unlock;
1109 closid = ret;
1110
1111 /* allocate the rdtgroup. */ 1101 /* allocate the rdtgroup. */
1112 rdtgrp = kzalloc(sizeof(*rdtgrp), GFP_KERNEL); 1102 rdtgrp = kzalloc(sizeof(*rdtgrp), GFP_KERNEL);
1113 if (!rdtgrp) { 1103 if (!rdtgrp) {
1114 ret = -ENOSPC; 1104 ret = -ENOSPC;
1115 goto out_closid_free; 1105 goto out_unlock;
1116 } 1106 }
1117 rdtgrp->closid = closid; 1107 *r = rdtgrp;
1118 list_add(&rdtgrp->rdtgroup_list, &rdt_all_groups);
1119 1108
1120 /* kernfs creates the directory for rdtgrp */ 1109 /* kernfs creates the directory for rdtgrp */
1121 kn = kernfs_create_dir(parent->kn, name, mode, rdtgrp); 1110 kn = kernfs_create_dir(parent_kn, name, mode, rdtgrp);
1122 if (IS_ERR(kn)) { 1111 if (IS_ERR(kn)) {
1123 ret = PTR_ERR(kn); 1112 ret = PTR_ERR(kn);
1124 goto out_cancel_ref; 1113 goto out_free_rgrp;
1125 } 1114 }
1126 rdtgrp->kn = kn; 1115 rdtgrp->kn = kn;
1127 1116
@@ -1137,27 +1126,85 @@ static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
1137 if (ret) 1126 if (ret)
1138 goto out_destroy; 1127 goto out_destroy;
1139 1128
1140 ret = rdtgroup_add_files(kn, RF_CTRL_BASE); 1129 files = RFTYPE_BASE | RFTYPE_CTRL;
1130 ret = rdtgroup_add_files(kn, files);
1141 if (ret) 1131 if (ret)
1142 goto out_destroy; 1132 goto out_destroy;
1143 1133
1144 kernfs_activate(kn); 1134 kernfs_activate(kn);
1145 1135
1146 ret = 0; 1136 /*
1147 goto out_unlock; 1137 * The caller unlocks the prgrp_kn upon success.
1138 */
1139 return 0;
1148 1140
1149out_destroy: 1141out_destroy:
1150 kernfs_remove(rdtgrp->kn); 1142 kernfs_remove(rdtgrp->kn);
1151out_cancel_ref: 1143out_free_rgrp:
1152 list_del(&rdtgrp->rdtgroup_list);
1153 kfree(rdtgrp); 1144 kfree(rdtgrp);
1154out_closid_free:
1155 closid_free(closid);
1156out_unlock: 1145out_unlock:
1157 rdtgroup_kn_unlock(parent_kn); 1146 rdtgroup_kn_unlock(prgrp_kn);
1147 return ret;
1148}
1149
1150static void mkdir_rdt_prepare_clean(struct rdtgroup *rgrp)
1151{
1152 kernfs_remove(rgrp->kn);
1153 kfree(rgrp);
1154}
1155
1156/*
1157 * These are rdtgroups created under the root directory. Can be used
1158 * to allocate resources.
1159 */
1160static int rdtgroup_mkdir_ctrl(struct kernfs_node *parent_kn,
1161 struct kernfs_node *prgrp_kn,
1162 const char *name, umode_t mode)
1163{
1164 struct rdtgroup *rdtgrp;
1165 struct kernfs_node *kn;
1166 u32 closid;
1167 int ret;
1168
1169 ret = mkdir_rdt_prepare(parent_kn, prgrp_kn, name, mode, &rdtgrp);
1170 if (ret)
1171 return ret;
1172
1173 kn = rdtgrp->kn;
1174 ret = closid_alloc();
1175 if (ret < 0)
1176 goto out_common_fail;
1177 closid = ret;
1178
1179 rdtgrp->closid = closid;
1180 list_add(&rdtgrp->rdtgroup_list, &rdt_all_groups);
1181
1182 goto out_unlock;
1183
1184out_common_fail:
1185 mkdir_rdt_prepare_clean(rdtgrp);
1186out_unlock:
1187 rdtgroup_kn_unlock(prgrp_kn);
1158 return ret; 1188 return ret;
1159} 1189}
1160 1190
1191static int rdtgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
1192 umode_t mode)
1193{
1194 /* Do not accept '\n' to avoid unparsable situation. */
1195 if (strchr(name, '\n'))
1196 return -EINVAL;
1197
1198 /*
1199 * If the parent directory is the root directory and RDT
1200 * allocation is supported, add a control rdtgroup.
1201 */
1202 if (rdt_alloc_capable && parent_kn == rdtgroup_default.kn)
1203 return rdtgroup_mkdir_ctrl(parent_kn, parent_kn, name, mode);
1204
1205 return -EPERM;
1206}
1207
1161static int rdtgroup_rmdir(struct kernfs_node *kn) 1208static int rdtgroup_rmdir(struct kernfs_node *kn)
1162{ 1209{
1163 int ret, cpu, closid = rdtgroup_default.closid; 1210 int ret, cpu, closid = rdtgroup_default.closid;