Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp491716imm; Mon, 21 May 2018 09:15:24 -0700 (PDT) X-Google-Smtp-Source: AB8JxZq549uLEVQ/OZFCg/RsJ7HoPfUCgR2Gt4+trf5bWckYl9R5WuttCXEYFVKVAeHs6tQFPVTz X-Received: by 2002:a65:4cc7:: with SMTP id n7-v6mr16520456pgt.354.1526919324641; Mon, 21 May 2018 09:15:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526919324; cv=none; d=google.com; s=arc-20160816; b=StAzO8SFHxT7y6v74oXQoM2fRjhkHtnbSMex/fq7xFlLiYFq1jtgTtcoL3Y1/iwLG4 qxEpotYLeamvwKaDW2ehpKW2nbB+PKpjzvtlpLnVgatiSey/KM3QkDt5fbDZswJwdf+x TX9r0XS9fUWI1ebBMXJJZrXUxbqGXanMkTrxFp/Xp0/kR9C6GElLgopRtgGm6taj/8xa YjhMTB5/21pE8+4kwChdajIZuAouPaSTHVj2K5RH/li2Mmi+nIZUPW+PG79ujd0h+Spt TxPOczFMQvsedgBvAscrzVB+IQzXanhQ7cpQzhjHnxKZY3FRoyyIEq1ivUFjfsbbo68b l23g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=lAHEj+6wQX5lcbFk2oFGQV11ohdOI6D4faYZ57HhDBE=; b=01ULJWFAfNF4FPD4f84S+KmFbzOU00P6SuZcc/K8RYc3rAkE+KOJnKYjZkJ51AfWN3 MGNqxxVatKDxr4mArCjyCu4Z7/Ov/qpkDtFknOgoTfFILdutjNJYAINclTNeUHe0pUTo 3E+DLBJajSm5wqlsNkI2TKOkT50DThPVtZP8rX5d+0CDg7zJJmaJiGEFhl/qa9vlj4Uw ZT/bRRxFruNHuh8hlDKzzBhx3oUS0V7ttAu93VvwvEQsGdnpz1MGkBQ2OwLqQwWC9lsh xUPoHBfJ5/5ehOcgfCog1HjedFluglXH4HXrBpiRPaH2oxZDNbbqDDmqcdaq7UrGBHdC vr0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=Oxjelb8n; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r2-v6si11288970pgd.517.2018.05.21.09.15.09; Mon, 21 May 2018 09:15:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=Oxjelb8n; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753045AbeEUQNw (ORCPT + 99 others); Mon, 21 May 2018 12:13:52 -0400 Received: from mail-pl0-f68.google.com ([209.85.160.68]:35865 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752879AbeEUQNs (ORCPT ); Mon, 21 May 2018 12:13:48 -0400 Received: by mail-pl0-f68.google.com with SMTP id v24-v6so9085312plo.3 for ; Mon, 21 May 2018 09:13:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=lAHEj+6wQX5lcbFk2oFGQV11ohdOI6D4faYZ57HhDBE=; b=Oxjelb8n0bihfx3vbByRBHnz7THJk3gEs9JiQgW4B63WaXEfyZQ32WvJDR+ppafEh7 Ydc32wVNYWX6wdJLjDZvuhRIIb1ZXQ9M+wD2P6V/3RphH5x9R+mhe4dzYvvCRwioequi SEVqYL9zvCzXqARfA+7MAaZrRTLKPMOHwMoPo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=lAHEj+6wQX5lcbFk2oFGQV11ohdOI6D4faYZ57HhDBE=; b=kqa/2hBvxOOOKUhD1+vHfwil1QoZqAyuxWvEbcy/wpYicjS4oxAQOfep1SVmdWpIm3 o+7uaqJrWT3ruQQ9hVGwPsrndJzDx4rOj6heRCEuFq1EgCIaVPBWYL0tXJ4h7sWGjaDs +Pq9qp4sb/DS1p1EE/mPEcuPXcb8pUr7eKKfZPt81n2M9YOKiFdLNRqED1/vwSzy40IA DRlWepsyd5fju8ncRc2rUoHB9Tgj98Iffw6IqMUesO4Sa4IQBk3daq29p03ejSxEeoRD ouOrM0c+1Uel+6F/adfAwtRhlvx8C6piv6TJgdX3N5mtvBBgO4ukeu4QTNCzJVe4ajMt z6FA== X-Gm-Message-State: ALKqPwc/riPDPbX+doS5S0PPHRKMzlCidiCD5Ch6yDPfp/H6PMpt89GK tQeEyHYKMHEBh0Z7Tdt6E5/FVg== X-Received: by 2002:a17:902:a717:: with SMTP id w23-v6mr20904794plq.130.1526919228067; Mon, 21 May 2018 09:13:48 -0700 (PDT) Received: from localhost ([2620:0:1000:1600:3122:ea9c:d178:eb]) by smtp.gmail.com with ESMTPSA id k64-v6sm22555408pgk.17.2018.05.21.09.13.47 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 21 May 2018 09:13:47 -0700 (PDT) Date: Mon, 21 May 2018 09:13:46 -0700 From: Joel Fernandes To: "Rafael J. Wysocki" Cc: Viresh Kumar , "Joel Fernandes (Google.)" , Linux Kernel Mailing List , "Rafael J . Wysocki" , Peter Zijlstra , Ingo Molnar , Patrick Bellasi , Juri Lelli , Luca Abeni , Todd Kjos , Claudio Scordino , kernel-team@android.com, Linux PM Subject: Re: [PATCH v2] schedutil: Allow cpufreq requests to be made even when kthread kicked Message-ID: <20180521161346.GB14065@joelaf.mtv.corp.google.com> References: <20180518185501.173552-1-joel@joelfernandes.org> <20180521051424.mljwmisvrvi6yyc4@vireshk-i7> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 21, 2018 at 10:29:52AM +0200, Rafael J. Wysocki wrote: > On Mon, May 21, 2018 at 7:14 AM, Viresh Kumar wrote: > > On 18-05-18, 11:55, Joel Fernandes (Google.) wrote: > >> From: "Joel Fernandes (Google)" > >> > >> Currently there is a chance of a schedutil cpufreq update request to be > >> dropped if there is a pending update request. This pending request can > >> be delayed if there is a scheduling delay of the irq_work and the wake > >> up of the schedutil governor kthread. > >> > >> A very bad scenario is when a schedutil request was already just made, > >> such as to reduce the CPU frequency, then a newer request to increase > >> CPU frequency (even sched deadline urgent frequency increase requests) > >> can be dropped, even though the rate limits suggest that its Ok to > >> process a request. This is because of the way the work_in_progress flag > >> is used. > >> > >> This patch improves the situation by allowing new requests to happen > >> even though the old one is still being processed. Note that in this > >> approach, if an irq_work was already issued, we just update next_freq > >> and don't bother to queue another request so there's no extra work being > >> done to make this happen. > > > > Now that this isn't an RFC anymore, you shouldn't have added below > > paragraph here. It could go to the comments section though. > > > >> I had brought up this issue at the OSPM conference and Claudio had a > >> discussion RFC with an alternate approach [1]. I prefer the approach as > >> done in the patch below since it doesn't need any new flags and doesn't > >> cause any other extra overhead. > >> > >> [1] https://patchwork.kernel.org/patch/10384261/ > >> > >> LGTMed-by: Viresh Kumar > >> LGTMed-by: Juri Lelli > > > > Looks like a Tag you just invented ? :) > > Yeah. > > The LGTM from Juri can be converned into an ACK silently IMO. That > said I have added Looks-good-to: tags to a couple of commits. :-) Cool, I'll covert them to Acks :-) [..] > >> v1 -> v2: Minor style related changes. > >> > >> kernel/sched/cpufreq_schedutil.c | 34 ++++++++++++++++++++++++-------- > >> 1 file changed, 26 insertions(+), 8 deletions(-) > >> > >> diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c > >> index e13df951aca7..5c482ec38610 100644 > >> --- a/kernel/sched/cpufreq_schedutil.c > >> +++ b/kernel/sched/cpufreq_schedutil.c > >> @@ -92,9 +92,6 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) > >> !cpufreq_can_do_remote_dvfs(sg_policy->policy)) > >> return false; > >> > >> - if (sg_policy->work_in_progress) > >> - return false; > >> - > >> if (unlikely(sg_policy->need_freq_update)) { > >> sg_policy->need_freq_update = false; > >> /* > >> @@ -128,7 +125,7 @@ static void sugov_update_commit(struct sugov_policy *sg_policy, u64 time, > >> > >> policy->cur = next_freq; > >> trace_cpu_frequency(next_freq, smp_processor_id()); > >> - } else { > >> + } else if (!sg_policy->work_in_progress) { > >> sg_policy->work_in_progress = true; > >> irq_work_queue(&sg_policy->irq_work); > >> } > >> @@ -291,6 +288,13 @@ static void sugov_update_single(struct update_util_data *hook, u64 time, > >> > >> ignore_dl_rate_limit(sg_cpu, sg_policy); > >> > >> + /* > >> + * For slow-switch systems, single policy requests can't run at the > >> + * moment if update is in progress, unless we acquire update_lock. > >> + */ > >> + if (sg_policy->work_in_progress) > >> + return; > >> + > > > > I would still want this to go away :) > > > > @Rafael, will it be fine to get locking in place for unshared policy > > platforms ? > > As long as it doesn't affect the fast switch path in any way. I just realized that on a single policy switch that uses the governor thread, there will be 1 thread per-CPU. The sugov_update_single will be called on the same CPU with interrupts disabled. In sugov_work, we are doing a raw_spin_lock_irqsave which also disables interrupts. So I don't think there's any possibility of a race happening on the same CPU between the frequency update request and the sugov_work executing. In other words, I feel we can drop the above if (..) statement for single policies completely and only keep the changes for the shared policy. Viresh since you brought up the single policy issue initially which made me add this if statememnt, could you let me know if you agree with what I just said? > >> if (!sugov_should_update_freq(sg_policy, time)) > >> return; > >> > >> @@ -382,13 +386,27 @@ sugov_update_shared(struct update_util_data *hook, u64 time, unsigned int flags) > >> static void sugov_work(struct kthread_work *work) > >> { > >> struct sugov_policy *sg_policy = container_of(work, struct sugov_policy, work); > >> + unsigned int freq; > >> + unsigned long flags; > >> + > >> + /* > >> + * Hold sg_policy->update_lock shortly to handle the case where: > >> + * incase sg_policy->next_freq is read here, and then updated by > >> + * sugov_update_shared just before work_in_progress is set to false > >> + * here, we may miss queueing the new update. > >> + * > >> + * Note: If a work was queued after the update_lock is released, > >> + * sugov_work will just be called again by kthread_work code; and the > >> + * request will be proceed before the sugov thread sleeps. > >> + */ > >> + raw_spin_lock_irqsave(&sg_policy->update_lock, flags); > >> + freq = sg_policy->next_freq; > >> + sg_policy->work_in_progress = false; > >> + raw_spin_unlock_irqrestore(&sg_policy->update_lock, flags); > >> > >> mutex_lock(&sg_policy->work_lock); > >> - __cpufreq_driver_target(sg_policy->policy, sg_policy->next_freq, > >> - CPUFREQ_RELATION_L); > >> + __cpufreq_driver_target(sg_policy->policy, freq, CPUFREQ_RELATION_L); > >> mutex_unlock(&sg_policy->work_lock); > >> - > >> - sg_policy->work_in_progress = false; > >> } > >> > >> static void sugov_irq_work(struct irq_work *irq_work) > > > > Fix the commit log and you can add my > > I can fix it up. > > > Acked-by: Viresh Kumar Thanks! - Joel