From: Greg Kroah-Hartman Date: Sat, 16 Sep 2023 12:29:58 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v5.10.195~39 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=744690906ddda7d7363aa295741c205afb38af8f;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches added patches: btrfs-compare-the-correct-fsid-metadata_uuid-in-btrfs_validate_super.patch btrfs-don-t-start-transaction-when-joining-with-trans_join_nostart.patch btrfs-free-qgroup-rsv-on-io-failure.patch btrfs-use-the-correct-superblock-to-compare-fsid-in-btrfs_validate_super.patch drm-amd-display-prevent-potential-division-by-zero-errors.patch mtd-rawnand-brcmnand-fix-crash-during-the-panic_write.patch mtd-rawnand-brcmnand-fix-potential-false-time-out-warning.patch mtd-rawnand-brcmnand-fix-potential-out-of-bounds-access-in-oob-write.patch perf-hists-browser-fix-hierarchy-mode-header.patch perf-hists-browser-fix-the-number-of-entries-for-e-key.patch perf-tools-handle-old-data-in-perf_record_attr.patch --- diff --git a/queue-5.10/btrfs-compare-the-correct-fsid-metadata_uuid-in-btrfs_validate_super.patch b/queue-5.10/btrfs-compare-the-correct-fsid-metadata_uuid-in-btrfs_validate_super.patch new file mode 100644 index 00000000000..e8727a9c4e0 --- /dev/null +++ b/queue-5.10/btrfs-compare-the-correct-fsid-metadata_uuid-in-btrfs_validate_super.patch @@ -0,0 +1,61 @@ +From 6bfe3959b0e7a526f5c64747801a8613f002f05a Mon Sep 17 00:00:00 2001 +From: Anand Jain +Date: Mon, 31 Jul 2023 19:16:35 +0800 +Subject: btrfs: compare the correct fsid/metadata_uuid in btrfs_validate_super + +From: Anand Jain + +commit 6bfe3959b0e7a526f5c64747801a8613f002f05a upstream. + +The function btrfs_validate_super() should verify the metadata_uuid in +the provided superblock argument. Because, all its callers expect it to +do that. + +Such as in the following stacks: + + write_all_supers() + sb = fs_info->super_for_commit; + btrfs_validate_write_super(.., sb) + btrfs_validate_super(.., sb, ..) + + scrub_one_super() + btrfs_validate_super(.., sb, ..) + +And + check_dev_super() + btrfs_validate_super(.., sb, ..) + +However, it currently verifies the fs_info::super_copy::metadata_uuid +instead. Fix this using the correct metadata_uuid in the superblock +argument. + +CC: stable@vger.kernel.org # 5.4+ +Reviewed-by: Johannes Thumshirn +Tested-by: Guilherme G. Piccoli +Signed-off-by: Anand Jain +Reviewed-by: David Sterba +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/disk-io.c | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2503,13 +2503,11 @@ static int validate_super(struct btrfs_f + ret = -EINVAL; + } + +- if (btrfs_fs_incompat(fs_info, METADATA_UUID) && +- memcmp(fs_info->fs_devices->metadata_uuid, +- fs_info->super_copy->metadata_uuid, BTRFS_FSID_SIZE)) { ++ if (memcmp(fs_info->fs_devices->metadata_uuid, btrfs_sb_fsid_ptr(sb), ++ BTRFS_FSID_SIZE) != 0) { + btrfs_err(fs_info, + "superblock metadata_uuid doesn't match metadata uuid of fs_devices: %pU != %pU", +- fs_info->super_copy->metadata_uuid, +- fs_info->fs_devices->metadata_uuid); ++ btrfs_sb_fsid_ptr(sb), fs_info->fs_devices->metadata_uuid); + ret = -EINVAL; + } + diff --git a/queue-5.10/btrfs-don-t-start-transaction-when-joining-with-trans_join_nostart.patch b/queue-5.10/btrfs-don-t-start-transaction-when-joining-with-trans_join_nostart.patch new file mode 100644 index 00000000000..811b5d3623e --- /dev/null +++ b/queue-5.10/btrfs-don-t-start-transaction-when-joining-with-trans_join_nostart.patch @@ -0,0 +1,43 @@ +From 4490e803e1fe9fab8db5025e44e23b55df54078b Mon Sep 17 00:00:00 2001 +From: Filipe Manana +Date: Wed, 26 Jul 2023 16:56:57 +0100 +Subject: btrfs: don't start transaction when joining with TRANS_JOIN_NOSTART + +From: Filipe Manana + +commit 4490e803e1fe9fab8db5025e44e23b55df54078b upstream. + +When joining a transaction with TRANS_JOIN_NOSTART, if we don't find a +running transaction we end up creating one. This goes against the purpose +of TRANS_JOIN_NOSTART which is to join a running transaction if its state +is at or below the state TRANS_STATE_COMMIT_START, otherwise return an +-ENOENT error and don't start a new transaction. So fix this to not create +a new transaction if there's no running transaction at or below that +state. + +CC: stable@vger.kernel.org # 4.14+ +Fixes: a6d155d2e363 ("Btrfs: fix deadlock between fiemap and transaction commits") +Signed-off-by: Filipe Manana +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/transaction.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +--- a/fs/btrfs/transaction.c ++++ b/fs/btrfs/transaction.c +@@ -301,10 +301,11 @@ loop: + spin_unlock(&fs_info->trans_lock); + + /* +- * If we are ATTACH, we just want to catch the current transaction, +- * and commit it. If there is no transaction, just return ENOENT. ++ * If we are ATTACH or TRANS_JOIN_NOSTART, we just want to catch the ++ * current transaction, and commit it. If there is no transaction, just ++ * return ENOENT. + */ +- if (type == TRANS_ATTACH) ++ if (type == TRANS_ATTACH || type == TRANS_JOIN_NOSTART) + return -ENOENT; + + /* diff --git a/queue-5.10/btrfs-free-qgroup-rsv-on-io-failure.patch b/queue-5.10/btrfs-free-qgroup-rsv-on-io-failure.patch new file mode 100644 index 00000000000..a161be1ebb6 --- /dev/null +++ b/queue-5.10/btrfs-free-qgroup-rsv-on-io-failure.patch @@ -0,0 +1,46 @@ +From e28b02118b94e42be3355458a2406c6861e2dd32 Mon Sep 17 00:00:00 2001 +From: Boris Burkov +Date: Fri, 21 Jul 2023 09:02:06 -0700 +Subject: btrfs: free qgroup rsv on io failure + +From: Boris Burkov + +commit e28b02118b94e42be3355458a2406c6861e2dd32 upstream. + +If we do a write whose bio suffers an error, we will never reclaim the +qgroup reserved space for it. We allocate the space in the write_iter +codepath, then release the reservation as we allocate the ordered +extent, but we only create a delayed ref if the ordered extent finishes. +If it has an error, we simply leak the rsv. This is apparent in running +any error injecting (dmerror) fstests like btrfs/146 or btrfs/160. Such +tests fail due to dmesg on umount complaining about the leaked qgroup +data space. + +When we clean up other aspects of space on failed ordered_extents, also +free the qgroup rsv. + +Reviewed-by: Josef Bacik +CC: stable@vger.kernel.org # 5.10+ +Signed-off-by: Boris Burkov +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/inode.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -2804,6 +2804,13 @@ out: + btrfs_free_reserved_extent(fs_info, + ordered_extent->disk_bytenr, + ordered_extent->disk_num_bytes, 1); ++ /* ++ * Actually free the qgroup rsv which was released when ++ * the ordered extent was created. ++ */ ++ btrfs_qgroup_free_refroot(fs_info, inode->root->root_key.objectid, ++ ordered_extent->qgroup_rsv, ++ BTRFS_QGROUP_RSV_DATA); + } + } + diff --git a/queue-5.10/btrfs-use-the-correct-superblock-to-compare-fsid-in-btrfs_validate_super.patch b/queue-5.10/btrfs-use-the-correct-superblock-to-compare-fsid-in-btrfs_validate_super.patch new file mode 100644 index 00000000000..6c6b56dd249 --- /dev/null +++ b/queue-5.10/btrfs-use-the-correct-superblock-to-compare-fsid-in-btrfs_validate_super.patch @@ -0,0 +1,57 @@ +From d167aa76dc0683828588c25767da07fb549e4f48 Mon Sep 17 00:00:00 2001 +From: Anand Jain +Date: Mon, 31 Jul 2023 19:16:34 +0800 +Subject: btrfs: use the correct superblock to compare fsid in btrfs_validate_super + +From: Anand Jain + +commit d167aa76dc0683828588c25767da07fb549e4f48 upstream. + +The function btrfs_validate_super() should verify the fsid in the provided +superblock argument. Because, all its callers expect it to do that. + +Such as in the following stack: + + write_all_supers() + sb = fs_info->super_for_commit; + btrfs_validate_write_super(.., sb) + btrfs_validate_super(.., sb, ..) + + scrub_one_super() + btrfs_validate_super(.., sb, ..) + +And + check_dev_super() + btrfs_validate_super(.., sb, ..) + +However, it currently verifies the fs_info::super_copy::fsid instead, +which is not correct. Fix this using the correct fsid in the superblock +argument. + +CC: stable@vger.kernel.org # 5.4+ +Reviewed-by: Johannes Thumshirn +Tested-by: Guilherme G. Piccoli +Signed-off-by: Anand Jain +Reviewed-by: David Sterba +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman +--- + fs/btrfs/disk-io.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2496,11 +2496,10 @@ static int validate_super(struct btrfs_f + ret = -EINVAL; + } + +- if (memcmp(fs_info->fs_devices->fsid, fs_info->super_copy->fsid, +- BTRFS_FSID_SIZE)) { ++ if (memcmp(fs_info->fs_devices->fsid, sb->fsid, BTRFS_FSID_SIZE) != 0) { + btrfs_err(fs_info, + "superblock fsid doesn't match fsid of fs_devices: %pU != %pU", +- fs_info->super_copy->fsid, fs_info->fs_devices->fsid); ++ sb->fsid, fs_info->fs_devices->fsid); + ret = -EINVAL; + } + diff --git a/queue-5.10/drm-amd-display-prevent-potential-division-by-zero-errors.patch b/queue-5.10/drm-amd-display-prevent-potential-division-by-zero-errors.patch new file mode 100644 index 00000000000..31d91cdbbd6 --- /dev/null +++ b/queue-5.10/drm-amd-display-prevent-potential-division-by-zero-errors.patch @@ -0,0 +1,50 @@ +From 07e388aab042774f284a2ad75a70a194517cdad4 Mon Sep 17 00:00:00 2001 +From: Hamza Mahfooz +Date: Tue, 5 Sep 2023 13:27:22 -0400 +Subject: drm/amd/display: prevent potential division by zero errors + +From: Hamza Mahfooz + +commit 07e388aab042774f284a2ad75a70a194517cdad4 upstream. + +There are two places in apply_below_the_range() where it's possible for +a divide by zero error to occur. So, to fix this make sure the divisor +is non-zero before attempting the computation in both cases. + +Cc: stable@vger.kernel.org +Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2637 +Fixes: a463b263032f ("drm/amd/display: Fix frames_to_insert math") +Fixes: ded6119e825a ("drm/amd/display: Reinstate LFC optimization") +Reviewed-by: Aurabindo Pillai +Signed-off-by: Hamza Mahfooz +Signed-off-by: Alex Deucher +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/amd/display/modules/freesync/freesync.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c ++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +@@ -327,7 +327,9 @@ static void apply_below_the_range(struct + * - Delta for CEIL: delta_from_mid_point_in_us_1 + * - Delta for FLOOR: delta_from_mid_point_in_us_2 + */ +- if ((last_render_time_in_us / mid_point_frames_ceil) < in_out_vrr->min_duration_in_us) { ++ if (mid_point_frames_ceil && ++ (last_render_time_in_us / mid_point_frames_ceil) < ++ in_out_vrr->min_duration_in_us) { + /* Check for out of range. + * If using CEIL produces a value that is out of range, + * then we are forced to use FLOOR. +@@ -374,8 +376,9 @@ static void apply_below_the_range(struct + /* Either we've calculated the number of frames to insert, + * or we need to insert min duration frames + */ +- if (last_render_time_in_us / frames_to_insert < +- in_out_vrr->min_duration_in_us){ ++ if (frames_to_insert && ++ (last_render_time_in_us / frames_to_insert) < ++ in_out_vrr->min_duration_in_us){ + frames_to_insert -= (frames_to_insert > 1) ? + 1 : 0; + } diff --git a/queue-5.10/mtd-rawnand-brcmnand-fix-crash-during-the-panic_write.patch b/queue-5.10/mtd-rawnand-brcmnand-fix-crash-during-the-panic_write.patch new file mode 100644 index 00000000000..fbbd2569d14 --- /dev/null +++ b/queue-5.10/mtd-rawnand-brcmnand-fix-crash-during-the-panic_write.patch @@ -0,0 +1,47 @@ +From e66dd317194daae0475fe9e5577c80aa97f16cb9 Mon Sep 17 00:00:00 2001 +From: William Zhang +Date: Thu, 6 Jul 2023 11:29:07 -0700 +Subject: mtd: rawnand: brcmnand: Fix crash during the panic_write + +From: William Zhang + +commit e66dd317194daae0475fe9e5577c80aa97f16cb9 upstream. + +When executing a NAND command within the panic write path, wait for any +pending command instead of calling BUG_ON to avoid crashing while +already crashing. + +Fixes: 27c5b17cd1b1 ("mtd: nand: add NAND driver "library" for Broadcom STB NAND controller") +Signed-off-by: William Zhang +Reviewed-by: Florian Fainelli +Reviewed-by: Kursad Oney +Reviewed-by: Kamal Dasu +Cc: stable@vger.kernel.org +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230706182909.79151-4-william.zhang@broadcom.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -1543,7 +1543,17 @@ static void brcmnand_send_cmd(struct brc + + dev_dbg(ctrl->dev, "send native cmd %d addr 0x%llx\n", cmd, cmd_addr); + +- BUG_ON(ctrl->cmd_pending != 0); ++ /* ++ * If we came here through _panic_write and there is a pending ++ * command, try to wait for it. If it times out, rather than ++ * hitting BUG_ON, just return so we don't crash while crashing. ++ */ ++ if (oops_in_progress) { ++ if (ctrl->cmd_pending && ++ bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, 0)) ++ return; ++ } else ++ BUG_ON(ctrl->cmd_pending != 0); + ctrl->cmd_pending = cmd; + + ret = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY, NAND_CTRL_RDY, 0); diff --git a/queue-5.10/mtd-rawnand-brcmnand-fix-potential-false-time-out-warning.patch b/queue-5.10/mtd-rawnand-brcmnand-fix-potential-false-time-out-warning.patch new file mode 100644 index 00000000000..d567367fe98 --- /dev/null +++ b/queue-5.10/mtd-rawnand-brcmnand-fix-potential-false-time-out-warning.patch @@ -0,0 +1,42 @@ +From 9cc0a598b944816f2968baf2631757f22721b996 Mon Sep 17 00:00:00 2001 +From: William Zhang +Date: Thu, 6 Jul 2023 11:29:06 -0700 +Subject: mtd: rawnand: brcmnand: Fix potential false time out warning + +From: William Zhang + +commit 9cc0a598b944816f2968baf2631757f22721b996 upstream. + +If system is busy during the command status polling function, the driver +may not get the chance to poll the status register till the end of time +out and return the premature status. Do a final check after time out +happens to ensure reading the correct status. + +Fixes: 9d2ee0a60b8b ("mtd: nand: brcmnand: Check flash #WP pin status before nand erase/program") +Signed-off-by: William Zhang +Reviewed-by: Florian Fainelli +Cc: stable@vger.kernel.org +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230706182909.79151-3-william.zhang@broadcom.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -1040,6 +1040,14 @@ static int bcmnand_ctrl_poll_status(stru + cpu_relax(); + } while (time_after(limit, jiffies)); + ++ /* ++ * do a final check after time out in case the CPU was busy and the driver ++ * did not get enough time to perform the polling to avoid false alarms ++ */ ++ val = brcmnand_read_reg(ctrl, BRCMNAND_INTFC_STATUS); ++ if ((val & mask) == expected_val) ++ return 0; ++ + dev_warn(ctrl->dev, "timeout on status poll (expected %x got %x)\n", + expected_val, val & mask); + diff --git a/queue-5.10/mtd-rawnand-brcmnand-fix-potential-out-of-bounds-access-in-oob-write.patch b/queue-5.10/mtd-rawnand-brcmnand-fix-potential-out-of-bounds-access-in-oob-write.patch new file mode 100644 index 00000000000..cc6c8c599fa --- /dev/null +++ b/queue-5.10/mtd-rawnand-brcmnand-fix-potential-out-of-bounds-access-in-oob-write.patch @@ -0,0 +1,64 @@ +From 5d53244186c9ac58cb88d76a0958ca55b83a15cd Mon Sep 17 00:00:00 2001 +From: William Zhang +Date: Thu, 6 Jul 2023 11:29:08 -0700 +Subject: mtd: rawnand: brcmnand: Fix potential out-of-bounds access in oob write + +From: William Zhang + +commit 5d53244186c9ac58cb88d76a0958ca55b83a15cd upstream. + +When the oob buffer length is not in multiple of words, the oob write +function does out-of-bounds read on the oob source buffer at the last +iteration. Fix that by always checking length limit on the oob buffer +read and fill with 0xff when reaching the end of the buffer to the oob +registers. + +Fixes: 27c5b17cd1b1 ("mtd: nand: add NAND driver "library" for Broadcom STB NAND controller") +Signed-off-by: William Zhang +Reviewed-by: Florian Fainelli +Cc: stable@vger.kernel.org +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20230706182909.79151-5-william.zhang@broadcom.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/brcmnand/brcmnand.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c ++++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c +@@ -1429,19 +1429,33 @@ static int write_oob_to_regs(struct brcm + const u8 *oob, int sas, int sector_1k) + { + int tbytes = sas << sector_1k; +- int j; ++ int j, k = 0; ++ u32 last = 0xffffffff; ++ u8 *plast = (u8 *)&last; + + /* Adjust OOB values for 1K sector size */ + if (sector_1k && (i & 0x01)) + tbytes = max(0, tbytes - (int)ctrl->max_oob); + tbytes = min_t(int, tbytes, ctrl->max_oob); + +- for (j = 0; j < tbytes; j += 4) ++ /* ++ * tbytes may not be multiple of words. Make sure we don't read out of ++ * the boundary and stop at last word. ++ */ ++ for (j = 0; (j + 3) < tbytes; j += 4) + oob_reg_write(ctrl, j, + (oob[j + 0] << 24) | + (oob[j + 1] << 16) | + (oob[j + 2] << 8) | + (oob[j + 3] << 0)); ++ ++ /* handle the remaing bytes */ ++ while (j < tbytes) ++ plast[k++] = oob[j++]; ++ ++ if (tbytes & 0x3) ++ oob_reg_write(ctrl, (tbytes & ~0x3), (__force u32)cpu_to_be32(last)); ++ + return tbytes; + } + diff --git a/queue-5.10/perf-hists-browser-fix-hierarchy-mode-header.patch b/queue-5.10/perf-hists-browser-fix-hierarchy-mode-header.patch new file mode 100644 index 00000000000..a558462a8bf --- /dev/null +++ b/queue-5.10/perf-hists-browser-fix-hierarchy-mode-header.patch @@ -0,0 +1,43 @@ +From e2cabf2a44791f01c21f8d5189b946926e34142e Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Mon, 31 Jul 2023 02:49:32 -0700 +Subject: perf hists browser: Fix hierarchy mode header + +From: Namhyung Kim + +commit e2cabf2a44791f01c21f8d5189b946926e34142e upstream. + +The commit ef9ff6017e3c4593 ("perf ui browser: Move the extra title +lines from the hists browser") introduced ui_browser__gotorc_title() to +help moving non-title lines easily. But it missed to update the title +for the hierarchy mode so it won't print the header line on TUI at all. + + $ perf report --hierarchy + +Fixes: ef9ff6017e3c4593 ("perf ui browser: Move the extra title lines from the hists browser") +Signed-off-by: Namhyung Kim +Tested-by: Arnaldo Carvalho de Melo +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Peter Zijlstra +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20230731094934.1616495-1-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/ui/browsers/hists.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tools/perf/ui/browsers/hists.c ++++ b/tools/perf/ui/browsers/hists.c +@@ -1778,7 +1778,7 @@ static void hists_browser__hierarchy_hea + hists_browser__scnprintf_hierarchy_headers(browser, headers, + sizeof(headers)); + +- ui_browser__gotorc(&browser->b, 0, 0); ++ ui_browser__gotorc_title(&browser->b, 0, 0); + ui_browser__set_color(&browser->b, HE_COLORSET_ROOT); + ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1); + } diff --git a/queue-5.10/perf-hists-browser-fix-the-number-of-entries-for-e-key.patch b/queue-5.10/perf-hists-browser-fix-the-number-of-entries-for-e-key.patch new file mode 100644 index 00000000000..94296bba784 --- /dev/null +++ b/queue-5.10/perf-hists-browser-fix-the-number-of-entries-for-e-key.patch @@ -0,0 +1,150 @@ +From f6b8436bede3e80226e8b2100279c4450c73806a Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Mon, 31 Jul 2023 02:49:33 -0700 +Subject: perf hists browser: Fix the number of entries for 'e' key + +From: Namhyung Kim + +commit f6b8436bede3e80226e8b2100279c4450c73806a upstream. + +The 'e' key is to toggle expand/collapse the selected entry only. But +the current code has a bug that it only increases the number of entries +by 1 in the hierarchy mode so users cannot move under the current entry +after the key stroke. This is due to a wrong assumption in the +hist_entry__set_folding(). + +The commit b33f922651011eff ("perf hists browser: Put hist_entry folding +logic into single function") factored out the code, but actually it +should be handled separately. The hist_browser__set_folding() is to +update fold state for each entry so it needs to traverse all (child) +entries regardless of the current fold state. So it increases the +number of entries by 1. + +But the hist_entry__set_folding() only cares the currently selected +entry and its all children. So it should count all unfolded child +entries. This code is implemented in hist_browser__toggle_fold() +already so we can just call it. + +Fixes: b33f922651011eff ("perf hists browser: Put hist_entry folding logic into single function") +Signed-off-by: Namhyung Kim +Tested-by: Arnaldo Carvalho de Melo +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Peter Zijlstra +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20230731094934.1616495-2-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/ui/browsers/hists.c | 58 ++++++++++++++++------------------------- + 1 file changed, 24 insertions(+), 34 deletions(-) + +--- a/tools/perf/ui/browsers/hists.c ++++ b/tools/perf/ui/browsers/hists.c +@@ -407,11 +407,6 @@ static bool hist_browser__selection_has_ + return container_of(ms, struct callchain_list, ms)->has_children; + } + +-static bool hist_browser__he_selection_unfolded(struct hist_browser *browser) +-{ +- return browser->he_selection ? browser->he_selection->unfolded : false; +-} +- + static bool hist_browser__selection_unfolded(struct hist_browser *browser) + { + struct hist_entry *he = browser->he_selection; +@@ -584,8 +579,8 @@ static int hierarchy_set_folding(struct + return n; + } + +-static void __hist_entry__set_folding(struct hist_entry *he, +- struct hist_browser *hb, bool unfold) ++static void hist_entry__set_folding(struct hist_entry *he, ++ struct hist_browser *hb, bool unfold) + { + hist_entry__init_have_children(he); + he->unfolded = unfold ? he->has_children : false; +@@ -603,34 +598,12 @@ static void __hist_entry__set_folding(st + he->nr_rows = 0; + } + +-static void hist_entry__set_folding(struct hist_entry *he, +- struct hist_browser *browser, bool unfold) +-{ +- double percent; +- +- percent = hist_entry__get_percent_limit(he); +- if (he->filtered || percent < browser->min_pcnt) +- return; +- +- __hist_entry__set_folding(he, browser, unfold); +- +- if (!he->depth || unfold) +- browser->nr_hierarchy_entries++; +- if (he->leaf) +- browser->nr_callchain_rows += he->nr_rows; +- else if (unfold && !hist_entry__has_hierarchy_children(he, browser->min_pcnt)) { +- browser->nr_hierarchy_entries++; +- he->has_no_entry = true; +- he->nr_rows = 1; +- } else +- he->has_no_entry = false; +-} +- + static void + __hist_browser__set_folding(struct hist_browser *browser, bool unfold) + { + struct rb_node *nd; + struct hist_entry *he; ++ double percent; + + nd = rb_first_cached(&browser->hists->entries); + while (nd) { +@@ -640,6 +613,21 @@ __hist_browser__set_folding(struct hist_ + nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD); + + hist_entry__set_folding(he, browser, unfold); ++ ++ percent = hist_entry__get_percent_limit(he); ++ if (he->filtered || percent < browser->min_pcnt) ++ continue; ++ ++ if (!he->depth || unfold) ++ browser->nr_hierarchy_entries++; ++ if (he->leaf) ++ browser->nr_callchain_rows += he->nr_rows; ++ else if (unfold && !hist_entry__has_hierarchy_children(he, browser->min_pcnt)) { ++ browser->nr_hierarchy_entries++; ++ he->has_no_entry = true; ++ he->nr_rows = 1; ++ } else ++ he->has_no_entry = false; + } + } + +@@ -659,8 +647,10 @@ static void hist_browser__set_folding_se + if (!browser->he_selection) + return; + +- hist_entry__set_folding(browser->he_selection, browser, unfold); +- browser->b.nr_entries = hist_browser__nr_entries(browser); ++ if (unfold == browser->he_selection->unfolded) ++ return; ++ ++ hist_browser__toggle_fold(browser); + } + + static void ui_browser__warn_lost_events(struct ui_browser *browser) +@@ -731,8 +721,8 @@ static int hist_browser__handle_hotkey(s + hist_browser__set_folding(browser, true); + break; + case 'e': +- /* Expand the selected entry. */ +- hist_browser__set_folding_selected(browser, !hist_browser__he_selection_unfolded(browser)); ++ /* Toggle expand/collapse the selected entry. */ ++ hist_browser__toggle_fold(browser); + break; + case 'H': + browser->show_headers = !browser->show_headers; diff --git a/queue-5.10/perf-tools-handle-old-data-in-perf_record_attr.patch b/queue-5.10/perf-tools-handle-old-data-in-perf_record_attr.patch new file mode 100644 index 00000000000..a571f41a623 --- /dev/null +++ b/queue-5.10/perf-tools-handle-old-data-in-perf_record_attr.patch @@ -0,0 +1,90 @@ +From 9bf63282ea77a531ea58acb42fb3f40d2d1e4497 Mon Sep 17 00:00:00 2001 +From: Namhyung Kim +Date: Fri, 25 Aug 2023 08:25:49 -0700 +Subject: perf tools: Handle old data in PERF_RECORD_ATTR + +From: Namhyung Kim + +commit 9bf63282ea77a531ea58acb42fb3f40d2d1e4497 upstream. + +The PERF_RECORD_ATTR is used for a pipe mode to describe an event with +attribute and IDs. The ID table comes after the attr and it calculate +size of the table using the total record size and the attr size. + + n_ids = (total_record_size - end_of_the_attr_field) / sizeof(u64) + +This is fine for most use cases, but sometimes it saves the pipe output +in a file and then process it later. And it becomes a problem if there +is a change in attr size between the record and report. + + $ perf record -o- > perf-pipe.data # old version + $ perf report -i- < perf-pipe.data # new version + +For example, if the attr size is 128 and it has 4 IDs, then it would +save them in 168 byte like below: + + 8 byte: perf event header { .type = PERF_RECORD_ATTR, .size = 168 }, + 128 byte: perf event attr { .size = 128, ... }, + 32 byte: event IDs [] = { 1234, 1235, 1236, 1237 }, + +But when report later, it thinks the attr size is 136 then it only read +the last 3 entries as ID. + + 8 byte: perf event header { .type = PERF_RECORD_ATTR, .size = 168 }, + 136 byte: perf event attr { .size = 136, ... }, + 24 byte: event IDs [] = { 1235, 1236, 1237 }, // 1234 is missing + +So it should use the recorded version of the attr. The attr has the +size field already then it should honor the size when reading data. + +Fixes: 2c46dbb517a10b18 ("perf: Convert perf header attrs into attr events") +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Peter Zijlstra +Cc: Tom Zanussi +Cc: stable@vger.kernel.org +Link: https://lore.kernel.org/r/20230825152552.112913-1-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/util/header.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +--- a/tools/perf/util/header.c ++++ b/tools/perf/util/header.c +@@ -3987,7 +3987,8 @@ int perf_event__process_attr(struct perf + union perf_event *event, + struct evlist **pevlist) + { +- u32 i, ids, n_ids; ++ u32 i, n_ids; ++ u64 *ids; + struct evsel *evsel; + struct evlist *evlist = *pevlist; + +@@ -4003,9 +4004,8 @@ int perf_event__process_attr(struct perf + + evlist__add(evlist, evsel); + +- ids = event->header.size; +- ids -= (void *)&event->attr.id - (void *)event; +- n_ids = ids / sizeof(u64); ++ n_ids = event->header.size - sizeof(event->header) - event->attr.attr.size; ++ n_ids = n_ids / sizeof(u64); + /* + * We don't have the cpu and thread maps on the header, so + * for allocating the perf_sample_id table we fake 1 cpu and +@@ -4014,8 +4014,9 @@ int perf_event__process_attr(struct perf + if (perf_evsel__alloc_id(&evsel->core, 1, n_ids)) + return -ENOMEM; + ++ ids = (void *)&event->attr.attr + event->attr.attr.size; + for (i = 0; i < n_ids; i++) { +- perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, event->attr.id[i]); ++ perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, ids[i]); + } + + return 0; diff --git a/queue-5.10/series b/queue-5.10/series index 91f779829c9..4f731b3415c 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -370,3 +370,14 @@ ata-sata_gemini-add-missing-module_description.patch ata-pata_ftide010-add-missing-module_description.patch fuse-nlookup-missing-decrement-in-fuse_direntplus_link.patch btrfs-fix-start-transaction-qgroup-rsv-double-free.patch +btrfs-free-qgroup-rsv-on-io-failure.patch +btrfs-don-t-start-transaction-when-joining-with-trans_join_nostart.patch +btrfs-use-the-correct-superblock-to-compare-fsid-in-btrfs_validate_super.patch +btrfs-compare-the-correct-fsid-metadata_uuid-in-btrfs_validate_super.patch +mtd-rawnand-brcmnand-fix-crash-during-the-panic_write.patch +mtd-rawnand-brcmnand-fix-potential-out-of-bounds-access-in-oob-write.patch +mtd-rawnand-brcmnand-fix-potential-false-time-out-warning.patch +drm-amd-display-prevent-potential-division-by-zero-errors.patch +perf-hists-browser-fix-hierarchy-mode-header.patch +perf-tools-handle-old-data-in-perf_record_attr.patch +perf-hists-browser-fix-the-number-of-entries-for-e-key.patch