All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
@ 2020-01-30 11:29 Leon Romanovsky
  2020-01-30 13:38 ` Randy Dunlap
  2020-01-30 15:34 ` Jason Gunthorpe
  0 siblings, 2 replies; 6+ messages in thread
From: Leon Romanovsky @ 2020-01-30 11:29 UTC (permalink / raw)
  To: Doug Ledford, Jason Gunthorpe
  Cc: Leon Romanovsky, RDMA mailing list, Randy Dunlap, Yishai Hadas,
	Stephen Rothwell, Linux Next Mailing List

From: Leon Romanovsky <leonro@mellanox.com>

Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
the following error.

on x86_64:

ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'

Guard the problematic code, so VAR objects API won't be compiled without CONFIG_INFINIBAND_USER_ACCESS.

Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
Reported-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 41ccc19d229e..c2afe6929cbb 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -2280,15 +2280,6 @@ static int mlx5_ib_mmap_offset(struct mlx5_ib_dev *dev,
 	return ret;
 }

-static u64 mlx5_entry_to_mmap_offset(struct mlx5_user_mmap_entry *entry)
-{
-	u16 cmd = entry->rdma_entry.start_pgoff >> 16;
-	u16 index = entry->rdma_entry.start_pgoff & 0xFFFF;
-
-	return (((index >> 8) << 16) | (cmd << MLX5_IB_MMAP_CMD_SHIFT) |
-		(index & 0xFF)) << PAGE_SHIFT;
-}
-
 static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma)
 {
 	struct mlx5_ib_ucontext *context = to_mucontext(ibcontext);
@@ -6085,6 +6076,16 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
 	mlx5_nic_vport_disable_roce(dev->mdev);
 }

+#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
+static u64 mlx5_entry_to_mmap_offset(struct mlx5_user_mmap_entry *entry)
+{
+	u16 cmd = entry->rdma_entry.start_pgoff >> 16;
+	u16 index = entry->rdma_entry.start_pgoff & 0xFFFF;
+
+	return (((index >> 8) << 16) | (cmd << MLX5_IB_MMAP_CMD_SHIFT) |
+		(index & 0xFF)) << PAGE_SHIFT;
+}
+
 static int var_obj_cleanup(struct ib_uobject *uobject,
 			   enum rdma_remove_reason why,
 			   struct uverbs_attr_bundle *attrs)
@@ -6223,6 +6224,7 @@ static bool var_is_supported(struct ib_device *device)
 	return (MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
 			MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q);
 }
+#endif

 ADD_UVERBS_ATTRIBUTES_SIMPLE(
 	mlx5_ib_dm,
@@ -6254,8 +6256,10 @@ static const struct uapi_definition mlx5_ib_defs[] = {
 	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
 				&mlx5_ib_flow_action),
 	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DM, &mlx5_ib_dm),
+#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 	UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_VAR,
 				UAPI_DEF_IS_OBJ_SUPPORTED(var_is_supported)),
+#endif
 	{}
 };

