2023-12-15 14:04:45

by Maksim Davydov

[permalink] [raw]
Subject: [PATCH] x86/split_lock: add split lock counter

Provides per task split locks counter to monitor split locks rate
in the system. It can be helpful in split locks monitoring to get a clear
sense of which process causing split locks and how many of them have
happened by the moment. For instance, it might be used by cloud providers
who can't control guest executable code and want to make decisions based
on the rate value like ratelimiting or notifing the split lock origins.

To implement this functionality the per-task flag have been transformed
into the counter. But procfs interface is used to provide the counter
in machine-readable format.

Signed-off-by: Maksim Davydov <[email protected]>
---
arch/x86/include/asm/cpu.h | 18 ++++++++++++++++++
arch/x86/kernel/cpu/intel.c | 35 +++++++++++++++++++++++++++++++++--
fs/proc/base.c | 7 +++++++
include/linux/sched.h | 6 +++---
kernel/fork.c | 2 +-
5 files changed, 62 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
index fecc4fe1d68a..1470124e1d63 100644
--- a/arch/x86/include/asm/cpu.h
+++ b/arch/x86/include/asm/cpu.h
@@ -44,6 +44,12 @@ extern bool handle_user_split_lock(struct pt_regs *regs, long error_code);
extern bool handle_guest_split_lock(unsigned long ip);
extern void handle_bus_lock(struct pt_regs *regs);
u8 get_this_hybrid_cpu_type(void);
+extern int proc_pid_split_locks_show(struct seq_file *s,
+ struct pid_namespace *ns, struct pid *pid,
+ struct task_struct *tsk);
+extern int proc_tgid_split_locks_show(struct seq_file *s,
+ struct pid_namespace *ns, struct pid *pid,
+ struct task_struct *tsk);
#else
static inline void __init sld_setup(struct cpuinfo_x86 *c) {}
static inline bool handle_user_split_lock(struct pt_regs *regs, long error_code)
@@ -62,6 +68,18 @@ static inline u8 get_this_hybrid_cpu_type(void)
{
return 0;
}
+static inline int proc_pid_split_locks_show(struct seq_file *s,
+ struct pid_namespace *ns, struct pid *pid,
+ struct task_struct *tsk)
+{
+ return 0;
+}
+static inline int proc_tgid_split_locks_show(struct seq_file *s,
+ struct pid_namespace *ns, struct pid *pid,
+ struct task_struct *tsk)
+{
+ return 0;
+}
#endif
#ifdef CONFIG_IA32_FEAT_CTL
void init_ia32_feat_ctl(struct cpuinfo_x86 *c);
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index a927a8fc9624..20640a4b9eac 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -1160,10 +1160,10 @@ static void split_lock_warn(unsigned long ip)
struct delayed_work *work;
int cpu;

- if (!current->reported_split_lock)
+ if (!current->detected_split_locks)
pr_warn_ratelimited("#AC: %s/%d took a split_lock trap at address: 0x%lx\n",
current->comm, current->pid, ip);
- current->reported_split_lock = 1;
+ current->detected_split_locks++;

