Skip to content

Commit 7028840

Browse files
James Morsebp3tk0v
authored andcommitted
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
1 parent 7d0ec14 commit 7028840

File tree

4 files changed

+53
-11
lines changed

4 files changed

+53
-11
lines changed

arch/x86/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,7 @@ config X86_CPU_RESCTRL
505505
depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
506506
select KERNFS
507507
select PROC_CPU_RESCTRL if PROC_FS
508+
select RESCTRL_FS_PSEUDO_LOCK
508509
help
509510
Enable x86 CPU resource control support.
510511

@@ -521,6 +522,12 @@ config X86_CPU_RESCTRL
521522

522523
Say N if unsure.
523524

525+
config RESCTRL_FS_PSEUDO_LOCK
526+
bool
527+
help
528+
Software mechanism to pin data in a cache portion using
529+
micro-architecture specific knowledge.
530+
524531
config X86_FRED
525532
bool "Flexible Return and Event Delivery"
526533
depends on X86_64

arch/x86/kernel/cpu/resctrl/Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
2-
obj-$(CONFIG_X86_CPU_RESCTRL) += core.o rdtgroup.o monitor.o
3-
obj-$(CONFIG_X86_CPU_RESCTRL) += ctrlmondata.o pseudo_lock.o
2+
obj-$(CONFIG_X86_CPU_RESCTRL) += core.o rdtgroup.o monitor.o
3+
obj-$(CONFIG_X86_CPU_RESCTRL) += ctrlmondata.o
4+
obj-$(CONFIG_RESCTRL_FS_PSEUDO_LOCK) += pseudo_lock.o
45
CFLAGS_pseudo_lock.o = -I$(src)

arch/x86/kernel/cpu/resctrl/internal.h

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -512,14 +512,6 @@ unsigned int rdtgroup_cbm_to_size(struct rdt_resource *r, struct rdt_ctrl_domain
512512
unsigned long cbm);
513513
enum rdtgrp_mode rdtgroup_mode_by_closid(int closid);
514514
int rdtgroup_tasks_assigned(struct rdtgroup *r);
515-
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
516-
int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
517-
bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm);
518-
bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d);
519-
int rdt_pseudo_lock_init(void);
520-
void rdt_pseudo_lock_release(void);
521-
int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
522-
void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
523515
struct rdt_ctrl_domain *get_ctrl_domain_from_cpu(int cpu, struct rdt_resource *r);
524516
struct rdt_mon_domain *get_mon_domain_from_cpu(int cpu, struct rdt_resource *r);
525517
int closids_supported(void);
@@ -551,4 +543,45 @@ void resctrl_file_fflags_init(const char *config, unsigned long fflags);
551543
void rdt_staged_configs_clear(void);
552544
bool closid_allocated(unsigned int closid);
553545
int resctrl_find_cleanest_closid(void);
546+
547+
#ifdef CONFIG_RESCTRL_FS_PSEUDO_LOCK
548+
int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp);
549+
int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp);
550+
bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm);
551+
bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d);
552+
int rdt_pseudo_lock_init(void);
553+
void rdt_pseudo_lock_release(void);
554+
int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp);
555+
void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp);
556+
#else
557+
static inline int rdtgroup_locksetup_enter(struct rdtgroup *rdtgrp)
558+
{
559+
return -EOPNOTSUPP;
560+
}
561+
562+
static inline int rdtgroup_locksetup_exit(struct rdtgroup *rdtgrp)
563+
{
564+
return -EOPNOTSUPP;
565+
}
566+
567+
static inline bool rdtgroup_cbm_overlaps_pseudo_locked(struct rdt_ctrl_domain *d, unsigned long cbm)
568+
{
569+
return false;
570+
}
571+
572+
static inline bool rdtgroup_pseudo_locked_in_hierarchy(struct rdt_ctrl_domain *d)
573+
{
574+
return false;
575+
}
576+
577+
static inline int rdt_pseudo_lock_init(void) { return 0; }
578+
static inline void rdt_pseudo_lock_release(void) { }
579+
static inline int rdtgroup_pseudo_lock_create(struct rdtgroup *rdtgrp)
580+
{
581+
return -EOPNOTSUPP;
582+
}
583+
584+
static inline void rdtgroup_pseudo_lock_remove(struct rdtgroup *rdtgrp) { }
585+
#endif /* CONFIG_RESCTRL_FS_PSEUDO_LOCK */
586+
554587
#endif /* _ASM_X86_RESCTRL_INTERNAL_H */

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1453,7 +1453,8 @@ static ssize_t rdtgroup_mode_write(struct kernfs_open_file *of,
14531453
goto out;
14541454
}
14551455
rdtgrp->mode = RDT_MODE_EXCLUSIVE;
1456-
} else if (!strcmp(buf, "pseudo-locksetup")) {
1456+
} else if (IS_ENABLED(CONFIG_RESCTRL_FS_PSEUDO_LOCK) &&
1457+
!strcmp(buf, "pseudo-locksetup")) {
14571458
ret = rdtgroup_locksetup_enter(rdtgrp);
14581459
if (ret)
14591460
goto out;

0 commit comments

Comments
 (0)