lkml.org 
[lkml]   [2019]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[GIT PULL 08/26] lightnvm: pblk: cleanly fail when there is not enough memory
    Date
    From: Igor Konopko <igor.j.konopko@intel.com>

    L2P table can be huge in many cases, since it typically requires 1GB
    of DRAM for 1TB of drive. When there is not enough memory available,
    OOM killer turns on and kills random processes, which can be very
    annoying for users.

    This patch changes the flag for L2P table allocation on order to handle
    this situation in more user friendly way.

    GFP_KERNEL and __GPF_HIGHMEM are default flags used in parameterless
    vmalloc() calls, so they are also keeped in that patch. Additionally
    __GFP_NOWARN flag is added in order to hide very long dmesg warn in
    case of the allocation failures. The most important flag introduced
    in that patch is __GFP_RETRY_MAYFAIL, which would cause allocator
    to try use free memory and if not available to drop caches, but not
    to run OOM killer.

    Signed-off-by: Igor Konopko <igor.j.konopko@intel.com>
    Reviewed-by: Hans Holmberg <hans.holmberg@cnexlabs.com>
    Reviewed-by: Javier González <javier@javigon.com>
    Signed-off-by: Matias Bjørling <mb@lightnvm.io>
    ---
    drivers/lightnvm/pblk-init.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
    index 81e8ed4d31ea..e0df3de1ce83 100644
    --- a/drivers/lightnvm/pblk-init.c
    +++ b/drivers/lightnvm/pblk-init.c
    @@ -164,9 +164,14 @@ static int pblk_l2p_init(struct pblk *pblk, bool factory_init)
    int ret = 0;

    map_size = pblk_trans_map_size(pblk);
    - pblk->trans_map = vmalloc(map_size);
    - if (!pblk->trans_map)
    + pblk->trans_map = __vmalloc(map_size, GFP_KERNEL | __GFP_NOWARN
    + | __GFP_RETRY_MAYFAIL | __GFP_HIGHMEM,
    + PAGE_KERNEL);
    + if (!pblk->trans_map) {
    + pblk_err(pblk, "failed to allocate L2P (need %zu of memory)\n",
    + map_size);
    return -ENOMEM;
    + }

    pblk_ppa_set_empty(&ppa);

    --
    2.19.1
    \
     
     \ /
      Last update: 2019-05-04 20:40    [W:2.342 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site