All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] specific do_timer_cpu value for nohz off mode
@ 2011-11-08 19:11 Dimitri Sivanich
  2011-11-23  0:08 ` Andrew Morton
                   ` (2 more replies)
  0 siblings, 3 replies; 35+ messages in thread
From: Dimitri Sivanich @ 2011-11-08 19:11 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner

Resending this.


Allow manual override of the tick_do_timer_cpu.

While not necessarily harmful, doing jiffies updates on an application cpu
does cause some extra overhead that HPC benchmarking people notice.  They
prefer to have OS activity isolated to certain cpus.  They like reproducibility
of results, and having jiffies updates bouncing around introduces variability.

Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
---
 kernel/time/tick-sched.c |   98 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 98 insertions(+)

Index: linux/kernel/time/tick-sched.c
===================================================================
--- linux.orig/kernel/time/tick-sched.c
+++ linux/kernel/time/tick-sched.c
@@ -834,6 +834,104 @@ void tick_cancel_sched_timer(int cpu)
 }
 #endif
 
+
+#ifdef CONFIG_SYSFS
+/**
+ * sysfs_show_do_timer_cpu - sysfs interface for tick_do_timer_cpu
+ * @dev:        unused
+ * @buf:        char buffer where value of tick_do_timer_cpu is copied
+ *
+ * Provides sysfs interface for showing the current tick_do_timer_cpu.
+ */
+static ssize_t
+sysfs_show_do_timer_cpu(struct sys_device *dev,
+				struct sysdev_attribute *attr, char *buf)
+{
+	ssize_t count = 0;
+
+	count = snprintf(buf, PAGE_SIZE, "%d\n", tick_do_timer_cpu);
+
+	return count;
+}
+
+/**
+ * sysfs_override_do_timer_cpu - manually override tick_do_timer_cpu
+ * @dev:        unused
+ * @buf:        cpu number of desired tick_do_timer_cpu
+ * @count:      length of buffer
+ *
+ * Takes input from sysfs interface for manually overriding the selected
+ * tick_do_timer_cpu.  Only applicable when not running in nohz mode.
+ */
+static ssize_t
+sysfs_override_do_timer_cpu(struct sys_device *dev,
+					struct sysdev_attribute *attr,
+					const char *buf, size_t count)
+{
+	char b[16];
+	size_t ret = count;
+	int c;
+
+#ifdef CONFIG_NO_HZ
+	/* nohz mode not supported */
+	if (tick_nohz_enabled)
+		return -EINVAL;
+#endif
+	/* strings from sysfs write are not 0 terminated! */
+	if (count >= sizeof(b))
+		return -EINVAL;
+
+	/* strip off \n: */
+	if (buf[count-1] == '\n')
+		count--;
+	if (count < 1)
+		return -EINVAL;
+
+	memcpy(b, buf, count);
+	b[count] = 0;
+
+	if (sscanf(b, "%d", &c) != 1)
+		return -EINVAL;
+
+	if (!cpu_online(c))
+		return -EINVAL;
+
+	tick_do_timer_cpu = c;
+
+	return ret;
+}
+
+/*
+ * Sysfs setup bits:
+ */
+static SYSDEV_ATTR(jiffies_cpu, 0644, sysfs_show_do_timer_cpu,
+		   sysfs_override_do_timer_cpu);
+
+static struct sysdev_class timekeeping_sysclass = {
+	.name = "timekeeping",
+};
+
+static struct sys_device device_timekeeping = {
+	.id     = 0,
+	.cls    = &timekeeping_sysclass,
+};
+
+static int __init init_timekeeping_sysfs(void)
+{
+	int error = sysdev_class_register(&timekeeping_sysclass);
+
+	if (!error)
+		error = sysdev_register(&device_timekeeping);
+	if (!error)
+		error = sysdev_create_file(
+				&device_timekeeping,
+				&attr_jiffies_cpu);
+	return error;
+}
+
+device_initcall(init_timekeeping_sysfs);
+#endif /* SYSFS */
+
 /**
  * Async notification about clocksource changes
  */

