IB/mlx5: Generally use the WC auto detection test result
authorYishai Hadas <yishaih@mellanox.com>
Wed, 18 Mar 2020 10:03:23 +0000 (12:03 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 24 Mar 2020 23:22:21 +0000 (20:22 -0300)
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.

Link: https://lore.kernel.org/r/20200318100323.46659-1-leon@kernel.org
Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Reviewed-by: Michael Guralnik <michaelgur@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mem.c

index b7151f8..1f91d9e 100644 (file)
@@ -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>
@@ -2145,14 +2142,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);
@@ -2298,9 +2287,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;
+               fallthrough;
        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:
index b90a364..c19ec9f 100644 (file)
@@ -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;
        }