Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4733775pxj; Tue, 22 Jun 2021 06:57:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz11zstvgJxdIgqV8rfCS/JEreTvh0VZRYCpNBZ1/Y57rT5PHE5WlVCym6vsObjhEVcBr7T X-Received: by 2002:a05:6638:2491:: with SMTP id x17mr4177851jat.33.1624370237967; Tue, 22 Jun 2021 06:57:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624370237; cv=none; d=google.com; s=arc-20160816; b=NOkYqbBmk5wxLepd7MrIm+vbdsNTw91/rYxd1BRuMGL+f6gLPaa89kHPc/tNUtQoGw p8BrsCjarI1NXyLSZx1U3KKFU9HUo5ew8xRoPNarT1erIJgzRx5f1T5rVJ/xmJzA1zNI IE0/bBXo92sq6mbejK2iyZnh6Jf1q2p2KEPQtrKmm/89Bo6x0rI7DDnGlgM6DpaNjpik BEkP9xhn/WBLjOWWg8nCwn8dra46jnFKr47yG35GSXiPnTSIMTh7fPCybQwBz0H5b3z6 JRzezRYbvKN4nV30AStEA9iqNIgR99MNI/tuSlIxr3F6uRCaL+38S69GtTiEdJUSSAiQ sZCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=gmz5poUQaceLKV0RtAse/MGXjoRAt1CEVmrmQpXj2oM=; b=aykb+/zmnfG3/v27xJMob2GcDg6SCpZT1aUVm9+Igyhz9cWZpGIqsPsxSNXvo+MEut tZZ0bgRoAZUUDE0XcAlDW6sM35QNK0BXjxrSM3/uYFT5M5WoBYchgrG3dpuMQYF5fsC2 sLKysP8Fv37M/VMs3F+eunLgjGbHFzJdwbcDhtAwZv+A4cHSzt7hoapUWjI476WTDk/U dPGDeFjCvkTZb/UwgiMAXpg2dUR9SFQyKXHXkgr9oXqBcJbeqRC5tJWsamzskXG+w4EE A/1WVp08MRjQFteoxuE1m0qQ+444ryeGCVcWnUyBfX6j2QqQKHyU0XcnIJ+gR21Z/w0J ZMbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=fhXfJmG8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f12si8233956ilk.157.2021.06.22.06.57.05; Tue, 22 Jun 2021 06:57:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=desiato.20200630 header.b=fhXfJmG8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230257AbhFVN6r (ORCPT + 99 others); Tue, 22 Jun 2021 09:58:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37960 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229988AbhFVN6r (ORCPT ); Tue, 22 Jun 2021 09:58:47 -0400 Received: from desiato.infradead.org (desiato.infradead.org [IPv6:2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE33AC061574 for ; Tue, 22 Jun 2021 06:56:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=gmz5poUQaceLKV0RtAse/MGXjoRAt1CEVmrmQpXj2oM=; b=fhXfJmG8MFXfQ2OTjMPxf0oQAm z+1EVSBdLlMmWv01P5Zf6tfYdgLslAPNAwwR3/OZZ/RPJcC8WN5ktFp/prD551gsySogdLetE65uq Mu4Q9rRWfmVGGvOhInPZz0tf8VKC46nyS8WqjbLK//PG98LtNKX4wMsr8vLUwLC227uwi6eBzTfmN 8vdQxqDK8yo0wiw1PooQQrwk6Ysf3IUTX5aEo0Bm5fn/RqWDNCyWkCd/IctwcN0kUtwBOfeXVgsz1 stkyq00S2vC6nL1dQ8yg145VAc5wszU3yD3kymCSdn0vVDtS6oD0VxKtCg5pvbriF5GV4zYGzQaPM 9/EHjWOg==; Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=noisy.programming.kicks-ass.net) by desiato.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1lvgsg-00AcAf-CY; Tue, 22 Jun 2021 13:56:05 +0000 Received: from hirez.programming.kicks-ass.net (hirez.programming.kicks-ass.net [192.168.1.225]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (Client did not present a certificate) by noisy.programming.kicks-ass.net (Postfix) with ESMTPS id 10F3D30021A; Tue, 22 Jun 2021 15:56:04 +0200 (CEST) Received: by hirez.programming.kicks-ass.net (Postfix, from userid 1000) id E137420C169E1; Tue, 22 Jun 2021 15:56:03 +0200 (CEST) Date: Tue, 22 Jun 2021 15:56:03 +0200 From: Peter Zijlstra To: Suren Baghdasaryan Cc: hannes@cmpxchg.org, mingo@redhat.com, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, bristot@redhat.com, matthias.bgg@gmail.com, minchan@google.com, timmurray@google.com, yt.chang@mediatek.com, wenju.xu@mediatek.com, jonathan.jmchen@mediatek.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, kernel-team@android.com Subject: Re: [PATCH 1/1] psi: stop relying on timer_pending for poll_work rescheduling Message-ID: References: <20210617212654.1529125-1-surenb@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210617212654.1529125-1-surenb@google.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jun 17, 2021 at 02:26:54PM -0700, Suren Baghdasaryan wrote: > Psi polling mechanism is trying to minimize the number of wakeups to > run psi_poll_work and is currently relying on timer_pending() to detect > when this work is already scheduled. This provides a window of opportunity > for psi_group_change to schedule an immediate psi_poll_work after > poll_timer_fn got called but before psi_poll_work could reschedule itself. > Below is the depiction of this entire window: > > poll_timer_fn > wake_up_interruptible(&group->poll_wait); > > psi_poll_worker > wait_event_interruptible(group->poll_wait, ...) > psi_poll_work > psi_schedule_poll_work > if (timer_pending(&group->poll_timer)) return; > ... > mod_timer(&group->poll_timer, jiffies + delay); > > Prior to 461daba06bdc we used to rely on poll_scheduled atomic which was > reset and set back inside psi_poll_work and therefore this race window > was much smaller. > The larger window causes increased number of wakeups and our partners > report visible power regression of ~10mA after applying 461daba06bdc. > Bring back the poll_scheduled atomic and make this race window even > narrower by resetting poll_scheduled only when we reach polling expiration > time. This does not completely eliminate the possibility of extra wakeups > caused by a race with psi_group_change however it will limit it to the > worst case scenario of one extra wakeup per every tracking window (0.5s > in the worst case). > By tracing the number of immediate rescheduling attempts performed by > psi_group_change and the number of these attempts being blocked due to > psi monitor being already active, we can assess the effects of this change: > > Before the patch: > Run#1 Run#2 Run#3 > Immediate reschedules attempted: 684365 1385156 1261240 > Immediate reschedules blocked: 682846 1381654 1258682 > Immediate reschedules (delta): 1519 3502 2558 > Immediate reschedules (% of attempted): 0.22% 0.25% 0.20% > > After the patch: > Run#1 Run#2 Run#3 > Immediate reschedules attempted: 882244 770298 426218 > Immediate reschedules blocked: 881996 769796 426074 > Immediate reschedules (delta): 248 502 144 > Immediate reschedules (% of attempted): 0.03% 0.07% 0.03% > > The number of non-blocked immediate reschedules dropped from 0.22-0.25% > to 0.03-0.07%. The drop is attributed to the decrease in the race window > size and the fact that we allow this race only when psi monitors reach > polling window expiration time. > > Fixes: 461daba06bdc ("psi: eliminate kthread_worker from psi trigger scheduling mechanism") > Reported-by: Kathleen Chang > Reported-by: Wenju Xu > Reported-by: Jonathan Chen > Signed-off-by: Suren Baghdasaryan Johannes? > -/* Schedule polling if it's not already scheduled. */ > -static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay) > +/* Schedule polling if it's not already scheduled or forced. */ > +static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay, > + bool force) > { > struct task_struct *task; > > - /* > - * Do not reschedule if already scheduled. > - * Possible race with a timer scheduled after this check but before > - * mod_timer below can be tolerated because group->polling_next_update > - * will keep updates on schedule. > - */ > - if (timer_pending(&group->poll_timer)) > + /* cmpxchg should be called even when !force to set poll_scheduled */ > + if (atomic_cmpxchg(&group->poll_scheduled, 0, 1) != 0 && !force) Do you care about memory ordering here? Afaict the whole thing is supposed to be ordered by ->trigger_lock, so you don't. Howver, if you did, the code seems to suggest you need a RELEASE ordering, but cmpxchg() as used above can fail in which case it does't provide anything. Also, I think the more conventional way to write that might be: if (atomic_xchg_relaxed(&group->poll_scheduled, 1) && !force) Hmm?