^ permalink raw reply	[flat|nested] 35+ messages in thread
* [PATCH] specific do_timer_cpu value for nohz off mode
@ 2011-08-17 16:07 Dimitri Sivanich
  2011-08-17 16:47 ` Thomas Gleixner
  0 siblings, 1 reply; 35+ messages in thread
From: Dimitri Sivanich @ 2011-08-17 16:07 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Ingo Molnar

Reposting this, as this was posted 2 weeks ago with no replies.

Jiffies updates are currently done by the tick_do_timer_cpu.  This has a
non-deterministic value that can be any running cpu on the system.  It
changes dynamically in nohz mode.  When nohz mode is off, it gets set to
a more static, but still non-deterministic value.

While the nohz behavior is necessary, is there a reason why the nohz off
case can't have a specific value, say 0 as it was on earlier kernels?
If the cpu is offlined, let the value change at that time (note that the
x86 arch disallows offlining cpu 0).

There are certain cases where this would be advantageous, especially where
timely jiffies updates may not necessarily occur on specific processors.

The following sample patch presents one way that this could be done.
Processors wait for the selected cpu to enter high resolution mode before
they do so.

Note that this patch is not hotplug aware (however, should the
tick_static_do_timer_cpu be offlined, the tick_do_timer_cpu simply becomes
another cpu anyway).

Comments on this idea, or the sample patch?

Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
---
 Documentation/kernel-parameters.txt |    8 +++++
 kernel/time/tick-sched.c            |   46 ++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

Index: linux/kernel/time/tick-sched.c
===================================================================
--- linux.orig/kernel/time/tick-sched.c
+++ linux/kernel/time/tick-sched.c
@@ -30,11 +30,54 @@
  */
 static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);
 
+DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
+
 /*
  * The time, when the last jiffy update happened. Protected by xtime_lock.
  */
 static ktime_t last_jiffies_update;
 
+/*
+ * Static tick_do_timer_cpu
+ */
+static int tick_static_do_timer_cpu __read_mostly = -1;
+
+/*
+ * Set tick_do_timer_cpu to a static cpu.
+ *
+ * Supported on systems w/nohz=off only.
+ * Selected cpu can be offlined.  If this is done, another cpu will be chosen,
+ * but will not revert back if selected cpu is onlined again.
+ */
+static int __init setup_static_do_timer_cpu(char *s)
+{
+	if (kstrtoint(s, 0, &tick_static_do_timer_cpu) < 0) {
+		printk(KERN_WARNING "Invalid tick_static_do_timer_cpu specified\n");
+		return 0;
+	}
+	printk(KERN_INFO "Set tick_static_do_timer_cpu %d\n",
+		tick_static_do_timer_cpu);
+
+	return 1;
+}
+__setup("do_timer_cpu=", setup_static_do_timer_cpu);
+
+/*
+ * Check to see if we need to wait for the selected static do_timer_cpu
+ * to enter high res mode first.
+ */
+static int wait_for_static_do_timer_cpu(void)
+{
+	if (tick_static_do_timer_cpu == -1)
+		return 0;
+
+	if (smp_processor_id() != tick_static_do_timer_cpu &&
+	    !*per_cpu_ptr(&hrtimer_bases.hres_active, tick_static_do_timer_cpu))
+		return 1;
+
+	return 0;
+}
+
 struct tick_sched *tick_get_tick_sched(int cpu)
 {
 	return &per_cpu(tick_cpu_sched, cpu);
@@ -848,6 +891,9 @@ int tick_check_oneshot_change(int allow_
 {
 	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
 
+	if (!allow_nohz && !tick_nohz_enabled && wait_for_static_do_timer_cpu())
+		return 0;
+
 	if (!test_and_clear_bit(0, &ts->check_clocks))
 		return 0;
 
Index: linux/Documentation/kernel-parameters.txt
===================================================================
--- linux.orig/Documentation/kernel-parameters.txt
+++ linux/Documentation/kernel-parameters.txt
@@ -665,6 +665,14 @@ bytes respectively. Such letter suffixes
 			The filter can be disabled or changed to another
 			driver later using sysfs.
 
+	do_timer_cpu=<cpu number>
+			This selects the cpu to process jiffies updates
+			when nohz mode is disabled.
+			Works only with high resolution mode enabled.
+			The selected cpu can be offlined.  If this is done,
+			another cpu will be chosen, but will not revert back
+			if the selected cpu is onlined again.
+
 	dscc4.setup=	[NET]
 
 	earlycon=	[KNL] Output early console device and options.

^ permalink raw reply	[flat|nested] 35+ messages in thread
* [PATCH] specific do_timer_cpu value for nohz off mode
@ 2011-08-03 19:57 Dimitri Sivanich
  0 siblings, 0 replies; 35+ messages in thread
From: Dimitri Sivanich @ 2011-08-03 19:57 UTC (permalink / raw)
  To: linux-kernel; +Cc: Thomas Gleixner, Ingo Molnar

Jiffies updates are currently done by the tick_do_timer_cpu.  This has a
non-deterministic value that can be any running cpu on the system.  It
changes dynamically in nohz mode.  When nohz mode is off, it gets set to
a more static, but still non-deterministic value.

While the nohz behavior is necessary, is there a reason why the nohz off
case can't have a specific value, say 0 as it was on earlier kernels?
If the cpu is offlined, let the value change at that time (note that the
x86 arch disallows offlining cpu 0).

There are certain cases where this would be advantageous, especially where
timely jiffies updates may not necessarily occur on specific processors.

The following sample patch presents one way that this could be done.
Processors wait for the selected cpu to enter high resolution mode before
they do so.

Note that this patch is not hotplug aware (however, should the
tick_static_do_timer_cpu be offlined, the tick_do_timer_cpu simply becomes
another cpu anyway).

Comments on this idea, or the sample patch?

Signed-off-by: Dimitri Sivanich <sivanich@sgi.com>
---
 Documentation/kernel-parameters.txt |    8 +++++
 kernel/time/tick-sched.c            |   46 ++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

Index: linux/kernel/time/tick-sched.c
===================================================================
--- linux.orig/kernel/time/tick-sched.c
+++ linux/kernel/time/tick-sched.c
@@ -30,11 +30,54 @@
  */
 static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);
 
+DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
+
 /*
  * The time, when the last jiffy update happened. Protected by xtime_lock.
  */
 static ktime_t last_jiffies_update;
 
+/*
+ * Static tick_do_timer_cpu
+ */
+static int tick_static_do_timer_cpu __read_mostly = -1;
+
+/*
+ * Set tick_do_timer_cpu to a static cpu.
+ *
+ * Supported on systems w/nohz=off only.
+ * Selected cpu can be offlined.  If this is done, another cpu will be chosen,
+ * but will not revert back if selected cpu is onlined again.
+ */
+static int __init setup_static_do_timer_cpu(char *s)
+{
+	if (kstrtoint(s, 0, &tick_static_do_timer_cpu) < 0) {
+		printk(KERN_WARNING "Invalid tick_static_do_timer_cpu specified\n");
+		return 0;
+	}
+	printk(KERN_INFO "Set tick_static_do_timer_cpu %d\n",
+		tick_static_do_timer_cpu);
+
+	return 1;
+}
+__setup("do_timer_cpu=", setup_static_do_timer_cpu);
+
+/*
+ * Check to see if we need to wait for the selected static do_timer_cpu
+ * to enter high res mode first.
+ */
+static int wait_for_static_do_timer_cpu(void)
+{
+	if (tick_static_do_timer_cpu == -1)
+		return 0;
+
+	if (smp_processor_id() != tick_static_do_timer_cpu &&
+	    !*per_cpu_ptr(&hrtimer_bases.hres_active, tick_static_do_timer_cpu))
+		return 1;
+
+	return 0;
+}
+
 struct tick_sched *tick_get_tick_sched(int cpu)
 {
 	return &per_cpu(tick_cpu_sched, cpu);
@@ -848,6 +891,9 @@ int tick_check_oneshot_change(int allow_
 {
 	struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
 
+	if (!allow_nohz && !tick_nohz_enabled && wait_for_static_do_timer_cpu())
+		return 0;
+
 	if (!test_and_clear_bit(0, &ts->check_clocks))
 		return 0;
 
Index: linux/Documentation/kernel-parameters.txt
===================================================================
--- linux.orig/Documentation/kernel-parameters.txt
+++ linux/Documentation/kernel-parameters.txt
@@ -665,6 +665,14 @@ bytes respectively. Such letter suffixes
 			The filter can be disabled or changed to another
 			driver later using sysfs.
 
+	do_timer_cpu=<cpu number>
+			This selects the cpu to process jiffies updates
+			when nohz mode is disabled.
+			Works only with high resolution mode enabled.
+			The selected cpu can be offlined.  If this is done,
+			another cpu will be chosen, but will not revert back
+			if the selected cpu is onlined again.
+
 	dscc4.setup=	[NET]
 
 	earlycon=	[KNL] Output early console device and options.


^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2013-03-19 17:03 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-08 19:11 [PATCH] specific do_timer_cpu value for nohz off mode Dimitri Sivanich
2011-11-23  0:08 ` Andrew Morton
2011-11-30 15:29   ` Dimitri Sivanich
2011-12-01  0:11     ` Andrew Morton
2011-12-01  0:16       ` Andrew Morton
2011-12-01  2:07         ` Dimitri Sivanich
2011-12-01  2:13           ` Andrew Morton
2011-12-01 16:37             ` Dimitri Sivanich
2011-12-01 22:56               ` Andrew Morton
2011-12-02 20:14                 ` Dimitri Sivanich
2011-12-02 20:22                   ` Dimitri Sivanich
2011-12-02 22:42                   ` Thomas Gleixner
2011-12-01  2:06       ` Dimitri Sivanich
2011-12-01  2:12         ` Andrew Morton
2011-12-01  2:34           ` Dimitri Sivanich
2011-12-01  2:38             ` Andrew Morton
2012-01-15 13:46 ` Mike Galbraith
2012-01-15 14:04   ` Mike Galbraith
2012-01-15 14:23   ` Mike Galbraith
2012-01-25 11:27   ` Mike Galbraith
2012-02-15 14:16 ` Thomas Gleixner
2012-02-15 14:37   ` Dimitri Sivanich
2012-02-15 14:52     ` Thomas Gleixner
2012-02-15 15:34       ` Dimitri Sivanich
2012-02-15 20:36         ` Thomas Gleixner
2012-02-16 14:59           ` Dimitri Sivanich
2013-03-19 17:03             ` [PATCH][RFC] " Jiri Bohac
  -- strict thread matches above, loose matches on Subject: below --
2011-08-17 16:07 [PATCH] " Dimitri Sivanich
2011-08-17 16:47 ` Thomas Gleixner
2011-08-23 19:56   ` Dimitri Sivanich
2011-09-02  8:19     ` Thomas Gleixner
2011-09-02 19:29       ` Dimitri Sivanich
2011-09-02 19:57         ` Thomas Gleixner
2011-09-02 20:39           ` Dimitri Sivanich
2011-08-03 19:57 Dimitri Sivanich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.