diff mbox series

[rdma-next] IB/mlx5: Generally use the WC auto detection test result

Message ID 20200318100323.46659-1-leon@kernel.org (mailing list archive)
State Accepted
Delegated to: Jason Gunthorpe
Headers show
Series [rdma-next] IB/mlx5: Generally use the WC auto detection test result | expand

Commit Message

Leon Romanovsky March 18, 2020, 10:03 a.m. UTC
From: Yishai Hadas <yishaih@mellanox.com>

Now that we have direct and reliable detection of WC support by the
system, use is broadly. The only case we have to worry about is when the
WC autodetector cannot run.

For this fringe case generally assume that that WC is available, except
in the well defined case of no PAT support on x86 which is tested by
calling arch_can_pci_mmap_wc().

If WC is wrongly assumed to be available then it causes a small
performance hit on paths in userspace that are tuned to the assumption
that WC is available. There is no functional loss.

It is very unlikely that any platforms exist that lack WC and also care
about the micro optimization of WC in the fringe case where
autodetection does not work.

By removing the fairly bogus CONFIG tests this makes WC work broadly on
all arches and all platforms.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Michael Guralnik <michaelgur@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
 drivers/infiniband/hw/mlx5/main.c | 16 ++++------------
 drivers/infiniband/hw/mlx5/mem.c  |  2 +-
 2 files changed, 5 insertions(+), 13 deletions(-)

--
2.24.1

Comments

Jason Gunthorpe March 24, 2020, 11:23 p.m. UTC | #1
On Wed, Mar 18, 2020 at 12:03:23PM +0200, Leon Romanovsky wrote:
> From: Yishai Hadas <yishaih@mellanox.com>
> 
> Now that we have direct and reliable detection of WC support by the
> system, use is broadly. The only case we have to worry about is when the
> WC autodetector cannot run.
> 
> For this fringe case generally assume that that WC is available, except
> in the well defined case of no PAT support on x86 which is tested by
> calling arch_can_pci_mmap_wc().
> 
> If WC is wrongly assumed to be available then it causes a small
> performance hit on paths in userspace that are tuned to the assumption
> that WC is available. There is no functional loss.
> 
> It is very unlikely that any platforms exist that lack WC and also care
> about the micro optimization of WC in the fringe case where
> autodetection does not work.
> 
> By removing the fairly bogus CONFIG tests this makes WC work broadly on
> all arches and all platforms.
> 
> Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
> Reviewed-by: Michael Guralnik <michaelgur@mellanox.com>
> Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
> ---
>  drivers/infiniband/hw/mlx5/main.c | 16 ++++------------
>  drivers/infiniband/hw/mlx5/mem.c  |  2 +-
>  2 files changed, 5 insertions(+), 13 deletions(-)

Applied to for-next, thanks

> diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
> index 66cd417f5d09..05804e4ba292 100644
> --- a/drivers/infiniband/hw/mlx5/main.c
> +++ b/drivers/infiniband/hw/mlx5/main.c
> @@ -39,9 +39,6 @@
>  #include <linux/dma-mapping.h>
>  #include <linux/slab.h>
>  #include <linux/bitmap.h>
> -#if defined(CONFIG_X86)
> -#include <asm/memtype.h>
> -#endif
>  #include <linux/sched.h>
>  #include <linux/sched/mm.h>
>  #include <linux/sched/task.h>
> @@ -2146,14 +2143,6 @@ static int uar_mmap(struct mlx5_ib_dev *dev, enum mlx5_ib_mmap_cmd cmd,
>  	switch (cmd) {
>  	case MLX5_IB_MMAP_WC_PAGE:
>  	case MLX5_IB_MMAP_ALLOC_WC:
> -/* Some architectures don't support WC memory */
> -#if defined(CONFIG_X86)
> -		if (!pat_enabled())
> -			return -EPERM;
> -#elif !(defined(CONFIG_PPC) || (defined(CONFIG_ARM) && defined(CONFIG_MMU)))
> -			return -EPERM;
> -#endif
> -	/* fall through */
>  	case MLX5_IB_MMAP_REGULAR_PAGE:
>  		/* For MLX5_IB_MMAP_REGULAR_PAGE do the best effort to get WC */
>  		prot = pgprot_writecombine(vma->vm_page_prot);
> @@ -2299,9 +2288,12 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm
>  	command = get_command(vma->vm_pgoff);
>  	switch (command) {
>  	case MLX5_IB_MMAP_WC_PAGE:
> +	case MLX5_IB_MMAP_ALLOC_WC:
> +		if (!dev->wc_support)
> +			return -EPERM;
> +		/* fall through */

This is apparently supposed to be spelled as

    fallthrough;

Now. I fixed it

Jason
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 66cd417f5d09..05804e4ba292 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -39,9 +39,6 @@ 
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 #include <linux/bitmap.h>
-#if defined(CONFIG_X86)
-#include <asm/memtype.h>
-#endif
 #include <linux/sched.h>
 #include <linux/sched/mm.h>
 #include <linux/sched/task.h>
@@ -2146,14 +2143,6 @@  static int uar_mmap(struct mlx5_ib_dev *dev, enum mlx5_ib_mmap_cmd cmd,
 	switch (cmd) {
 	case MLX5_IB_MMAP_WC_PAGE:
 	case MLX5_IB_MMAP_ALLOC_WC:
-/* Some architectures don't support WC memory */
-#if defined(CONFIG_X86)
-		if (!pat_enabled())
-			return -EPERM;
-#elif !(defined(CONFIG_PPC) || (defined(CONFIG_ARM) && defined(CONFIG_MMU)))
-			return -EPERM;
-#endif
-	/* fall through */
 	case MLX5_IB_MMAP_REGULAR_PAGE:
 		/* For MLX5_IB_MMAP_REGULAR_PAGE do the best effort to get WC */
 		prot = pgprot_writecombine(vma->vm_page_prot);
@@ -2299,9 +2288,12 @@  static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm
 	command = get_command(vma->vm_pgoff);
 	switch (command) {
 	case MLX5_IB_MMAP_WC_PAGE:
+	case MLX5_IB_MMAP_ALLOC_WC:
+		if (!dev->wc_support)
+			return -EPERM;
+		/* fall through */
 	case MLX5_IB_MMAP_NC_PAGE:
 	case MLX5_IB_MMAP_REGULAR_PAGE:
-	case MLX5_IB_MMAP_ALLOC_WC:
 		return uar_mmap(dev, command, vma, context);

 	case MLX5_IB_MMAP_GET_CONTIGUOUS_PAGES:
diff --git a/drivers/infiniband/hw/mlx5/mem.c b/drivers/infiniband/hw/mlx5/mem.c
index b90a3649e7d1..c19ec9fd8a63 100644
--- a/drivers/infiniband/hw/mlx5/mem.c
+++ b/drivers/infiniband/hw/mlx5/mem.c
@@ -316,7 +316,7 @@  int mlx5_ib_test_wc(struct mlx5_ib_dev *dev)
 	if (!dev->mdev->roce.roce_en &&
 	    port_type_cap == MLX5_CAP_PORT_TYPE_ETH) {
 		if (mlx5_core_is_pf(dev->mdev))
-			dev->wc_support = true;
+			dev->wc_support = arch_can_pci_mmap_wc();
 		return 0;
 	}