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 |
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 --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; }