--
2.24.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
  2020-01-30 11:29 [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS Leon Romanovsky
@ 2020-01-30 13:38 ` Randy Dunlap
  2020-01-30 15:34 ` Jason Gunthorpe
  1 sibling, 0 replies; 6+ messages in thread
From: Randy Dunlap @ 2020-01-30 13:38 UTC (permalink / raw)
  To: Leon Romanovsky, Doug Ledford, Jason Gunthorpe
  Cc: Leon Romanovsky, RDMA mailing list, Yishai Hadas,
	Stephen Rothwell, Linux Next Mailing List

On 1/30/20 3:29 AM, Leon Romanovsky wrote:
> From: Leon Romanovsky <leonro@mellanox.com>
> 
> Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
> the following error.
> 
> on x86_64:
> 
> ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
> main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'
> 
> Guard the problematic code, so VAR objects API won't be compiled without CONFIG_INFINIBAND_USER_ACCESS.
> 
> Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>

Acked-by: Randy Dunlap <rdunlap@infradead.org> # build-tested

Thanks.

> ---
>  drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
> index 41ccc19d229e..c2afe6929cbb 100644
> --- a/drivers/infiniband/hw/mlx5/main.c
> +++ b/drivers/infiniband/hw/mlx5/main.c
> @@ -2280,15 +2280,6 @@ static int mlx5_ib_mmap_offset(struct mlx5_ib_dev *dev,
>  	return ret;
>  }
> 
> -static u64 mlx5_entry_to_mmap_offset(struct mlx5_user_mmap_entry *entry)
> -{
> -	u16 cmd = entry->rdma_entry.start_pgoff >> 16;
> -	u16 index = entry->rdma_entry.start_pgoff & 0xFFFF;
> -
> -	return (((index >> 8) << 16) | (cmd << MLX5_IB_MMAP_CMD_SHIFT) |
> -		(index & 0xFF)) << PAGE_SHIFT;
> -}
> -
>  static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vma)
>  {
>  	struct mlx5_ib_ucontext *context = to_mucontext(ibcontext);
> @@ -6085,6 +6076,16 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
>  	mlx5_nic_vport_disable_roce(dev->mdev);
>  }
> 
> +#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
> +static u64 mlx5_entry_to_mmap_offset(struct mlx5_user_mmap_entry *entry)
> +{
> +	u16 cmd = entry->rdma_entry.start_pgoff >> 16;
> +	u16 index = entry->rdma_entry.start_pgoff & 0xFFFF;
> +
> +	return (((index >> 8) << 16) | (cmd << MLX5_IB_MMAP_CMD_SHIFT) |
> +		(index & 0xFF)) << PAGE_SHIFT;
> +}
> +
>  static int var_obj_cleanup(struct ib_uobject *uobject,
>  			   enum rdma_remove_reason why,
>  			   struct uverbs_attr_bundle *attrs)
> @@ -6223,6 +6224,7 @@ static bool var_is_supported(struct ib_device *device)
>  	return (MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
>  			MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q);
>  }
> +#endif
> 
>  ADD_UVERBS_ATTRIBUTES_SIMPLE(
>  	mlx5_ib_dm,
> @@ -6254,8 +6256,10 @@ static const struct uapi_definition mlx5_ib_defs[] = {
>  	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
>  				&mlx5_ib_flow_action),
>  	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_DM, &mlx5_ib_dm),
> +#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
>  	UAPI_DEF_CHAIN_OBJ_TREE_NAMED(MLX5_IB_OBJECT_VAR,
>  				UAPI_DEF_IS_OBJ_SUPPORTED(var_is_supported)),
> +#endif
>  	{}
>  };
> 
> --
> 2.24.1
> 


-- 
~Randy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
  2020-01-30 11:29 [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS Leon Romanovsky
  2020-01-30 13:38 ` Randy Dunlap
@ 2020-01-30 15:34 ` Jason Gunthorpe
  2020-01-30 15:47   ` Leon Romanovsky
  2020-01-30 16:26   ` Randy Dunlap
  1 sibling, 2 replies; 6+ messages in thread
From: Jason Gunthorpe @ 2020-01-30 15:34 UTC (permalink / raw)
  To: Leon Romanovsky
  Cc: Doug Ledford, Leon Romanovsky, RDMA mailing list, Randy Dunlap,
	Yishai Hadas, Stephen Rothwell, Linux Next Mailing List

On Thu, Jan 30, 2020 at 01:29:57PM +0200, Leon Romanovsky wrote:
> From: Leon Romanovsky <leonro@mellanox.com>
> 
> Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
> the following error.
> 
> on x86_64:
> 
> ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
> main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'
> 
> Guard the problematic code, so VAR objects API won't be compiled without CONFIG_INFINIBAND_USER_ACCESS.
> 
> Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
>  drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)

Hurm. This is actually a side effect of some other code that needs to
be deleted.. We can now make all the generated structs static and rely
on compiler pruning to sort this out.

So this:

        if (IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS))
                dev->ib_dev.driver_def = mlx5_ib_defs;

Will cause the compiler to drop the entire tree of stuff, above
references inclded.

See below:

