Skip to content

Commit 2f10e58

Browse files
Hakon-BuggeNipaLocal
authored andcommitted
net/mlx5: Brute force GFP_NOIO
In mlx5_core_init(), we call memalloc_noio_{save,restore} in a parenthetic fashion when enabled by the module parameter force_noio. This in order to conditionally enable mlx5_core to work aligned with I/O devices. Any work queued later on work-queues created during module initialization will inherit the PF_MEMALLOC_{NOIO,NOFS} flag(s), due to commit ("workqueue: Inherit NOIO and NOFS alloc flags"). We do this in order to enable ULPs using the RDMA stack and the mlx5_core driver to be used as a network block I/O device. This to support a filesystem on top of a raw block device which uses said ULP(s) and the RDMA stack as the network transport layer. Under intense memory pressure, we get memory reclaims. Assume the filesystem reclaims memory, goes to the raw block device, which calls into the ULP in question, which calls the RDMA stack. Now, if regular GFP_KERNEL allocations in ULP or the RDMA stack require reclaims to be fulfilled, we end up in a circular dependency. We break this circular dependency by: 1. Force all allocations in the ULP and the relevant RDMA stack to use GFP_NOIO, by means of a parenthetic use of memalloc_noio_{save,restore} on all relevant entry points. 2. Make sure work-queues inherits current->flags wrt. PF_MEMALLOC_{NOIO,NOFS}, such that work executed on the work-queue inherits the same flag(s). Signed-off-by: Håkon Bugge <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 73ac50a commit 2f10e58

File tree

1 file changed

+13
-1
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+13
-1
lines changed

drivers/net/ethernet/mellanox/mlx5/core/main.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include <linux/mlx5/vport.h>
4949
#include <linux/version.h>
5050
#include <net/devlink.h>
51+
#include <linux/sched/mm.h>
5152
#include "mlx5_core.h"
5253
#include "lib/eq.h"
5354
#include "fs_core.h"
@@ -87,6 +88,10 @@ static unsigned int prof_sel = MLX5_DEFAULT_PROF;
8788
module_param_named(prof_sel, prof_sel, uint, 0444);
8889
MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2");
8990

91+
static bool mlx5_core_force_noio;
92+
module_param_named(force_noio, mlx5_core_force_noio, bool, 0444);
93+
MODULE_PARM_DESC(force_noio, "Force the use of GFP_NOIO (Y/N)");
94+
9095
static u32 sw_owner_id[4];
9196
#define MAX_SW_VHCA_ID (BIT(__mlx5_bit_sz(cmd_hca_cap_2, sw_vhca_id)) - 1)
9297
static DEFINE_IDA(sw_vhca_ida);
@@ -2308,8 +2313,12 @@ static void mlx5_core_verify_params(void)
23082313

23092314
static int __init mlx5_init(void)
23102315
{
2316+
unsigned int noio_flags;
23112317
int err;
23122318

2319+
if (mlx5_core_force_noio)
2320+
noio_flags = memalloc_noio_save();
2321+
23132322
WARN_ONCE(strcmp(MLX5_ADEV_NAME, KBUILD_MODNAME),
23142323
"mlx5_core name not in sync with kernel module name");
23152324

@@ -2330,14 +2339,17 @@ static int __init mlx5_init(void)
23302339
if (err)
23312340
goto err_pci;
23322341

2333-
return 0;
2342+
goto out;
23342343

23352344
err_pci:
23362345
mlx5_sf_driver_unregister();
23372346
err_sf:
23382347
mlx5e_cleanup();
23392348
err_debug:
23402349
mlx5_unregister_debugfs();
2350+
out:
2351+
if (mlx5_core_force_noio)
2352+
memalloc_noio_restore(noio_flags);
23412353
return err;
23422354
}
23432355

0 commit comments

Comments
 (0)