mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 11:55:12 +07:00
mlx4_core: restore optimal ICM memory allocation
Commit1383cb8103
("mlx4_core: allocate ICM memory in page size chunks") brought two regressions caught in our regression suite. The big one is an additional cost of 256 bytes of overhead per 4096 bytes, or 6.25 % which is unacceptable since ICM can be pretty large. This comes from having to allocate one struct mlx4_icm_chunk (256 bytes) per MLX4_TABLE_CHUNK, which the buggy commit shrank to 4KB (instead of prior 256KB) Note that mlx4_alloc_icm() is already able to try high order allocations and fallback to low-order allocations under high memory pressure. Most of these allocations happen right after boot time, when we get plenty of non fragmented memory, there is really no point being so pessimistic and break huge pages into order-0 ones just for fun. We only have to tweak gfp_mask a bit, to help falling back faster, without risking OOM killings. Second regression is an KASAN fault, that will need further investigations. Fixes:1383cb8103
("mlx4_core: allocate ICM memory in page size chunks") Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Tariq Toukan <tariqt@mellanox.com> Cc: John Sperbeck <jsperbeck@google.com> Cc: Tarick Bedeir <tarick@google.com> Cc: Qing Huang <qing.huang@oracle.com> Cc: Daniel Jurgens <danielj@mellanox.com> Cc: Zhu Yanjun <yanjun.zhu@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
918fe1b315
commit
885892fb37
@ -43,12 +43,13 @@
|
||||
#include "fw.h"
|
||||
|
||||
/*
|
||||
* We allocate in page size (default 4KB on many archs) chunks to avoid high
|
||||
* order memory allocations in fragmented/high usage memory situation.
|
||||
* We allocate in as big chunks as we can, up to a maximum of 256 KB
|
||||
* per chunk. Note that the chunks are not necessarily in contiguous
|
||||
* physical memory.
|
||||
*/
|
||||
enum {
|
||||
MLX4_ICM_ALLOC_SIZE = PAGE_SIZE,
|
||||
MLX4_TABLE_CHUNK_SIZE = PAGE_SIZE,
|
||||
MLX4_ICM_ALLOC_SIZE = 1 << 18,
|
||||
MLX4_TABLE_CHUNK_SIZE = 1 << 18,
|
||||
};
|
||||
|
||||
static void mlx4_free_icm_pages(struct mlx4_dev *dev, struct mlx4_icm_chunk *chunk)
|
||||
@ -135,6 +136,7 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
|
||||
struct mlx4_icm *icm;
|
||||
struct mlx4_icm_chunk *chunk = NULL;
|
||||
int cur_order;
|
||||
gfp_t mask;
|
||||
int ret;
|
||||
|
||||
/* We use sg_set_buf for coherent allocs, which assumes low memory */
|
||||
@ -178,13 +180,17 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages,
|
||||
while (1 << cur_order > npages)
|
||||
--cur_order;
|
||||
|
||||
mask = gfp_mask;
|
||||
if (cur_order)
|
||||
mask &= ~__GFP_DIRECT_RECLAIM;
|
||||
|
||||
if (coherent)
|
||||
ret = mlx4_alloc_icm_coherent(&dev->persist->pdev->dev,
|
||||
&chunk->mem[chunk->npages],
|
||||
cur_order, gfp_mask);
|
||||
cur_order, mask);
|
||||
else
|
||||
ret = mlx4_alloc_icm_pages(&chunk->mem[chunk->npages],
|
||||
cur_order, gfp_mask,
|
||||
cur_order, mask,
|
||||
dev->numa_node);
|
||||
|
||||
if (ret) {
|
||||
|
Loading…
Reference in New Issue
Block a user