lkml.org 
[lkml]   [2022]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFCv2 10/10] x86: Expose thread features status in /proc/$PID/arch_status
    Date
    Add two lines in /proc/$PID/arch_status to report enabled and locked
    features.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    arch/x86/kernel/Makefile | 2 ++
    arch/x86/kernel/fpu/xstate.c | 47 ---------------------------
    arch/x86/kernel/proc.c | 63 ++++++++++++++++++++++++++++++++++++
    3 files changed, 65 insertions(+), 47 deletions(-)
    create mode 100644 arch/x86/kernel/proc.c

    diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
    index c41ef42adbe8..19dae7a4201b 100644
    --- a/arch/x86/kernel/Makefile
    +++ b/arch/x86/kernel/Makefile
    @@ -149,6 +149,8 @@ obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o

    obj-$(CONFIG_AMD_MEM_ENCRYPT) += sev.o

    +obj-$(CONFIG_PROC_FS) += proc.o
    +
    ###
    # 64 bit specific files
    ifeq ($(CONFIG_X86_64),y)
    diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
    index 39e1c8626ab9..789a7a1429df 100644
    --- a/arch/x86/kernel/fpu/xstate.c
    +++ b/arch/x86/kernel/fpu/xstate.c
    @@ -10,8 +10,6 @@
    #include <linux/mman.h>
    #include <linux/nospec.h>
    #include <linux/pkeys.h>
    -#include <linux/seq_file.h>
    -#include <linux/proc_fs.h>
    #include <linux/vmalloc.h>

    #include <asm/fpu/api.h>
    @@ -1730,48 +1728,3 @@ long fpu_xstate_prctl(struct task_struct *tsk, int option, unsigned long arg2)
    return -EINVAL;
    }
    }
    -
    -#ifdef CONFIG_PROC_PID_ARCH_STATUS
    -/*
    - * Report the amount of time elapsed in millisecond since last AVX512
    - * use in the task.
    - */
    -static void avx512_status(struct seq_file *m, struct task_struct *task)
    -{
    - unsigned long timestamp = READ_ONCE(task->thread.fpu.avx512_timestamp);
    - long delta;
    -
    - if (!timestamp) {
    - /*
    - * Report -1 if no AVX512 usage
    - */
    - delta = -1;
    - } else {
    - delta = (long)(jiffies - timestamp);
    - /*
    - * Cap to LONG_MAX if time difference > LONG_MAX
    - */
    - if (delta < 0)
    - delta = LONG_MAX;
    - delta = jiffies_to_msecs(delta);
    - }
    -
    - seq_put_decimal_ll(m, "AVX512_elapsed_ms:\t", delta);
    - seq_putc(m, '\n');
    -}
    -
    -/*
    - * Report architecture specific information
    - */
    -int proc_pid_arch_status(struct seq_file *m, struct pid_namespace *ns,
    - struct pid *pid, struct task_struct *task)
    -{
    - /*
    - * Report AVX512 state if the processor and build option supported.
    - */
    - if (cpu_feature_enabled(X86_FEATURE_AVX512F))
    - avx512_status(m, task);
    -
    - return 0;
    -}
    -#endif /* CONFIG_PROC_PID_ARCH_STATUS */
    diff --git a/arch/x86/kernel/proc.c b/arch/x86/kernel/proc.c
    new file mode 100644
    index 000000000000..7b2f39031d8a
    --- /dev/null
    +++ b/arch/x86/kernel/proc.c
    @@ -0,0 +1,63 @@
    +// SPDX-License-Identifier: GPL-2.0-only
    +#include <linux/seq_file.h>
    +#include <linux/proc_fs.h>
    +#include <uapi/asm/prctl.h>
    +
    +/*
    + * Report the amount of time elapsed in millisecond since last AVX512
    + * use in the task.
    + */
    +static void avx512_status(struct seq_file *m, struct task_struct *task)
    +{
    + unsigned long timestamp = READ_ONCE(task->thread.fpu.avx512_timestamp);
    + long delta;
    +
    + if (!timestamp) {
    + /*
    + * Report -1 if no AVX512 usage
    + */
    + delta = -1;
    + } else {
    + delta = (long)(jiffies - timestamp);
    + /*
    + * Cap to LONG_MAX if time difference > LONG_MAX
    + */
    + if (delta < 0)
    + delta = LONG_MAX;
    + delta = jiffies_to_msecs(delta);
    + }
    +
    + seq_put_decimal_ll(m, "AVX512_elapsed_ms:\t", delta);
    + seq_putc(m, '\n');
    +}
    +
    +static void dump_features(struct seq_file *m, unsigned long features)
    +{
    + if (features & X86_THREAD_LAM_U48)
    + seq_puts(m, "lam_u48 ");
    + if (features & X86_THREAD_LAM_U57)
    + seq_puts(m, "lam_u57 ");
    +}
    +
    +/*
    + * Report architecture specific information
    + */
    +int proc_pid_arch_status(struct seq_file *m, struct pid_namespace *ns,
    + struct pid *pid, struct task_struct *task)
    +{
    + /*
    + * Report AVX512 state if the processor and build option supported.
    + */
    + if (cpu_feature_enabled(X86_FEATURE_AVX512F))
    + avx512_status(m, task);
    +
    + seq_puts(m, "Thread_features:\t");
    + dump_features(m, task->thread.features);
    + seq_putc(m, '\n');
    +
    + seq_puts(m, "Thread_features_locked:\t");
    + dump_features(m, task->thread.features_locked);
    + seq_putc(m, '\n');
    +
    + return 0;
    +}
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-05-11 04:32    [W:6.481 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site