net/mlx5: Use multi threaded workqueue for page fault handling
authorMoni Shoua <monis@mellanox.com>
Thu, 8 Nov 2018 19:10:14 +0000 (21:10 +0200)
committerLeon Romanovsky <leonro@mellanox.com>
Mon, 12 Nov 2018 20:21:32 +0000 (22:21 +0200)
Page fault events are processed in a workqueue context. Since each QP
can have up to two concurrent unrelated page-faults, one for requester
and one for responder, page-fault handling can be done in parallel.
Achieve this by changing the workqueue to be multi-threaded.
The number of threads is the same as the number of command interface
channels to avoid command interface bottlenecks.

In addition to multi-threads, change the workqueue flags to give it high
priority.

Stress benchmark shows that before this change 85% of page faults were
waiting in queue 8 seconds or more while after the change 98% of page
faults were waiting in queue 64 milliseconds or less. The number of threads
was chosen as the number of channels to the command interface.

Fixes: d9aaed838765 ("{net,IB}/mlx5: Refactor page fault handling")
Signed-off-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eq.c

index c1e1a16a9b07d4335bb4cdc3b29bdea3673b8fa2..aeab0c4f60f43a0a9bfd61f1d7dc8c531531bd90 100644 (file)
@@ -356,8 +356,9 @@ static int init_pf_ctx(struct mlx5_eq_pagefault *pf_ctx, const char *name)
        spin_lock_init(&pf_ctx->lock);
        INIT_WORK(&pf_ctx->work, eq_pf_action);
 
-       pf_ctx->wq = alloc_ordered_workqueue(name,
-                                            WQ_MEM_RECLAIM);
+       pf_ctx->wq = alloc_workqueue(name,
+                                    WQ_HIGHPRI | WQ_UNBOUND | WQ_MEM_RECLAIM,
+                                    MLX5_NUM_CMD_EQE);
        if (!pf_ctx->wq)
                return -ENOMEM;