mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 22:22:08 +02:00
x86/resctrl: Allow an architecture to disable pseudo lock
Pseudo-lock relies on knowledge of the micro-architecture to disable prefetchers etc. On arm64 these controls are typically secure only, meaning Linux can't access them. Arm's cache-lockdown feature works in a very different way. Resctrl's pseudo-lock isn't going to be used on arm64 platforms. Add a Kconfig symbol that can be selected by the architecture. This enables or disables building of the pseudo_lock.c file, and replaces the functions with stubs. An additional IS_ENABLED() check is needed in rdtgroup_mode_write() so that attempting to enable pseudo-lock reports an "Unknown or unsupported mode" to user-space via the last_cmd_status file. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Reviewed-by: Tony Luck <tony.luck@intel.com> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Reviewed-by: Fenghua Yu <fenghuay@nvidia.com> Reviewed-by: Babu Moger <babu.moger@amd.com> Tested-by: Carl Worth <carl@os.amperecomputing.com> # arm64 Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Tested-by: Peter Newman <peternewman@google.com> Tested-by: Amit Singh Tomar <amitsinght@marvell.com> # arm64 Tested-by: Shanker Donthineni <sdonthineni@nvidia.com> # arm64 Tested-by: Babu Moger <babu.moger@amd.com> Link: https://lore.kernel.org/r/20250311183715.16445-25-james.morse@arm.com
This commit is contained in:
parent
7d0ec14c64
commit
7028840552
|
|
@ -505,6 +505,7 @@ config X86_CPU_RESCTRL
|
|||
depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
|
||||
select KERNFS
|
||||
select PROC_CPU_RESCTRL if PROC_FS
|
||||
select RESCTRL_FS_PSEUDO_LOCK
|
||||
help
|
||||
Enable x86 CPU resource control support.
|
||||
|
||||
|
|
@ -521,6 +522,12 @@ config X86_CPU_RESCTRL
|
|||
|
||||
Say N if unsure.
|
||||
|
||||
config RESCTRL_FS_PSEUDO_LOCK
|
||||
bool
|
||||
help
|
||||
Software mechanism to pin data in a cache portion using
|
||||
micro-architecture specific knowledge.
|
||||
|
||||
config X86_FRED
|
||||
bool "Flexible Return and Event Delivery"
|
||||
depends on X86_64
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-$(CONFIG_X86_CPU_RESCTRL) += core.o rdtgroup.o monitor.o
|
||||
obj-$(CONFIG_X86_CPU_RESCTRL) += ctrlmondata.o pseudo_lock.o
|
||||
obj-$(CONFIG_X86_CPU_RESCTRL) += core.o rdtgroup.o monitor.o
|
||||
obj-$(CONFIG_X86_CPU_RESCTRL) += ctrlmondata.o
|
||||
obj-$(CONFIG_RESCTRL_FS_PSEUDO_LOCK) += pseudo_lock.o
|
||||
CFLAGS_pseudo_lock.o = -I$(src)
|
||||
|
|
|
|||
|
|
@ -512,14 +512,6 @@ unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct rdt_ctrl_domain
|
|||
unsigned long cbm);
|
||||
enum rdtgrp_mode rdtgroup_mode_by_closid(int closid);
|
||||
int rdtgroup_tasks_assigned(struct rdtgroup *r);
|
||||
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
|
||||
int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
|
||||
bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm);
|
||||
bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d);
|
||||
int rdt_pseudo_lock_init(void);
|
||||
void rdt_pseudo_lock_release(void);
|
||||
int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
|
||||
void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
|
||||
struct rdt_ctrl_domain *get_ctrl_domain_from_cpu(int cpu, struct rdt_resource *r);
|
||||
struct rdt_mon_domain *get_mon_domain_from_cpu(int cpu, struct rdt_resource *r);
|
||||
int closids_supported(void);
|
||||
|
|
@ -551,4 +543,45 @@ void resctrl_file_fflags_init(const char *config, unsigned long fflags);
|
|||
void rdt_staged_configs_clear(void);
|
||||
bool closid_allocated(unsigned int closid);
|
||||
int resctrl_find_cleanest_closid(void);
|
||||
|
||||
#ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
|
||||
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
|
||||
int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
|
||||
bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm);
|
||||
bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d);
|
||||
int rdt_pseudo_lock_init(void);
|
||||
void rdt_pseudo_lock_release(void);
|
||||
int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
|
||||
void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
|
||||
#else
|
||||
static inline int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int rdt_pseudo_lock_init(void) { return 0; }
|
||||
static inline void rdt_pseudo_lock_release(void) { }
|
||||
static inline int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp) { }
|
||||
#endif /* CONFIG_RESCTRL_FS_PSEUDO_LOCK */
|
||||
|
||||
#endif /* _ASM_X86_RESCTRL_INTERNAL_H */
|
||||
|
|
|
|||
|
|
@ -1453,7 +1453,8 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
|
|||
goto out;
|
||||
}
|
||||
rdtgrp->mode = RDT_MODE_EXCLUSIVE;
|
||||
} else if (!strcmp(buf, "pseudo-locksetup")) {
|
||||
} else if (IS_ENABLED(CONFIG_RESCTRL_FS_PSEUDO_LOCK) &&
|
||||
!strcmp(buf, "pseudo-locksetup")) {
|
||||
ret = rdtgroup_locksetup_enter(rdtgrp);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user