lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <b8bec531-125b-065f-9160-1df03cc25a9e@oracle.com>
Date:   Thu, 25 Oct 2018 10:07:58 -0400
From:   Steven Sistare <steven.sistare@...cle.com>
To:     Valentin Schneider <valentin.schneider@....com>, mingo@...hat.com,
        peterz@...radead.org
Cc:     subhra.mazumdar@...cle.com, dhaval.giani@...cle.com,
        rohit.k.jain@...cle.com, daniel.m.jordan@...cle.com,
        pavel.tatashin@...rosoft.com, matt@...eblueprint.co.uk,
        umgwanakikbuti@...il.com, riel@...hat.com, jbacik@...com,
        juri.lelli@...hat.com, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 08/10] sched/fair: Steal work from an overloaded CPU when
 CPU goes idle

On 10/25/2018 9:48 AM, Valentin Schneider wrote:
> Hi Steve,
> 
> On 22/10/2018 15:59, Steve Sistare wrote:
> [...]
>> +/*
>> + * 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 */
>> +
>> [...]
>> +
>> +	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")

Absolutely, will fix in next version.  Thanks for the careful review.

- Steve

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