[openwrt/openwrt] ath79: increase openmesh sysupgrade copy block size

LEDE Commits lede-commits at lists.infradead.org
Mon Dec 28 13:49:27 EST 2020


adrian pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/d0a9cf662ee0e5bbe49f6b443e1374e73b10a946

commit d0a9cf662ee0e5bbe49f6b443e1374e73b10a946
Author: Sven Eckelmann <sven at narfation.org>
AuthorDate: Mon Dec 28 16:59:13 2020 +0100

    ath79: increase openmesh sysupgrade copy block size
    
    The upgrade script for the openmesh sysupgrade procedure used always an 1
    byte block size. This made it easier to seek the correct position in the CE
    image and to make sure the right amount of data was copied. But this also
    meant that the reading/writing of data required an excessive amount of
    syscalls and copy operations.
    
    A 5.4MB big sysupgrade image on an OM2P-HS v3 needed roughly 120s for the
    write operation (170s in total) during the sysupgrade.
    
    But it is possible to reduce this overhead slightly:
    
    * index access to read the file size can be done in single 8 byte chunk
      (while doing the seek with byte granularity) because each size entry is
      example 8 bytes long
    * the fwupgrade.cfg can be read as one block (while seeking to its position
      using its actual byte offset) because it should be rather small and fit
      into the RAM easily
    * the kernel can be read in 1KB blocks (while seking to its positions using
      its actual byte offset) because the the size of the kernel is always a
      multiple of the NOR flash block size (64KB and 256KB)
    
    This results in a sysupgrade write time of roughly 90s (140s in total).
    
    This could be reduced even further when also using larger chunks for the
    rootfs. But the squashfs rootfs image is at the moment always
    
      (256KB or 64KB) * block + 4 bytes
    
    long. It would be expected that the time for the sysupgrade write could be
    reduced to roughly 30s (80s in total) when busybox's dd would support
    the iflag count_bytes.
    
    Reported-by: Adrian Schmutzler <freifunk at adrianschmutzler.de>
    Signed-off-by: Sven Eckelmann <sven at narfation.org>
---
 .../ath79/generic/base-files/lib/upgrade/openmesh.sh     | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/openmesh.sh b/target/linux/ath79/generic/base-files/lib/upgrade/openmesh.sh
index 35a4ccfbfe..fdb57dbed9 100644
--- a/target/linux/ath79/generic/base-files/lib/upgrade/openmesh.sh
+++ b/target/linux/ath79/generic/base-files/lib/upgrade/openmesh.sh
@@ -30,6 +30,7 @@ platform_do_upgrade_openmesh()
 	local inactive_mtd="$(find_mtd_index $PART_NAME)"
 	local inactive_offset="$(cat /sys/class/mtd/mtd${inactive_mtd}/offset)"
 	local total_size="$(cat /sys/class/mtd/mtd${inactive_mtd}/size)"
+	local total_kbs=$((total_size / 1024))
 	local flash_start_mem=0x9f000000
 	local data_offset=$((64 * 1024))
 
@@ -63,15 +64,16 @@ platform_do_upgrade_openmesh()
 	local primary_kernel_mtd="3"
 	[ "$inactive_mtd" = "$primary_kernel_mtd" ] || next_boot_part="2"
 
-	local cfg_size=$(dd if="$img_path" bs=2 skip=35 count=4 2>/dev/null)
+	local cfg_size=$(dd if="$img_path" bs=8 skip=70 count=1 iflag=skip_bytes 2>/dev/null)
 	local cfg_length=$((0x$cfg_size))
-	local cfg_content=$(dd if="$img_path" bs=1 skip=$data_offset count=$cfg_length 2>/dev/null)
+	local cfg_content=$(dd if="$img_path" bs=$cfg_length skip=$data_offset count=1 iflag=skip_bytes 2>/dev/null)
 
-	local kernel_size=$(dd if="$img_path" bs=2 skip=71 count=4 2>/dev/null)
+	local kernel_size=$(dd if="$img_path" bs=8 skip=142 count=1 iflag=skip_bytes 2>/dev/null)
 	local kernel_length=$((0x$kernel_size))
+	local kernel_kbs=$((kernel_length / 1024))
 	local kernel_md5=$(cfg_value_get "$cfg_content" "vmlinux" "md5sum")
 
-	local rootfs_size=$(dd if="$img_path" bs=2 skip=107 count=4 2>/dev/null)
+	local rootfs_size=$(dd if="$img_path" bs=8 skip=214 count=1 iflag=skip_bytes 2>/dev/null)
 	local rootfs_length=$((0x$rootfs_size))
 	local rootfs_md5=$(cfg_value_get "$cfg_content" "rootfs" "md5sum")
 	local rootfs_checksize=$(cfg_value_get "$cfg_content" "rootfs" "checksize")
@@ -83,7 +85,7 @@ platform_do_upgrade_openmesh()
 	mtd -q erase inactive
 	dd if="$img_path" bs=1 skip=$((data_offset + cfg_length + kernel_length)) count=$rootfs_length 2>&- | \
 		mtd -n -p $kernel_length $restore_backup write - $PART_NAME
-	dd if="$img_path" bs=1 skip=$((data_offset + cfg_length)) count=$kernel_length 2>&- | \
+	dd if="$img_path" bs=1024 skip=$((data_offset + cfg_length)) count=$kernel_kbs iflag=skip_bytes 2>&- | \
 		mtd -n write - $PART_NAME
 
 	# prepare new u-boot env
@@ -93,12 +95,12 @@ platform_do_upgrade_openmesh()
 		echo "bootseq 2,1" > $setenv_script
 	fi
 
-	printf "kernel_size_%i %i\n" $next_boot_part $((kernel_length / 1024)) >> $setenv_script
+	printf "kernel_size_%i %i\n" $next_boot_part $kernel_kbs >> $setenv_script
 	printf "vmlinux_start_addr 0x%08x\n" $((flash_start_mem + inactive_offset)) >> $setenv_script
 	printf "vmlinux_size 0x%08x\n" ${kernel_length} >> $setenv_script
 	printf "vmlinux_checksum %s\n" ${kernel_md5} >> $setenv_script
 
-	printf "rootfs_size_%i %i\n" $next_boot_part $(((total_size-kernel_length) / 1024)) >> $setenv_script
+	printf "rootfs_size_%i %i\n" $next_boot_part $((total_kbs - kernel_kbs)) >> $setenv_script
 	printf "rootfs_start_addr 0x%08x\n" $((flash_start_mem+inactive_offset+kernel_length)) >> $setenv_script
 	printf "rootfs_size %s\n" $rootfs_checksize >> $setenv_script
 	printf "rootfs_checksum %s\n" ${rootfs_md5} >> $setenv_script



More information about the lede-commits mailing list