ubi: fastmap: Add module parameter to control reserving filling pool PEBs
authorZhihao Cheng <chengzhihao1@huawei.com>
Mon, 28 Aug 2023 06:38:44 +0000 (14:38 +0800)
committerRichard Weinberger <richard@nod.at>
Sat, 28 Oct 2023 21:15:44 +0000 (23:15 +0200)
Adding 6th module parameter in 'mtd=xxx' to control whether or not
reserving PEBs for filling pool/wl_pool.

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
drivers/mtd/ubi/build.c
drivers/mtd/ubi/cdev.c
drivers/mtd/ubi/ubi.h

index 66d7b6a16aada8ac920f11de4a53fc789009b8f2..7d4ff1193db6f04a114b1e0fcdde3984644607d1 100644 (file)
@@ -35,7 +35,7 @@
 #define MTD_PARAM_LEN_MAX 64
 
 /* Maximum number of comma-separated items in the 'mtd=' parameter */
-#define MTD_PARAM_MAX_COUNT 5
+#define MTD_PARAM_MAX_COUNT 6
 
 /* Maximum value for the number of bad PEBs per 1024 PEBs */
 #define MAX_MTD_UBI_BEB_LIMIT 768
@@ -54,6 +54,7 @@
  * @vid_hdr_offs: VID header offset
  * @max_beb_per1024: maximum expected number of bad PEBs per 1024 PEBs
  * @enable_fm: enable fastmap when value is non-zero
+ * @need_resv_pool: reserve pool->max_size pebs when value is none-zero
  */
 struct mtd_dev_param {
        char name[MTD_PARAM_LEN_MAX];
@@ -61,6 +62,7 @@ struct mtd_dev_param {
        int vid_hdr_offs;
        int max_beb_per1024;
        int enable_fm;
+       int need_resv_pool;
 };
 
 /* Numbers of elements set in the @mtd_dev_param array */
@@ -825,6 +827,7 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
  * @vid_hdr_offset: VID header offset
  * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs
  * @disable_fm: whether disable fastmap
+ * @need_resv_pool: whether reserve pebs to fill fm_pool
  *
  * This function attaches MTD device @mtd_dev to UBI and assign @ubi_num number
  * to the newly created UBI device, unless @ubi_num is %UBI_DEV_NUM_AUTO, in
@@ -840,7 +843,8 @@ static int autoresize(struct ubi_device *ubi, int vol_id)
  * @ubi_devices_mutex.
  */
 int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
-                      int vid_hdr_offset, int max_beb_per1024, bool disable_fm)
+                      int vid_hdr_offset, int max_beb_per1024, bool disable_fm,
+                      bool need_resv_pool)
 {
        struct ubi_device *ubi;
        int i, err;
@@ -951,7 +955,7 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
                UBI_FM_MIN_POOL_SIZE);
 
        ubi->fm_wl_pool.max_size = ubi->fm_pool.max_size / 2;
-       ubi->fm_pool_rsv_cnt = ubi->fm_pool.max_size;
+       ubi->fm_pool_rsv_cnt = need_resv_pool ? ubi->fm_pool.max_size : 0;
        ubi->fm_disabled = (!fm_autoconvert || disable_fm) ? 1 : 0;
        if (fm_debug)
                ubi_enable_dbg_chk_fastmap(ubi);
@@ -1274,7 +1278,8 @@ static int __init ubi_init(void)
                mutex_lock(&ubi_devices_mutex);
                err = ubi_attach_mtd_dev(mtd, p->ubi_num,
                                         p->vid_hdr_offs, p->max_beb_per1024,
-                                        p->enable_fm == 0);
+                                        p->enable_fm == 0,
+                                        p->need_resv_pool != 0);
                mutex_unlock(&ubi_devices_mutex);
                if (err < 0) {
                        pr_err("UBI error: cannot attach mtd%d\n",
@@ -1483,6 +1488,18 @@ static int ubi_mtd_param_parse(const char *val, const struct kernel_param *kp)
        } else
                p->enable_fm = 0;
 
+       token = tokens[5];
+       if (token) {
+               int err = kstrtoint(token, 10, &p->need_resv_pool);
+
+               if (err) {
+                       pr_err("UBI error: bad value for need_resv_pool parameter: %s\n",
+                               token);
+                       return -EINVAL;
+               }
+       } else
+               p->need_resv_pool = 0;
+
        mtd_devs += 1;
        return 0;
 }
@@ -1496,6 +1513,7 @@ MODULE_PARM_DESC(mtd, "MTD devices to attach. Parameter format: mtd=<name|num|pa
                      __stringify(CONFIG_MTD_UBI_BEB_LIMIT) ") if 0)\n"
                      "Optional \"ubi_num\" parameter specifies UBI device number which have to be assigned to the newly created UBI device (assigned automatically by default)\n"
                      "Optional \"enable_fm\" parameter determines whether to enable fastmap during attach. If the value is non-zero, fastmap is enabled. Default value is 0.\n"
+                     "Optional \"need_resv_pool\" parameter determines whether to reserve pool->max_size pebs during attach. If the value is non-zero, peb reservation is enabled. Default value is 0.\n"
                      "\n"
                      "Example 1: mtd=/dev/mtd0 - attach MTD device /dev/mtd0.\n"
                      "Example 2: mtd=content,1984 mtd=4 - attach MTD device with name \"content\" using VID header offset 1984, and MTD device number 4 with default VID header offset.\n"
index f43430b9c1e65c326e3c870a7743d32d5181ccd8..98aa00344b29bab91785ff684636936ba7034f7c 100644 (file)
@@ -1041,7 +1041,8 @@ static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
                 */
                mutex_lock(&ubi_devices_mutex);
                err = ubi_attach_mtd_dev(mtd, req.ubi_num, req.vid_hdr_offset,
-                                        req.max_beb_per1024, !!req.disable_fm);
+                                        req.max_beb_per1024, !!req.disable_fm,
+                                        false);
                mutex_unlock(&ubi_devices_mutex);
                if (err < 0)
                        put_mtd_device(mtd);
index 6e20a0fee72fd30a3e8c77bded7d195a9e7bc812..a5ec566df0d74d255e200f7c67f493a859d52dc1 100644 (file)
@@ -944,7 +944,7 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
 /* build.c */
 int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num,
                       int vid_hdr_offset, int max_beb_per1024,
-                      bool disable_fm);
+                      bool disable_fm, bool need_resv_pool);
 int ubi_detach_mtd_dev(int ubi_num, int anyway);
 struct ubi_device *ubi_get_device(int ubi_num);
 void ubi_put_device(struct ubi_device *ubi);