From fb22c0daf5fac6fd5e014e691f7c92421d848330 Mon Sep 17 00:00:00 2001
From: Jason Gunthorpe <jgg@mellanox.com>
Date: Thu, 30 Jan 2020 11:21:21 -0400
Subject: [PATCH] RDMA/core: Make the entire API tree static

Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
the following error.

on x86_64:

 ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
 main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
 ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
 ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'

This is happening because some parts of the UAPI description are not
static. This is a hold over from earlier code that relied on struct
pointers to refer to object types, now object types are referenced by
number. Remove the unused globals and add statics to the remaining UAPI
description elements.

Remove the redundent #ifdefs around mlx5_ib_*defs and obsolete
mlx5_ib_get_devx_tree().

The compiler now trims alot more unused code, including the above
problematic definitions when !CONFIG_INFINIBAND_USER_ACCESS.

Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
Reported-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
---
 drivers/infiniband/core/uverbs.h     | 17 -----------------
 drivers/infiniband/hw/mlx5/main.c    |  2 --
 drivers/infiniband/hw/mlx5/mlx5_ib.h |  6 +++---
 include/rdma/uverbs_named_ioctl.h    |  6 +++---
 4 files changed, 6 insertions(+), 25 deletions(-)

diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
index 4d4cec46d25132..7df71983212d6f 100644
--- a/drivers/infiniband/core/uverbs.h
+++ b/drivers/infiniband/core/uverbs.h
@@ -271,23 +271,6 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
 					  size_t kern_filter_sz,
 					  union ib_flow_spec *ib_spec);
 
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DEVICE);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_PD);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_MR);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_CQ);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_QP);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_AH);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_MW);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_SRQ);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_WQ);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_XRCD);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DM);
-extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_COUNTERS);
-
 /*
  * ib_uverbs_query_port_resp.port_cap_flags started out as just a copy of the
  * PortInfo CapabilityMask, but was extended with unique bits.
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 01fc09f3ddd3f9..0ca9581432808c 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -6247,10 +6247,8 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE(
 			     enum mlx5_ib_uapi_flow_action_flags));
 
 static const struct uapi_definition mlx5_ib_defs[] = {
-#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 	UAPI_DEF_CHAIN(mlx5_ib_devx_defs),
 	UAPI_DEF_CHAIN(mlx5_ib_flow_defs),
-#endif
 
 	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
 				&mlx5_ib_flow_action),
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index 7b019bd4de4b2b..c160a43d77f0fd 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -1379,14 +1379,14 @@ int mlx5_ib_fill_res_entry(struct sk_buff *msg,
 int mlx5_ib_fill_stat_entry(struct sk_buff *msg,
 			    struct rdma_restrack_entry *res);
 
+extern const struct uapi_definition mlx5_ib_devx_defs[];
+extern const struct uapi_definition mlx5_ib_flow_defs[];
+
 #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
 void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid);
 void mlx5_ib_devx_init_event_table(struct mlx5_ib_dev *dev);
 void mlx5_ib_devx_cleanup_event_table(struct mlx5_ib_dev *dev);
-const struct uverbs_object_tree_def *mlx5_ib_get_devx_tree(void);
-extern const struct uapi_definition mlx5_ib_devx_defs[];
-extern const struct uapi_definition mlx5_ib_flow_defs[];
 struct mlx5_ib_flow_handler *mlx5_ib_raw_fs_rule_add(
 	struct mlx5_ib_dev *dev, struct mlx5_ib_flow_matcher *fs_matcher,
 	struct mlx5_flow_context *flow_context,
diff --git a/include/rdma/uverbs_named_ioctl.h b/include/rdma/uverbs_named_ioctl.h
index 3447bfe356d6ea..6ae6cf8e4c2e13 100644
--- a/include/rdma/uverbs_named_ioctl.h
+++ b/include/rdma/uverbs_named_ioctl.h
@@ -76,7 +76,7 @@
 #define DECLARE_UVERBS_NAMED_OBJECT(_object_id, _type_attrs, ...)              \
 	static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
 		_object_id)[] = { __VA_ARGS__ };                               \
-	const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
+	static const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {    \
 		.id = _object_id,                                              \
 		.type_attrs = &_type_attrs,                                    \
 		.num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
@@ -88,10 +88,10 @@
  * identify all uapi methods with a (object,method) tuple. However, they have
  * no type pointer.
  */
