diff mbox series

[v2,5/8] lightnvm: pblk: Cleanly fail when there is not enough memory

Message ID 20190305135120.29284-6-igor.j.konopko@intel.com (mailing list archive)
State New, archived
Headers show
Series lightnvm: bugfixes and improvements | expand

Commit Message

Igor Konopko March 5, 2019, 1:51 p.m. UTC
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: Javier González <javier@javigon.com>
---
 drivers/lightnvm/pblk-init.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

Hans Holmberg March 6, 2019, 2:20 p.m. UTC | #1
Looks good,

Reviewed-by: Hans Holmberg <hans.holmberg@cnexlabs.com>

On Tue, Mar 5, 2019 at 2:54 PM Igor Konopko <igor.j.konopko@intel.com> wrote:
>
> 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: Javier González <javier@javigon.com>
> ---
>  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 f4b6d8f2..97b4c6e 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 %ld of memory)\n",
> +                               map_size);
>                 return -ENOMEM;
> +       }
>
>         pblk_ppa_set_empty(&ppa);
>
> --
> 2.9.5
>
diff mbox series

Patch

diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c
index f4b6d8f2..97b4c6e 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 %ld of memory)\n",
+				map_size);
 		return -ENOMEM;
+	}
 
 	pblk_ppa_set_empty(&ppa);