if (sysctl_sld_mitigate) {
/*
@@ -1191,6 +1191,37 @@ static void split_lock_warn(unsigned long ip)
put_cpu();
}

+static int split_locks_show(struct seq_file *s, struct task_struct *tsk,
+ int whole)
+{
+ u64 detected_split_locks = tsk->detected_split_locks;
+
+ if (whole) {
+ struct task_struct *t = tsk;
+
+ while_each_thread(tsk, t) {
+ detected_split_locks += t->detected_split_locks;
+ }
+ }
+
+ seq_put_decimal_ull(s, "", detected_split_locks);
+ seq_putc(s, '\n');
+
+ return 0;
+}
+
+int proc_pid_split_locks_show(struct seq_file *s, struct pid_namespace *ns,
+ struct pid *pid, struct task_struct *tsk)
+{
+ return split_locks_show(s, tsk, 0);
+}
+
+int proc_tgid_split_locks_show(struct seq_file *s, struct pid_namespace *ns,
+ struct pid *pid, struct task_struct *tsk)
+{
+ return split_locks_show(s, tsk, 1);
+}
+
bool handle_guest_split_lock(unsigned long ip)
{
if (sld_state == sld_warn) {
diff --git a/fs/proc/base.c b/fs/proc/base.c
index dd31e3b6bf77..3c533312dbbc 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -98,6 +98,7 @@
#include <linux/cn_proc.h>
#include <linux/ksm.h>
#include <trace/events/oom.h>
+#include <asm/cpu.h>
#include "internal.h"
#include "fd.h"

@@ -3360,6 +3361,9 @@ static const struct pid_entry tgid_base_stuff[] = {
ONE("ksm_merging_pages", S_IRUSR, proc_pid_ksm_merging_pages),
ONE("ksm_stat", S_IRUSR, proc_pid_ksm_stat),
#endif
+#ifdef CONFIG_CPU_SUP_INTEL
+ ONE("split_locks", S_IRUGO, proc_tgid_split_locks_show),
+#endif
};

static int proc_tgid_base_readdir(struct file *file, struct dir_context *ctx)
@@ -3699,6 +3703,9 @@ static const struct pid_entry tid_base_stuff[] = {
ONE("ksm_merging_pages", S_IRUSR, proc_pid_ksm_merging_pages),
ONE("ksm_stat", S_IRUSR, proc_pid_ksm_stat),
#endif
+#ifdef CONFIG_CPU_SUP_INTEL
+ ONE("split_locks", S_IRUGO, proc_pid_split_locks_show),
+#endif
};

static int proc_tid_base_readdir(struct file *file, struct dir_context *ctx)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 292c31697248..5b9cd4524405 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -957,9 +957,6 @@ struct task_struct {
#ifdef CONFIG_IOMMU_SVA
unsigned pasid_activated:1;
#endif
-#ifdef CONFIG_CPU_SUP_INTEL
- unsigned reported_split_lock:1;
-#endif
#ifdef CONFIG_TASK_DELAY_ACCT
/* delay due to memory thrashing */
unsigned in_thrashing:1;
@@ -1027,6 +1024,9 @@ struct task_struct {
u64 stimescaled;
#endif
u64 gtime;
+#ifdef CONFIG_CPU_SUP_INTEL
+ u64 detected_split_locks;
+#endif
struct prev_cputime prev_cputime;
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
struct vtime vtime;
diff --git a/kernel/fork.c b/kernel/fork.c
index 10917c3e1f03..5a0318010dd5 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1188,7 +1188,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
#endif

#ifdef CONFIG_CPU_SUP_INTEL
- tsk->reported_split_lock = 0;
+ tsk->detected_split_locks = 0;
#endif

#ifdef CONFIG_SCHED_MM_CID
--
2.34.1



2023-12-15 18:17:14

by Dave Hansen

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter

On 12/15/23 06:01, Maksim Davydov wrote:
> Provides per task split locks counter to monitor split locks rate
> in the system. It can be helpful in split locks monitoring to get a clear
> sense of which process causing split locks and how many of them have
> happened by the moment. For instance, it might be used by cloud providers
> who can't control guest executable code and want to make decisions based
> on the rate value like ratelimiting or notifing the split lock origins.

Have you considered doing this with tracing instead?

It seems a _little_ silly for everyone to pay the cost of having that
counter around.

2023-12-16 02:23:23

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter

Hi Maksim,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/x86/core]
[also build test ERROR on tip/master tip/sched/core linus/master tip/auto-latest v6.7-rc5 next-20231215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Maksim-Davydov/x86-split_lock-add-split-lock-counter/20231215-220639
base: tip/x86/core
patch link: https://lore.kernel.org/r/20231215140113.57173-1-davydov-max%40yandex-team.ru
patch subject: [PATCH] x86/split_lock: add split lock counter
config: hexagon-allnoconfig (https://download.01.org/0day-ci/archive/20231216/[email protected]/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231216/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:337:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
547 | val = __raw_readb(PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
560 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
| ^
In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:337:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
573 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
| ^
In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:337:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
584 | __raw_writeb(value, PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
594 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
604 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
>> fs/proc/base.c:101:10: fatal error: 'asm/cpu.h' file not found
101 | #include <asm/cpu.h>
| ^~~~~~~~~~~
6 warnings and 1 error generated.


vim +101 fs/proc/base.c

52
53 #include <linux/errno.h>
54 #include <linux/time.h>
55 #include <linux/proc_fs.h>
56 #include <linux/stat.h>
57 #include <linux/task_io_accounting_ops.h>
58 #include <linux/init.h>
59 #include <linux/capability.h>
60 #include <linux/file.h>
61 #include <linux/fdtable.h>
62 #include <linux/generic-radix-tree.h>
63 #include <linux/string.h>
64 #include <linux/seq_file.h>
65 #include <linux/namei.h>
66 #include <linux/mnt_namespace.h>
67 #include <linux/mm.h>
68 #include <linux/swap.h>
69 #include <linux/rcupdate.h>
70 #include <linux/kallsyms.h>
71 #include <linux/stacktrace.h>
72 #include <linux/resource.h>
73 #include <linux/module.h>
74 #include <linux/mount.h>
75 #include <linux/security.h>
76 #include <linux/ptrace.h>
77 #include <linux/printk.h>
78 #include <linux/cache.h>
79 #include <linux/cgroup.h>
80 #include <linux/cpuset.h>
81 #include <linux/audit.h>
82 #include <linux/poll.h>
83 #include <linux/nsproxy.h>
84 #include <linux/oom.h>
85 #include <linux/elf.h>
86 #include <linux/pid_namespace.h>
87 #include <linux/user_namespace.h>
88 #include <linux/fs_struct.h>
89 #include <linux/slab.h>
90 #include <linux/sched/autogroup.h>
91 #include <linux/sched/mm.h>
92 #include <linux/sched/coredump.h>
93 #include <linux/sched/debug.h>
94 #include <linux/sched/stat.h>
95 #include <linux/posix-timers.h>
96 #include <linux/time_namespace.h>
97 #include <linux/resctrl.h>
98 #include <linux/cn_proc.h>
99 #include <linux/ksm.h>
100 #include <trace/events/oom.h>
> 101 #include <asm/cpu.h>
102 #include "internal.h"
103 #include "fd.h"
104

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2023-12-16 03:30:37

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter

Hi Maksim,

kernel test robot noticed the following build warnings:

[auto build test WARNING on tip/x86/core]
[also build test WARNING on tip/master tip/sched/core linus/master tip/auto-latest v6.7-rc5 next-20231215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Maksim-Davydov/x86-split_lock-add-split-lock-counter/20231215-220639
base: tip/x86/core
patch link: https://lore.kernel.org/r/20231215140113.57173-1-davydov-max%40yandex-team.ru
patch subject: [PATCH] x86/split_lock: add split lock counter
config: um-defconfig (https://download.01.org/0day-ci/archive/20231216/[email protected]/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231216/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

In file included from fs/proc/base.c:101:
>> arch/x86/include/asm/cpu.h:36:31: warning: 'struct cpuinfo_x86' declared inside parameter list will not be visible outside of this definition or declaration
36 | int mwait_usable(const struct cpuinfo_x86 *);
| ^~~~~~~~~~~
arch/x86/include/asm/cpu.h:42:37: warning: 'struct cpuinfo_x86' declared inside parameter list will not be visible outside of this definition or declaration
42 | extern void __init sld_setup(struct cpuinfo_x86 *c);
| ^~~~~~~~~~~
arch/x86/include/asm/cpu.h:85:32: warning: 'struct cpuinfo_x86' declared inside parameter list will not be visible outside of this definition or declaration
85 | void init_ia32_feat_ctl(struct cpuinfo_x86 *c);
| ^~~~~~~~~~~


vim +36 arch/x86/include/asm/cpu.h

bb6e89df9028b2 Thomas Gleixner 2022-04-15 35
1c9d16e3591109 Borislav Petkov 2011-02-11 @36 int mwait_usable(const struct cpuinfo_x86 *);
6d652ea1d05639 Jaswinder Singh Rajput 2009-01-07 37

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2023-12-16 06:00:44

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter

Hi Maksim,

kernel test robot noticed the following build errors:

[auto build test ERROR on tip/x86/core]
[also build test ERROR on tip/master tip/sched/core linus/master tip/auto-latest v6.7-rc5 next-20231215]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Maksim-Davydov/x86-split_lock-add-split-lock-counter/20231215-220639
base: tip/x86/core
patch link: https://lore.kernel.org/r/20231215140113.57173-1-davydov-max%40yandex-team.ru
patch subject: [PATCH] x86/split_lock: add split lock counter
config: um-allmodconfig (https://download.01.org/0day-ci/archive/20231216/[email protected]/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231216/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All error/warnings (new ones prefixed by >>):

In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/um/include/asm/hardirq.h:5:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/um/include/asm/io.h:24:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
547 | val = __raw_readb(PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
560 | val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
| ^
In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/um/include/asm/hardirq.h:5:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/um/include/asm/io.h:24:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
573 | val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
| ~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
| ^
In file included from fs/proc/base.c:68:
In file included from include/linux/swap.h:9:
In file included from include/linux/memcontrol.h:13:
In file included from include/linux/cgroup.h:26:
In file included from include/linux/kernel_stat.h:9:
In file included from include/linux/interrupt.h:11:
In file included from include/linux/hardirq.h:11:
In file included from arch/um/include/asm/hardirq.h:5:
In file included from include/asm-generic/hardirq.h:17:
In file included from include/linux/irq.h:20:
In file included from include/linux/io.h:13:
In file included from arch/um/include/asm/io.h:24:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
584 | __raw_writeb(value, PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
594 | __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
604 | __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:692:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
692 | readsb(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:700:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
700 | readsw(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:708:20: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
708 | readsl(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:717:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
717 | writesb(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:726:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
726 | writesw(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
include/asm-generic/io.h:735:21: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
735 | writesl(PCI_IOBASE + addr, buffer, count);
| ~~~~~~~~~~ ^
In file included from fs/proc/base.c:101:
>> arch/x86/include/asm/cpu.h:36:31: warning: declaration of 'struct cpuinfo_x86' will not be visible outside of this function [-Wvisibility]
36 | int mwait_usable(const struct cpuinfo_x86 *);
| ^
arch/x86/include/asm/cpu.h:42:37: warning: declaration of 'struct cpuinfo_x86' will not be visible outside of this function [-Wvisibility]
42 | extern void __init sld_setup(struct cpuinfo_x86 *c);
| ^
arch/x86/include/asm/cpu.h:85:32: warning: declaration of 'struct cpuinfo_x86' will not be visible outside of this function [-Wvisibility]
85 | void init_ia32_feat_ctl(struct cpuinfo_x86 *c);
| ^
15 warnings generated.
--
/usr/bin/ld: init/main.o: warning: relocation in read-only section `.ref.text'
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
>> /usr/bin/ld: fs/proc/base.o:(.rodata+0x860): undefined reference to `proc_pid_split_locks_show'
>> /usr/bin/ld: fs/proc/base.o:(.rodata+0xe08): undefined reference to `proc_tgid_split_locks_show'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
clang: error: linker command failed with exit code 1 (use -v to see invocation)

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

2023-12-16 10:56:34

by Maksim Davydov

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter


On 12/15/23 21:16, Dave Hansen wrote:
> On 12/15/23 06:01, Maksim Davydov wrote:
>> Provides per task split locks counter to monitor split locks rate
>> in the system. It can be helpful in split locks monitoring to get a clear
>> sense of which process causing split locks and how many of them have
>> happened by the moment. For instance, it might be used by cloud providers
>> who can't control guest executable code and want to make decisions based
>> on the rate value like ratelimiting or notifing the split lock origins.
> Have you considered doing this with tracing instead?
>
> It seems a _little_ silly for everyone to pay the cost of having that
> counter around.
No, it just seemed like a good idea to make a simple machine-readable
interface based on the existing flag (reported_split_lock).
What if this interface is made together with the appropriate CONFIG flag
(default false)? Thus it won't affect those who don't need it.

--
Best regards,
Maksim Davydov


2024-01-02 15:14:21

by Dave Hansen

[permalink] [raw]
Subject: Re: [PATCH] x86/split_lock: add split lock counter

On 12/16/23 02:56, Maksim Davydov wrote:
> On 12/15/23 21:16, Dave Hansen wrote:
>> On 12/15/23 06:01, Maksim Davydov wrote:
>>> Provides per task split locks counter to monitor split locks rate
>>> in the system. It can be helpful in split locks monitoring to get a
>>> clear
>>> sense of which process causing split locks and how many of them have
>>> happened by the moment. For instance, it might be used by cloud
>>> providers
>>> who can't control guest executable code and want to make decisions based
>>> on the rate value like ratelimiting or notifing the split lock origins.
>> Have you considered doing this with tracing instead?
>>
>> It seems a _little_ silly for everyone to pay the cost of having that
>> counter around.
> No, it just seemed like a good idea to make a simple machine-readable
> interface based on the existing flag (reported_split_lock).
> What if this interface is made together with the appropriate CONFIG flag
> (default false)? Thus it won't affect those who don't need it.

Distributions (effectively) run a single kernel config. They turn on
almost everything. Using a config option would subject all distro users
to the overhead.