On Wed, Mar 06, 2019 at 04:44:04PM +0000, Jason Gunthorpe wrote: > On Wed, Mar 06, 2019 at 02:37:17PM +0200, Leon Romanovsky wrote: > > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > > > Attempt to use check_shl_overflow() with inputs of unsigned type > > produces the following compilation warnings. > > > > drivers/infiniband/hw/mlx5/qp.c: In function _set_user_rq_size_: > > ./include/linux/overflow.h:230:6: warning: comparison of unsigned > > expression >= 0 is always true [-Wtype-limits] > > _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ > > ^~ > > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, > > &rwq->buf_size)) > > ^~~~~~~~~~~~~~~~~~ > > ./include/linux/overflow.h:232:26: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] > > (_to_shift != _s || *_d < 0 || _a < 0 || \ > > ^ > > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, &rwq->buf_size)) > > ^~~~~~~~~~~~~~~~~~ > > ./include/linux/overflow.h:232:36: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] > > (_to_shift != _s || *_d < 0 || _a < 0 || \ > > ^ > > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift,&rwq->buf_size)) > > ^~~~~~~~~~~~~~~~~~ > > > > Fixes: 0c66847793d1 ("overflow.h: Add arithmetic shift helper") > > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > Changelog v0->v1: > > * fixed wrong checks > > include/linux/overflow.h | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > > index 40b48e2133cb..a47fb6046c0a 100644 > > +++ b/include/linux/overflow.h > > @@ -227,10 +227,10 @@ > > typeof(d) _d = d; \ > > u64 _a_full = _a; \ > > unsigned int _to_shift = \ > > - _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ > > + (_s == 0 || _s > 0) && _s < 8 * sizeof(*d) ? _s : 0; \ > > I think this is just trading a tautological compare gcc happens to > know about today (_s >= 0) with one it currently doesn't (_s == 0 || > _s > 0) > > Maybe cc the various people that helped review this macro and see if > we can find another solution? I would be glad to see other solution, but I don't know such. > > Jason
Attachment:
signature.asc
Description: PGP signature