Skip to content

Commit 77530d1

Browse files
zmlin1998richardweinberger
authored andcommitted
mtd: ubi: skip programming unused bits in ubi headers
This patch prevents unnecessary programming of bits in ec_hdr and vid_hdr that are not used or read during normal UBI operation. These unused bits are typcially already set to 1 in erased flash and do not need to be explicitly programmed to 0 if they are not used. Programming such unused areas offers no functional benefit and may result in unnecessary flash wear, reducing the overall lifetime of the device. By skipping these writes, we preserve the flash state as much as possible and minimize wear caused by redundant operations. This change ensures that only necessary fields are written when preparing UBI headers, improving flash efficiency without affecting functionality. Additionally, the Kioxia TC58NVG1S3HTA00 datasheet (page 63) also notes that continuous program/erase cycling with a high percentage of '0' bits in the data pattern can accelerate block endurance degradation. This further supports avoiding large 0x00 patterns. Link: https://europe.kioxia.com/content/dam/kioxia/newidr/productinfo/datasheet/201910/DST_TC58NVG1S3HTA00-TDE_EN_31442.pdf Signed-off-by: Cheng Ming Lin <[email protected]> Reviewed-by: Miquel Raynal <[email protected]> Reviewed-by: Zhihao Cheng <[email protected]> Signed-off-by: Richard Weinberger <[email protected]>
1 parent c0d612b commit 77530d1

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

drivers/mtd/ubi/io.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,8 @@ int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,
868868
return -EROFS;
869869
}
870870

871+
memset((char *)ec_hdr + UBI_EC_HDR_SIZE, 0xFF, ubi->ec_hdr_alsize - UBI_EC_HDR_SIZE);
872+
871873
err = ubi_io_write(ubi, ec_hdr, pnum, 0, ubi->ec_hdr_alsize);
872874
return err;
873875
}
@@ -1150,6 +1152,14 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
11501152
return -EROFS;
11511153
}
11521154

1155+
if (ubi->vid_hdr_shift) {
1156+
memset((char *)p, 0xFF, ubi->vid_hdr_shift);
1157+
memset((char *)p + ubi->vid_hdr_shift + UBI_VID_HDR_SIZE, 0xFF,
1158+
ubi->vid_hdr_alsize - (ubi->vid_hdr_shift + UBI_VID_HDR_SIZE));
1159+
} else {
1160+
memset((char *)p + UBI_VID_HDR_SIZE, 0xFF, ubi->vid_hdr_alsize - UBI_VID_HDR_SIZE);
1161+
}
1162+
11531163
err = ubi_io_write(ubi, p, pnum, ubi->vid_hdr_aloffset,
11541164
ubi->vid_hdr_alsize);
11551165
return err;

0 commit comments

Comments
 (0)