• Qing Huang's avatar
    mlx4_core: allocate ICM memory in page size chunks · 1383cb81
    Qing Huang authored
    When a system is under memory presure (high usage with fragments),
    the original 256KB ICM chunk allocations will likely trigger kernel
    memory management to enter slow path doing memory compact/migration
    ops in order to complete high order memory allocations.
    
    When that happens, user processes calling uverb APIs may get stuck
    for more than 120s easily even though there are a lot of free pages
    in smaller chunks available in the system.
    
    Syslog:
    ...
    Dec 10 09:04:51 slcc03db02 kernel: [397078.572732] INFO: task
    oracle_205573_e:205573 blocked for more than 120 seconds.
    ...
    
    With 4KB ICM chunk size on x86_64 arch, the above issue is fixed.
    
    However in order to support smaller ICM chunk size, we need to fix
    another issue in large size kcalloc allocations.
    
    E.g.
    Setting log_num_mtt=30 requires 1G mtt entries. With the 4KB ICM chunk
    size, each ICM chunk can only hold 512 mtt entries (8 bytes for each mtt
    entry). So we need a 16MB allocation for a table->icm pointer array to
    hold 2M pointers which can easily cause kcalloc to fail.
    
    The solution is to use kvzalloc to replace kcalloc which will fall back
    to vmalloc automatically if kmalloc fails.
    Signed-off-by: default avatarQing Huang <qing.huang@oracle.com>
    Acked-by: default avatarDaniel Jurgens <danielj@mellanox.com>
    Reviewed-by: default avatarZhu Yanjun <yanjun.zhu@oracle.com>
    Reviewed-by: default avatarTariq Toukan <tariqt@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1383cb81
icm.c 11.3 KB