linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Valentin Schneider <valentin.schneider@arm.com>
To: Steve Sistare <steven.sistare@oracle.com>,
	mingo@redhat.com, peterz@infradead.org
Cc: subhra.mazumdar@oracle.com, dhaval.giani@oracle.com,
	rohit.k.jain@oracle.com, daniel.m.jordan@oracle.com,
	pavel.tatashin@microsoft.com, matt@codeblueprint.co.uk,
	umgwanakikbuti@gmail.com, riel@redhat.com, jbacik@fb.com,
	juri.lelli@redhat.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 08/10] sched/fair: Steal work from an overloaded CPU when CPU goes idle
Date: Thu, 25 Oct 2018 14:48:00 +0100	[thread overview]
Message-ID: <223bfcdb-bb0c-b25e-04dc-26226a7c3ab3@arm.com> (raw)
In-Reply-To: <1540220381-424433-9-git-send-email-steven.sistare@oracle.com>

Hi Steve,

On 22/10/2018 15:59, Steve Sistare wrote:
[...]
> @@ -9683,6 +9698,141 @@ void trigger_load_balance(struct rq *rq)
>  	nohz_balancer_kick(rq);
>  }
>  
> +/*
> + * Search the runnable tasks in @cfs_rq in order of next to run, and find
> + * the first one that can be migrated to @dst_rq.  @cfs_rq is locked on entry.
> + * On success, dequeue the task from @cfs_rq and return it, else return NULL.
> + */
> +static struct task_struct *
> +detach_next_task(struct cfs_rq *cfs_rq, struct rq *dst_rq)
> +{
> +	int dst_cpu = dst_rq->cpu;
> +	struct task_struct *p;
> +	struct rq *rq = rq_of(cfs_rq);
> +
> +	lockdep_assert_held(&rq_of(cfs_rq)->lock);
> +
> +	list_for_each_entry_reverse(p, &rq->cfs_tasks, se.group_node) {
> +		if (can_migrate_task_llc(p, rq, dst_rq)) {
> +			detach_task(p, rq, dst_cpu);
> +			return p;
> +		}
> +	}
> +	return NULL;
> +}
> +
> +/*
> + * Attempt to migrate a CFS task from @src_cpu to @dst_rq.  @locked indicates
> + * whether @dst_rq is already locked on entry.  This function may lock or
> + * unlock @dst_rq, and updates @locked to indicate the locked state on return.
> + * The locking protocol is based on idle_balance().
> + * Returns 1 on success and 0 on failure.
> + */
> +static int steal_from(struct rq *dst_rq, struct rq_flags *dst_rf, bool *locked,
> +		      int src_cpu)
> +{
> +	struct task_struct *p;
> +	struct rq_flags rf;
> +	int stolen = 0;
> +	int dst_cpu = dst_rq->cpu;
> +	struct rq *src_rq = cpu_rq(src_cpu);
> +
> +	if (dst_cpu == src_cpu || src_rq->cfs.h_nr_running < 2)
> +		return 0;
> +
> +	if (*locked) {
> +		rq_unpin_lock(dst_rq, dst_rf);
> +		raw_spin_unlock(&dst_rq->lock);
> +		*locked = false;
> +	}
> +	rq_lock_irqsave(src_rq, &rf);
> +	update_rq_clock(src_rq);
> +
> +	if (src_rq->cfs.h_nr_running < 2 || !cpu_active(src_cpu))
> +		p = NULL;
> +	else
> +		p = detach_next_task(&src_rq->cfs, dst_rq);
> +
> +	rq_unlock(src_rq, &rf);
> +
> +	if (p) {
> +		raw_spin_lock(&dst_rq->lock);
> +		rq_repin_lock(dst_rq, dst_rf);
> +		*locked = true;
> +		update_rq_clock(dst_rq);
> +		attach_task(dst_rq, p);
> +		stolen = 1;
> +	}
> +	local_irq_restore(rf.flags);
> +
> +	return stolen;
> +}
> +
> +/*
> + * Try to steal a runnable CFS task from a CPU in the same LLC as @dst_rq,
> + * and migrate it to @dst_rq.  rq_lock is held on entry and return, but
> + * may be dropped in between.  Return 1 on success, 0 on failure, and -1
> + * if a task in a different scheduling class has become runnable on @dst_rq.
> + */
> +static int try_steal(struct rq *dst_rq, struct rq_flags *dst_rf)
> +{
> +	int src_cpu;
> +	int dst_cpu = dst_rq->cpu;
> +	bool locked = true;
> +	int stolen = 0;
> +	struct sparsemask *overload_cpus;
> +
> +	if (!sched_feat(STEAL))
> +		return 0;
> +
> +	if (!cpu_active(dst_cpu))
> +		return 0;
> +
> +	/* Get bitmap of overloaded CPUs in the same LLC as @dst_rq */
> +
> +	rcu_read_lock();
> +	overload_cpus = rcu_dereference(dst_rq->cfs_overload_cpus);
> +	if (!overload_cpus) {
> +		rcu_read_unlock();
> +		return 0;
> +	}
> +
> +#ifdef CONFIG_SCHED_SMT
> +	/*
> +	 * First try overloaded CPUs on the same core to preserve cache warmth.
> +	 */
> +	if (static_branch_likely(&sched_smt_present)) {
> +		for_each_cpu(src_cpu, cpu_smt_mask(dst_cpu)) {
> +			if (sparsemask_test_elem(src_cpu, overload_cpus) &&
> +			    steal_from(dst_rq, dst_rf, &locked, src_cpu)) {
> +				stolen = 1;
> +				goto out;
> +			}
> +		}
> +	}
> +#endif	/* CONFIG_SCHED_SMT */
> +
> +	/* Accept any suitable task in the LLC */
> +
> +	for_each_sparse_wrap(src_cpu, overload_cpus, dst_cpu) {
> +		if (steal_from(dst_rq, dst_rf, &locked, src_cpu)) {
> +			stolen = 1;
> +			break;
			^^^^^^
You might want to have a 'goto out' there for consistency and to make GCC
happy for !CONFIG_SCHED_SMT (I get a "warning: label ‘out’ defined but not
used")

[...]

  reply	other threads:[~2018-10-25 13:48 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-22 14:59 [PATCH 00/10] steal tasks to improve CPU utilization Steve Sistare
2018-10-22 14:59 ` [PATCH 01/10] sched: Provide sparsemask, a reduced contention bitmap Steve Sistare
2018-10-22 14:59 ` [PATCH 02/10] sched/topology: Provide hooks to allocate data shared per LLC Steve Sistare
2018-10-22 14:59 ` [PATCH 03/10] sched/topology: Provide cfs_overload_cpus bitmap Steve Sistare
2018-10-22 14:59 ` [PATCH 04/10] sched/fair: Dynamically update cfs_overload_cpus Steve Sistare
2018-10-22 16:56   ` Peter Zijlstra
2018-10-22 18:43     ` Steven Sistare
2018-10-22 14:59 ` [PATCH 05/10] sched/fair: Hoist idle_stamp up from idle_balance Steve Sistare
2018-10-25 13:47   ` Valentin Schneider
2018-10-25 14:04     ` Steven Sistare
2018-10-22 14:59 ` [PATCH 06/10] sched/fair: Generalize the detach_task interface Steve Sistare
2018-10-22 14:59 ` [PATCH 07/10] sched/fair: Provide can_migrate_task_llc Steve Sistare
2018-10-26 18:04   ` Valentin Schneider
2018-10-26 18:28     ` Steven Sistare
2018-10-29 19:34       ` Valentin Schneider
2018-10-31 15:43         ` Steven Sistare
2018-10-31 18:48           ` Valentin Schneider
2018-10-31 19:14         ` Peter Zijlstra
2018-11-01 11:16           ` Valentin Schneider
2018-10-22 14:59 ` [PATCH 08/10] sched/fair: Steal work from an overloaded CPU when CPU goes idle Steve Sistare
2018-10-25 13:48   ` Valentin Schneider [this message]
2018-10-25 14:07     ` Steven Sistare
2018-10-22 14:59 ` [PATCH 09/10] sched/fair: disable stealing if too many NUMA nodes Steve Sistare
2018-10-22 17:06   ` Peter Zijlstra
2018-10-22 18:47     ` Steven Sistare
2018-10-22 19:21       ` Steven Sistare
2018-10-22 22:05         ` Peter Zijlstra
2018-10-23 13:18   ` Steven Sistare
2018-10-22 14:59 ` [PATCH 10/10] sched/fair: Provide idle search schedstats Steve Sistare
2018-10-22 17:04 ` [PATCH 00/10] steal tasks to improve CPU utilization Peter Zijlstra
2018-10-22 19:07   ` Steven Sistare
2018-10-22 22:09     ` Peter Zijlstra
2018-10-24 15:34     ` Valentin Schneider
2018-10-24 19:27       ` Steven Sistare
2018-10-25 11:31         ` Valentin Schneider
2018-10-25 12:21           ` Steven Sistare
2018-10-25  7:50 ` Vincent Guittot
2018-10-25 11:28   ` Steven Sistare
2018-10-25 12:43     ` Vincent Guittot
2018-10-25 14:19       ` Steven Sistare
2018-10-31 19:35 ` Steven Sistare
2018-11-01 11:56 ` Steven Sistare
2018-11-02 23:39 ` Subhra Mazumdar
2018-11-05 20:08   ` Steven Sistare
2019-01-04 13:37 ` Shijith Thotton

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=223bfcdb-bb0c-b25e-04dc-26226a7c3ab3@arm.com \
    --to=valentin.schneider@arm.com \
    --cc=daniel.m.jordan@oracle.com \
    --cc=dhaval.giani@oracle.com \
    --cc=jbacik@fb.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matt@codeblueprint.co.uk \
    --cc=mingo@redhat.com \
    --cc=pavel.tatashin@microsoft.com \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=rohit.k.jain@oracle.com \
    --cc=steven.sistare@oracle.com \
    --cc=subhra.mazumdar@oracle.com \
    --cc=umgwanakikbuti@gmail.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).