All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <frederic@kernel.org>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Chris Friesen <chris.friesen@windriver.com>,
	linux-kernel@vger.kernel.org, Christoph Lameter <cl@linux.com>,
	Jim Somerville <Jim.Somerville@windriver.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Peter Zijlstra <peterz@infradead.org>
Subject: Re: [PATCH v2] isolcpus: affine kernel threads to specified cpumask
Date: Wed, 25 Mar 2020 01:30:00 +0100	[thread overview]
Message-ID: <20200325002956.GC20223@lenoir> (raw)
In-Reply-To: <20200324152016.GA25422@fuller.cnet>

On Tue, Mar 24, 2020 at 12:20:16PM -0300, Marcelo Tosatti wrote:
> 
> This is a kernel enhancement to configure the cpu affinity of kernel
> threads via kernel boot option isolcpus=no_kthreads,<isolcpus_params>,<cpulist>
> 
> When this option is specified, the cpumask is immediately applied upon
> thread launch. This does not affect kernel threads that specify cpu
> and node.
> 
> This allows CPU isolation (that is not allowing certain threads
> to execute on certain CPUs) without using the isolcpus=domain parameter,
> making it possible to enable load balancing on such CPUs
> during runtime (see
> 
> Note-1: this is based off on Wind River's patch at
> https://github.com/starlingx-staging/stx-integ/blob/master/kernel/kernel-std/centos/patches/affine-compute-kernel-threads.patch
> 
> Difference being that this patch is limited to modifying
> kernel thread cpumask: Behaviour of other threads can
> be controlled via cgroups or sched_setaffinity.
> 
> Note-2: MontaVista's patch was based off Christoph Lameter's patch at
> https://lwn.net/Articles/565932/ with the only difference being
> the kernel parameter changed from kthread to kthread_cpus.
> 
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

I'm wondering, why do you need such a boot shift at all when you
can actually affine kthreads on runtime?

> 
> ---
> 
> v2: use isolcpus= subcommand (Thomas Gleixner)
> 
>  Documentation/admin-guide/kernel-parameters.txt |    8 ++++++++
>  include/linux/cpumask.h                         |    5 +++++
>  include/linux/sched/isolation.h                 |    1 +
>  init/main.c                                     |    1 +
>  kernel/cpu.c                                    |   13 +++++++++++++
>  kernel/kthread.c                                |    4 ++--
>  kernel/sched/isolation.c                        |    6 ++++++
>  7 files changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
> index c07815d230bc..7318e3057383 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -1959,6 +1959,14 @@
>  			  the CPU affinity syscalls or cpuset.
>  			  <cpu number> begins at 0 and the maximum value is
>  			  "number of CPUs in system - 1".
> +			  When using cpusets, use the isolcpus option no_kthreads
> +			  to avoid creation of kernel threads on isolated CPUs.
> +
> +			no_kthreads
> +			  Adjust the CPU affinity mask of unbound kernel threads to
> +			  not contain CPUs on the isolated list. This complements
> +			  the isolation provided by the cpusets mechanism described
> +			  above.

Actually that should be "kthread" instead of no_kthreads. A flag of isolcpus
describes what we want a set of CPUs to be isolated from. Well, at least that's
how we started with "domain" and "managed_irq".

>  
>  			managed_irq
>  
> diff --git a/include/linux/sched/isolation.h b/include/linux/sched/isolation.h
> index 0fbcbacd1b29..d002332d00eb 100644
> --- a/include/linux/sched/isolation.h
> +++ b/include/linux/sched/isolation.h
> @@ -14,6 +14,7 @@ enum hk_flags {
>  	HK_FLAG_DOMAIN		= (1 << 5),
>  	HK_FLAG_WQ		= (1 << 6),
>  	HK_FLAG_MANAGED_IRQ	= (1 << 7),
> +	HK_FLAG_NO_KTHREADS	= (1 << 8),

Similarly that should be HK_FLAG_KTHREAD.

>  };
>  
>  #ifdef CONFIG_CPU_ISOLATION
> diff --git a/kernel/kthread.c b/kernel/kthread.c
> index b262f47046ca..be9c8d53a986 100644
> --- a/kernel/kthread.c
> +++ b/kernel/kthread.c
> @@ -347,7 +347,7 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data),
>  		 * The kernel thread should not inherit these properties.
>  		 */
>  		sched_setscheduler_nocheck(task, SCHED_NORMAL, &param);
> -		set_cpus_allowed_ptr(task, cpu_all_mask);
> +		set_cpus_allowed_ptr(task, cpu_kthread_mask);

I'm wondering, why are we using cpu_all_mask and not cpu_possible_mask here?
If we used the latter, you wouldn't need to create cpu_kthread_mask and
you could directly rely on housekeeping_cpumask(HK_FLAG_KTHREAD).

> diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c
> index 008d6ac2342b..e9d48729efd4 100644
> --- a/kernel/sched/isolation.c
> +++ b/kernel/sched/isolation.c
> @@ -169,6 +169,12 @@ static int __init housekeeping_isolcpus_setup(char *str)
>  			continue;
>  		}
>  
> +		if (!strncmp(str, "no_kthreads,", 12)) {
> +			str += 12;
> +			flags |= HK_FLAG_NO_KTHREADS;

You will certainly want HK_FLAG_WQ as well since workqueue has its own
way to deal with unbound affinity.

> +			continue;
> +		}
> +
>  		pr_warn("isolcpus: Error, unknown flag\n");
>  		return 0;
>  	}
> 

Thanks.

  parent reply	other threads:[~2020-03-25  0:30 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-23 13:54 [PATCH] affine kernel threads to specified cpumask Marcelo Tosatti
2020-03-23 15:29 ` Chris Friesen
2020-03-24 15:07   ` Marcelo Tosatti
2020-03-23 16:22 ` Thomas Gleixner
2020-03-23 17:02   ` Chris Friesen
2020-03-23 20:31     ` Thomas Gleixner
2020-03-24 11:38       ` Marcelo Tosatti
2020-03-24 15:20       ` [PATCH v2] isolcpus: " Marcelo Tosatti
2020-03-24 15:56         ` Chris Friesen
2020-03-24 16:50           ` Marcelo Tosatti
2020-03-25  0:30         ` Frederic Weisbecker [this message]
2020-03-25 11:47           ` Marcelo Tosatti
2020-03-26 16:20             ` Frederic Weisbecker
2020-03-26 16:52               ` Frederic Weisbecker
2020-03-27 12:07               ` Marcelo Tosatti
2020-03-25 18:05         ` David Laight
2020-03-26 11:28           ` Marcelo Tosatti
2020-03-26 16:22           ` Frederic Weisbecker
2020-03-26 16:32             ` Chris Friesen
2020-03-26 16:51               ` Frederic Weisbecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200325002956.GC20223@lenoir \
    --to=frederic@kernel.org \
    --cc=Jim.Somerville@windriver.com \
    --cc=akpm@linux-foundation.org \
    --cc=chris.friesen@windriver.com \
    --cc=cl@linux.com \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.