From ecea7a6ac9b6c0d8a0756e839feb61755e590b96 Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Wed, 10 Jun 2020 20:04:00 +0900 Subject: [PATCH 01/16] scripts: mkbootimg_rpi4.sh: Add support make boot image for arm64 Support make boot image for arm64. Change-Id: I2cb18a0a383fff21c2f158473a51339b1867338a Signed-off-by: Hoegeun Kwon --- scripts/mkbootimg_rpi4.sh | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/scripts/mkbootimg_rpi4.sh b/scripts/mkbootimg_rpi4.sh index 42d0443..5fbf319 100755 --- a/scripts/mkbootimg_rpi4.sh +++ b/scripts/mkbootimg_rpi4.sh @@ -3,6 +3,7 @@ BOOT_PATH="rpi4/boot" USER_ID=`id -u` GROUP_ID=`id -g` +IS_64BIT=`cat .config | grep CONFIG_64BIT` rm -f boot.img rm -rf tmp @@ -12,26 +13,40 @@ mkdir tmp mkfs.vfat -F 16 -C -n BOOT boot.img 65536 sudo mount -o loop,uid=$USER_ID,gid=$GROUP_ID,showexec boot.img ./tmp -cp -a $BOOT_PATH/config.txt ./tmp +if [ -n "$IS_64BIT" ]; then + echo "Create 64bit boot image" + cp -a $BOOT_PATH/config_64bit.txt ./tmp/config.txt +else + echo "Create 32bit boot image" + cp -a $BOOT_PATH/config.txt ./tmp +fi cp -a $BOOT_PATH/LICENCE.broadcom ./tmp cp -a $BOOT_PATH/start*.elf ./tmp cp -a $BOOT_PATH/fixup*.dat ./tmp -cp -a arch/arm/boot/zImage ./tmp -cp -a arch/arm/boot/dts/bcm*.dtb ./tmp +if [ -n "$IS_64BIT" ]; then + cp -a arch/arm64/boot/Image ./tmp + cp -a arch/arm64/boot/dts/broadcom/bcm*.dtb ./tmp +else + cp -a arch/arm/boot/zImage ./tmp + cp -a arch/arm/boot/dts/bcm*.dtb ./tmp +fi # install u-boot files extracted from u-boot-rpi4 rpm package in download.tizen.org. TMP_UBOOT_PATH=tmp_uboot mkdir -p ${TMP_UBOOT_PATH} pushd ${TMP_UBOOT_PATH} -REPO_URL=http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/armv7l/ +if [ -n "$IS_64BIT" ]; then + REPO_URL=http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/aarch64/ +else + REPO_URL=http://download.tizen.org/snapshots/tizen/unified/latest/repos/standard/packages/armv7l/ +fi rm -f index.html* wget ${REPO_URL} UBOOT=`awk -F\" '{ print $2 }' index.html | grep u-boot-rpi4` wget ${REPO_URL}${UBOOT} unrpm ${UBOOT} - -# install u-boot.img having optee.bin extracted from atf-rpi4 rpm package in download.tizen.org. popd + cp -a ${TMP_UBOOT_PATH}/boot/* ./tmp rm -rf ${TMP_UBOOT_PATH} @@ -46,8 +61,14 @@ mkdir -p tmp_modules dd if=/dev/zero of=modules.img bs=1024 count=20480 mkfs.ext4 -q -F -t ext4 -b 1024 -L modules modules.img sudo mount -o loop modules.img ./tmp/lib/modules - -make modules_install ARCH=arm INSTALL_MOD_PATH=./tmp_modules INSTALL_MOD_STRIP=1 CROSS_COMPILE=arm-linux-gnueabi- +if [ -n "$IS_64BIT" ]; then + export ARCH=arm64 + export CROSS_COMPILE=aarch64-linux-gnu- +else + export ARCH=arm + export CROSS_COMPILE=arm-linux-gnueabi- +fi +make modules_install INSTALL_MOD_PATH=./tmp_modules INSTALL_MOD_STRIP=1 sudo mv ./tmp_modules/lib/modules/* ./tmp/lib/modules sudo -n chown root:root ./tmp/lib/modules -R @@ -59,7 +80,11 @@ rm -rf tmp tmp_modules # Create boot tarball for the lthor flashing DATE=`date +%Y%m%d` -BOOT_TARBALL=tizen-local-${DATE}-boot-armv7l-rpi4.tar +if [ -n "$IS_64BIT" ]; then + BOOT_TARBALL=tizen-local-${DATE}-boot-arm64-rpi4.tar +else + BOOT_TARBALL=tizen-local-${DATE}-boot-armv7l-rpi4.tar +fi tar cf ${BOOT_TARBALL} boot.img modules.img if [ "$?" != "0" ]; then -- 2.7.4 From 38d5f5700aa805f8f8d5e3247efc18bbe1c3f342 Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Wed, 10 Jun 2020 19:50:21 +0900 Subject: [PATCH 02/16] tools: Add support build for arm64 Support kernel build for arm64 Change-Id: Id02cf2e57e4c8db134821a50aaaeed278d2407ae Signed-off-by: Hoegeun Kwon --- build-rpi4-arm32.sh | 28 ---------------------------- build-rpi4.sh | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 28 deletions(-) delete mode 100755 build-rpi4-arm32.sh create mode 100755 build-rpi4.sh diff --git a/build-rpi4-arm32.sh b/build-rpi4-arm32.sh deleted file mode 100755 index c518c88..0000000 --- a/build-rpi4-arm32.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# Check this system has ccache -check_ccache() -{ - type ccache - if [ "$?" -eq "0" ]; then - CCACHE=ccache - fi -} - -check_ccache - -rm -f arch/arm/boot/zImage -rm -f arch/arm/boot/dts/*.dtb - -if ! [ -e .config ] ; then - make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tizen_bcm2711_defconfig -fi - -make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8 - -if [ ! -f "./arch/arm/boot/zImage" ]; then - echo "Build fail" - exit 1 -fi - -scripts/mkbootimg_rpi4.sh diff --git a/build-rpi4.sh b/build-rpi4.sh new file mode 100755 index 0000000..34abe1b --- /dev/null +++ b/build-rpi4.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +if [ $# != 1 ]; then + echo "Usage : $0 " + echo " architecture : arm or arm64" + echo " e.g) $0 arm" + exit +fi + +# Check this system has ccache +check_ccache() +{ + type ccache + if [ "$?" -eq "0" ]; then + CCACHE=ccache + fi +} + +check_ccache + +if [ $1 = "arm" ]; then + echo "ARM" + + rm -f arch/arm/boot/zImage + rm -f arch/arm/boot/dts/*.dtb + + if ! [ -e .config ] ; then + make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tizen_bcm2711_defconfig + fi + + make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8 + + if [ ! -f "./arch/arm/boot/zImage" ]; then + echo "Build fail" + exit 1 + fi +elif [ $1 = "arm64" ]; then + echo "ARM64" + + rm -f arch/arm64/boot/Image + rm -f arch/arm64/boot/dts/broadcom/*.dtb + + if ! [ -e .config ] ; then + make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- tizen_bcm2711_defconfig + fi + make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 + if [ ! -f "./arch/arm64/boot/Image" ]; then + echo "Build fail" + exit 1 + fi +fi + +scripts/mkbootimg_rpi4.sh -- 2.7.4 From 32c2be716ffcc72733869422d7d55bc89d425904 Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Mon, 15 Jun 2020 16:20:33 +0900 Subject: [PATCH 03/16] scripts: mkbootimg_rpi4.sh: Fix how to check 64bit The CONFIG_64BIT_TIME configuration is used by 32bit kernel, so it is having problem identifying 64bit. So modify to "CONFIG_64BIT=y". Change-Id: I0e8b3e34b3faf5f307ce9bc0fef266397ae697a7 Signed-off-by: Hoegeun Kwon --- scripts/mkbootimg_rpi4.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mkbootimg_rpi4.sh b/scripts/mkbootimg_rpi4.sh index 5fbf319..f78575d 100755 --- a/scripts/mkbootimg_rpi4.sh +++ b/scripts/mkbootimg_rpi4.sh @@ -3,7 +3,7 @@ BOOT_PATH="rpi4/boot" USER_ID=`id -u` GROUP_ID=`id -g` -IS_64BIT=`cat .config | grep CONFIG_64BIT` +IS_64BIT=`cat .config | grep "CONFIG_64BIT=y"` rm -f boot.img rm -rf tmp -- 2.7.4 From 23c911e7aaa583c890b30026d48a375466ca8a84 Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Mon, 15 Jun 2020 17:30:12 +0900 Subject: [PATCH 04/16] usb: dwc_otg: Fix pointer-to-int-cast build warning Fix pointer to int cast build warning. drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c:486:5: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] (int)dwc_otg_hcd->fiq_state->mphi_regs.base); Change-Id: Ic495d320dbf41aaeeb77ed303fce8cc4cc121c67 Signed-off-by: Hoegeun Kwon --- drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c index 46dadc4..9d60ac6 100644 --- a/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c +++ b/drivers/usb/host/dwc_otg/dwc_otg_hcd_linux.c @@ -482,8 +482,8 @@ static void hcd_init_fiq(void *cookie) otg_dev->os_dep.mphi_base + 0x1f0; dwc_otg_hcd->fiq_state->mphi_regs.swirq_clr = otg_dev->os_dep.mphi_base + 0x1f4; - DWC_WARN("Fake MPHI regs_base at 0x%08x", - (int)dwc_otg_hcd->fiq_state->mphi_regs.base); + DWC_WARN("Fake MPHI regs_base at 0x%px", + dwc_otg_hcd->fiq_state->mphi_regs.base); } else { dwc_otg_hcd->fiq_state->mphi_regs.ctrl = otg_dev->os_dep.mphi_base + 0x4c; -- 2.7.4 From a75b90842ebbecd9a2f47c75ab8a27519c25e5f4 Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Mon, 22 Jun 2020 15:58:23 +0900 Subject: [PATCH 05/16] ARM: configs: tizen_bcm2711: change BLK_DEV_RAM_SIZE to 32MB Change BLK_DEV_RAM_SIZE from 12MB to 32MB. Change-Id: I6004bc1f12cdcb3f8c4c3b86cc13c974b3880dba Signed-off-by: Jaehoon Chung --- arch/arm/configs/tizen_bcm2711_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/configs/tizen_bcm2711_defconfig b/arch/arm/configs/tizen_bcm2711_defconfig index 9002bae..1e00067 100644 --- a/arch/arm/configs/tizen_bcm2711_defconfig +++ b/arch/arm/configs/tizen_bcm2711_defconfig @@ -214,7 +214,7 @@ CONFIG_OF_CONFIGFS=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=12288 +CONFIG_BLK_DEV_RAM_SIZE=32768 CONFIG_TIZEN_INFORM_REBOOT=y CONFIG_TIZEN_INFORM_PATH="/mnt/inform/reboot-param.bin" CONFIG_SCSI=y -- 2.7.4 From b38fbe462ee3f089ce79118675d61f82aa4209e3 Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Mon, 22 Jun 2020 16:03:28 +0900 Subject: [PATCH 06/16] ARM64: configs: tizen_bcm2711: change BLK_DEV_RAM_SIZE to 32MB Change BLK_DEV_RAM_SIZE from 12MB to 32MB. Change-Id: Ifbdd9d5ac0ba36cb6ef65b96ac981b496573be6b Signed-off-by: Jaehoon Chung --- arch/arm64/configs/tizen_bcm2711_defconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm64/configs/tizen_bcm2711_defconfig b/arch/arm64/configs/tizen_bcm2711_defconfig index ddd886a..569396a 100644 --- a/arch/arm64/configs/tizen_bcm2711_defconfig +++ b/arch/arm64/configs/tizen_bcm2711_defconfig @@ -210,7 +210,7 @@ CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=12288 +CONFIG_BLK_DEV_RAM_SIZE=32768 CONFIG_TIZEN_INFORM_REBOOT=y CONFIG_TIZEN_INFORM_PATH="/mnt/inform/reboot-param.bin" CONFIG_SCSI=y -- 2.7.4 From f50de597dd9b4f84f6c41cec644c6dcad147e67a Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Tue, 30 Jun 2020 14:32:02 +0900 Subject: [PATCH 07/16] drm/vc4: add extcon hdmi connection uevent Add extcon hdmi connection and disconnection uevent when extcon module is enabled. The vc4_hdmi detection is done by polling way, so extcon uevent for connection is a bit slow after changing real hdmi cable state. Change-Id: I962f7a39b7a3344f9793e436ef28c36b123571a8 Signed-off-by: Seung-Woo Kim Signed-off-by: Hoegeun Kwon --- drivers/gpu/drm/vc4/vc4_hdmi.c | 42 ++++++++++++++++++++++++++++++++++++++++-- drivers/gpu/drm/vc4/vc4_hdmi.h | 9 +++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 031d4e5..200f30b 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -114,6 +115,7 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) { struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); bool connected = false; + enum drm_connector_status status; if (vc4_hdmi->hpd_gpio) { if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^ @@ -134,10 +136,22 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) kfree(edid); } } - return connector_status_connected; + status = connector_status_connected; + goto out; } cec_phys_addr_invalidate(vc4_hdmi->cec_adap); - return connector_status_disconnected; + status = connector_status_disconnected; + +out: +#ifdef CONFIG_EXTCON + if (status != vc4_hdmi->status) { + extcon_set_state_sync(vc4_hdmi->edev, EXTCON_DISP_HDMI, + (status == connector_status_connected ? + true : false)); + vc4_hdmi->status = status; + } +#endif + return status; } static void vc4_hdmi_connector_destroy(struct drm_connector *connector) @@ -1640,6 +1654,13 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) return 0; } +#ifdef CONFIG_EXTCON +static const unsigned int vc4_hdmi_extcon_cable[] = { + EXTCON_DISP_HDMI, + EXTCON_NONE, +}; +#endif + static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); @@ -1677,6 +1698,23 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) return -EPROBE_DEFER; } +#ifdef CONFIG_EXTCON + vc4_hdmi->status = connector_status_disconnected; + + /* Initialize extcon device */ + vc4_hdmi->edev = devm_extcon_dev_allocate(dev, vc4_hdmi_extcon_cable); + if (IS_ERR(vc4_hdmi->edev)) { + dev_err(dev, "failed to allocate memory for extcon\n"); + return PTR_ERR(vc4_hdmi->edev); + } + + ret = devm_extcon_dev_register(dev, vc4_hdmi->edev); + if (ret) { + dev_err(dev, "failed to register extcon device\n"); + return ret; + } +#endif + /* Only use the GPIO HPD pin if present in the DT, otherwise * we'll use the HDMI core's register. */ diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index 60f7bf9..c3125587 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -26,6 +26,10 @@ struct drm_display_mode; struct vc4_hdmi; struct vc4_hdmi_register; +#ifdef CONFIG_EXTCON +struct extcon_dev; +#endif + enum vc4_hdmi_phy_channel { PHY_LANE_0 = 0, PHY_LANE_1, @@ -161,6 +165,11 @@ struct vc4_hdmi { struct debugfs_regset32 hdmi_regset; struct debugfs_regset32 hd_regset; + +#ifdef CONFIG_EXTCON + enum drm_connector_status status; + struct extcon_dev *edev; +#endif }; static inline struct vc4_hdmi * -- 2.7.4 From 2aab8469d74ff27ed1796377505a01f60fb5626c Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Thu, 4 Jun 2020 13:54:35 +0900 Subject: [PATCH 08/16] block: zram: Add support for dynamic compressor switch Orginally, the compression algorithm cannot be changed until resetting it if zram is once initialized by setting disksize. Since this, however, zram can have multiple compressor and switch them dynamically. With this, zram uses the algorithm which is fast but has low compression ratio at first, and can change to the one that is slightly slower but having higher ratio when the target get bothered by low memory. Change-Id: I3fd817e299a76284b8b28e318a4822107e6a5f6d Signed-off-by: Dongwoo Lee --- drivers/block/zram/zcomp.c | 84 ++++++++++++++++++++++++++++++------------- drivers/block/zram/zcomp.h | 6 ++-- drivers/block/zram/zram_drv.c | 54 +++++++++++++++++----------- drivers/block/zram/zram_drv.h | 2 ++ 4 files changed, 98 insertions(+), 48 deletions(-) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 1a8564a..a02f08d 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -63,24 +63,6 @@ static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp) return zstrm; } -bool zcomp_available_algorithm(const char *comp) -{ - int i; - - i = __sysfs_match_string(backends, -1, comp); - if (i >= 0) - return true; - - /* - * Crypto does not ignore a trailing new line symbol, - * so make sure you don't supply a string containing - * one. - * This also means that we permit zcomp initialisation - * with any compressing algorithm known to crypto api. - */ - return crypto_has_comp(comp, 0, 0) == 1; -} - /* show available compressors */ ssize_t zcomp_available_show(const char *comp, char *buf) { @@ -202,29 +184,43 @@ cleanup: return ret; } -void zcomp_destroy(struct zcomp *comp) +static void zcomp_destroy(struct zcomp *comp) { cpuhp_state_remove_instance(CPUHP_ZCOMP_PREPARE, &comp->node); free_percpu(comp->stream); kfree(comp); } +void zcomp_reset(struct list_head *blist) +{ + struct list_head *curr, *next; + struct zcomp *comp; + int i; + + list_for_each_safe(curr, next, blist) { + comp = list_entry(curr, struct zcomp, list); + list_del(&comp->list); + + i = __sysfs_match_string(backends, -1, comp->name); + if (i < 0) + kfree(comp->name); + + zcomp_destroy(comp); + } +} + /* - * search available compressors for requested algorithm. * allocate new zcomp and initialize it. return compressing * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL) * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in * case of allocation error, or any other error potentially * returned by zcomp_init(). */ -struct zcomp *zcomp_create(const char *compress) +static struct zcomp *zcomp_create(const char *compress) { struct zcomp *comp; int error; - if (!zcomp_available_algorithm(compress)) - return ERR_PTR(-EINVAL); - comp = kzalloc(sizeof(struct zcomp), GFP_KERNEL); if (!comp) return ERR_PTR(-ENOMEM); @@ -237,3 +233,43 @@ struct zcomp *zcomp_create(const char *compress) } return comp; } + +struct zcomp *zcomp_get_instance(struct list_head *blist, const char *name) +{ + struct zcomp *comp; + const char *comp_name = NULL; + int i; + + list_for_each_entry(comp, blist, list) + if (sysfs_streq(name, comp->name)) + return comp; + + i = __sysfs_match_string(backends, -1, name); + if (i >= 0) + comp_name = backends[i]; + else { + /* + * Crypto does not ignore a trailing new line symbol, + * so make sure you don't supply a string containing + * one. + * This also means that we permit zcomp initialisation + * with any compressing algorithm known to crypto api. + */ + if (crypto_has_comp(name, 0, 0) == 1) + comp_name = kstrdup(name, GFP_KERNEL); + else + return ERR_PTR(-ENOENT); + } + + comp = zcomp_create(comp_name); + if (IS_ERR(comp)) { + pr_err("Cannot initialise %s compressing backend\n", name); + if (i < 0) + kfree(comp_name); + return comp; + } + + list_add(&comp->list, blist); + + return comp; +} diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 1806475..aff688d 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -17,15 +17,15 @@ struct zcomp { struct zcomp_strm * __percpu *stream; const char *name; struct hlist_node node; + struct list_head list; }; int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node); int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node); ssize_t zcomp_available_show(const char *comp, char *buf); -bool zcomp_available_algorithm(const char *comp); -struct zcomp *zcomp_create(const char *comp); -void zcomp_destroy(struct zcomp *comp); +struct zcomp *zcomp_get_instance(struct list_head *blist, const char *name); +void zcomp_reset(struct list_head *blist); struct zcomp_strm *zcomp_stream_get(struct zcomp *comp); void zcomp_stream_put(struct zcomp *comp); diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 1bf4a90..6335e66 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -121,6 +121,17 @@ static unsigned long zram_get_element(struct zram *zram, u32 index) return zram->table[index].element; } +static inline void zram_set_compressor(struct zram *zram, u32 index, + struct zcomp *comp) +{ + zram->table[index].compressor = comp; +} + +static struct zcomp *zram_get_compressor(struct zram *zram, u32 index) +{ + return zram->table[index].compressor; +} + static size_t zram_get_obj_size(struct zram *zram, u32 index) { return zram->table[index].flags & (BIT(ZRAM_FLAG_SHIFT) - 1); @@ -985,6 +996,7 @@ static ssize_t comp_algorithm_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { struct zram *zram = dev_to_zram(dev); + struct zcomp *comp; char compressor[ARRAY_SIZE(zram->compressor)]; size_t sz; @@ -994,16 +1006,12 @@ static ssize_t comp_algorithm_store(struct device *dev, if (sz > 0 && compressor[sz - 1] == '\n') compressor[sz - 1] = 0x00; - if (!zcomp_available_algorithm(compressor)) + comp = zcomp_get_instance(&zram->backend_list, compressor); + if (IS_ERR_OR_NULL(comp)) return -EINVAL; down_write(&zram->init_lock); - if (init_done(zram)) { - up_write(&zram->init_lock); - pr_info("Can't change algorithm for initialized device\n"); - return -EBUSY; - } - + zram->comp = comp; strcpy(zram->compressor, compressor); up_write(&zram->init_lock); return len; @@ -1198,6 +1206,7 @@ static void zram_free_page(struct zram *zram, size_t index) return; zs_free(zram->mem_pool, handle); + zram->table[index].compressor = NULL; atomic64_sub(zram_get_obj_size(zram, index), &zram->stats.compr_data_size); @@ -1253,12 +1262,13 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index, kunmap_atomic(dst); ret = 0; } else { - struct zcomp_strm *zstrm = zcomp_stream_get(zram->comp); + struct zcomp *comp = zram_get_compressor(zram, index); + struct zcomp_strm *zstrm = zcomp_stream_get(comp); dst = kmap_atomic(page); ret = zcomp_decompress(zstrm, src, size, dst); kunmap_atomic(dst); - zcomp_stream_put(zram->comp); + zcomp_stream_put(comp); } zs_unmap_object(zram->mem_pool, handle); zram_slot_unlock(zram, index); @@ -1312,6 +1322,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, unsigned int comp_len = 0; void *src, *dst, *mem; struct zcomp_strm *zstrm; + struct zcomp *comp = NULL; struct page *page = bvec->bv_page; unsigned long element = 0; enum zram_pageflags flags = 0; @@ -1327,13 +1338,14 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, kunmap_atomic(mem); compress_again: - zstrm = zcomp_stream_get(zram->comp); + comp = zram->comp; + zstrm = zcomp_stream_get(comp); src = kmap_atomic(page); ret = zcomp_compress(zstrm, src, &comp_len); kunmap_atomic(src); if (unlikely(ret)) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(comp); pr_err("Compression failed! err=%d\n", ret); zs_free(zram->mem_pool, handle); return ret; @@ -1361,7 +1373,7 @@ compress_again: __GFP_HIGHMEM | __GFP_MOVABLE); if (!handle) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(comp); atomic64_inc(&zram->stats.writestall); handle = zs_malloc(zram->mem_pool, comp_len, GFP_NOIO | __GFP_HIGHMEM | @@ -1375,7 +1387,7 @@ compress_again: update_used_max(zram, alloced_pages); if (zram->limit_pages && alloced_pages > zram->limit_pages) { - zcomp_stream_put(zram->comp); + zcomp_stream_put(comp); zs_free(zram->mem_pool, handle); return -ENOMEM; } @@ -1389,7 +1401,7 @@ compress_again: if (comp_len == PAGE_SIZE) kunmap_atomic(src); - zcomp_stream_put(zram->comp); + zcomp_stream_put(comp); zs_unmap_object(zram->mem_pool, handle); atomic64_add(comp_len, &zram->stats.compr_data_size); out: @@ -1411,6 +1423,8 @@ out: } else { zram_set_handle(zram, index, handle); zram_set_obj_size(zram, index, comp_len); + if (comp_len < PAGE_SIZE) + zram_set_compressor(zram, index, comp); } zram_slot_unlock(zram, index); @@ -1675,7 +1689,6 @@ out: static void zram_reset_device(struct zram *zram) { - struct zcomp *comp; u64 disksize; down_write(&zram->init_lock); @@ -1687,7 +1700,6 @@ static void zram_reset_device(struct zram *zram) return; } - comp = zram->comp; disksize = zram->disksize; zram->disksize = 0; @@ -1698,7 +1710,8 @@ static void zram_reset_device(struct zram *zram) /* I/O operation under all of CPU are done so let's free */ zram_meta_free(zram, disksize); memset(&zram->stats, 0, sizeof(zram->stats)); - zcomp_destroy(comp); + zram->comp = NULL; + zcomp_reset(&zram->backend_list); reset_bdev(zram); } @@ -1727,10 +1740,8 @@ static ssize_t disksize_store(struct device *dev, goto out_unlock; } - comp = zcomp_create(zram->compressor); - if (IS_ERR(comp)) { - pr_err("Cannot initialise %s compressing backend\n", - zram->compressor); + comp = zcomp_get_instance(&zram->backend_list, zram->compressor); + if (IS_ERR_OR_NULL(comp)) { err = PTR_ERR(comp); goto out_free_meta; } @@ -1953,6 +1964,7 @@ static int zram_add(void) device_add_disk(NULL, zram->disk, zram_disk_attr_groups); strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); + INIT_LIST_HEAD(&zram->backend_list); zram_debugfs_register(zram); pr_info("Added device: %s\n", zram->disk->disk_name); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index f2fd46d..83b320f 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -63,6 +63,7 @@ struct zram_table_entry { unsigned long element; }; unsigned long flags; + struct zcomp *compressor; #ifdef CONFIG_ZRAM_MEMORY_TRACKING ktime_t ac_time; #endif @@ -112,6 +113,7 @@ struct zram { * zram is claimed so open request will be failed */ bool claim; /* Protected by bdev->bd_mutex */ + struct list_head backend_list; struct file *backing_dev; #ifdef CONFIG_ZRAM_WRITEBACK spinlock_t wb_limit_lock; -- 2.7.4 From 69754ff94b914494b841213700c61723cd75d503 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Thu, 4 Jun 2020 13:54:44 +0900 Subject: [PATCH 09/16] lib: zstd: Improve decode performance To speed up decode performance, optimizations are brought from zstd github repository and ported as kernel-style. Since the low-level algorithm is preferred in linux due to compression/decompression performance (default level 3), the optimization for low-level is chosed as follows: [1] lib: zstd: Speed up single segment zstd_fast by 5% (https://github.com/facebook/zstd/pull/1562/commits/95624b77e477752b3c380c22be7bcf67f06c9934) [2] perf improvements for zstd decode (https://github.com/facebook/zstd/pull/1668/commits/29d1e81bbdfc21085529623e7bc5abcb3e1627ae) [3] updated double_fast complementary insertion (https://github.com/facebook/zstd/pull/1681/commits/d1327738c277643f09c972a407083ad73c8ecf7b) [4] Improvements in zstd decode performance (https://github.com/facebook/zstd/pull/1756/commits/b83059958246dfcb5b91af9c187fad8c706869a0) [5] Optimize decompression and fix wildcopy overread (https://github.com/facebook/zstd/pull/1804/commits/efd37a64eaff5a0a26ae2566fdb45dc4a0c91673) [6] Improve ZSTD_highbit32's codegen (https://github.com/facebook/zstd/commit/a07da7b0db682c170a330a8c21585be3d68275fa) [7] Optimize decompression speed for gcc and clang (#1892) (https://github.com/facebook/zstd/commit/718f00ff6fe42db7e6ba09a7f7992b3e85283f77) [8] Fix performance regression on aarch64 with clang (https://github.com/facebook/zstd/pull/1973/commits/cb2abc3dbe010113d9e00ca3b612bf61983145a2) Change-Id: Ia2cf120879a415988dbbc2fce59a994915c8c77c Signed-off-by: Dongwoo Lee --- lib/zstd/bitstream.h | 25 ++- lib/zstd/compress.c | 201 +++++++++++++------ lib/zstd/decompress.c | 490 ++++++++++++++++++++-------------------------- lib/zstd/huf_decompress.c | 24 ++- lib/zstd/zstd_internal.h | 82 ++++++-- lib/zstd/zstd_opt.h | 4 +- 6 files changed, 448 insertions(+), 378 deletions(-) diff --git a/lib/zstd/bitstream.h b/lib/zstd/bitstream.h index 3a49784..8fbe2ed 100644 --- a/lib/zstd/bitstream.h +++ b/lib/zstd/bitstream.h @@ -145,7 +145,7 @@ ZSTD_STATIC size_t BIT_readBitsFast(BIT_DStream_t *bitD, unsigned nbBits); /*-************************************************************** * Internal functions ****************************************************************/ -ZSTD_STATIC unsigned BIT_highbit32(register U32 val) { return 31 - __builtin_clz(val); } +ZSTD_STATIC unsigned BIT_highbit32(register U32 val) { return __builtin_clz(val) ^ 31; } /*===== Local Constants =====*/ static const unsigned BIT_mask[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, @@ -333,6 +333,24 @@ ZSTD_STATIC size_t BIT_readBitsFast(BIT_DStream_t *bitD, U32 nbBits) return value; } +/*! BIT_reloadDStreamFast() : + * Similar to BIT_reloadDStream(), but with two differences: + * 1. bitsConsumed <= sizeof(bitD->bitContainer)*8 must hold! + * 2. Returns BIT_DStream_overflow when bitD->ptr < bitD->limitPtr, at this + * point you must use BIT_reloadDStream() to reload. + */ +ZSTD_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t *bitD) +{ + if (unlikely(bitD->ptr < bitD->start + sizeof(bitD->bitContainer))) + return BIT_DStream_overflow; + + bitD->ptr -= bitD->bitsConsumed >> 3; + bitD->bitsConsumed &= 7; + bitD->bitContainer = ZSTD_readLEST(bitD->ptr); + + return BIT_DStream_unfinished; +} + /*! BIT_reloadDStream() : * Refill `bitD` from buffer previously set in BIT_initDStream() . * This function is safe, it guarantees it will not read beyond src buffer. @@ -344,10 +362,7 @@ ZSTD_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t *bitD) return BIT_DStream_overflow; if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) { - bitD->ptr -= bitD->bitsConsumed >> 3; - bitD->bitsConsumed &= 7; - bitD->bitContainer = ZSTD_readLEST(bitD->ptr); - return BIT_DStream_unfinished; + return BIT_reloadDStreamFast(bitD); } if (bitD->ptr == bitD->start) { if (bitD->bitsConsumed < sizeof(bitD->bitContainer) * 8) diff --git a/lib/zstd/compress.c b/lib/zstd/compress.c index 5e0b670..4a33566 100644 --- a/lib/zstd/compress.c +++ b/lib/zstd/compress.c @@ -853,15 +853,46 @@ ZSTD_STATIC size_t ZSTD_compressSequences(ZSTD_CCtx *zc, void *dst, size_t dstCa return cSize; } +/*! ZSTD_safecopyLiterals() : + * memcpy() function that won't read beyond more than WILDCOPY_OVERLENGTH bytes past ilimit_w. + * Only called when the sequence ends past ilimit_w, so it only needs to be optimized for single + * large copies. + */ +static void ZSTD_safecopyLiterals(BYTE *op, BYTE const *ip, BYTE const * const iend, BYTE const *ilimit_w) +{ + if (ip <= ilimit_w) { + ZSTD_wildcopy(op, ip, ilimit_w - ip, ZSTD_no_overlap); + + op += ilimit_w - ip; + ip = ilimit_w; + } + while (ip < iend) + *op++ = *ip++; +} + /*! ZSTD_storeSeq() : Store a sequence (literal length, literals, offset code and match length code) into seqStore_t. `offsetCode` : distance to match, or 0 == repCode. `matchCode` : matchLength - MINMATCH */ -ZSTD_STATIC void ZSTD_storeSeq(seqStore_t *seqStorePtr, size_t litLength, const void *literals, U32 offsetCode, size_t matchCode) +ZSTD_STATIC void ZSTD_storeSeq(seqStore_t *seqStorePtr, size_t litLength, const void *literals, const BYTE *litLimit, U32 offsetCode, size_t matchCode) { + BYTE const * const litLimit_w = litLimit - WILDCOPY_OVERLENGTH; + BYTE const * const litEnd = literals + litLength; /* copy Literals */ - ZSTD_wildcopy(seqStorePtr->lit, literals, litLength); + /* We are guaranteed at least 8 bytes of literals space because of HASH_READ_SIZE and + * MINMATCH. + */ + if (litEnd <= litLimit_w) { + /* Common case we can use wildcopy. + * First copy 16 bytes, because literals are likely short. + */ + ZSTD_copy16(seqStorePtr->lit, literals); + if (litLength > 16) + ZSTD_wildcopy(seqStorePtr->lit+16, literals+16, (ptrdiff_t)litLength-16, ZSTD_no_overlap); + } else { + ZSTD_safecopyLiterals(seqStorePtr->lit, literals, litEnd, litLimit_w); + } seqStorePtr->lit += litLength; /* literal Length */ @@ -1010,9 +1041,12 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx *cctx, const void *src, size_t sr U32 *const hashTable = cctx->hashTable; U32 const hBits = cctx->params.cParams.hashLog; seqStore_t *seqStorePtr = &(cctx->seqStore); + size_t const stepSize = 2; const BYTE *const base = cctx->base; const BYTE *const istart = (const BYTE *)src; - const BYTE *ip = istart; + /* We check ip0 (ip + 0) and ip1 (ip + 1) each loop */ + const BYTE *ip0 = istart; + const BYTE *ip1; const BYTE *anchor = istart; const U32 lowestIndex = cctx->dictLimit; const BYTE *const lowest = base + lowestIndex; @@ -1022,9 +1056,10 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx *cctx, const void *src, size_t sr U32 offsetSaved = 0; /* init */ - ip += (ip == lowest); + ip0 += (ip0 == lowest); + ip1 = ip0 + 1; { - U32 const maxRep = (U32)(ip - lowest); + U32 const maxRep = (U32)(ip0 - lowest); if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; if (offset_1 > maxRep) @@ -1032,58 +1067,88 @@ void ZSTD_compressBlock_fast_generic(ZSTD_CCtx *cctx, const void *src, size_t sr } /* Main Search Loop */ - while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ + while (ip1 < ilimit) { /* < instead of <=, because check at (ip0+2) */ size_t mLength; - size_t const h = ZSTD_hashPtr(ip, hBits, mls); - U32 const curr = (U32)(ip - base); - U32 const matchIndex = hashTable[h]; - const BYTE *match = base + matchIndex; - hashTable[h] = curr; /* update hash table */ - - if ((offset_1 > 0) & (ZSTD_read32(ip + 1 - offset_1) == ZSTD_read32(ip + 1))) { - mLength = ZSTD_count(ip + 1 + 4, ip + 1 + 4 - offset_1, iend) + 4; - ip++; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH); - } else { - U32 offset; - if ((matchIndex <= lowestIndex) || (ZSTD_read32(match) != ZSTD_read32(ip))) { - ip += ((ip - anchor) >> g_searchStrength) + 1; - continue; - } - mLength = ZSTD_count(ip + 4, match + 4, iend) + 4; - offset = (U32)(ip - match); - while (((ip > anchor) & (match > lowest)) && (ip[-1] == match[-1])) { - ip--; - match--; - mLength++; - } /* catch up */ - offset_2 = offset_1; - offset_1 = offset; + BYTE const *ip2 = ip0 + 2; + size_t const h0 = ZSTD_hashPtr(ip0, hBits, mls); + U32 const val0 = ZSTD_read32(ip0); + size_t const h1 = ZSTD_hashPtr(ip1, hBits, mls); + U32 const val1 = ZSTD_read32(ip1); + U32 const current0 = (U32)(ip0 - base); + U32 const current1 = (U32)(ip1 - base); + U32 const matchIndex0 = hashTable[h0]; + U32 const matchIndex1 = hashTable[h1]; + BYTE const *repMatch = ip2 - offset_1; + const BYTE *match0 = base + matchIndex0; + const BYTE *match1 = base + matchIndex1; + U32 offcode; + + hashTable[h0] = current0; + hashTable[h1] = current1; + + if ((offset_1 > 0) & (ZSTD_read32(repMatch) == ZSTD_read32(ip2))) { + mLength = ip2[-1] == repMatch[-1] ? 1 : 0; + ip0 = ip2 - mLength; + match0 = repMatch - mLength; + offcode = 0; + goto _match; + } + if ((matchIndex0 > lowestIndex) && ZSTD_read32(match0) == val0) { + goto _offset; + } + if ((matchIndex1 > lowestIndex) && ZSTD_read32(match1) == val1) { + ip0 = ip1; + match0 = match1; + goto _offset; + } + { + size_t const step = ((ip0 - anchor) >> (g_searchStrength - 1)) + stepSize; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH); + ip0 += step; + ip1 += step; + continue; } +_offset: /* Requires: ip0, match0 */ + /* Compute the offset code */ + offset_2 = offset_1; + offset_1 = (U32)(ip0 - match0); + offcode = offset_1 + ZSTD_REP_MOVE; + mLength = 0; + /* Count the backwards match length */ + while (((ip0 > anchor) & (match0 > lowest)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } /* catch up */ + +_match: /* Requires: ip0, match0, offcode */ + /* Count the forward length */ + mLength += ZSTD_count(ip0 + mLength + 4, match0 + mLength + 4, iend) + 4; + ZSTD_storeSeq(seqStorePtr, ip0-anchor, anchor, iend, offcode, mLength - MINMATCH); /* match found */ - ip += mLength; - anchor = ip; + ip0 += mLength; + anchor = ip0; + ip1 = ip0 + 1; - if (ip <= ilimit) { + if (ip0 <= ilimit) { /* Fill Table */ - hashTable[ZSTD_hashPtr(base + curr + 2, hBits, mls)] = curr + 2; /* here because curr+2 could be > iend-8 */ - hashTable[ZSTD_hashPtr(ip - 2, hBits, mls)] = (U32)(ip - 2 - base); + hashTable[ZSTD_hashPtr(base + current0 + 2, hBits, mls)] = current0 + 2; /* here because curr+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0 - 2, hBits, mls)] = (U32)(ip0 - 2 - base); /* check immediate repcode */ - while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) { + while ((ip0 <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip0) == ZSTD_read32(ip0 - offset_2)))) { /* store sequence */ - size_t const rLength = ZSTD_count(ip + 4, ip + 4 - offset_2, iend) + 4; + size_t const rLength = ZSTD_count(ip0 + 4, ip0 + 4 - offset_2, iend) + 4; { U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; } /* swap offset_2 <=> offset_1 */ - hashTable[ZSTD_hashPtr(ip, hBits, mls)] = (U32)(ip - base); - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength - MINMATCH); - ip += rLength; - anchor = ip; + hashTable[ZSTD_hashPtr(ip0, hBits, mls)] = (U32)(ip0 - base); + ip0 += rLength; + ip1 = ip0 + 1; + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, rLength - MINMATCH); + anchor = ip0; continue; /* faster when present ... (?) */ } } @@ -1150,7 +1215,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx *ctx, const void * const BYTE *repMatchEnd = repIndex < dictLimit ? dictEnd : iend; mLength = ZSTD_count_2segments(ip + 1 + EQUAL_READ32, repMatch + EQUAL_READ32, iend, repMatchEnd, lowPrefixPtr) + EQUAL_READ32; ip++; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, 0, mLength - MINMATCH); } else { if ((matchIndex < lowestIndex) || (ZSTD_read32(match) != ZSTD_read32(ip))) { ip += ((ip - anchor) >> g_searchStrength) + 1; @@ -1169,7 +1234,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx *ctx, const void * offset = curr - matchIndex; offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, offset + ZSTD_REP_MOVE, mLength - MINMATCH); } } @@ -1194,7 +1259,7 @@ static void ZSTD_compressBlock_fast_extDict_generic(ZSTD_CCtx *ctx, const void * U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, repLength2 - MINMATCH); + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, repLength2 - MINMATCH); hashTable[ZSTD_hashPtr(ip, hBits, mls)] = curr2; ip += repLength2; anchor = ip; @@ -1294,7 +1359,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx *cctx, const void *src, siz if ((offset_1 > 0) & (ZSTD_read32(ip + 1 - offset_1) == ZSTD_read32(ip + 1))) { /* note : by construction, offset_1 <= curr */ mLength = ZSTD_count(ip + 1 + 4, ip + 1 + 4 - offset_1, iend) + 4; ip++; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, 0, mLength - MINMATCH); } else { U32 offset; if ((matchIndexL > lowestIndex) && (ZSTD_read64(matchLong) == ZSTD_read64(ip))) { @@ -1336,7 +1401,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx *cctx, const void *src, siz offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, offset + ZSTD_REP_MOVE, mLength - MINMATCH); } /* match found */ @@ -1345,10 +1410,14 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx *cctx, const void *src, siz if (ip <= ilimit) { /* Fill Table */ - hashLong[ZSTD_hashPtr(base + curr + 2, hBitsL, 8)] = hashSmall[ZSTD_hashPtr(base + curr + 2, hBitsS, mls)] = - curr + 2; /* here because curr+2 could be > iend-8 */ - hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = hashSmall[ZSTD_hashPtr(ip - 2, hBitsS, mls)] = (U32)(ip - 2 - base); + { + U32 const insert_idx = curr + 2; + hashLong[ZSTD_hashPtr(base + insert_idx, hBitsL, 8)] = insert_idx; + hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = (U32)(ip - 2 - base); + hashSmall[ZSTD_hashPtr(base + insert_idx, hBitsS, mls)] = insert_idx; + hashSmall[ZSTD_hashPtr(ip - 1, hBitsS, mls)] = (U32)(ip - 1 - base); + } /* check immediate repcode */ while ((ip <= ilimit) && ((offset_2 > 0) & (ZSTD_read32(ip) == ZSTD_read32(ip - offset_2)))) { /* store sequence */ @@ -1360,7 +1429,7 @@ void ZSTD_compressBlock_doubleFast_generic(ZSTD_CCtx *cctx, const void *src, siz } /* swap offset_2 <=> offset_1 */ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip - base); hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip - base); - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, rLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, rLength - MINMATCH); ip += rLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -1437,7 +1506,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const const BYTE *repMatchEnd = repIndex < dictLimit ? dictEnd : iend; mLength = ZSTD_count_2segments(ip + 1 + 4, repMatch + 4, iend, repMatchEnd, lowPrefixPtr) + 4; ip++; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, 0, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, 0, mLength - MINMATCH); } else { if ((matchLongIndex > lowestIndex) && (ZSTD_read64(matchLong) == ZSTD_read64(ip))) { const BYTE *matchEnd = matchLongIndex < dictLimit ? dictEnd : iend; @@ -1452,7 +1521,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, offset + ZSTD_REP_MOVE, mLength - MINMATCH); } else if ((matchIndex > lowestIndex) && (ZSTD_read32(match) == ZSTD_read32(ip))) { size_t const h3 = ZSTD_hashPtr(ip + 1, hBitsL, 8); @@ -1485,7 +1554,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const } offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, offset + ZSTD_REP_MOVE, mLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, ip - anchor, anchor, iend, offset + ZSTD_REP_MOVE, mLength - MINMATCH); } else { ip += ((ip - anchor) >> g_searchStrength) + 1; @@ -1499,10 +1568,14 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const if (ip <= ilimit) { /* Fill Table */ - hashSmall[ZSTD_hashPtr(base + curr + 2, hBitsS, mls)] = curr + 2; - hashLong[ZSTD_hashPtr(base + curr + 2, hBitsL, 8)] = curr + 2; - hashSmall[ZSTD_hashPtr(ip - 2, hBitsS, mls)] = (U32)(ip - 2 - base); - hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = (U32)(ip - 2 - base); + { + U32 const insert_idx = curr + 2; + + hashLong[ZSTD_hashPtr(base + insert_idx, hBitsL, 8)] = insert_idx; + hashLong[ZSTD_hashPtr(ip - 2, hBitsL, 8)] = (U32)(ip - 2 - base); + hashSmall[ZSTD_hashPtr(base + insert_idx, hBitsS, mls)] = insert_idx; + hashSmall[ZSTD_hashPtr(ip - 1, hBitsS, mls)] = (U32)(ip - 1 - base); + } /* check immediate repcode */ while (ip <= ilimit) { U32 const curr2 = (U32)(ip - base); @@ -1516,7 +1589,7 @@ static void ZSTD_compressBlock_doubleFast_extDict_generic(ZSTD_CCtx *ctx, const U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, repLength2 - MINMATCH); + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, repLength2 - MINMATCH); hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = curr2; hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = curr2; ip += repLength2; @@ -2016,7 +2089,7 @@ void ZSTD_compressBlock_lazy_generic(ZSTD_CCtx *ctx, const void *src, size_t src _storeSequence: { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, litLength, anchor, iend, (U32)offset, matchLength - MINMATCH); anchor = ip = start + matchLength; } @@ -2027,7 +2100,7 @@ _storeSequence: offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */ - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, matchLength - MINMATCH); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -2210,7 +2283,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx *ctx, const void *src, si /* store sequence */ _storeSequence : { size_t const litLength = start - anchor; - ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, litLength, anchor, iend, (U32)offset, matchLength - MINMATCH); anchor = ip = start + matchLength; } @@ -2228,7 +2301,7 @@ void ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx *ctx, const void *src, si offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap offset history */ - ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength - MINMATCH); + ZSTD_storeSeq(seqStorePtr, 0, anchor, iend, 0, matchLength - MINMATCH); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ diff --git a/lib/zstd/decompress.c b/lib/zstd/decompress.c index 269ee9a..b90e1de 100644 --- a/lib/zstd/decompress.c +++ b/lib/zstd/decompress.c @@ -876,40 +876,113 @@ typedef struct { uPtrDiff gotoDict; } seqState_t; +/*! ZSTD_overlapCopy8() : + * Copies 8 bytes from ip to op and updates op and ip where ip <= op. + * If the offset is < 8 then the offset is spread to at least 8 bytes. + * + * Precondition: *ip <= *op + * Postcondition: *op - *op >= 8 + */ +static inline __attribute__((always_inline)) void ZSTD_overlapCopy8(BYTE **op, BYTE const **ip, size_t offset) +{ + if (offset < 8) { + /* close range match, overlap */ + static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */ + static const int dec64table[] = { 8, 8, 8, 7, 8, 9, 10, 11 }; /* subtracted */ + int const sub2 = dec64table[offset]; + (*op)[0] = (*ip)[0]; + (*op)[1] = (*ip)[1]; + (*op)[2] = (*ip)[2]; + (*op)[3] = (*ip)[3]; + *ip += dec32table[offset]; + ZSTD_copy4(*op+4, *ip); + *ip -= sub2; + } else { + ZSTD_copy8(*op, *ip); + } + *ip += 8; + *op += 8; +} + +/*! ZSTD_safecopy() : + * Specialized version of memcpy() that is allowed to READ up to WILDCOPY_OVERLENGTH past the input buffer + * and write up to 16 bytes past oend_w (op >= oend_w is allowed). + * This function is only called in the uncommon case where the sequence is near the end of the block. It + * should be fast for a single long sequence, but can be slow for several short sequences. + * + * @param ovtype controls the overlap detection + * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart. + * - ZSTD_overlap_src_before_dst: The src and dst may overlap and may be any distance apart. + * The src buffer must be before the dst buffer. + */ +static void ZSTD_safecopy(BYTE *op, BYTE *const oend_w, BYTE const *ip, ptrdiff_t length, enum ZSTD_overlap_e ovtype) +{ + ptrdiff_t const diff = op - ip; + BYTE *const oend = op + length; + + if (length < 8) { + /* Handle short lengths. */ + while (op < oend) + *op++ = *ip++; + return; + } + if (ovtype == ZSTD_overlap_src_before_dst) { + /* Copy 8 bytes and ensure the offset >= 8 when there can be overlap. */ + ZSTD_overlapCopy8(&op, &ip, diff); + } + + if (oend <= oend_w) { + /* No risk of overwrite. */ + ZSTD_wildcopy(op, ip, length, ovtype); + return; + } + if (op <= oend_w) { + /* Wildcopy until we get close to the end. */ + ZSTD_wildcopy(op, ip, oend_w - op, ovtype); + ip += oend_w - op; + op = oend_w; + } + /* Handle the leftovers. */ + while (op < oend) + *op++ = *ip++; +} + +/* ZSTD_execSequenceEnd(): + * This version handles cases that are near the end of the output buffer. It requires + * more careful checks to make sure there is no overflow. By separating out these hard + * and unlikely cases, we can speed up the common cases. + * + * NOTE: This function needs to be fast for a single long sequence, but doesn't need + * to be optimized for many small sequences, since those fall into ZSTD_execSequence(). + */ FORCE_NOINLINE -size_t ZSTD_execSequenceLast7(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base, - const BYTE *const vBase, const BYTE *const dictEnd) +size_t ZSTD_execSequenceEnd(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const prefixStart, + const BYTE *const virtualStart, const BYTE *const dictEnd) { BYTE *const oLitEnd = op + sequence.litLength; size_t const sequenceLength = sequence.litLength + sequence.matchLength; BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ - BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; const BYTE *const iLitEnd = *litPtr + sequence.litLength; const BYTE *match = oLitEnd - sequence.offset; + BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; /* check */ if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */ - if (oLitEnd <= oend_w) - return ERROR(GENERIC); /* Precondition */ /* copy literals */ - if (op < oend_w) { - ZSTD_wildcopy(op, *litPtr, oend_w - op); - *litPtr += oend_w - op; - op = oend_w; - } - while (op < oLitEnd) - *op++ = *(*litPtr)++; + ZSTD_safecopy(op, oend_w, *litPtr, sequence.litLength, ZSTD_no_overlap); + op = oLitEnd; + *litPtr = iLitEnd; /* copy Match */ - if (sequence.offset > (size_t)(oLitEnd - base)) { + if (sequence.offset > (size_t)(oLitEnd - prefixStart)) { /* offset beyond prefix */ - if (sequence.offset > (size_t)(oLitEnd - vBase)) + if (sequence.offset > (size_t)(oLitEnd - virtualStart)) return ERROR(corruption_detected); - match = dictEnd - (base - match); + match = dictEnd - (prefixStart - match); if (match + sequence.matchLength <= dictEnd) { memmove(oLitEnd, match, sequence.matchLength); return sequenceLength; @@ -920,15 +993,16 @@ size_t ZSTD_execSequenceLast7(BYTE *op, BYTE *const oend, seq_t sequence, const memmove(oLitEnd, match, length1); op = oLitEnd + length1; sequence.matchLength -= length1; - match = base; + match = prefixStart; } } - while (op < oMatchEnd) - *op++ = *match++; + ZSTD_safecopy(op, oend_w, match, sequence.matchLength, ZSTD_overlap_src_before_dst); return sequenceLength; } -static seq_t ZSTD_decodeSequence(seqState_t *seqState) +enum ZSTD_prefetch_e { ZSTD_p_noPrefetch = 0, ZSTD_p_prefetch = 1 }; + +static seq_t ZSTD_decodeSequence(seqState_t *seqState, int const longOffsets, const enum ZSTD_prefetch_e prefetch) { seq_t seq; @@ -955,30 +1029,47 @@ static seq_t ZSTD_decodeSequence(seqState_t *seqState) /* sequence */ { size_t offset; - if (!ofCode) - offset = 0; - else { - offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ - if (ZSTD_32bits()) - BIT_reloadDStream(&seqState->DStream); - } - if (ofCode <= 1) { - offset += (llCode == 0); - if (offset) { - size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; - temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ - if (offset != 1) - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset = temp; + if (ofCode > 1) { + if (longOffsets) { + int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN); + offset = OF_base[ofCode] + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); + if (ZSTD_32bits() || extraBits) + BIT_reloadDStream(&seqState->DStream); + if (extraBits) + offset += BIT_readBitsFast(&seqState->DStream, extraBits); } else { - offset = seqState->prevOffset[0]; + offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ + if (ZSTD_32bits()) + BIT_reloadDStream(&seqState->DStream); } - } else { + seqState->prevOffset[2] = seqState->prevOffset[1]; seqState->prevOffset[1] = seqState->prevOffset[0]; seqState->prevOffset[0] = offset; + + } else { + U32 const ll0 = (llCode == 0); + + if (likely((ofCode == 0))) { + if (likely(!ll0)) + offset = seqState->prevOffset[0]; + else { + offset = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset; + } + } else { + offset = OF_base[ofCode] + ll0 + BIT_readBitsFast(&seqState->DStream, 1); + { + size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; + temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ + if (offset != 1) + seqState->prevOffset[2] = seqState->prevOffset[1]; + seqState->prevOffset[1] = seqState->prevOffset[0]; + seqState->prevOffset[0] = offset = temp; + } + } } seq.offset = offset; } @@ -991,15 +1082,30 @@ static seq_t ZSTD_decodeSequence(seqState_t *seqState) if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog))) BIT_reloadDStream(&seqState->DStream); - /* ANS state update */ + seq.match = NULL; + + if (prefetch == ZSTD_p_prefetch) { + size_t const pos = seqState->pos + seq.litLength; + const BYTE *const matchBase = (seq.offset > pos) ? seqState->gotoDict + seqState->base : seqState->base; + seq.match = matchBase + pos - seq.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted. + * No consequence though : no memory access will occur, offset is only used for prefetching */ + seqState->pos = pos + seq.matchLength; + } + + /* ANS state update + * gcc-9.0.0 does 2.5% worse with ZSTD_updateFseStateWithDInfo(). + * clang-9.2.0 does 7% worse with ZSTD_updateFseState(). + * Naturally it seems like ZSTD_updateFseStateWithDInfo() should be the + * better option, so it is the default for other compilers. But, if you + * measure that it is worse, please put up a pull request. + */ + FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ if (ZSTD_32bits()) BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ - seq.match = NULL; - return seq; } @@ -1014,26 +1120,24 @@ size_t ZSTD_execSequence(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE const BYTE *const iLitEnd = *litPtr + sequence.litLength; const BYTE *match = oLitEnd - sequence.offset; - /* check */ - if (oMatchEnd > oend) - return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ - if (iLitEnd > litLimit) - return ERROR(corruption_detected); /* over-read beyond lit buffer */ - if (oLitEnd > oend_w) - return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd); - - /* copy Literals */ - ZSTD_copy8(op, *litPtr); - if (sequence.litLength > 8) - ZSTD_wildcopy(op + 8, (*litPtr) + 8, - sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + /* Errors and uncommon cases handled here. */ + if (unlikely(iLitEnd > litLimit || oMatchEnd > oend_w)) + return ZSTD_execSequenceEnd(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd); + + /* Copy Literals: + * Split out litLength <= 16 since it is nearly always true. +1.6% on gcc-9. + * We likely don't need the full 32-byte wildcopy. + */ + ZSTD_copy16(op, *litPtr); + if (unlikely(sequence.litLength > 16)) + ZSTD_wildcopy(op + 16, (*litPtr) + 16, sequence.litLength - 16, ZSTD_no_overlap); op = oLitEnd; - *litPtr = iLitEnd; /* update for next sequence */ + *litPtr = iLitEnd; /* update for next sequence */ /* copy Match */ if (sequence.offset > (size_t)(oLitEnd - base)) { /* offset beyond prefix */ - if (sequence.offset > (size_t)(oLitEnd - vBase)) + if (unlikely(sequence.offset > (size_t)(oLitEnd - vBase))) return ERROR(corruption_detected); match = dictEnd + (match - base); if (match + sequence.matchLength <= dictEnd) { @@ -1047,45 +1151,27 @@ size_t ZSTD_execSequence(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE op = oLitEnd + length1; sequence.matchLength -= length1; match = base; - if (op > oend_w || sequence.matchLength < MINMATCH) { - U32 i; - for (i = 0; i < sequence.matchLength; ++i) - op[i] = match[i]; - return sequenceLength; - } } } - /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */ - /* match within prefix */ - if (sequence.offset < 8) { - /* close range match, overlap */ - static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */ - static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */ - int const sub2 = dec64table[sequence.offset]; - op[0] = match[0]; - op[1] = match[1]; - op[2] = match[2]; - op[3] = match[3]; - match += dec32table[sequence.offset]; - ZSTD_copy4(op + 4, match); - match -= sub2; - } else { - ZSTD_copy8(op, match); + /* Nearly all offsets are >= WILDCOPY_VECLEN bytes, which means we can use wildcopy + * without overlap checking. + */ + if (likely(sequence.offset >= WILDCOPY_VECLEN)) { + /* We bet on a full wildcopy for matches, since we expect matches to be + * longer than literals (in general). In silesia, ~10% of matches are longer + * than 16 bytes. + */ + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength, ZSTD_no_overlap); + return sequenceLength; } - op += 8; - match += 8; - if (oMatchEnd > oend - (16 - MINMATCH)) { - if (op < oend_w) { - ZSTD_wildcopy(op, match, oend_w - op); - match += oend_w - op; - op = oend_w; - } - while (op < oMatchEnd) - *op++ = *match++; - } else { - ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */ + /* Copy 8 bytes and spread the offset to be >= 8. */ + ZSTD_overlapCopy8(&op, &match, sequence.offset); + + /* If the match length is > 8 bytes, then continue with the wildcopy. */ + if (sequence.matchLength > 8) { + ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8, ZSTD_overlap_src_before_dst); } return sequenceLength; } @@ -1094,7 +1180,7 @@ static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDst { const BYTE *ip = (const BYTE *)seqStart; const BYTE *const iend = ip + seqSize; - BYTE *const ostart = (BYTE * const)dst; + BYTE *const ostart = (BYTE *const)dst; BYTE *const oend = ostart + maxDstSize; BYTE *op = ostart; const BYTE *litPtr = dctx->litPtr; @@ -1115,6 +1201,7 @@ static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDst /* Regen sequences */ if (nbSeq) { seqState_t seqState; + size_t error = 0; dctx->fseEntropy = 1; { U32 i; @@ -1126,18 +1213,29 @@ static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDst FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr); FSE_initDState(&seqState.stateML, &seqState.DStream, dctx->MLTptr); - for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq;) { - nbSeq--; - { - seq_t const sequence = ZSTD_decodeSequence(&seqState); - size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); - if (ZSTD_isError(oneSeqSize)) - return oneSeqSize; + for ( ; ; ) { + seq_t const sequence = ZSTD_decodeSequence(&seqState, 0, ZSTD_p_noPrefetch); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd); + + BIT_reloadDStream(&(seqState.DStream)); + /* gcc and clang both don't like early returns in this loop. + * gcc doesn't like early breaks either. + * Instead save an error and report it at the end. + * When there is an error, don't increment op, so we don't + * overwrite. + */ + if (unlikely(ZSTD_isError(oneSeqSize))) + error = oneSeqSize; + else op += oneSeqSize; - } + + if (unlikely(!--nbSeq)) + break; } /* check if reached exact end */ + if (ZSTD_isError(error)) + return error; if (nbSeq) return ERROR(corruption_detected); /* save reps for next block */ @@ -1160,196 +1258,20 @@ static size_t ZSTD_decompressSequences(ZSTD_DCtx *dctx, void *dst, size_t maxDst return op - ostart; } -FORCE_INLINE seq_t ZSTD_decodeSequenceLong_generic(seqState_t *seqState, int const longOffsets) -{ - seq_t seq; - - U32 const llCode = FSE_peekSymbol(&seqState->stateLL); - U32 const mlCode = FSE_peekSymbol(&seqState->stateML); - U32 const ofCode = FSE_peekSymbol(&seqState->stateOffb); /* <= maxOff, by table construction */ - - U32 const llBits = LL_bits[llCode]; - U32 const mlBits = ML_bits[mlCode]; - U32 const ofBits = ofCode; - U32 const totalBits = llBits + mlBits + ofBits; - - static const U32 LL_base[MaxLL + 1] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, - 20, 22, 24, 28, 32, 40, 48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000}; - - static const U32 ML_base[MaxML + 1] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 39, 41, - 43, 47, 51, 59, 67, 83, 99, 0x83, 0x103, 0x203, 0x403, 0x803, 0x1003, 0x2003, 0x4003, 0x8003, 0x10003}; - - static const U32 OF_base[MaxOff + 1] = {0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D, 0xFD, 0x1FD, - 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD, 0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, - 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD, 0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD}; - - /* sequence */ - { - size_t offset; - if (!ofCode) - offset = 0; - else { - if (longOffsets) { - int const extraBits = ofBits - MIN(ofBits, STREAM_ACCUMULATOR_MIN); - offset = OF_base[ofCode] + (BIT_readBitsFast(&seqState->DStream, ofBits - extraBits) << extraBits); - if (ZSTD_32bits() || extraBits) - BIT_reloadDStream(&seqState->DStream); - if (extraBits) - offset += BIT_readBitsFast(&seqState->DStream, extraBits); - } else { - offset = OF_base[ofCode] + BIT_readBitsFast(&seqState->DStream, ofBits); /* <= (ZSTD_WINDOWLOG_MAX-1) bits */ - if (ZSTD_32bits()) - BIT_reloadDStream(&seqState->DStream); - } - } - - if (ofCode <= 1) { - offset += (llCode == 0); - if (offset) { - size_t temp = (offset == 3) ? seqState->prevOffset[0] - 1 : seqState->prevOffset[offset]; - temp += !temp; /* 0 is not valid; input is corrupted; force offset to 1 */ - if (offset != 1) - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset = temp; - } else { - offset = seqState->prevOffset[0]; - } - } else { - seqState->prevOffset[2] = seqState->prevOffset[1]; - seqState->prevOffset[1] = seqState->prevOffset[0]; - seqState->prevOffset[0] = offset; - } - seq.offset = offset; - } - - seq.matchLength = ML_base[mlCode] + ((mlCode > 31) ? BIT_readBitsFast(&seqState->DStream, mlBits) : 0); /* <= 16 bits */ - if (ZSTD_32bits() && (mlBits + llBits > 24)) - BIT_reloadDStream(&seqState->DStream); - - seq.litLength = LL_base[llCode] + ((llCode > 15) ? BIT_readBitsFast(&seqState->DStream, llBits) : 0); /* <= 16 bits */ - if (ZSTD_32bits() || (totalBits > 64 - 7 - (LLFSELog + MLFSELog + OffFSELog))) - BIT_reloadDStream(&seqState->DStream); - - { - size_t const pos = seqState->pos + seq.litLength; - seq.match = seqState->base + pos - seq.offset; /* single memory segment */ - if (seq.offset > pos) - seq.match += seqState->gotoDict; /* separate memory segment */ - seqState->pos = pos + seq.matchLength; - } - - /* ANS state update */ - FSE_updateState(&seqState->stateLL, &seqState->DStream); /* <= 9 bits */ - FSE_updateState(&seqState->stateML, &seqState->DStream); /* <= 9 bits */ - if (ZSTD_32bits()) - BIT_reloadDStream(&seqState->DStream); /* <= 18 bits */ - FSE_updateState(&seqState->stateOffb, &seqState->DStream); /* <= 8 bits */ - - return seq; -} - -static seq_t ZSTD_decodeSequenceLong(seqState_t *seqState, unsigned const windowSize) +static seq_t ZSTD_decodeSequenceLong(seqState_t *seqState, unsigned const windowSize, enum ZSTD_prefetch_e const prefetch) { if (ZSTD_highbit32(windowSize) > STREAM_ACCUMULATOR_MIN) { - return ZSTD_decodeSequenceLong_generic(seqState, 1); + return ZSTD_decodeSequence(seqState, 1, prefetch); } else { - return ZSTD_decodeSequenceLong_generic(seqState, 0); + return ZSTD_decodeSequence(seqState, 0, prefetch); } } -FORCE_INLINE -size_t ZSTD_execSequenceLong(BYTE *op, BYTE *const oend, seq_t sequence, const BYTE **litPtr, const BYTE *const litLimit, const BYTE *const base, - const BYTE *const vBase, const BYTE *const dictEnd) -{ - BYTE *const oLitEnd = op + sequence.litLength; - size_t const sequenceLength = sequence.litLength + sequence.matchLength; - BYTE *const oMatchEnd = op + sequenceLength; /* risk : address space overflow (32-bits) */ - BYTE *const oend_w = oend - WILDCOPY_OVERLENGTH; - const BYTE *const iLitEnd = *litPtr + sequence.litLength; - const BYTE *match = sequence.match; - - /* check */ - if (oMatchEnd > oend) - return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ - if (iLitEnd > litLimit) - return ERROR(corruption_detected); /* over-read beyond lit buffer */ - if (oLitEnd > oend_w) - return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, base, vBase, dictEnd); - - /* copy Literals */ - ZSTD_copy8(op, *litPtr); - if (sequence.litLength > 8) - ZSTD_wildcopy(op + 8, (*litPtr) + 8, - sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ - op = oLitEnd; - *litPtr = iLitEnd; /* update for next sequence */ - - /* copy Match */ - if (sequence.offset > (size_t)(oLitEnd - base)) { - /* offset beyond prefix */ - if (sequence.offset > (size_t)(oLitEnd - vBase)) - return ERROR(corruption_detected); - if (match + sequence.matchLength <= dictEnd) { - memmove(oLitEnd, match, sequence.matchLength); - return sequenceLength; - } - /* span extDict & currPrefixSegment */ - { - size_t const length1 = dictEnd - match; - memmove(oLitEnd, match, length1); - op = oLitEnd + length1; - sequence.matchLength -= length1; - match = base; - if (op > oend_w || sequence.matchLength < MINMATCH) { - U32 i; - for (i = 0; i < sequence.matchLength; ++i) - op[i] = match[i]; - return sequenceLength; - } - } - } - /* Requirement: op <= oend_w && sequence.matchLength >= MINMATCH */ - - /* match within prefix */ - if (sequence.offset < 8) { - /* close range match, overlap */ - static const U32 dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */ - static const int dec64table[] = {8, 8, 8, 7, 8, 9, 10, 11}; /* subtracted */ - int const sub2 = dec64table[sequence.offset]; - op[0] = match[0]; - op[1] = match[1]; - op[2] = match[2]; - op[3] = match[3]; - match += dec32table[sequence.offset]; - ZSTD_copy4(op + 4, match); - match -= sub2; - } else { - ZSTD_copy8(op, match); - } - op += 8; - match += 8; - - if (oMatchEnd > oend - (16 - MINMATCH)) { - if (op < oend_w) { - ZSTD_wildcopy(op, match, oend_w - op); - match += oend_w - op; - op = oend_w; - } - while (op < oMatchEnd) - *op++ = *match++; - } else { - ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength - 8); /* works even if matchLength < 8 */ - } - return sequenceLength; -} - static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx *dctx, void *dst, size_t maxDstSize, const void *seqStart, size_t seqSize) { const BYTE *ip = (const BYTE *)seqStart; const BYTE *const iend = ip + seqSize; - BYTE *const ostart = (BYTE * const)dst; + BYTE *const ostart = (BYTE *const)dst; BYTE *const oend = ostart + maxDstSize; BYTE *op = ostart; const BYTE *litPtr = dctx->litPtr; @@ -1394,16 +1316,18 @@ static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx *dctx, void *dst, size_t ma /* prepare in advance */ for (seqNb = 0; (BIT_reloadDStream(&seqState.DStream) <= BIT_DStream_completed) && seqNb < seqAdvance; seqNb++) { - sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, windowSize); + sequences[seqNb] = ZSTD_decodeSequenceLong(&seqState, windowSize, ZSTD_p_prefetch); + ZSTD_PREFETCH(sequences[seqNb].match); + ZSTD_PREFETCH(sequences[seqNb].match + sequences[seqNb].matchLength - 1); } if (seqNb < seqAdvance) return ERROR(corruption_detected); /* decode and decompress */ for (; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && seqNb < nbSeq; seqNb++) { - seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, windowSize); + seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, windowSize, ZSTD_p_prefetch); size_t const oneSeqSize = - ZSTD_execSequenceLong(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd); + ZSTD_execSequence(op, oend, sequences[(seqNb - ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd); if (ZSTD_isError(oneSeqSize)) return oneSeqSize; ZSTD_PREFETCH(sequence.match); @@ -1416,7 +1340,7 @@ static size_t ZSTD_decompressSequencesLong(ZSTD_DCtx *dctx, void *dst, size_t ma /* finish queue */ seqNb -= seqAdvance; for (; seqNb < nbSeq; seqNb++) { - size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd); + size_t const oneSeqSize = ZSTD_execSequence(op, oend, sequences[seqNb & STOSEQ_MASK], &litPtr, litEnd, base, vBase, dictEnd); if (ZSTD_isError(oneSeqSize)) return oneSeqSize; op += oneSeqSize; @@ -1566,7 +1490,7 @@ size_t ZSTD_findFrameCompressedSize(const void *src, size_t srcSize) static size_t ZSTD_decompressFrame(ZSTD_DCtx *dctx, void *dst, size_t dstCapacity, const void **srcPtr, size_t *srcSizePtr) { const BYTE *ip = (const BYTE *)(*srcPtr); - BYTE *const ostart = (BYTE * const)dst; + BYTE *const ostart = (BYTE *const)dst; BYTE *const oend = ostart + dstCapacity; BYTE *op = ostart; size_t remainingSize = *srcSizePtr; diff --git a/lib/zstd/huf_decompress.c b/lib/zstd/huf_decompress.c index 6526482..6753153 100644 --- a/lib/zstd/huf_decompress.c +++ b/lib/zstd/huf_decompress.c @@ -254,6 +254,7 @@ static size_t HUF_decompress4X2_usingDTable_internal(void *dst, size_t dstSize, const BYTE *const istart = (const BYTE *)cSrc; BYTE *const ostart = (BYTE *)dst; BYTE *const oend = ostart + dstSize; + BYTE *const olimit = oend - 3; const void *const dtPtr = DTable + 1; const HUF_DEltX2 *const dt = (const HUF_DEltX2 *)dtPtr; @@ -278,7 +279,7 @@ static size_t HUF_decompress4X2_usingDTable_internal(void *dst, size_t dstSize, BYTE *op2 = opStart2; BYTE *op3 = opStart3; BYTE *op4 = opStart4; - U32 endSignal; + U32 endSignal = 1; DTableDesc const dtd = HUF_getDTableDesc(DTable); U32 const dtLog = dtd.tableLog; @@ -306,8 +307,7 @@ static size_t HUF_decompress4X2_usingDTable_internal(void *dst, size_t dstSize, } /* 16-32 symbols per loop (4-8 symbols per stream) */ - endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4); - for (; (endSignal == BIT_DStream_unfinished) && (op4 < (oend - 7));) { + for ( ; (endSignal) & (op4 < olimit); ) { HUF_DECODE_SYMBOLX2_2(op1, &bitD1); HUF_DECODE_SYMBOLX2_2(op2, &bitD2); HUF_DECODE_SYMBOLX2_2(op3, &bitD3); @@ -324,7 +324,10 @@ static size_t HUF_decompress4X2_usingDTable_internal(void *dst, size_t dstSize, HUF_DECODE_SYMBOLX2_0(op2, &bitD2); HUF_DECODE_SYMBOLX2_0(op3, &bitD3); HUF_DECODE_SYMBOLX2_0(op4, &bitD4); - endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4); + endSignal &= BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished; + endSignal &= BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished; } /* check corruption */ @@ -713,6 +716,7 @@ static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, const BYTE *const istart = (const BYTE *)cSrc; BYTE *const ostart = (BYTE *)dst; BYTE *const oend = ostart + dstSize; + BYTE *const olimit = oend - (sizeof(size_t) - 1); const void *const dtPtr = DTable + 1; const HUF_DEltX4 *const dt = (const HUF_DEltX4 *)dtPtr; @@ -737,7 +741,7 @@ static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, BYTE *op2 = opStart2; BYTE *op3 = opStart3; BYTE *op4 = opStart4; - U32 endSignal; + U32 endSignal = 1; DTableDesc const dtd = HUF_getDTableDesc(DTable); U32 const dtLog = dtd.tableLog; @@ -765,8 +769,7 @@ static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, } /* 16-32 symbols per loop (4-8 symbols per stream) */ - endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4); - for (; (endSignal == BIT_DStream_unfinished) & (op4 < (oend - (sizeof(bitD4.bitContainer) - 1)));) { + for ( ; (endSignal) & (op4 < olimit); ) { HUF_DECODE_SYMBOLX4_2(op1, &bitD1); HUF_DECODE_SYMBOLX4_2(op2, &bitD2); HUF_DECODE_SYMBOLX4_2(op3, &bitD3); @@ -783,8 +786,11 @@ static size_t HUF_decompress4X4_usingDTable_internal(void *dst, size_t dstSize, HUF_DECODE_SYMBOLX4_0(op2, &bitD2); HUF_DECODE_SYMBOLX4_0(op3, &bitD3); HUF_DECODE_SYMBOLX4_0(op4, &bitD4); - - endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4); + endSignal = likely( + (BIT_reloadDStreamFast(&bitD1) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD2) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD3) == BIT_DStream_unfinished) + & (BIT_reloadDStreamFast(&bitD4) == BIT_DStream_unfinished)); } /* check corruption */ diff --git a/lib/zstd/zstd_internal.h b/lib/zstd/zstd_internal.h index 1a79fab..479d061 100644 --- a/lib/zstd/zstd_internal.h +++ b/lib/zstd/zstd_internal.h @@ -126,24 +126,76 @@ static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG; /*-******************************************* * Shared functions to include for inlining *********************************************/ -ZSTD_STATIC void ZSTD_copy8(void *dst, const void *src) { +FORCE_INLINE void ZSTD_copy8(void *dst, const void *src) +{ memcpy(dst, src, 8); } + +FORCE_INLINE void ZSTD_copy16(void *dst, const void *src) +{ + memcpy(dst, src, 16); +} + +enum ZSTD_overlap_e { + ZSTD_no_overlap, + ZSTD_overlap_src_before_dst, + /* ZSTD_overlap_dst_before_src, */ +}; + +#define WILDCOPY_OVERLENGTH 32 +#define WILDCOPY_VECLEN 16 + /*! ZSTD_wildcopy() : -* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */ -#define WILDCOPY_OVERLENGTH 8 -ZSTD_STATIC void ZSTD_wildcopy(void *dst, const void *src, ptrdiff_t length) + * Custom version of memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0) + * @param ovtype controls the overlap detection + * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart. + * - ZSTD_overlap_src_before_dst: The src and dst may overlap, but they MUST be at least 8 bytes apart. + * The src buffer must be before the dst buffer. + */ +FORCE_INLINE void ZSTD_wildcopy(void *dst, const void *src, ptrdiff_t length, enum ZSTD_overlap_e const ovtype) { - const BYTE* ip = (const BYTE*)src; - BYTE* op = (BYTE*)dst; - BYTE* const oend = op + length; - /* Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81388. - * Avoid the bad case where the loop only runs once by handling the - * special case separately. This doesn't trigger the bug because it - * doesn't involve pointer/integer overflow. - */ - if (length <= 8) - return ZSTD_copy8(dst, src); + ptrdiff_t diff = (BYTE *)dst - (const BYTE *)src; + const BYTE *ip = (const BYTE *)src; + BYTE *op = (BYTE *)dst; + BYTE *const oend = op + length; + + if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) { + /* Handle short offset copies */ + do { + ZSTD_copy8(op, ip); + op += 8; + ip += 8; + } while (op < oend); + } else { + ZSTD_copy16(op, ip); + op += 16; + ip += 16; + ZSTD_copy16(op, ip); + op += 16; + ip += 16; + if (op >= oend) + return; + do { + ZSTD_copy16(op, ip); + op += 16; + ip += 16; + ZSTD_copy16(op, ip); + op += 16; + ip += 16; + } while (op < oend); + } +} + +/*! ZSTD_wildcopy8() : + * The same as ZSTD_wildcopy(), but it can only overwrite 8 bytes, and works for + * overlapping buffers that are at least 8 bytes apart. + */ +ZSTD_STATIC void ZSTD_wildcopy8(void *dst, const void *src, ptrdiff_t length) +{ + const BYTE *ip = (const BYTE *)src; + BYTE *op = (BYTE *)dst; + BYTE *const oend = (BYTE *)op + length; + do { ZSTD_copy8(op, ip); op += 8; @@ -243,7 +295,7 @@ void ZSTD_stackFree(void *opaque, void *address); /*====== common function ======*/ -ZSTD_STATIC U32 ZSTD_highbit32(U32 val) { return 31 - __builtin_clz(val); } +ZSTD_STATIC U32 ZSTD_highbit32(U32 val) { return __builtin_clz(val) ^ 31; } /* hidden functions */ diff --git a/lib/zstd/zstd_opt.h b/lib/zstd/zstd_opt.h index 55e1b4c..d731c42 100644 --- a/lib/zstd/zstd_opt.h +++ b/lib/zstd/zstd_opt.h @@ -676,7 +676,7 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */ } ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH); - ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH); + ZSTD_storeSeq(seqStorePtr, litLength, anchor, iend, offset, mlen - MINMATCH); anchor = ip = ip + mlen; } } /* for (cur=0; cur < last_pos; ) */ @@ -991,7 +991,7 @@ _storeSequence: /* cur, last_pos, best_mlen, best_off have to be set */ } ZSTD_updatePrice(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH); - ZSTD_storeSeq(seqStorePtr, litLength, anchor, offset, mlen - MINMATCH); + ZSTD_storeSeq(seqStorePtr, litLength, anchor, iend, offset, mlen - MINMATCH); anchor = ip = ip + mlen; } } /* for (cur=0; cur < last_pos; ) */ -- 2.7.4 From d3b7366d415f7c425e9ac067c3f40917f0bea23a Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Wed, 3 Jun 2020 11:07:09 +0900 Subject: [PATCH 10/16] ARM: tizen_bcm2711_defconfig: Enable lz4 and zstd cryptos This enables lz4 and zstd crypto to enable compressor for zram Change-Id: I0a2f3af9e30693b6c0deebba5053b768bc1229fb Signed-off-by: Dongwoo Lee --- arch/arm/configs/tizen_bcm2711_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/configs/tizen_bcm2711_defconfig b/arch/arm/configs/tizen_bcm2711_defconfig index 1e00067..1196a00 100644 --- a/arch/arm/configs/tizen_bcm2711_defconfig +++ b/arch/arm/configs/tizen_bcm2711_defconfig @@ -472,6 +472,8 @@ CONFIG_SECURITY_SMACK_APPEND_SIGNALS=y CONFIG_CRYPTO_XTS=y CONFIG_CRYPTO_TWOFISH=y CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_ZSTD=y # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_CRC_ITU_T=y CONFIG_CRC7=m -- 2.7.4 From 1e633ab57e24e8a8334b2ddd529ca8c7a6d3ac8a Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Mon, 29 Jun 2020 18:21:05 +0900 Subject: [PATCH 11/16] ARM64: tizen_bcm2711_defconfig: Enable lz4 and zstd cryptos This enables lz4 and zstd crypto to enable compressor for zram Change-Id: Id2ac2daa8e7e3e0b7526dedc53f175b83c4fb1eb Signed-off-by: Dongwoo Lee --- arch/arm64/configs/tizen_bcm2711_defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/configs/tizen_bcm2711_defconfig b/arch/arm64/configs/tizen_bcm2711_defconfig index 569396a..c36f499 100644 --- a/arch/arm64/configs/tizen_bcm2711_defconfig +++ b/arch/arm64/configs/tizen_bcm2711_defconfig @@ -447,6 +447,8 @@ CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_XTS=y CONFIG_CRYPTO_XCBC=y CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_ZSTD=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_RAID6_PQ_BENCHMARK is not set CONFIG_CRC_ITU_T=y -- 2.7.4 From e62449b4ffb1bd8f8c9bf1fbb3835fdd968d6c75 Mon Sep 17 00:00:00 2001 From: Dongwoo Lee Date: Wed, 1 Jul 2020 18:27:33 +0900 Subject: [PATCH 12/16] Revert "cgroup: Disable cgroup "memory" by default" The feature is used for saving memory which is consumed by memcg-related structure (32bytes per 4K page), but now it is no longer merged on the latest raspberry pi kernel. So instead of enabling memory cgroup by adding command to cmdline.txt while preserving this feature, in order to enable memory cgroup by default, this reverts commit '35bbb61da9e2 ("cgroup: Disable cgroup "memory" by default")' Change-Id: I1830129125fb44b36bfe64f97fddf329ea795c3c Signed-off-by: Dongwoo Lee --- kernel/cgroup/cgroup.c | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index 9e2e96f..7c9e975 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -5720,8 +5720,6 @@ int __init cgroup_init_early(void) } static u16 cgroup_disable_mask __initdata; -static u16 cgroup_enable_mask __initdata; -static int __init cgroup_disable(char *str); /** * cgroup_init - cgroup initialization @@ -5761,12 +5759,6 @@ int __init cgroup_init(void) mutex_unlock(&cgroup_mutex); - /* Apply an implicit disable... */ - cgroup_disable("memory"); - - /* ...knowing that an explicit enable will override it. */ - cgroup_disable_mask &= ~cgroup_enable_mask; - for_each_subsys(ss, ssid) { if (ss->early_init) { struct cgroup_subsys_state *css = @@ -6186,28 +6178,6 @@ static int __init cgroup_disable(char *str) } __setup("cgroup_disable=", cgroup_disable); -static int __init cgroup_enable(char *str) -{ - struct cgroup_subsys *ss; - char *token; - int i; - - while ((token = strsep(&str, ",")) != NULL) { - if (!*token) - continue; - - for_each_subsys(ss, i) { - if (strcmp(token, ss->name) && - strcmp(token, ss->legacy_name)) - continue; - - cgroup_enable_mask |= 1 << i; - } - } - return 1; -} -__setup("cgroup_enable=", cgroup_enable); - void __init __weak enable_debug_cgroup(void) { } static int __init enable_cgroup_debug(char *str) -- 2.7.4 From d249b77d6275844cbd4cfe55f6c4188ff1205828 Mon Sep 17 00:00:00 2001 From: Hoegeun Kwon Date: Fri, 3 Jul 2020 14:18:53 +0900 Subject: [PATCH 13/16] rpi4: boot: Update the firmwares for kernel v5.4.50 Update the firmwares with the latest version from the vendor git repo. The commit base is "66fc5eaac3d kernel: Bump to 5.4.50" Change-Id: I7f4f70fefe1cc22a31539f19566c9bfed285bb52 Signed-off-by: Hoegeun Kwon --- rpi4/boot/fixup4.dat | Bin 5400 -> 5409 bytes rpi4/boot/fixup4cd.dat | Bin 3153 -> 3148 bytes rpi4/boot/fixup4db.dat | Bin 8421 -> 8418 bytes rpi4/boot/fixup4x.dat | Bin 8413 -> 8416 bytes rpi4/boot/start4.elf | Bin 2252416 -> 2277312 bytes rpi4/boot/start4cd.elf | Bin 799900 -> 818844 bytes rpi4/boot/start4db.elf | Bin 3743268 -> 3778888 bytes rpi4/boot/start4x.elf | Bin 3011236 -> 3036136 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/rpi4/boot/fixup4.dat b/rpi4/boot/fixup4.dat index 5c277243144c7d32fda223e6cf222a4adb080be6..62b189d7a8774d213e69684dce86fbb81d9044a4 100644 GIT binary patch delta 362 zcmXv~F-t;W6usx&_xaSPJ)c1mFHn+*OoE0eg(RWDh6W*$ineH|A=&~5O^3>sx?N{ZcKEdsb%0B6S z>IJyd9%$V5ll%=uxL2UJ}iMW_@H+@A2lT9|{kN-vX{38)mJjC-# zTDC^nVP42O4$nIB$vi~M9S;F^Hg8r2&yw-sL1qNz6xw}Q}!GGvGF Ps-jla1HShRxF!4nFMULk delta 365 zcmXv~Pbfrj5T1GSe(!njS#RHCm3FO_gDeR}R%j&`QbZ^xXKCXme|AgC$?i56Cvn`X zcacAP*@JS}!cB=Q7qmx|-&>iQ`M#Oyo0;Y`eiYAj5S}2fQ)_;W5ndeNC74DRsieB|gVHF{uK&e5l;xythJKsPv^dt45UKsDCr(8f;D(CVvHO z{vgf!Ry#4DRK0c$6><&WXSJDUoK5aggFIDd@MBFX(5(a6{u0q9TD%2g3(@8m^OE09 zvk@~IP%l|D5~!yzQDQ6{rg1*AR&m3N)-KBNnztP&sd&sucUigepBMA4-3cY~R8%l4 U0HqE~We8zK{vkA^V`UeA0sP5K#sB~S diff --git a/rpi4/boot/fixup4cd.dat b/rpi4/boot/fixup4cd.dat index 8bf51446977fdcd9f4a90e0faf96fcfe7a0b6538..65b5e3fe2873dc5da10f481439a79215c3c37969 100644 GIT binary patch delta 287 zcmca8aYkZ-CJSQ&Bg4c%g^B*%p^PC6%*@P;h5`&B3=C!r49e^b46FPRsNGBfi|He}S(5EN9jjJ4zh znhpcmFh(HrdFI3H+U!8!?mM}I(Vekq^99D~jLZx60NtguxrbSSaqOSGS1oT!fC?9SUtItdyo9{%?ykMtPG6vycro+8#6HOW&yH+uAh3EiSb|`0|1ob BG{*n{ delta 277 zcmX>jaZzG|CL2F9V*w+>#6X3KzTKh!gBh5anHdcQ7(y7fnKCd)vNJHSGB7Z3192FT z!2_fNJQx|6fixQsUod9?vqgYx79a+RC#_&$^hjc4Wo1;6Vi06z=ACTFs59AtkwsJ0 zG7xAw7;sy1!k9o>o!OO{F@=$V-I*N-7F$nlW^`w)*nFCCIwNz=4xr`7GOI-Y-lH%(BeJyv)hs%*K<~vBxmhZRX}M wU}T)P*@n}EiLriiA@?4ciJKW1(^wf8V>}ocZ<;g6Fs1@s{Anc<n494?a?%lP$o=0hyS_&2F9|Xk?iie^cSU1H*&`~JjB6e_4M5s8pNz22{ zLBYW~DGwZ66cofkXOSW(x>^(*6bD}`{z6CyANfLFgXf^!W1m2|&bAH~GG_V8cLpFFcG#B1 z=yg&sCKJRtc6ro`bBfsyQfcl<$qBdUa*VMzX6WmNY*7i~s^;DSt~&C*7(ePDz9MiY z)5(%F!>P)YEzgrVDD|GKT3j|;~w53us_XT DnhH^* delta 410 zcmXv~O(;ZR6usx&`QDp(Z(h@w8882Dq!ek4G?8RRSk~qsQ54j0$U>+zmH1UWWaTi6LF+Zp--B+lC*eByl?IucKgVOkEI@lPbkr>z-gGD1Y;wJ`SkT#!% zMTo^Bl1n5+x+5$d2o;-wFf;ku#*>_!_ne%Z^X8ONZ>d}tBL|f?qxtdU^zs%lGa^Bn zqtSDsHj_vaQ9#G07OeAzMKql@D%z*(aH-la>ocRO?+OBYH$ExRuf`DXT}z-Al(6*j zf3P6Rw<;|1H)9xNrcBL*)VRo~D}2dUCfMpk{ED2v?9#hs8)9Z%JsB}fdO~i)+wo<9 zcJIeLf`|pYeJcrPu!h(zFOnUy)%)--K?XR$rpnp{wPO35@Tn(y*x{sG&mrc4RH%i! zLu$my+8kt@&XV>rU@Fu#ctz(PaJ)lz-omA7Y+i+-a@x#A^Rtg%1gV2aSe-`fXdHcy Z0=ts%K4qY@M7TBx5BeR&Aqy8S{{avLOi=&; delta 408 zcmXv~PbdUo6n}5td^6^sX|2UtyOt;=X*X@;U^h9b-Ebf|C{CiqO{v|I3x(-Bxgo?& zja)b=<>0^pDN?(+<1AagS^Vm~_j~_-ypn%ZhtY{EQ(GZb|)$0N&YKtvezK^DGG z0fH(30{}x)`vmv;Vg;ryC44(j7{g{hh>7mi9+c3NF2m^2 z{;7zV6dmmH+zo=7RRu~+z{X*IhVSfw0IT@1^hGjH5*e;GB3^*stMZCH(-_DpAn@ diff --git a/rpi4/boot/start4.elf b/rpi4/boot/start4.elf index 82db9e1f08d0cefda10fef1c885dfc737515cc38..c646d0dd66e59b455448ff6a8152286a0a896fe4 100644 GIT binary patch delta 545310 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�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