diff mbox series

[v3,47/47] xen/sched: add scheduling granularity enum

Message ID 20190914085251.18816-48-jgross@suse.com (mailing list archive)
State Superseded
Headers show
Series xen: add core scheduling support | expand

Commit Message

Jürgen Groß Sept. 14, 2019, 8:52 a.m. UTC
Add a scheduling granularity enum ("cpu", "core", "socket") for
specification of the scheduling granularity. Initially it is set to
"cpu", this can be modified by the new boot parameter (x86 only)
"sched-gran".

According to the selected granularity sched_granularity is set after
all cpus are online.

A test is added for all sched resources holding the same number of
cpus. Fall back to core- or cpu-scheduling in that case.

Signed-off-by: Juergen Gross <jgross@suse.com>
---
RFC V2:
- fixed freeing of sched_res when merging cpus
- rename parameter to "sched-gran" (Jan Beulich)
- rename parameter option from "thread" to "cpu" (Jan Beulich)

V1:
- rename scheduler_smp_init() to scheduler_gran_init(), let it be called
  by cpupool_init()
- avoid using literal cpu number 0 in scheduler_percpu_init() (Jan Beulich)
- style correction (Jan Beulich)
- fallback to smaller granularity instead of panic in case of
  unbalanced cpu configuration

V2:
- style changes (Jan Beulich)
- introduce CONFIG_HAS_SCHED_GRANULARITY (Jan Beulich)
---
 xen/arch/x86/Kconfig       |  1 +
 xen/common/Kconfig         |  3 ++
 xen/common/cpupool.c       |  2 ++
 xen/common/schedule.c      | 78 ++++++++++++++++++++++++++++++++++++++++++++++
 xen/include/xen/sched-if.h |  1 +
 5 files changed, 85 insertions(+)

Comments

Dario Faggioli Sept. 26, 2019, 9:46 a.m. UTC | #1
On Sat, 2019-09-14 at 10:52 +0200, Juergen Gross wrote:
> Add a scheduling granularity enum ("cpu", "core", "socket") for
> specification of the scheduling granularity. Initially it is set to
> "cpu", this can be modified by the new boot parameter (x86 only)
> "sched-gran".
> 
> According to the selected granularity sched_granularity is set after
> all cpus are online.
> 
> A test is added for all sched resources holding the same number of
> cpus. Fall back to core- or cpu-scheduling in that case.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
>
Reviewed-by: Dario Faggioli <dfaggioli@suse.com>

Regards
Jürgen Groß Sept. 26, 2019, 12:37 p.m. UTC | #2
On 26.09.19 11:46, Dario Faggioli wrote:
> On Sat, 2019-09-14 at 10:52 +0200, Juergen Gross wrote:
>> Add a scheduling granularity enum ("cpu", "core", "socket") for
>> specification of the scheduling granularity. Initially it is set to
>> "cpu", this can be modified by the new boot parameter (x86 only)
>> "sched-gran".
>>
>> According to the selected granularity sched_granularity is set after
>> all cpus are online.
>>
>> A test is added for all sched resources holding the same number of
>> cpus. Fall back to core- or cpu-scheduling in that case.
>>
>> Signed-off-by: Juergen Gross <jgross@suse.com>
>>
> Reviewed-by: Dario Faggioli <dfaggioli@suse.com>

Does this still stand with moving all code of this patch to
cpupool.c? That would avoid making some variables/functions globally
visible.


Juergen
Dario Faggioli Sept. 26, 2019, 4:21 p.m. UTC | #3
On Thu, 2019-09-26 at 14:37 +0200, Jürgen Groß wrote:
> On 26.09.19 11:46, Dario Faggioli wrote:
> > On Sat, 2019-09-14 at 10:52 +0200, Juergen Gross wrote:
> > > Add a scheduling granularity enum ("cpu", "core", "socket") for
> > > specification of the scheduling granularity. Initially it is set
> > > to
> > > "cpu", this can be modified by the new boot parameter (x86 only)
> > > "sched-gran".
> > > 
> > > According to the selected granularity sched_granularity is set
> > > after
> > > all cpus are online.
> > > 
> > > A test is added for all sched resources holding the same number
> > > of
> > > cpus. Fall back to core- or cpu-scheduling in that case.
> > > 
> > > Signed-off-by: Juergen Gross <jgross@suse.com>
> > > 
> > Reviewed-by: Dario Faggioli <dfaggioli@suse.com>
> 
> Does this still stand with moving all code of this patch to
> cpupool.c? That would avoid making some variables/functions globally
> visible.
>
Yep, I saw this being discussed during review of other patches, but
forgot to mention it here, sorry.

Yes, I'm fine with that, and I'm fine with the consequences of doing
that on this patch (i.e., moving to cpupool.c).

The Reviewed-by still holds.

Regards
diff mbox series

Patch

diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig
index 288dc6c042..3f88adae97 100644
--- a/xen/arch/x86/Kconfig
+++ b/xen/arch/x86/Kconfig
@@ -22,6 +22,7 @@  config X86
 	select HAS_PASSTHROUGH
 	select HAS_PCI
 	select HAS_PDX
