Message ID | 20201026161549.3709175-1-arnd@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Jason Gunthorpe |
Headers | show |
Series | IB/verbs: avoid nested container_of() | expand |
On Mon, Oct 26, 2020 at 05:15:39PM +0100, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@arndb.de> > > Nested container_of() calls work correctly but cause a warning when > building with W=2. Invoking it from an inline function like in > drivers/infiniband/hw/mlx5/mlx5_ib.h means we get hundreds of > warnings like: > > include/linux/kernel.h:852:8: warning: declaration of '__mptr' shadows a previous local [-Wshadow] > 852 | void *__mptr = (void *)(ptr); \ > | ^~~~~~ > include/rdma/uverbs_ioctl.h:651:11: note: in expansion of macro 'container_of' > 651 | (udata ? container_of(container_of(udata, struct uverbs_attr_bundle, \ > | ^~~~~~~~~~~~ > include/rdma/uverbs_ioctl.h:651:24: note: in expansion of macro 'container_of' > 651 | (udata ? container_of(container_of(udata, struct uverbs_attr_bundle, \ > | ^~~~~~~~~~~~ > drivers/infiniband/hw/mthca/mthca_qp.c:564:35: note: in expansion of macro 'rdma_udata_to_drv_context' > 564 | struct mthca_ucontext *context = rdma_udata_to_drv_context( > | ^~~~~~~~~~~~~~~~~~~~~~~~~ > include/linux/kernel.h:852:8: note: shadowed declaration is here > 852 | void *__mptr = (void *)(ptr); \ > | ^~~~~~ > include/rdma/uverbs_ioctl.h:651:11: note: in expansion of macro 'container_of' > 651 | (udata ? container_of(container_of(udata, struct uverbs_attr_bundle, \ > | ^~~~~~~~~~~~ > drivers/infiniband/hw/mthca/mthca_qp.c:564:35: note: in expansion of macro 'rdma_udata_to_drv_context' > 564 | struct mthca_ucontext *context = rdma_udata_to_drv_context( > | ^~~~~~~~~~~~~~~~~~~~~~~~~ > In file included from <command-line>: > include/linux/kernel.h:852:8: warning: declaration of '__mptr' shadows a previous local [-Wshadow] > 852 | void *__mptr = (void *)(ptr); \ > | ^~~~~~ > > Rewrite the macro to use an inline function internally, which makes > it more readable and reduces the amount of useless output from > make W=2. > > Fixes: 730623f4a56f ("IB/verbs: Add helper function rdma_udata_to_drv_context") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > include/rdma/uverbs_ioctl.h | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) Applied to rdma for-next, thanks Jason
diff --git a/include/rdma/uverbs_ioctl.h b/include/rdma/uverbs_ioctl.h index b00270c72740..bf167ef6c688 100644 --- a/include/rdma/uverbs_ioctl.h +++ b/include/rdma/uverbs_ioctl.h @@ -647,12 +647,15 @@ static inline bool uverbs_attr_is_valid(const struct uverbs_attr_bundle *attrs_b * 'ucontext'. * */ -#define rdma_udata_to_drv_context(udata, drv_dev_struct, member) \ - (udata ? container_of(container_of(udata, struct uverbs_attr_bundle, \ - driver_udata) \ - ->context, \ - drv_dev_struct, member) : \ - (drv_dev_struct *)NULL) +static inline struct uverbs_attr_bundle * +rdma_udata_to_uverbs_attr_bundle(struct ib_udata *udata) +{ + return container_of(udata, struct uverbs_attr_bundle, driver_udata); +} + +#define rdma_udata_to_drv_context(udata, drv_dev_struct, member) \ + (udata ? container_of(rdma_udata_to_uverbs_attr_bundle(udata)->context, \ + drv_dev_struct, member) : (drv_dev_struct *)NULL) #define IS_UVERBS_COPY_ERR(_ret) ((_ret) && (_ret) != -ENOENT)