default, it is helpful for large sized SMR or ZNS devices to
                         reduce memory cost by getting rid of fs metadata supports small
                         discard.
+memory=%s               Control memory mode. This supports "normal" and "low" modes.
+                        "low" mode is introduced to support low memory devices.
+                        Because of the nature of low memory devices, in this mode, f2fs
+                        will try to save memory sometimes by sacrificing performance.
+                        "normal" mode is the default mode and same as before.
 ======================== ============================================================
 
 Debugfs Entries
 
        int fsync_mode;                 /* fsync policy */
        int fs_mode;                    /* fs mode: LFS or ADAPTIVE */
        int bggc_mode;                  /* bggc mode: off, on or sync */
+       int memory_mode;                /* memory mode */
        int discard_unit;               /*
                                         * discard command's offset/size should
                                         * be aligned to this unit: block,
        DISCARD_UNIT_SECTION,   /* basic discard unit is section */
 };
 
+enum {
+       MEMORY_MODE_NORMAL,     /* memory mode for normal devices */
+       MEMORY_MODE_LOW,        /* memory mode for low memry devices */
+};
+
+
+
 static inline int f2fs_test_bit(unsigned int nr, char *addr);
 static inline void f2fs_set_bit(unsigned int nr, char *addr);
 static inline void f2fs_clear_bit(unsigned int nr, char *addr);
        return F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS;
 }
 
+static inline bool f2fs_low_mem_mode(struct f2fs_sb_info *sbi)
+{
+       return F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW;
+}
+
 static inline bool f2fs_may_compress(struct inode *inode)
 {
        if (IS_SWAPFILE(inode) || f2fs_is_pinned_file(inode) ||
 
        Opt_gc_merge,
        Opt_nogc_merge,
        Opt_discard_unit,
+       Opt_memory_mode,
        Opt_err,
 };
 
        {Opt_gc_merge, "gc_merge"},
        {Opt_nogc_merge, "nogc_merge"},
        {Opt_discard_unit, "discard_unit=%s"},
+       {Opt_memory_mode, "memory=%s"},
        {Opt_err, NULL},
 };
 
                        }
                        kfree(name);
                        break;
+               case Opt_memory_mode:
+                       name = match_strdup(&args[0]);
+                       if (!name)
+                               return -ENOMEM;
+                       if (!strcmp(name, "normal")) {
+                               F2FS_OPTION(sbi).memory_mode =
+                                               MEMORY_MODE_NORMAL;
+                       } else if (!strcmp(name, "low")) {
+                               F2FS_OPTION(sbi).memory_mode =
+                                               MEMORY_MODE_LOW;
+                       } else {
+                               kfree(name);
+                               return -EINVAL;
+                       }
+                       kfree(name);
+                       break;
                default:
                        f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value",
                                 p);
        else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION)
                seq_printf(seq, ",discard_unit=%s", "section");
 
+       if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_NORMAL)
+               seq_printf(seq, ",memory=%s", "normal");
+       else if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW)
+               seq_printf(seq, ",memory=%s", "low");
+
        return 0;
 }
 
        F2FS_OPTION(sbi).compress_ext_cnt = 0;
        F2FS_OPTION(sbi).compress_mode = COMPR_MODE_FS;
        F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_ON;
+       F2FS_OPTION(sbi).memory_mode = MEMORY_MODE_NORMAL;
 
        sbi->sb->s_flags &= ~SB_INLINECRYPT;