+	select HAS_SCHED_GRANULARITY
 	select HAS_UBSAN
 	select HAS_VPCI if !PV_SHIM_EXCLUSIVE && HVM
 	select NEEDS_LIBELF
diff --git a/xen/common/Kconfig b/xen/common/Kconfig
index 16829f6274..e9247871a8 100644
--- a/xen/common/Kconfig
+++ b/xen/common/Kconfig
@@ -63,6 +63,9 @@  config HAS_GDBSX
 config HAS_IOPORTS
 	bool
 
+config HAS_SCHED_GRANULARITY
+	bool
+
 config NEEDS_LIBELF
 	bool
 
diff --git a/xen/common/cpupool.c b/xen/common/cpupool.c
index 7f173f5099..4226f7ded8 100644
--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -866,6 +866,8 @@  static int __init cpupool_init(void)
     unsigned int cpu;
     int err;
 
+    scheduler_gran_init();
+
     cpupool0 = cpupool_create(0, 0, &err);
     BUG_ON(cpupool0 == NULL);
     cpupool_put(cpupool0);
diff --git a/xen/common/schedule.c b/xen/common/schedule.c
index 800d2405a7..b940083a26 100644
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -34,6 +34,7 @@ 
 #include <xen/cpu.h>
 #include <xen/preempt.h>
 #include <xen/event.h>
+#include <xen/warning.h>
 #include <public/sched.h>
 #include <xsm/xsm.h>
 #include <xen/err.h>
@@ -61,6 +62,23 @@  unsigned int __read_mostly sched_granularity = 1;
 bool __read_mostly sched_disable_smt_switching;
 cpumask_var_t sched_res_mask;
 
+#ifdef CONFIG_HAS_SCHED_GRANULARITY
+static int __init sched_select_granularity(const char *str)
+{
+    if ( strcmp("cpu", str) == 0 )
+        opt_sched_granularity = SCHED_GRAN_cpu;
+    else if ( strcmp("core", str) == 0 )
+        opt_sched_granularity = SCHED_GRAN_core;
+    else if ( strcmp("socket", str) == 0 )
+        opt_sched_granularity = SCHED_GRAN_socket;
+    else
+        return -EINVAL;
+
+    return 0;
+}
+custom_param("sched-gran", sched_select_granularity);
+#endif
+
 /* Common lock for free cpus. */
 static DEFINE_SPINLOCK(sched_free_cpu_lock);
 
@@ -2617,6 +2635,66 @@  void scheduler_enable(void)
     scheduler_active = true;
 }
 
+static unsigned int __init sched_check_granularity(void)
+{
+    unsigned int cpu;
+    unsigned int siblings, gran = 0;
+
+    if ( opt_sched_granularity == SCHED_GRAN_cpu )
+        return 1;
+
+    for_each_online_cpu ( cpu )
+    {
+        siblings = cpumask_weight(sched_get_opt_cpumask(opt_sched_granularity,
+                                                        cpu));
+        if ( gran == 0 )
+            gran = siblings;
+        else if ( gran != siblings )
+            return 0;
+    }
+
+    sched_disable_smt_switching = true;
+
+    return gran;
+}
+
+/* Setup data for selected scheduler granularity. */
+void __init scheduler_gran_init(void)
+{
+    unsigned int gran = 0;
+    const char *fallback = NULL;
+
+    while ( gran == 0 )
+    {
+        gran = sched_check_granularity();
+
+        if ( gran == 0 )
+        {
+            switch ( opt_sched_granularity )
+            {
+            case SCHED_GRAN_core:
+                opt_sched_granularity = SCHED_GRAN_cpu;
+                fallback = "Asymmetric cpu configuration.\n"
+                           "Falling back to sched-gran=cpu.\n";
+                break;
+            case SCHED_GRAN_socket:
+                opt_sched_granularity = SCHED_GRAN_core;
+                fallback = "Asymmetric cpu configuration.\n"
+                           "Falling back to sched-gran=core.\n";
+                break;
+            default:
+                ASSERT_UNREACHABLE();
+                break;
+            }
+        }
+    }
+
+    if ( fallback )
+        warning_add(fallback);
+
+    sched_granularity = gran;
+}
+
 /* Initialise the data structures. */
 void __init scheduler_init(void)
 {
diff --git a/xen/include/xen/sched-if.h b/xen/include/xen/sched-if.h
index f1e8f44f62..53158fe4ea 100644
--- a/xen/include/xen/sched-if.h
+++ b/xen/include/xen/sched-if.h
@@ -626,5 +626,6 @@  affinity_balance_cpumask(const struct sched_unit *unit, int step,
 
 void sched_rm_cpu(unsigned int cpu);
 const cpumask_t *sched_get_opt_cpumask(enum sched_gran opt, unsigned int cpu);
+void scheduler_gran_init(void);
 
 #endif /* __XEN_SCHED_IF_H__ */