Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp308054pxy; Fri, 30 Apr 2021 06:02:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwE6PNrUzFZ+jZU+53w1kUihGvY282h3lK3p7FeHi85jxERhIn9iVslo04od72HDwult21S X-Received: by 2002:a7b:c0d7:: with SMTP id s23mr16169312wmh.43.1619787775845; Fri, 30 Apr 2021 06:02:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619787775; cv=none; d=google.com; s=arc-20160816; b=fRgkF6AZ6LLyI9vzt4ktLFjxtmBvaNfhbzQ4F0SZdjJNRvuhcntPQ+rhbUhY2oYEJV fBSdeHobx4hPt9Uspsi/QFp808bEguwp+RNrOAGejJds5qhYuHrdO+SKz2QNywU1LW03 jC2qDKJok+j6mU+yTtiXt4MNVGJzLj5TzIt4ZAhdr98LkWtRPE8I2DEdWQHIeIsT80Tv cCyhKI++6kVmT6lQO0DaYfc39C5fFBi222CPGCyA8+CwMN1UPcc/FAZkkurEG4+r+BIE JIMvGXtO/K7KTZZPpGGV2YxP458t2KXZGS4ibMQYZTWCAlImyeFnptlzMF9PeCC25nNg iyWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=2yxSCLjVYezYn6Asb1xddiUux7D1xxNcS4y5Wr7WQXI=; b=wKWRRA0kWw2zOBCkFgDumZPAO4YENG0Y8zZStSgl2QhN39NL0guyqcUO1nJkyRUWCi bpj6QsPraMcWgK7ag9oPmOVTDQe+3VSqZ9lkFxG46lpZ5pW8RO97ZNKDH7tJ7Ru9FZzW B7p+liRe93W+5qyo4hu8MfUWyeDiQGFHQYkfh1oSANhCKIVobPm1Itxt+NqcZC0CghoY JjVqMuQkvSL9ECQPUQ7uYAoIFvcLv0iXmPi69YbvHjLPglOAQR4fdn+Rg6ZhAXb/8I76 h3oVyDxz1t7OhRfPpJob0muysKYAVyvkm+G0LKxpVsL2NRqijIsGHqMQooEvOgQxjGUr zGbA== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g12si1852482edb.437.2021.04.30.06.02.29; Fri, 30 Apr 2021 06:02:55 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232202AbhD3NAx (ORCPT + 99 others); Fri, 30 Apr 2021 09:00:53 -0400 Received: from foss.arm.com ([217.140.110.172]:47844 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231696AbhD3NAw (ORCPT ); Fri, 30 Apr 2021 09:00:52 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 89488ED1; Fri, 30 Apr 2021 06:00:04 -0700 (PDT) Received: from [192.168.178.6] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9DA9C3F73B; Fri, 30 Apr 2021 06:00:01 -0700 (PDT) Subject: Re: [PATCH v2] sched: Fix out-of-bound access in uclamp To: Vincent Guittot , Quentin Perret Cc: Ingo Molnar , Peter Zijlstra , Juri Lelli , Steven Rostedt , Ben Segall , Mel Gorman , Daniel Bristot de Oliveira , Qais Yousef , Android Kernel Team , linux-kernel , Patrick Bellasi References: <20210429152656.4118460-1-qperret@google.com> From: Dietmar Eggemann Message-ID: Date: Fri, 30 Apr 2021 15:00:00 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 30/04/2021 14:03, Vincent Guittot wrote: > On Fri, 30 Apr 2021 at 11:40, Quentin Perret wrote: >> >> On Friday 30 Apr 2021 at 10:49:50 (+0200), Vincent Guittot wrote: >>> 20 buckets is probably not the best example because of the rounding of >>> the division. With 16 buckets, each bucket should be exactly 64 steps >>> large except the last one which will have 65 steps because of the >>> value 1024. With your change, buckets will be 65 large and the last >>> one will be only 49 large >> >> OK, so what do you think of this? > > Looks good to me +1 >> diff --git a/kernel/sched/core.c b/kernel/sched/core.c >> index c5fb230dc604..dceeb5821797 100644 >> --- a/kernel/sched/core.c >> +++ b/kernel/sched/core.c >> @@ -920,14 +920,14 @@ static struct uclamp_se uclamp_default[UCLAMP_CNT]; >> */ >> DEFINE_STATIC_KEY_FALSE(sched_uclamp_used); >> >> -#define UCLAMP_BUCKET_DELTA (SCHED_CAPACITY_SCALE / UCLAMP_BUCKETS + 1) >> +#define UCLAMP_BUCKET_DELTA DIV_ROUND_CLOSEST(SCHED_CAPACITY_SCALE, UCLAMP_BUCKETS) >> >> #define for_each_clamp_id(clamp_id) \ >> for ((clamp_id) = 0; (clamp_id) < UCLAMP_CNT; (clamp_id)++) >> >> static inline unsigned int uclamp_bucket_id(unsigned int clamp_value) >> { >> - return clamp_value / UCLAMP_BUCKET_DELTA; >> + return min(clamp_value / UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS - 1); IMHO, this asks for min_t(unsigned int, clamp_value/UCLAMP_BUCKET_DELTA, UCLAMP_BUCKETS-1); >> } >> >> static inline unsigned int uclamp_none(enum uclamp_id clamp_id) Looks like this will fix a lot of possible configs: nbr buckets 1-4, 7-8, 10-12, 14-17, *20*, 26, 29-32 ... We would still introduce larger last buckets, right? Examples: nbr_buckets delta last bucket size 20 51 +5 = 56 26 39 +10 = 49 29 35 +9 = 44 ...