Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp193847imm; Tue, 22 May 2018 16:52:39 -0700 (PDT) X-Google-Smtp-Source: AB8JxZozRcU48udt2e8ZuqqRDmbBrnEtsuQA2vVO25YTYWh8mPfBLJibhWqeWR62mUVm88CWDwvH X-Received: by 2002:a63:7a5a:: with SMTP id j26-v6mr409275pgn.421.1527033159240; Tue, 22 May 2018 16:52:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527033159; cv=none; d=google.com; s=arc-20160816; b=Z/9sD/5ffc08C+yHOFWse9HjgFD6stzoFRmE6fIfE8SLnSh6tS3RM2F1PDJwKWnGLp j0/TFQRS0U41T6VZrrqBdyuIykPPZc5MMO3Fe1NdaBHZi3d9+arD5y/MeM9NwZHS2yUT SylUYfhApvfX/rYgBhZCLJO1VDujD8mx/lgS7/KJeTAtzyoFwkH7tPCBwmktJk5E/hRd mGNRrbPHJQbzJphlY5e/r3CAFz4L7Tl8bNbqC6K787E8ZVpASTqbmZ1lfvJZGaO2CvnT dsqNsb19D2bcO8gJE1cHbqJIQ4E+mBzqI6XSzA7jFwLSL7s8lhaV48Pk171r5H5j+GT/ y5Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=+q/5UDzYXBuzuH9NpCs0k/Acyefn6/pzwKkePpJir+s=; b=HRGahssgu4pODXo0FIBaxzf3kK8NwYxX20LAa0jLmUzisAePdN0GhSkk9LkerbPBsT UtiPAkV44UrLFmToFZuskJpirz/M13ZmIQXDvVQDvEqjkculhOhZJWyWzl+Y5HCegC6K GOqgeorfGMP6+pbblUaeahPm/qmXt3nhqZTsK5M5vJDnJRNd5QRyNe0i+rKBYR0WUkUZ Kh/GbEfQNiqusFe/8x/ZiFcbMpcV9Uwf2bL+7mtRi0bmHBWC/+J65Z7h180QaaVd5tIg /IBXaCIeOUE0/Dfw/Yp29LukK8TF2VA5+ZJV354sdWJdguqyBPaU0MTwyfKopbTDh5th Isqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=DUD2wf79; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a100-v6si17748172pli.588.2018.05.22.16.52.23; Tue, 22 May 2018 16:52:39 -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=@google.com header.s=20161025 header.b=DUD2wf79; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753526AbeEVXul (ORCPT + 99 others); Tue, 22 May 2018 19:50:41 -0400 Received: from mail-pl0-f65.google.com ([209.85.160.65]:33232 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753324AbeEVXuj (ORCPT ); Tue, 22 May 2018 19:50:39 -0400 Received: by mail-pl0-f65.google.com with SMTP id n10-v6so11841927plp.0 for ; Tue, 22 May 2018 16:50:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=+q/5UDzYXBuzuH9NpCs0k/Acyefn6/pzwKkePpJir+s=; b=DUD2wf79zWPJO4VglfQE++XaW5F5ebD7uwJV3fA28jWBRoJoV4HlcDrfSikdI27c5I E9p+0DWHHvPia5GZ9SvHZ5MlyGXxQoF1Sit6I6tqUG5u0dI04nc5KLN9VQZeBMQBH6O9 sNBx51la8X6fAFmzgjPtFIkk96VHUkpg5hxOT92uMjEedXiJ/7zt3SqtLlaK0rQgxY5W S172HRmbs6HfZcYO8eRGJFNITC9Pa0J9Rdqtob5HNADEDQ864F8qKiuKVO6XENKMIMaj AiWE4faj+/EzpaPY/vEQcOz/E1kl4YZODflOmYIYs6mukGMciYZfDohqfLYuCdhStzcO IpcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=+q/5UDzYXBuzuH9NpCs0k/Acyefn6/pzwKkePpJir+s=; b=fcs/s0+7pIiNwBzjY6A5BExqddqcsSn3CQC6EaEr8wmi9knkbCuW+IvkRL/xWNV83V RZjU+Opb3nyrgZwFocZhDV/3QmBh1K/fRp4/xOeT3kmfJG7K/PUQ7QyPj7zSEuS8Od/e /ALcMXM6eFuZCXq/eRCJWAX5KkVWMJHiv6iOhRVZOd6Kgiu4cmcbIE29GHTpci4QulGG bRcAy5UhTPhbG+3arCHMT5wcJli5mFVhTRTj5uCWyt+2Mxs810X7aiNhVEsYvQEW5DvL 5bNY/DmB2UxcwLcPRqVq3a82cnCHb7m1HOkDs45OdP9deaftgUItvQtEbSRT8hXxLw3q fEag== X-Gm-Message-State: ALKqPwfMImUN+EnBgHtqjrGT8QMmc/LN+TRnR84eCLMP9j1iLsTLJEe5 e062QPuLdwglKItGW2W85AvM18f/FBU= X-Received: by 2002:a17:902:1025:: with SMTP id b34-v6mr506601pla.207.1527033038916; Tue, 22 May 2018 16:50:38 -0700 (PDT) Received: from joelaf.mtv.corp.google.com ([2620:0:1000:1600:3122:ea9c:d178:eb]) by smtp.gmail.com with ESMTPSA id w134-v6sm29460366pfd.187.2018.05.22.16.50.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 May 2018 16:50:38 -0700 (PDT) From: "Joel Fernandes (Google)" X-Google-Original-From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , "Rafael J . Wysocki" , Peter Zijlstra , Ingo Molnar , Patrick Bellasi , Juri Lelli , Luca Abeni , Todd Kjos , claudio@evidence.eu.com, kernel-team@android.com, linux-pm@vger.kernel.org Subject: [PATCH RFC] schedutil: Address the r/w ordering race in kthread Date: Tue, 22 May 2018 16:50:28 -0700 Message-Id: <20180522235028.80564-1-joel@joelfernandes.org> X-Mailer: git-send-email 2.17.0.441.gb46fe60e1d-goog Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently there is a race in schedutil code for slow-switch single-CPU systems. Fix it by enforcing ordering the write to work_in_progress to happen before the read of next_freq. Kthread Sched update sugov_work() sugov_update_single() lock(); // The CPU is free to rearrange below // two in any order, so it may clear // the flag first and then read next // freq. Lets assume it does. work_in_progress = false if (work_in_progress) return; sg_policy->next_freq = 0; freq = sg_policy->next_freq; sg_policy->next_freq = real-freq; unlock(); Reported-by: Viresh Kumar CC: Rafael J. Wysocki CC: Peter Zijlstra CC: Ingo Molnar CC: Patrick Bellasi CC: Juri Lelli Cc: Luca Abeni CC: Todd Kjos CC: claudio@evidence.eu.com CC: kernel-team@android.com CC: linux-pm@vger.kernel.org Signed-off-by: Joel Fernandes (Google) --- I split this into separate patch, because this race can also happen in mainline. kernel/sched/cpufreq_schedutil.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c index 5c482ec38610..ce7749da7a44 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -401,6 +401,13 @@ static void sugov_work(struct kthread_work *work) */ raw_spin_lock_irqsave(&sg_policy->update_lock, flags); freq = sg_policy->next_freq; + + /* + * sugov_update_single can access work_in_progress without update_lock, + * make sure next_freq is read before work_in_progress is set. + */ + smp_mb(); + sg_policy->work_in_progress = false; raw_spin_unlock_irqrestore(&sg_policy->update_lock, flags); -- 2.17.0.441.gb46fe60e1d-goog