-#define DECLARE_UVERBS_GLOBAL_METHODS(_object_id, ...)	\
+#define DECLARE_UVERBS_GLOBAL_METHODS(_object_id, ...)                         \
 	static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
 		_object_id)[] = { __VA_ARGS__ };                               \
-	const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
+	static const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {    \
 		.id = _object_id,                                              \
 		.num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
 		.methods = &UVERBS_OBJECT_METHODS(_object_id)                  \
-- 
2.25.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
  2020-01-30 15:34 ` Jason Gunthorpe
@ 2020-01-30 15:47   ` Leon Romanovsky
  2020-01-30 16:26   ` Randy Dunlap
  1 sibling, 0 replies; 6+ messages in thread
From: Leon Romanovsky @ 2020-01-30 15:47 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Doug Ledford, RDMA mailing list, Randy Dunlap, Yishai Hadas,
	Stephen Rothwell, Linux Next Mailing List

On Thu, Jan 30, 2020 at 11:34:26AM -0400, Jason Gunthorpe wrote:
> On Thu, Jan 30, 2020 at 01:29:57PM +0200, Leon Romanovsky wrote:
> > From: Leon Romanovsky <leonro@mellanox.com>
> >
> > Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
> > the following error.
> >
> > on x86_64:
> >
> > ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
> > main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
> > ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
> > ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'
> >
> > Guard the problematic code, so VAR objects API won't be compiled without CONFIG_INFINIBAND_USER_ACCESS.
> >
> > Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
> > Reported-by: Randy Dunlap <rdunlap@infradead.org>
> > Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
> >  drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++---------
> >  1 file changed, 13 insertions(+), 9 deletions(-)
>
> Hurm. This is actually a side effect of some other code that needs to
> be deleted.. We can now make all the generated structs static and rely
> on compiler pruning to sort this out.
>
> So this:
>
>         if (IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS))
>                 dev->ib_dev.driver_def = mlx5_ib_defs;
>
> Will cause the compiler to drop the entire tree of stuff, above
> references inclded.

It is viable solution too, more cryptic than previous one, but cleaner for sure.

Thanks

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
  2020-01-30 15:34 ` Jason Gunthorpe
  2020-01-30 15:47   ` Leon Romanovsky
@ 2020-01-30 16:26   ` Randy Dunlap
  2020-01-30 20:43     ` Jason Gunthorpe
  1 sibling, 1 reply; 6+ messages in thread
From: Randy Dunlap @ 2020-01-30 16:26 UTC (permalink / raw)
  To: Jason Gunthorpe, Leon Romanovsky
  Cc: Doug Ledford, Leon Romanovsky, RDMA mailing list, Yishai Hadas,
	Stephen Rothwell, Linux Next Mailing List

On 1/30/20 7:34 AM, Jason Gunthorpe wrote:
> On Thu, Jan 30, 2020 at 01:29:57PM +0200, Leon Romanovsky wrote:
>> From: Leon Romanovsky <leonro@mellanox.com>
>>
>> Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
>> the following error.
>>
>> on x86_64:
>>
>> ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
>> main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
>> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
>> ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'
>>
>> Guard the problematic code, so VAR objects API won't be compiled without CONFIG_INFINIBAND_USER_ACCESS.
>>
>> Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
>> Reported-by: Randy Dunlap <rdunlap@infradead.org>
>> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
>>  drivers/infiniband/hw/mlx5/main.c | 22 +++++++++++++---------
>>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> Hurm. This is actually a side effect of some other code that needs to
> be deleted.. We can now make all the generated structs static and rely
> on compiler pruning to sort this out.
> 
> So this:
> 
>         if (IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS))
>                 dev->ib_dev.driver_def = mlx5_ib_defs;
> 
> Will cause the compiler to drop the entire tree of stuff, above
> references inclded.
> 
> See below:
> 
> From fb22c0daf5fac6fd5e014e691f7c92421d848330 Mon Sep 17 00:00:00 2001
> From: Jason Gunthorpe <jgg@mellanox.com>
> Date: Thu, 30 Jan 2020 11:21:21 -0400
> Subject: [PATCH] RDMA/core: Make the entire API tree static
> 
> Compilation of mlx5 driver without CONFIG_INFINIBAND_USER_ACCESS generates
> the following error.
> 
> on x86_64:
> 
>  ld: drivers/infiniband/hw/mlx5/main.o: in function `mlx5_ib_handler_MLX5_IB_METHOD_VAR_OBJ_ALLOC':
>  main.c:(.text+0x186d): undefined reference to `ib_uverbs_get_ucontext_file'
>  ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x2480): undefined reference to `uverbs_idr_class'
>  ld: drivers/infiniband/hw/mlx5/main.o:(.rodata+0x24d8): undefined reference to `uverbs_destroy_def_handler'
> 
> This is happening because some parts of the UAPI description are not
> static. This is a hold over from earlier code that relied on struct
> pointers to refer to object types, now object types are referenced by
> number. Remove the unused globals and add statics to the remaining UAPI
> description elements.
> 
> Remove the redundent #ifdefs around mlx5_ib_*defs and obsolete
> mlx5_ib_get_devx_tree().
> 
> The compiler now trims alot more unused code, including the above
> problematic definitions when !CONFIG_INFINIBAND_USER_ACCESS.
> 
> Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>

Yes, that works also.  Thanks.

Acked-by: Randy Dunlap <rdunlap@infradead.org>


> ---
>  drivers/infiniband/core/uverbs.h     | 17 -----------------
>  drivers/infiniband/hw/mlx5/main.c    |  2 --
>  drivers/infiniband/hw/mlx5/mlx5_ib.h |  6 +++---
>  include/rdma/uverbs_named_ioctl.h    |  6 +++---
>  4 files changed, 6 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h
> index 4d4cec46d25132..7df71983212d6f 100644
> --- a/drivers/infiniband/core/uverbs.h
> +++ b/drivers/infiniband/core/uverbs.h
> @@ -271,23 +271,6 @@ int ib_uverbs_kern_spec_to_ib_spec_filter(enum ib_flow_spec_type type,
>  					  size_t kern_filter_sz,
>  					  union ib_flow_spec *ib_spec);
>  
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DEVICE);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_PD);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_MR);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_COMP_CHANNEL);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_CQ);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_QP);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_AH);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_MW);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_SRQ);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_WQ);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_RWQ_IND_TBL);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_XRCD);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_FLOW_ACTION);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_DM);
> -extern const struct uverbs_object_def UVERBS_OBJECT(UVERBS_OBJECT_COUNTERS);
> -
>  /*
>   * ib_uverbs_query_port_resp.port_cap_flags started out as just a copy of the
>   * PortInfo CapabilityMask, but was extended with unique bits.
> diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
> index 01fc09f3ddd3f9..0ca9581432808c 100644
> --- a/drivers/infiniband/hw/mlx5/main.c
> +++ b/drivers/infiniband/hw/mlx5/main.c
> @@ -6247,10 +6247,8 @@ ADD_UVERBS_ATTRIBUTES_SIMPLE(
>  			     enum mlx5_ib_uapi_flow_action_flags));
>  
>  static const struct uapi_definition mlx5_ib_defs[] = {
> -#if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
>  	UAPI_DEF_CHAIN(mlx5_ib_devx_defs),
>  	UAPI_DEF_CHAIN(mlx5_ib_flow_defs),
> -#endif
>  
>  	UAPI_DEF_CHAIN_OBJ_TREE(UVERBS_OBJECT_FLOW_ACTION,
>  				&mlx5_ib_flow_action),
> diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
> index 7b019bd4de4b2b..c160a43d77f0fd 100644
> --- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
> +++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
> @@ -1379,14 +1379,14 @@ int mlx5_ib_fill_res_entry(struct sk_buff *msg,
>  int mlx5_ib_fill_stat_entry(struct sk_buff *msg,
>  			    struct rdma_restrack_entry *res);
>  
> +extern const struct uapi_definition mlx5_ib_devx_defs[];
> +extern const struct uapi_definition mlx5_ib_flow_defs[];
> +
>  #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
>  int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
>  void mlx5_ib_devx_destroy(struct mlx5_ib_dev *dev, u16 uid);
>  void mlx5_ib_devx_init_event_table(struct mlx5_ib_dev *dev);
>  void mlx5_ib_devx_cleanup_event_table(struct mlx5_ib_dev *dev);
> -const struct uverbs_object_tree_def *mlx5_ib_get_devx_tree(void);
> -extern const struct uapi_definition mlx5_ib_devx_defs[];
> -extern const struct uapi_definition mlx5_ib_flow_defs[];
>  struct mlx5_ib_flow_handler *mlx5_ib_raw_fs_rule_add(
>  	struct mlx5_ib_dev *dev, struct mlx5_ib_flow_matcher *fs_matcher,
>  	struct mlx5_flow_context *flow_context,
> diff --git a/include/rdma/uverbs_named_ioctl.h b/include/rdma/uverbs_named_ioctl.h
> index 3447bfe356d6ea..6ae6cf8e4c2e13 100644
> --- a/include/rdma/uverbs_named_ioctl.h
> +++ b/include/rdma/uverbs_named_ioctl.h
> @@ -76,7 +76,7 @@
>  #define DECLARE_UVERBS_NAMED_OBJECT(_object_id, _type_attrs, ...)              \
>  	static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
>  		_object_id)[] = { __VA_ARGS__ };                               \
> -	const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
> +	static const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {    \
>  		.id = _object_id,                                              \
>  		.type_attrs = &_type_attrs,                                    \
>  		.num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
> @@ -88,10 +88,10 @@
>   * identify all uapi methods with a (object,method) tuple. However, they have
>   * no type pointer.
>   */
> -#define DECLARE_UVERBS_GLOBAL_METHODS(_object_id, ...)	\
> +#define DECLARE_UVERBS_GLOBAL_METHODS(_object_id, ...)                         \
>  	static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
>  		_object_id)[] = { __VA_ARGS__ };                               \
> -	const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
> +	static const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {    \
>  		.id = _object_id,                                              \
>  		.num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
>  		.methods = &UVERBS_OBJECT_METHODS(_object_id)                  \
> 


-- 
~Randy


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS
  2020-01-30 16:26   ` Randy Dunlap
@ 2020-01-30 20:43     ` Jason Gunthorpe
  0 siblings, 0 replies; 6+ messages in thread
From: Jason Gunthorpe @ 2020-01-30 20:43 UTC (permalink / raw)
  To: Randy Dunlap
  Cc: Leon Romanovsky, Doug Ledford, Leon Romanovsky,
	RDMA mailing list, Yishai Hadas, Stephen Rothwell,
	Linux Next Mailing List

On Thu, Jan 30, 2020 at 08:26:03AM -0800, Randy Dunlap wrote:
> > 
> > The compiler now trims alot more unused code, including the above
> > problematic definitions when !CONFIG_INFINIBAND_USER_ACCESS.
> > 
> > Fixes: 7be76bef320b ("IB/mlx5: Introduce VAR object and its alloc/destroy methods")
> > Reported-by: Randy Dunlap <rdunlap@infradead.org>
> > Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
> 
> Yes, that works also.  Thanks.
> 
> Acked-by: Randy Dunlap <rdunlap@infradead.org>

Thanks, applied to for-next

Jason

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-01-30 20:43 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-30 11:29 [PATCH rdma-rc] RDMA/mlx5: Fix compilation breakage without INFINIBAND_USER_ACCESS Leon Romanovsky
2020-01-30 13:38 ` Randy Dunlap
2020-01-30 15:34 ` Jason Gunthorpe
2020-01-30 15:47   ` Leon Romanovsky
2020-01-30 16:26   ` Randy Dunlap
2020-01-30 20:43     ` Jason Gunthorpe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.