From: Arnd Bergmann <arnd@arndb.de>
clang warns for comparisons that are always true, which is the case
for these two page size checks on architectures with 64KB pages:
drivers/infiniband/core/uverbs_ioctl.c:90:39: error: result of comparison of constant 65536 with expression of type 'u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
include/asm-generic/bug.h:104:25: note: expanded from macro 'WARN_ON_ONCE'
int __ret_warn_on = !!(condition); \
^~~~~~~~~
drivers/infiniband/core/uverbs_ioctl.c:621:17: error: result of comparison of constant 65536 with expression of type '__u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (hdr.length > PAGE_SIZE ||
~~~~~~~~~~ ^ ~~~~~~~~~
Add a cast to u32 in both cases, so it never warns about this.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
drivers/infiniband/core/uverbs_ioctl.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/core/uverbs_ioctl.c b/drivers/infiniband/core/uverbs_ioctl.c
index f80da6a67e24..e0cc3ddae71b 100644
--- a/drivers/infiniband/core/uverbs_ioctl.c
+++ b/drivers/infiniband/core/uverbs_ioctl.c
@@ -90,7 +90,7 @@ void uapi_compute_bundle_size(struct uverbs_api_ioctl_method *method_elm,
ALIGN(bundle_size + 256, sizeof(*pbundle->internal_buffer));
/* Do not want order-2 allocations for this. */
- WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE);
+ WARN_ON_ONCE((u32)method_elm->bundle_size > PAGE_SIZE);
}
/**
@@ -636,7 +636,7 @@ long ib_uverbs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
if (err)
return -EFAULT;
- if (hdr.length > PAGE_SIZE ||
+ if ((u32)hdr.length > PAGE_SIZE ||
hdr.length != struct_size(&hdr, attrs, hdr.num_attrs))
return -EINVAL;
--
2.39.2
On Thu, Mar 28, 2024 at 03:30:45PM +0100, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@arndb.de> > > clang warns for comparisons that are always true, which is the case > for these two page size checks on architectures with 64KB pages: > > drivers/infiniband/core/uverbs_ioctl.c:90:39: error: result of comparison of constant 65536 with expression of type 'u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare] > WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE); > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~ > include/asm-generic/bug.h:104:25: note: expanded from macro 'WARN_ON_ONCE' > int __ret_warn_on = !!(condition); \ > ^~~~~~~~~ > drivers/infiniband/core/uverbs_ioctl.c:621:17: error: result of comparison of constant 65536 with expression of type '__u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare] > if (hdr.length > PAGE_SIZE || > ~~~~~~~~~~ ^ ~~~~~~~~~ > > Add a cast to u32 in both cases, so it never warns about this. But doesn't that hurt the codegen? Jason
On Wed, Apr 3, 2024, at 17:45, Jason Gunthorpe wrote:
> On Thu, Mar 28, 2024 at 03:30:45PM +0100, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>>
>> clang warns for comparisons that are always true, which is the case
>> for these two page size checks on architectures with 64KB pages:
>>
>> drivers/infiniband/core/uverbs_ioctl.c:90:39: error: result of comparison of constant 65536 with expression of type 'u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
>> WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE);
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
>> include/asm-generic/bug.h:104:25: note: expanded from macro 'WARN_ON_ONCE'
>> int __ret_warn_on = !!(condition); \
>> ^~~~~~~~~
>> drivers/infiniband/core/uverbs_ioctl.c:621:17: error: result of comparison of constant 65536 with expression of type '__u16' (aka 'unsigned short') is always false [-Werror,-Wtautological-constant-out-of-range-compare]
>> if (hdr.length > PAGE_SIZE ||
>> ~~~~~~~~~~ ^ ~~~~~~~~~
>>
>> Add a cast to u32 in both cases, so it never warns about this.
>
> But doesn't that hurt the codegen?
I just double-checked in the compiler explorer to confirm that
this works as I expected: both gcc and clang are still able
to optimize out the comparison for 64K pages, but clang no
longer complains after my change that this is an obvious
case.
I also see that gcc still produces a -Wtype-limits warning, but that
likely has to stay disabled because it produces too much output
elsewhere and I don't see an easy way to shut it up.
Arnd
On Thu, Mar 28, 2024 at 7:32 AM Arnd Bergmann <arnd@kernel.org> wrote: > Add a cast to u32 in both cases, so it never warns about this. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Justin Stitt <justinstitt@google.com> > --- > drivers/infiniband/core/uverbs_ioctl.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/infiniband/core/uverbs_ioctl.c b/drivers/infiniband/core/uverbs_ioctl.c > index f80da6a67e24..e0cc3ddae71b 100644 > --- a/drivers/infiniband/core/uverbs_ioctl.c > +++ b/drivers/infiniband/core/uverbs_ioctl.c > @@ -90,7 +90,7 @@ void uapi_compute_bundle_size(struct uverbs_api_ioctl_method *method_elm, > ALIGN(bundle_size + 256, sizeof(*pbundle->internal_buffer)); > > /* Do not want order-2 allocations for this. */ > - WARN_ON_ONCE(method_elm->bundle_size > PAGE_SIZE); > + WARN_ON_ONCE((u32)method_elm->bundle_size > PAGE_SIZE); > } > > /** > @@ -636,7 +636,7 @@ long ib_uverbs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) > if (err) > return -EFAULT; > > - if (hdr.length > PAGE_SIZE || > + if ((u32)hdr.length > PAGE_SIZE || > hdr.length != struct_size(&hdr, attrs, hdr.num_attrs)) > return -EINVAL; > > -- > 2.39.2 >
© 2016 - 2026 Red Hat, Inc.