From mboxrd@z Thu Jan 1 00:00:00 1970 From: Raghavendra K T Subject: Re: [PATCH V3 RFC 1/2] sched: Bail out of yield_to when source and target runqueue has one task Date: Wed, 19 Dec 2012 11:05:45 +0530 Message-ID: <50D15231.2060602@linux.vnet.ibm.com> References: <20121126120740.2595.33651.sendpatchset@codeblue> <20121126120754.2595.37316.sendpatchset@codeblue> <20121214002944.GB17513@amt.cnet> <50CB487C.5000209@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Peter Zijlstra , "H. Peter Anvin" , Gleb Natapov , Avi Kivity , Rik van Riel , Srikar , "Nikunj A. Dadhania" , KVM , Jiannan Ouyang , Chegu Vinod , "Andrew M. Theurer" , LKML , Srivatsa Vaddagiri , Andrew Jones To: Marcelo Tosatti , Ingo Molnar , Ingo Molnar Return-path: Received: from e23smtp08.au.ibm.com ([202.81.31.141]:35977 "EHLO e23smtp08.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751114Ab2LSFhj (ORCPT ); Wed, 19 Dec 2012 00:37:39 -0500 Received: from /spool/local by e23smtp08.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 19 Dec 2012 15:36:20 +1000 In-Reply-To: <50CB487C.5000209@linux.vnet.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: [I forgot to do TO to Ingo last time] Ingo, Could you please take this into x86 tree. This is Acked-by: Andrew Jones Tested-by: Chegu Vinod Marcelo, do you want to add your Acked-by/Reviewed-by? On 12/14/2012 09:10 PM, Raghavendra K T wrote: > Hi Ingo, > > Could you please take this into x86 tree? > > Thanks, > On 12/14/2012 05:59 AM, Marcelo Tosatti wrote: >> Raghavendra, >> >> Please get this integrate through x86 tree (Ingo CC'ed). >> >> On Mon, Nov 26, 2012 at 05:37:54PM +0530, Raghavendra K T wrote: >>> From: Peter Zijlstra >>> >>> In case of undercomitted scenarios, especially in large guests >>> yield_to overhead is significantly high. when run queue length of >>> source and target is one, take an opportunity to bail out and return >>> -ESRCH. This return condition can be further exploited to quickly come >>> out of PLE handler. >>> >>> (History: Raghavendra initially worked on break out of kvm ple >>> handler upon >>> seeing source runqueue length = 1, but it had to export rq length). >>> Peter came up with the elegant idea of return -ESRCH in scheduler >>> core. >>> >>> Signed-off-by: Peter Zijlstra >>> Raghavendra, Checking the rq length of target vcpu condition >>> added.(thanks Avi) >>> Reviewed-by: Srikar Dronamraju >>> Signed-off-by: Raghavendra K T >>> --- >>> >>> kernel/sched/core.c | 25 +++++++++++++++++++------ >>> 1 file changed, 19 insertions(+), 6 deletions(-) >>> >>> diff --git a/kernel/sched/core.c b/kernel/sched/core.c >>> index 2d8927f..fc219a5 100644 >>> --- a/kernel/sched/core.c >>> +++ b/kernel/sched/core.c >>> @@ -4289,7 +4289,10 @@ EXPORT_SYMBOL(yield); >>> * It's the caller's job to ensure that the target task struct >>> * can't go away on us before we can do any checks. >>> * >>> - * Returns true if we indeed boosted the target task. >>> + * Returns: >>> + * true (>0) if we indeed boosted the target task. >>> + * false (0) if we failed to boost the target. >>> + * -ESRCH if there's no task to yield to. >>> */ >>> bool __sched yield_to(struct task_struct *p, bool preempt) >>> { >>> @@ -4303,6 +4306,15 @@ bool __sched yield_to(struct task_struct *p, >>> bool preempt) >>> >>> again: >>> p_rq = task_rq(p); >>> + /* >>> + * If we're the only runnable task on the rq and target rq also >>> + * has only one task, there's absolutely no point in yielding. >>> + */ >>> + if (rq->nr_running == 1 && p_rq->nr_running == 1) { >>> + yielded = -ESRCH; >>> + goto out_irq; >>> + } >>> + >>> double_rq_lock(rq, p_rq); >>> while (task_rq(p) != p_rq) { >>> double_rq_unlock(rq, p_rq); >>> @@ -4310,13 +4322,13 @@ again: >>> } >>> >>> if (!curr->sched_class->yield_to_task) >>> - goto out; >>> + goto out_unlock; >>> >>> if (curr->sched_class != p->sched_class) >>> - goto out; >>> + goto out_unlock; >>> >>> if (task_running(p_rq, p) || p->state) >>> - goto out; >>> + goto out_unlock; >>> >>> yielded = curr->sched_class->yield_to_task(rq, p, preempt); >>> if (yielded) { >>> @@ -4329,11 +4341,12 @@ again: >>> resched_task(p_rq->curr); >>> } >>> >>> -out: >>> +out_unlock: >>> double_rq_unlock(rq, p_rq); >>> +out_irq: >>> local_irq_restore(flags); >>> >>> - if (yielded) >>> + if (yielded > 0) >>> schedule(); >>> >>> return yielded; >>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe kvm" in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> >> >