Skip to content

Commit c45c06d

Browse files
Peter Newmanbp3tk0v
authored andcommitted
x86/resctrl: Factor rdtgroup lock for multi-file ops
rdtgroup_kn_lock_live() can only release a kernfs reference for a single file before waiting on the rdtgroup_mutex, limiting its usefulness for operations on multiple files, such as rename. Factor the work needed to respectively break and unbreak active protection on an individual file into rdtgroup_kn_{get,put}(). No functional change. Signed-off-by: Peter Newman <peternewman@google.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Tested-by: Babu Moger <babu.moger@amd.com> Link: https://lore.kernel.org/r/20230419125015.693566-2-peternewman@google.com
1 parent 2997d94 commit c45c06d

1 file changed

Lines changed: 22 additions & 13 deletions

File tree

arch/x86/kernel/cpu/resctrl/rdtgroup.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2305,15 +2305,34 @@ static struct rdtgroup *kernfs_to_rdtgroup(struct kernfs_node *kn)
23052305
}
23062306
}
23072307

2308+
static void rdtgroup_kn_get(struct rdtgroup *rdtgrp, struct kernfs_node *kn)
2309+
{
2310+
atomic_inc(&rdtgrp->waitcount);
2311+
kernfs_break_active_protection(kn);
2312+
}
2313+
2314+
static void rdtgroup_kn_put(struct rdtgroup *rdtgrp, struct kernfs_node *kn)
2315+
{
2316+
if (atomic_dec_and_test(&rdtgrp->waitcount) &&
2317+
(rdtgrp->flags & RDT_DELETED)) {
2318+
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
2319+
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
2320+
rdtgroup_pseudo_lock_remove(rdtgrp);
2321+
kernfs_unbreak_active_protection(kn);
2322+
rdtgroup_remove(rdtgrp);
2323+
} else {
2324+
kernfs_unbreak_active_protection(kn);
2325+
}
2326+
}
2327+
23082328
struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn)
23092329
{
23102330
struct rdtgroup *rdtgrp = kernfs_to_rdtgroup(kn);
23112331

23122332
if (!rdtgrp)
23132333
return NULL;
23142334

2315-
atomic_inc(&rdtgrp->waitcount);
2316-
kernfs_break_active_protection(kn);
2335+
rdtgroup_kn_get(rdtgrp, kn);
23172336

23182337
mutex_lock(&rdtgroup_mutex);
23192338

@@ -2332,17 +2351,7 @@ void rdtgroup_kn_unlock(struct kernfs_node *kn)
23322351
return;
23332352

23342353
mutex_unlock(&rdtgroup_mutex);
2335-
2336-
if (atomic_dec_and_test(&rdtgrp->waitcount) &&
2337-
(rdtgrp->flags & RDT_DELETED)) {
2338-
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
2339-
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
2340-
rdtgroup_pseudo_lock_remove(rdtgrp);
2341-
kernfs_unbreak_active_protection(kn);
2342-
rdtgroup_remove(rdtgrp);
2343-
} else {
2344-
kernfs_unbreak_active_protection(kn);
2345-
}
2354+
rdtgroup_kn_put(rdtgrp, kn);
23462355
}
23472356

23482357
static int mkdir_mondata_all(struct kernfs_node *parent_kn,

0 commit comments

Comments
 (0)