From patchwork Thu Feb 2 18:05:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 93120 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp220962qgi; Thu, 2 Feb 2017 10:05:47 -0800 (PST) X-Received: by 10.84.254.74 with SMTP id a10mr14330721pln.57.1486058747158; Thu, 02 Feb 2017 10:05:47 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g21si18258489pgh.125.2017.02.02.10.05.46; Thu, 02 Feb 2017 10:05:47 -0800 (PST) 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; 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 S1752618AbdBBSFf (ORCPT + 25 others); Thu, 2 Feb 2017 13:05:35 -0500 Received: from mail-wj0-f173.google.com ([209.85.210.173]:34257 "EHLO mail-wj0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752444AbdBBSFd (ORCPT ); Thu, 2 Feb 2017 13:05:33 -0500 Received: by mail-wj0-f173.google.com with SMTP id uo9so5227816wjc.1 for ; Thu, 02 Feb 2017 10:05:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=EcvNCAA5GgQh+nWUrgnkzFfFDKS9vw6mm/CLvmgi4Pg=; b=jzBFO9gk7Hr4W0VbO38Mf7/XEqnmHn4zuDhaPKuGLjIsNWKObtqowyb6FPQ84feiJ6 NJBu/61H1pv+rpmtFcZuM3XFfkCg21SuZybND0DS57Aow41ppDa9XPXBIGcDa1vhuc40 zKqQypK0Q2jMfFPlIQzRTYqNzCljQ3nZpQaZQ= 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=EcvNCAA5GgQh+nWUrgnkzFfFDKS9vw6mm/CLvmgi4Pg=; b=RDzBqCx+eees58sfkz3VJptv3rrYXMAbSTHH/31RRiujjMy+j9FH/WiNHIkZFBH+J5 puOKOjWZv7vle0cjDY46exsqDhHpdY3tCV1pynj8u1fi7ZKYwNEYWJupsXM09TawDsRe Fuy1qfHf0RFbjteuetAIdztH9H/agq5Kba2ZaiwmDRSKW4XvWLFUjMZ7t4VG/MJw2/eO Hn7Z8RYxzY5r5exb7zd15w6kE3l3GWmko0VabJTn6a8Cg7MVSeEVL8SGASc2NZJw7PE+ 8JapZwD218oidwbLVbmLIbKeJME8pTrfzHbDfCgcwO5jon8Q69gqYZghDy17qZ4RnT0r gYBg== X-Gm-Message-State: AIkVDXJI883Ec3ClYHGTGh5DGBAhVaHgRKAPfbIItZteccQy7r7sdjq8h22Kh06gp2SgyYzK X-Received: by 10.223.173.80 with SMTP id p74mr8430254wrc.168.1486058732175; Thu, 02 Feb 2017 10:05:32 -0800 (PST) Received: from localhost.localdomain ([105.130.17.13]) by smtp.gmail.com with ESMTPSA id 36sm41008888wrz.8.2017.02.02.10.05.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 02 Feb 2017 10:05:31 -0800 (PST) From: Ard Biesheuvel To: linux-kernel@vger.kernel.org, labbott@fedoraproject.org, will.deacon@arm.com, sboyd@codeaurora.org, gregory.clement@free-electrons.com, james.greenhalgh@arm.com, mingo@kernel.org, peterz@infradead.org, markus@trippelsdorf.de, akpm@linux-foundation.org Cc: linux-arm-kernel@lists.infradead.org, torvalds@linux-foundation.org, joe@perches.com, Ard Biesheuvel Subject: [PATCH v2] log2: make order_base_2() behave correctly on const input value zero Date: Thu, 2 Feb 2017 18:05:26 +0000 Message-Id: <1486058726-7262-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function order_base_2() is defined (according to the comment block) as returning zero on input zero, but subsequently passes the input into roundup_pow_of_two(), which is explicitly undefined for input zero. This has gone unnoticed until now, but optimization passes in GCC 7 may produce constant folded function instances where a constant value of zero is passed into order_base_2(), resulting in link errors against the deliberately undefined '____ilog2_NaN'. So update order_base_2() to adhere to its own documented interface. Signed-off-by: Ard Biesheuvel --- v2: make __order_base_2() return int to match the prototype of __ilog2_uXX() This is a followup to Will's message 'Build failure with v4.9-rc1 and GCC trunk -- compiler weirdness' which can be found here: http://marc.info/?l=linux-kernel&m=147672952517795&w=2 include/linux/log2.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) -- 2.7.4 diff --git a/include/linux/log2.h b/include/linux/log2.h index fd7ff3d91e6a..d3fe63b12e96 100644 --- a/include/linux/log2.h +++ b/include/linux/log2.h @@ -203,6 +203,17 @@ unsigned long __rounddown_pow_of_two(unsigned long n) * ... and so on. */ -#define order_base_2(n) ilog2(roundup_pow_of_two(n)) +static inline __attribute_const__ +int __order_base_2(unsigned long n) +{ + return n > 1 ? ilog2(n - 1) + 1 : 0; +} +#define order_base_2(n) \ +( \ + __builtin_constant_p(n) ? ( \ + ((n) == 0 || (n) == 1) ? 0 : \ + ilog2((n) - 1) + 1) : \ + __order_base_2(n) \ +) #endif /* _LINUX_LOG2_H */