mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 14:12:07 +02:00
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
This commit is contained in:
parent
2997d94b5d
commit
c45c06d4ae
|
|
@ -2305,6 +2305,26 @@ static struct rdtgroup *kernfs_to_rdtgroup(struct kernfs_node *kn)
|
|||
}
|
||||
}
|
||||
|
||||
static void rdtgroup_kn_get(struct rdtgroup *rdtgrp, struct kernfs_node *kn)
|
||||
{
|
||||
atomic_inc(&rdtgrp->waitcount);
|
||||
kernfs_break_active_protection(kn);
|
||||
}
|
||||
|
||||
static void rdtgroup_kn_put(struct rdtgroup *rdtgrp, struct kernfs_node *kn)
|
||||
{
|
||||
if (atomic_dec_and_test(&rdtgrp->waitcount) &&
|
||||
(rdtgrp->flags & RDT_DELETED)) {
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
|
||||
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
|
||||
rdtgroup_pseudo_lock_remove(rdtgrp);
|
||||
kernfs_unbreak_active_protection(kn);
|
||||
rdtgroup_remove(rdtgrp);
|
||||
} else {
|
||||
kernfs_unbreak_active_protection(kn);
|
||||
}
|
||||
}
|
||||
|
||||
struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn)
|
||||
{
|
||||
struct rdtgroup *rdtgrp = kernfs_to_rdtgroup(kn);
|
||||
|
|
@ -2312,8 +2332,7 @@ struct rdtgroup *rdtgroup_kn_lock_live(struct kernfs_node *kn)
|
|||
if (!rdtgrp)
|
||||
return NULL;
|
||||
|
||||
atomic_inc(&rdtgrp->waitcount);
|
||||
kernfs_break_active_protection(kn);
|
||||
rdtgroup_kn_get(rdtgrp, kn);
|
||||
|
||||
mutex_lock(&rdtgroup_mutex);
|
||||
|
||||
|
|
@ -2332,17 +2351,7 @@ void rdtgroup_kn_unlock(struct kernfs_node *kn)
|
|||
return;
|
||||
|
||||
mutex_unlock(&rdtgroup_mutex);
|
||||
|
||||
if (atomic_dec_and_test(&rdtgrp->waitcount) &&
|
||||
(rdtgrp->flags & RDT_DELETED)) {
|
||||
if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
|
||||
rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED)
|
||||
rdtgroup_pseudo_lock_remove(rdtgrp);
|
||||
kernfs_unbreak_active_protection(kn);
|
||||
rdtgroup_remove(rdtgrp);
|
||||
} else {
|
||||
kernfs_unbreak_active_protection(kn);
|
||||
}
|
||||
rdtgroup_kn_put(rdtgrp, kn);
|
||||
}
|
||||
|
||||
static int mkdir_mondata_all(struct kernfs_node *parent_kn,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user