scsi: target: tcmu: Prevent memory reclaim recursion
authorDamien Le Moal <damien.lemoal@wdc.com>
Fri, 8 Nov 2019 08:29:01 +0000 (17:29 +0900)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 9 Nov 2019 02:37:24 +0000 (21:37 -0500)
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().

Link: https://lore.kernel.org/r/20191108082901.417950-1-damien.lemoal@wdc.com
Reported-by: Masato Suzuki <masato.suzuki@wdc.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Acked-by: Mike Christie <mchristi@redhat.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_user.c

index 35be1be..0b9dfa6 100644 (file)
@@ -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;