--- /dev/null
+From 29905b52fad0854351f57bab867647e4982285bf Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Date: Thu, 2 Feb 2017 18:05:26 +0000
+Subject: log2: make order_base_2() behave correctly on const input value zero
+
+From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+
+commit 29905b52fad0854351f57bab867647e4982285bf upstream.
+
+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.
+
+[ See
+
+ http://marc.info/?l=linux-kernel&m=147672952517795&w=2
+
+ and follow-up discussion for more background. The gcc "optimization
+ pass" is really just broken, but now the GCC trunk problem seems to
+ have escaped out of just specially built daily images, so we need to
+ work around it in mainline. - Linus ]
+
+Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/linux/log2.h | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+--- a/include/linux/log2.h
++++ b/include/linux/log2.h
+@@ -194,6 +194,17 @@ unsigned long __rounddown_pow_of_two(uns
+ * ... 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 */