On 11/08/2019 02:29 AM, Damien Le Moal wrote: > Prevent recursion into the IO path under low memory conditions by using > GFP_NOIO in place of GFP_KERNEL when allocating a new command with > tcmu_alloc_cmd() and user ring space with tcmu_get_empty_block(). > > Reported-by: Masato Suzuki <masato.suzuki@xxxxxxx> > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> > --- > > Changes from v1: > * Added reported-by tag > > drivers/target/target_core_user.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c > index 35be1be87d2a..0b9dfa6b17bc 100644 > --- a/drivers/target/target_core_user.c > +++ b/drivers/target/target_core_user.c > @@ -499,7 +499,7 @@ static inline bool tcmu_get_empty_block(struct tcmu_dev *udev, > schedule_delayed_work(&tcmu_unmap_work, 0); > > /* try to get new page from the mm */ > - page = alloc_page(GFP_KERNEL); > + page = alloc_page(GFP_NOIO); > if (!page) > goto err_alloc; > > @@ -573,7 +573,7 @@ static struct tcmu_cmd *tcmu_alloc_cmd(struct se_cmd *se_cmd) > struct tcmu_dev *udev = TCMU_DEV(se_dev); > struct tcmu_cmd *tcmu_cmd; > > - tcmu_cmd = kmem_cache_zalloc(tcmu_cmd_cache, GFP_KERNEL); > + tcmu_cmd = kmem_cache_zalloc(tcmu_cmd_cache, GFP_NOIO); > if (!tcmu_cmd) > return NULL; > > @@ -584,7 +584,7 @@ static struct tcmu_cmd *tcmu_alloc_cmd(struct se_cmd *se_cmd) > tcmu_cmd_reset_dbi_cur(tcmu_cmd); > tcmu_cmd->dbi_cnt = tcmu_cmd_get_block_cnt(tcmu_cmd); > tcmu_cmd->dbi = kcalloc(tcmu_cmd->dbi_cnt, sizeof(uint32_t), > - GFP_KERNEL); > + GFP_NOIO); > if (!tcmu_cmd->dbi) { > kmem_cache_free(tcmu_cmd_cache, tcmu_cmd); > return NULL; > Acked-by: Mike Christie <mchristi@xxxxxxxxxx> We should also change tcmu_setup_cmd_timer so the gfp use in that code path is consistent. I think we can do that in a separate patch later as this one just fixes a specific bug.