Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp4304253imm; Wed, 30 May 2018 03:09:04 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKyk/dVX7jg6iXA7k0mEJ1J3SAOQXbqeEToxi78jHTFujFJs34S7FLKKczGREmiHvUMAUmF X-Received: by 2002:a62:1656:: with SMTP id 83-v6mr2153660pfw.61.1527674944621; Wed, 30 May 2018 03:09:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527674944; cv=none; d=google.com; s=arc-20160816; b=GPV3jl+fIP5D2AOpdCkNlF2aFs/hX2lrQHyWN7L6jjwebklpmlXtWL/S/lvpZ1V+F8 YwKmT9TcxIc3RY4CdQAg1dhHfAHQr9QTAnPlA60j1H3KChrz4RdfAWjd7lH0o4aY+pmO h+0/heXx0YhjToR8+BXvGbzgK5D/IQW3ptBveqVonOcwuAbbidti6DEnLm9PsBQRyqPx GlDDDY9AxLct4VipbpqNTkQYYA3tR9RTRBzergOpXR77V8qSuHl6NqonJ9RBnivRkAnZ kQCmVclKF4GhZBDPF7sie0pwnM6m7DWXheLirO2bx35jVQ8DGGbbg7sCSQsgyr7HdFPl lN+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=LM95K7gJdwyyza4wjldqJqtdmECqHTfsePoWXnP7qGg=; b=jJ69pBHyYJOr0pgp/gTWdzOZkxskAIAKbHKd7UPoM+2hykXe468ootn/7Q86PDEns2 +YcW/6/LxNHNQElWKXndp0nFocnuXEnyMw36ZeQBHjikrV3NiytWUZ4X1MOyUXq0dRpq DszHCiytZ7aSW+s1/avQLAmy3YQvH+H/QWBgznBGpIbYJxrFH32mfryvBl67sCulgOkE 6YrvBgu9CV9z02aw4BgbDAJqd7+O1dmjxPvm3/WbxpnIMSDYhVQH97+BdW1M9TQhw4ik DxuJ2AVEneJ8RcnGgC4nCMd886zf38+Wzvvv0SCD0IF+GBPn42vQTGvdwGBjkYWlMyTf /ngQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BvDoZIU4; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g130-v6si33991903pfc.366.2018.05.30.03.08.50; Wed, 30 May 2018 03:09:04 -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=@linaro.org header.s=google header.b=BvDoZIU4; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751827AbeE3KG7 (ORCPT + 99 others); Wed, 30 May 2018 06:06:59 -0400 Received: from mail-it0-f66.google.com ([209.85.214.66]:37470 "EHLO mail-it0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750869AbeE3KG6 (ORCPT ); Wed, 30 May 2018 06:06:58 -0400 Received: by mail-it0-f66.google.com with SMTP id l6-v6so9314123iti.2 for ; Wed, 30 May 2018 03:06:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=LM95K7gJdwyyza4wjldqJqtdmECqHTfsePoWXnP7qGg=; b=BvDoZIU4SoWlO2XGG0M42FG4uAYw89V32O0XqMduXlk6znGhRm1zSV/dGIZHMlhNY/ 54hliCqDs9ff0eDooQHht67sG9V523oWVlTnCi5Jx3Q8HZKTyPWZMqR8UdzesgrxIL8F cqwc30wxM/xm9r7DjVi1BVd7kVxK5Eu/PCwok= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=LM95K7gJdwyyza4wjldqJqtdmECqHTfsePoWXnP7qGg=; b=HGbLbKIb0Qyw5MFTkMiuyoaPb5nsNi9GxG8T7G6fYtfRkmB99ho1DruFRgNadTPCuD fAXMOkEOdNnsi9zTgz10bCOqZhqzn+qxgyl6WC7vA6o35AZeJ9vyJQD18A4xAd5LziCc R0Oc6fycMWuHRBHTGUc8IeAPW6vcqySTuiOdyECtmMmF4KQkHuYjhmb0JSKGPykv51mN BTeM4Md0t+wp1yltFU11CtFEF7fOqUjuV/zsJE7S4l5ypB10CJWcr2WZaL3qkkmQcNxJ b0lEmF6FDGpTjiJH2w5l70ucemoNvTr6k3x8rs5IkLNj9EkeoFvrta2iuDUvR52vYcbA Q38Q== X-Gm-Message-State: APt69E0K2U6Xc58Yz78gC7DGTAazZyGDiGH/YAg9KSYYxyedwYxLMyak 4NOyCChNsohStCbhmSiwjjNhKlv/TB4V2MA4x12Rpw== X-Received: by 2002:a24:4089:: with SMTP id n131-v6mr924364ita.8.1527674817820; Wed, 30 May 2018 03:06:57 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a6b:4cc:0:0:0:0:0 with HTTP; Wed, 30 May 2018 03:06:37 -0700 (PDT) In-Reply-To: <20180530093203.GG30654@e110439-lin> References: <1527253951-22709-1-git-send-email-vincent.guittot@linaro.org> <1527253951-22709-3-git-send-email-vincent.guittot@linaro.org> <20180525155437.GE30654@e110439-lin> <20180530093203.GG30654@e110439-lin> From: Vincent Guittot Date: Wed, 30 May 2018 12:06:37 +0200 Message-ID: Subject: Re: [PATCH v5 02/10] sched/rt: add rt_rq utilization tracking To: Patrick Bellasi Cc: Peter Zijlstra , Ingo Molnar , linux-kernel , "Rafael J. Wysocki" , Juri Lelli , Dietmar Eggemann , Morten Rasmussen , viresh kumar , Valentin Schneider , Quentin Perret Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 30 May 2018 at 11:32, Patrick Bellasi wrote: > On 29-May 15:29, Vincent Guittot wrote: >> Hi Patrick, >> >> +static inline bool rt_rq_has_blocked(struct rq *rq) >> >> +{ >> >> + if (rq->avg_rt.util_avg) >> > >> > Should use READ_ONCE? >> >> I was expecting that there will be only one read by default but I can >> add READ_ONCE > > I would say here it's required mainly for "documentation" purposes, > since we can use this function from non rq-locked paths, e.g. > > update_sg_lb_stats() > update_nohz_stats() > update_blocked_averages() > rt_rq_has_blocked() > > Thus, AFAIU, we should use READ_ONCE to "flag" that the value can > potentially be updated concurrently? yes > >> > >> >> + return true; >> >> + >> >> + return false; >> > >> > What about just: >> > >> > return READ_ONCE(rq->avg_rt.util_avg); >> > >> > ? >> >> This function is renamed and extended with others tracking in the >> following patches so we have to test several values in the function. >> That's also why there is the if test because additional if test are >> going to be added > > Right, makes sense. > > [...] > >> >> diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c >> >> index ef3c4e6..b4148a9 100644 >> >> --- a/kernel/sched/rt.c >> >> +++ b/kernel/sched/rt.c >> >> @@ -5,6 +5,8 @@ >> >> */ >> >> #include "sched.h" >> >> >> >> +#include "pelt.h" >> >> + >> >> int sched_rr_timeslice = RR_TIMESLICE; >> >> int sysctl_sched_rr_timeslice = (MSEC_PER_SEC / HZ) * RR_TIMESLICE; >> >> >> >> @@ -1572,6 +1574,9 @@ pick_next_task_rt(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) >> >> >> >> rt_queue_push_tasks(rq); >> >> >> >> + update_rt_rq_load_avg(rq_clock_task(rq), rq, >> >> + rq->curr->sched_class == &rt_sched_class); >> >> + >> >> return p; >> >> } >> >> >> >> @@ -1579,6 +1584,8 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p) >> >> { >> >> update_curr_rt(rq); >> >> >> >> + update_rt_rq_load_avg(rq_clock_task(rq), rq, 1); >> >> + >> >> /* >> >> * The previous task needs to be made eligible for pushing >> >> * if it is still active >> >> @@ -2308,6 +2315,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued) >> >> struct sched_rt_entity *rt_se = &p->rt; >> >> >> >> update_curr_rt(rq); >> >> + update_rt_rq_load_avg(rq_clock_task(rq), rq, 1); >> > >> > Mmm... not entirely sure... can't we fold >> > update_rt_rq_load_avg() into update_curr_rt() ? >> > >> > Currently update_curr_rt() is used in: >> > dequeue_task_rt >> > pick_next_task_rt >> > put_prev_task_rt >> > task_tick_rt >> > >> > while we update_rt_rq_load_avg() only in: >> > pick_next_task_rt >> > put_prev_task_rt >> > task_tick_rt >> > and >> > update_blocked_averages >> > >> > Why we don't we need to update at dequeue_task_rt() time ? >> >> We are tracking rt rq and not sched entities so we want to know when >> sched rt will be the running or not sched class on the rq. Tracking >> dequeue_task_rt is useless > > What about (push) migrations? it doesn't make any difference. put_prev_task_rt() says that the prev task that was running, was a rt task so we can account past time at rt running time and pick_next_task_rt says that the next one will be a rt task so we have to account elapse time either to rt or not rt time according. I can probably optimize the pick_next_task_rt by doing the below instead: if (rq->curr->sched_class == &rt_sched_class) update_rt_rq_load_avg(rq_clock_task(rq), rq, 0); If prev task is a rt task, put_prev_task_rt has already done the update > > -- > #include > > Patrick Bellasi