From: Sasha Levin Date: Fri, 23 Aug 2024 00:12:53 +0000 (-0400) Subject: Fixes for 6.6 X-Git-Tag: v6.1.107~81 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d949e0651e80a2d9781246b19b96028acf444f53;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 6.6 Signed-off-by: Sasha Levin --- diff --git a/queue-6.6/alsa-hda-tas2781-use-correct-endian-conversion.patch b/queue-6.6/alsa-hda-tas2781-use-correct-endian-conversion.patch new file mode 100644 index 00000000000..a92ff10c8ff --- /dev/null +++ b/queue-6.6/alsa-hda-tas2781-use-correct-endian-conversion.patch @@ -0,0 +1,44 @@ +From 7e5522d1bbb1e878e16e92187a65cc76473928ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 14 Aug 2024 12:04:59 +0200 +Subject: ALSA: hda/tas2781: Use correct endian conversion + +From: Takashi Iwai + +[ Upstream commit 829e2a23121fb36ee30ea5145c2a85199f68e2c8 ] + +The data conversion is done rather by a wrong function. We convert to +BE32, not from BE32. Although the end result must be same, this was +complained by the compiler. + +Fix the code again and align with another similar function +tas2563_apply_calib() that does already right. + +Fixes: 3beddef84d90 ("ALSA: hda/tas2781: fix wrong calibrated data order") +Reported-by: kernel test robot +Closes: https://lore.kernel.org/oe-kbuild-all/202408141630.DiDUB8Z4-lkp@intel.com/ +Link: https://patch.msgid.link/20240814100500.1944-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/pci/hda/tas2781_hda_i2c.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/pci/hda/tas2781_hda_i2c.c b/sound/pci/hda/tas2781_hda_i2c.c +index 74d603524fbdb..e5bb1fed26a0c 100644 +--- a/sound/pci/hda/tas2781_hda_i2c.c ++++ b/sound/pci/hda/tas2781_hda_i2c.c +@@ -433,8 +433,8 @@ static void tas2781_apply_calib(struct tasdevice_priv *tas_priv) + + for (i = 0; i < tas_priv->ndev; i++) { + for (j = 0; j < CALIB_MAX; j++) { +- data = get_unaligned_be32( +- &tas_priv->cali_data.data[offset]); ++ data = cpu_to_be32( ++ *(uint32_t *)&tas_priv->cali_data.data[offset]); + rc = tasdevice_dev_bulk_write(tas_priv, i, + TASDEVICE_REG(0, page_array[j], rgno_array[j]), + (unsigned char *)&data, 4); +-- +2.43.0 + diff --git a/queue-6.6/btrfs-replace-sb-s_blocksize-by-fs_info-sectorsize.patch b/queue-6.6/btrfs-replace-sb-s_blocksize-by-fs_info-sectorsize.patch new file mode 100644 index 00000000000..30d51229221 --- /dev/null +++ b/queue-6.6/btrfs-replace-sb-s_blocksize-by-fs_info-sectorsize.patch @@ -0,0 +1,160 @@ +From 1f25066622ef25b98a1efd6557df59b8b1dfa847 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Jan 2024 17:33:20 +0100 +Subject: btrfs: replace sb::s_blocksize by fs_info::sectorsize + +From: David Sterba + +[ Upstream commit 4e00422ee62663e31e611d7de4d2c4aa3f8555f2 ] + +The block size stored in the super block is used by subsystems outside +of btrfs and it's a copy of fs_info::sectorsize. Unify that to always +use our sectorsize, with the exception of mount where we first need to +use fixed values (4K) until we read the super block and can set the +sectorsize. + +Replace all uses, in most cases it's fewer pointer indirections. + +Reviewed-by: Josef Bacik +Reviewed-by: Anand Jain +Signed-off-by: David Sterba +Stable-dep-of: 46a6e10a1ab1 ("btrfs: send: allow cloning non-aligned extent if it ends at i_size") +Signed-off-by: Sasha Levin +--- + fs/btrfs/disk-io.c | 2 ++ + fs/btrfs/extent_io.c | 4 ++-- + fs/btrfs/inode.c | 2 +- + fs/btrfs/ioctl.c | 2 +- + fs/btrfs/reflink.c | 6 +++--- + fs/btrfs/send.c | 2 +- + fs/btrfs/super.c | 2 +- + 7 files changed, 11 insertions(+), 9 deletions(-) + +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index 1cc7e36c64c49..caedd4460d994 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -2800,6 +2800,7 @@ static int init_mount_fs_info(struct btrfs_fs_info *fs_info, struct super_block + int ret; + + fs_info->sb = sb; ++ /* Temporary fixed values for block size until we read the superblock. */ + sb->s_blocksize = BTRFS_BDEV_BLOCKSIZE; + sb->s_blocksize_bits = blksize_bits(BTRFS_BDEV_BLOCKSIZE); + +@@ -3339,6 +3340,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device + sb->s_bdi->ra_pages *= btrfs_super_num_devices(disk_super); + sb->s_bdi->ra_pages = max(sb->s_bdi->ra_pages, SZ_4M / PAGE_SIZE); + ++ /* Update the values for the current filesystem. */ + sb->s_blocksize = sectorsize; + sb->s_blocksize_bits = blksize_bits(sectorsize); + memcpy(&sb->s_uuid, fs_info->fs_devices->fsid, BTRFS_FSID_SIZE); +diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c +index c6a95dfa59c81..b2ae50dcca0fe 100644 +--- a/fs/btrfs/extent_io.c ++++ b/fs/btrfs/extent_io.c +@@ -974,7 +974,7 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached, + int ret = 0; + size_t pg_offset = 0; + size_t iosize; +- size_t blocksize = inode->i_sb->s_blocksize; ++ size_t blocksize = fs_info->sectorsize; + struct extent_io_tree *tree = &BTRFS_I(inode)->io_tree; + + ret = set_page_extent_mapped(page); +@@ -2254,7 +2254,7 @@ int extent_invalidate_folio(struct extent_io_tree *tree, + struct extent_state *cached_state = NULL; + u64 start = folio_pos(folio); + u64 end = start + folio_size(folio) - 1; +- size_t blocksize = folio->mapping->host->i_sb->s_blocksize; ++ size_t blocksize = btrfs_sb(folio->mapping->host->i_sb)->sectorsize; + + /* This function is only called for the btree inode */ + ASSERT(tree->owner == IO_TREE_BTREE_INODE_IO); +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index 7071a58e5b9d4..18ce5353092d7 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -8695,7 +8695,7 @@ static int btrfs_getattr(struct mnt_idmap *idmap, + u64 delalloc_bytes; + u64 inode_bytes; + struct inode *inode = d_inode(path->dentry); +- u32 blocksize = inode->i_sb->s_blocksize; ++ u32 blocksize = btrfs_sb(inode->i_sb)->sectorsize; + u32 bi_flags = BTRFS_I(inode)->flags; + u32 bi_ro_flags = BTRFS_I(inode)->ro_flags; + +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 3f43a08613d8a..d5297523d4977 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -528,7 +528,7 @@ static noinline int btrfs_ioctl_fitrim(struct btrfs_fs_info *fs_info, + * block group is in the logical address space, which can be any + * sectorsize aligned bytenr in the range [0, U64_MAX]. + */ +- if (range.len < fs_info->sb->s_blocksize) ++ if (range.len < fs_info->sectorsize) + return -EINVAL; + + range.minlen = max(range.minlen, minlen); +diff --git a/fs/btrfs/reflink.c b/fs/btrfs/reflink.c +index 65d2bd6910f2c..9f60aa79a8c50 100644 +--- a/fs/btrfs/reflink.c ++++ b/fs/btrfs/reflink.c +@@ -664,7 +664,7 @@ static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 len, + struct inode *dst, u64 dst_loff) + { + struct btrfs_fs_info *fs_info = BTRFS_I(src)->root->fs_info; +- const u64 bs = fs_info->sb->s_blocksize; ++ const u64 bs = fs_info->sectorsize; + int ret; + + /* +@@ -731,7 +731,7 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src, + int ret; + int wb_ret; + u64 len = olen; +- u64 bs = fs_info->sb->s_blocksize; ++ u64 bs = fs_info->sectorsize; + + /* + * VFS's generic_remap_file_range_prep() protects us from cloning the +@@ -797,7 +797,7 @@ static int btrfs_remap_file_range_prep(struct file *file_in, loff_t pos_in, + { + struct inode *inode_in = file_inode(file_in); + struct inode *inode_out = file_inode(file_out); +- u64 bs = BTRFS_I(inode_out)->root->fs_info->sb->s_blocksize; ++ u64 bs = BTRFS_I(inode_out)->root->fs_info->sectorsize; + u64 wb_len; + int ret; + +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c +index 163f36eb7491a..633d306933f3f 100644 +--- a/fs/btrfs/send.c ++++ b/fs/btrfs/send.c +@@ -6159,7 +6159,7 @@ static int send_write_or_clone(struct send_ctx *sctx, + int ret = 0; + u64 offset = key->offset; + u64 end; +- u64 bs = sctx->send_root->fs_info->sb->s_blocksize; ++ u64 bs = sctx->send_root->fs_info->sectorsize; + + end = min_t(u64, btrfs_file_extent_end(path), sctx->cur_inode_size); + if (offset >= end) +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index de0bfebce1269..e33587a814098 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -2124,7 +2124,7 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + buf->f_bavail = 0; + + buf->f_type = BTRFS_SUPER_MAGIC; +- buf->f_bsize = dentry->d_sb->s_blocksize; ++ buf->f_bsize = fs_info->sectorsize; + buf->f_namelen = BTRFS_NAME_LEN; + + /* We treat it as constant endianness (it doesn't matter _which_) +-- +2.43.0 + diff --git a/queue-6.6/btrfs-send-allow-cloning-non-aligned-extent-if-it-en.patch b/queue-6.6/btrfs-send-allow-cloning-non-aligned-extent-if-it-en.patch new file mode 100644 index 00000000000..da67189f9e5 --- /dev/null +++ b/queue-6.6/btrfs-send-allow-cloning-non-aligned-extent-if-it-en.patch @@ -0,0 +1,192 @@ +From 09b6cfee963b75b81103fc4e8c7ebb8ebb3f38e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 12 Aug 2024 14:18:06 +0100 +Subject: btrfs: send: allow cloning non-aligned extent if it ends at i_size + +From: Filipe Manana + +[ Upstream commit 46a6e10a1ab16cc71d4a3cab73e79aabadd6b8ea ] + +If we a find that an extent is shared but its end offset is not sector +size aligned, then we don't clone it and issue write operations instead. +This is because the reflink (remap_file_range) operation does not allow +to clone unaligned ranges, except if the end offset of the range matches +the i_size of the source and destination files (and the start offset is +sector size aligned). + +While this is not incorrect because send can only guarantee that a file +has the same data in the source and destination snapshots, it's not +optimal and generates confusion and surprising behaviour for users. + +For example, running this test: + + $ cat test.sh + #!/bin/bash + + DEV=/dev/sdi + MNT=/mnt/sdi + + mkfs.btrfs -f $DEV + mount $DEV $MNT + + # Use a file size not aligned to any possible sector size. + file_size=$((1 * 1024 * 1024 + 5)) # 1MB + 5 bytes + dd if=/dev/random of=$MNT/foo bs=$file_size count=1 + cp --reflink=always $MNT/foo $MNT/bar + + btrfs subvolume snapshot -r $MNT/ $MNT/snap + rm -f /tmp/send-test + btrfs send -f /tmp/send-test $MNT/snap + + umount $MNT + mkfs.btrfs -f $DEV + mount $DEV $MNT + + btrfs receive -vv -f /tmp/send-test $MNT + + xfs_io -r -c "fiemap -v" $MNT/snap/bar + + umount $MNT + +Gives the following result: + + (...) + mkfile o258-7-0 + rename o258-7-0 -> bar + write bar - offset=0 length=49152 + write bar - offset=49152 length=49152 + write bar - offset=98304 length=49152 + write bar - offset=147456 length=49152 + write bar - offset=196608 length=49152 + write bar - offset=245760 length=49152 + write bar - offset=294912 length=49152 + write bar - offset=344064 length=49152 + write bar - offset=393216 length=49152 + write bar - offset=442368 length=49152 + write bar - offset=491520 length=49152 + write bar - offset=540672 length=49152 + write bar - offset=589824 length=49152 + write bar - offset=638976 length=49152 + write bar - offset=688128 length=49152 + write bar - offset=737280 length=49152 + write bar - offset=786432 length=49152 + write bar - offset=835584 length=49152 + write bar - offset=884736 length=49152 + write bar - offset=933888 length=49152 + write bar - offset=983040 length=49152 + write bar - offset=1032192 length=16389 + chown bar - uid=0, gid=0 + chmod bar - mode=0644 + utimes bar + utimes + BTRFS_IOC_SET_RECEIVED_SUBVOL uuid=06d640da-9ca1-604c-b87c-3375175a8eb3, stransid=7 + /mnt/sdi/snap/bar: + EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS + 0: [0..2055]: 26624..28679 2056 0x1 + +There's no clone operation to clone extents from the file foo into file +bar and fiemap confirms there's no shared flag (0x2000). + +So update send_write_or_clone() so that it proceeds with cloning if the +source and destination ranges end at the i_size of the respective files. + +After this changes the result of the test is: + + (...) + mkfile o258-7-0 + rename o258-7-0 -> bar + clone bar - source=foo source offset=0 offset=0 length=1048581 + chown bar - uid=0, gid=0 + chmod bar - mode=0644 + utimes bar + utimes + BTRFS_IOC_SET_RECEIVED_SUBVOL uuid=582420f3-ea7d-564e-bbe5-ce440d622190, stransid=7 + /mnt/sdi/snap/bar: + EXT: FILE-OFFSET BLOCK-RANGE TOTAL FLAGS + 0: [0..2055]: 26624..28679 2056 0x2001 + +A test case for fstests will also follow up soon. + +Link: https://github.com/kdave/btrfs-progs/issues/572#issuecomment-2282841416 +CC: stable@vger.kernel.org # 5.10+ +Reviewed-by: Qu Wenruo +Signed-off-by: Filipe Manana +Reviewed-by: David Sterba +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/send.c | 52 ++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 39 insertions(+), 13 deletions(-) + +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c +index 633d306933f3f..e912d8e411cc4 100644 +--- a/fs/btrfs/send.c ++++ b/fs/btrfs/send.c +@@ -6160,25 +6160,51 @@ static int send_write_or_clone(struct send_ctx *sctx, + u64 offset = key->offset; + u64 end; + u64 bs = sctx->send_root->fs_info->sectorsize; ++ struct btrfs_file_extent_item *ei; ++ u64 disk_byte; ++ u64 data_offset; ++ u64 num_bytes; ++ struct btrfs_inode_info info = { 0 }; + + end = min_t(u64, btrfs_file_extent_end(path), sctx->cur_inode_size); + if (offset >= end) + return 0; + +- if (clone_root && IS_ALIGNED(end, bs)) { +- struct btrfs_file_extent_item *ei; +- u64 disk_byte; +- u64 data_offset; ++ num_bytes = end - offset; + +- ei = btrfs_item_ptr(path->nodes[0], path->slots[0], +- struct btrfs_file_extent_item); +- disk_byte = btrfs_file_extent_disk_bytenr(path->nodes[0], ei); +- data_offset = btrfs_file_extent_offset(path->nodes[0], ei); +- ret = clone_range(sctx, path, clone_root, disk_byte, +- data_offset, offset, end - offset); +- } else { +- ret = send_extent_data(sctx, path, offset, end - offset); +- } ++ if (!clone_root) ++ goto write_data; ++ ++ if (IS_ALIGNED(end, bs)) ++ goto clone_data; ++ ++ /* ++ * If the extent end is not aligned, we can clone if the extent ends at ++ * the i_size of the inode and the clone range ends at the i_size of the ++ * source inode, otherwise the clone operation fails with -EINVAL. ++ */ ++ if (end != sctx->cur_inode_size) ++ goto write_data; ++ ++ ret = get_inode_info(clone_root->root, clone_root->ino, &info); ++ if (ret < 0) ++ return ret; ++ ++ if (clone_root->offset + num_bytes == info.size) ++ goto clone_data; ++ ++write_data: ++ ret = send_extent_data(sctx, path, offset, num_bytes); ++ sctx->cur_inode_next_write_offset = end; ++ return ret; ++ ++clone_data: ++ ei = btrfs_item_ptr(path->nodes[0], path->slots[0], ++ struct btrfs_file_extent_item); ++ disk_byte = btrfs_file_extent_disk_bytenr(path->nodes[0], ei); ++ data_offset = btrfs_file_extent_offset(path->nodes[0], ei); ++ ret = clone_range(sctx, path, clone_root, disk_byte, data_offset, offset, ++ num_bytes); + sctx->cur_inode_next_write_offset = end; + return ret; + } +-- +2.43.0 + diff --git a/queue-6.6/change-alloc_pages-name-in-dma_map_ops-to-avoid-name.patch b/queue-6.6/change-alloc_pages-name-in-dma_map_ops-to-avoid-name.patch new file mode 100644 index 00000000000..ffb1a17465b --- /dev/null +++ b/queue-6.6/change-alloc_pages-name-in-dma_map_ops-to-avoid-name.patch @@ -0,0 +1,238 @@ +From 067a44a657c9aea19605af274e5fc1aec3952a42 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Mar 2024 09:36:39 -0700 +Subject: change alloc_pages name in dma_map_ops to avoid name conflicts +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Suren Baghdasaryan + +[ Upstream commit 8a2f11878771da65b8ac135c73b47dae13afbd62 ] + +After redefining alloc_pages, all uses of that name are being replaced. +Change the conflicting names to prevent preprocessor from replacing them +when it's not intended. + +Link: https://lkml.kernel.org/r/20240321163705.3067592-18-surenb@google.com +Signed-off-by: Suren Baghdasaryan +Tested-by: Kees Cook +Cc: Alexander Viro +Cc: Alex Gaynor +Cc: Alice Ryhl +Cc: Andreas Hindborg +Cc: Benno Lossin +Cc: "Björn Roy Baron" +Cc: Boqun Feng +Cc: Christoph Lameter +Cc: Dennis Zhou +Cc: Gary Guo +Cc: Kent Overstreet +Cc: Miguel Ojeda +Cc: Pasha Tatashin +Cc: Peter Zijlstra +Cc: Tejun Heo +Cc: Vlastimil Babka +Cc: Wedson Almeida Filho +Signed-off-by: Andrew Morton +Stable-dep-of: 61ebe5a747da ("mm/vmalloc: fix page mapping if vm_area_alloc_pages() with high order fallback to order 0") +Signed-off-by: Sasha Levin +--- + arch/alpha/kernel/pci_iommu.c | 2 +- + arch/mips/jazz/jazzdma.c | 2 +- + arch/powerpc/kernel/dma-iommu.c | 2 +- + arch/powerpc/platforms/ps3/system-bus.c | 4 ++-- + arch/powerpc/platforms/pseries/vio.c | 2 +- + arch/x86/kernel/amd_gart_64.c | 2 +- + drivers/iommu/dma-iommu.c | 2 +- + drivers/parisc/ccio-dma.c | 2 +- + drivers/parisc/sba_iommu.c | 2 +- + drivers/xen/grant-dma-ops.c | 2 +- + drivers/xen/swiotlb-xen.c | 2 +- + include/linux/dma-map-ops.h | 2 +- + kernel/dma/mapping.c | 4 ++-- + 13 files changed, 15 insertions(+), 15 deletions(-) + +diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c +index c81183935e970..7fcf3e9b71030 100644 +--- a/arch/alpha/kernel/pci_iommu.c ++++ b/arch/alpha/kernel/pci_iommu.c +@@ -929,7 +929,7 @@ const struct dma_map_ops alpha_pci_ops = { + .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + EXPORT_SYMBOL(alpha_pci_ops); +diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c +index eabddb89d221f..c97b089b99029 100644 +--- a/arch/mips/jazz/jazzdma.c ++++ b/arch/mips/jazz/jazzdma.c +@@ -617,7 +617,7 @@ const struct dma_map_ops jazz_dma_ops = { + .sync_sg_for_device = jazz_dma_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + EXPORT_SYMBOL(jazz_dma_ops); +diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c +index 8920862ffd791..f0ae39e77e374 100644 +--- a/arch/powerpc/kernel/dma-iommu.c ++++ b/arch/powerpc/kernel/dma-iommu.c +@@ -216,6 +216,6 @@ const struct dma_map_ops dma_iommu_ops = { + .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; +diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c +index d6b5f5ecd5152..56dc6b29a3e76 100644 +--- a/arch/powerpc/platforms/ps3/system-bus.c ++++ b/arch/powerpc/platforms/ps3/system-bus.c +@@ -695,7 +695,7 @@ static const struct dma_map_ops ps3_sb_dma_ops = { + .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + +@@ -709,7 +709,7 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { + .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + +diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c +index 2dc9cbc4bcd8f..0c90fc4c37963 100644 +--- a/arch/powerpc/platforms/pseries/vio.c ++++ b/arch/powerpc/platforms/pseries/vio.c +@@ -611,7 +611,7 @@ static const struct dma_map_ops vio_dma_mapping_ops = { + .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + +diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c +index 56a917df410d3..842a0ec5eaa9e 100644 +--- a/arch/x86/kernel/amd_gart_64.c ++++ b/arch/x86/kernel/amd_gart_64.c +@@ -676,7 +676,7 @@ static const struct dma_map_ops gart_dma_ops = { + .get_sgtable = dma_common_get_sgtable, + .dma_supported = dma_direct_supported, + .get_required_mask = dma_direct_get_required_mask, +- .alloc_pages = dma_direct_alloc_pages, ++ .alloc_pages_op = dma_direct_alloc_pages, + .free_pages = dma_direct_free_pages, + }; + +diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c +index 2da969fc89900..f5eb97726d1bb 100644 +--- a/drivers/iommu/dma-iommu.c ++++ b/drivers/iommu/dma-iommu.c +@@ -1614,7 +1614,7 @@ static const struct dma_map_ops iommu_dma_ops = { + .flags = DMA_F_PCI_P2PDMA_SUPPORTED, + .alloc = iommu_dma_alloc, + .free = iommu_dma_free, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + .alloc_noncontiguous = iommu_dma_alloc_noncontiguous, + .free_noncontiguous = iommu_dma_free_noncontiguous, +diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c +index 9ce0d20a6c581..feef537257d05 100644 +--- a/drivers/parisc/ccio-dma.c ++++ b/drivers/parisc/ccio-dma.c +@@ -1022,7 +1022,7 @@ static const struct dma_map_ops ccio_ops = { + .map_sg = ccio_map_sg, + .unmap_sg = ccio_unmap_sg, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + +diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c +index 05e7103d1d407..6f5b919280ff0 100644 +--- a/drivers/parisc/sba_iommu.c ++++ b/drivers/parisc/sba_iommu.c +@@ -1090,7 +1090,7 @@ static const struct dma_map_ops sba_ops = { + .map_sg = sba_map_sg, + .unmap_sg = sba_unmap_sg, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + }; + +diff --git a/drivers/xen/grant-dma-ops.c b/drivers/xen/grant-dma-ops.c +index 76f6f26265a3b..29257d2639dbf 100644 +--- a/drivers/xen/grant-dma-ops.c ++++ b/drivers/xen/grant-dma-ops.c +@@ -282,7 +282,7 @@ static int xen_grant_dma_supported(struct device *dev, u64 mask) + static const struct dma_map_ops xen_grant_dma_ops = { + .alloc = xen_grant_dma_alloc, + .free = xen_grant_dma_free, +- .alloc_pages = xen_grant_dma_alloc_pages, ++ .alloc_pages_op = xen_grant_dma_alloc_pages, + .free_pages = xen_grant_dma_free_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c +index 0e6c6c25d154f..1c4ef5111651d 100644 +--- a/drivers/xen/swiotlb-xen.c ++++ b/drivers/xen/swiotlb-xen.c +@@ -403,7 +403,7 @@ const struct dma_map_ops xen_swiotlb_dma_ops = { + .dma_supported = xen_swiotlb_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, +- .alloc_pages = dma_common_alloc_pages, ++ .alloc_pages_op = dma_common_alloc_pages, + .free_pages = dma_common_free_pages, + .max_mapping_size = swiotlb_max_mapping_size, + }; +diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h +index f2fc203fb8a1a..3a8a015fdd2ed 100644 +--- a/include/linux/dma-map-ops.h ++++ b/include/linux/dma-map-ops.h +@@ -28,7 +28,7 @@ struct dma_map_ops { + unsigned long attrs); + void (*free)(struct device *dev, size_t size, void *vaddr, + dma_addr_t dma_handle, unsigned long attrs); +- struct page *(*alloc_pages)(struct device *dev, size_t size, ++ struct page *(*alloc_pages_op)(struct device *dev, size_t size, + dma_addr_t *dma_handle, enum dma_data_direction dir, + gfp_t gfp); + void (*free_pages)(struct device *dev, size_t size, struct page *vaddr, +diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c +index f1d9f01b283d7..2923f3b2dd2c7 100644 +--- a/kernel/dma/mapping.c ++++ b/kernel/dma/mapping.c +@@ -570,9 +570,9 @@ static struct page *__dma_alloc_pages(struct device *dev, size_t size, + size = PAGE_ALIGN(size); + if (dma_alloc_direct(dev, ops)) + return dma_direct_alloc_pages(dev, size, dma_handle, dir, gfp); +- if (!ops->alloc_pages) ++ if (!ops->alloc_pages_op) + return NULL; +- return ops->alloc_pages(dev, size, dma_handle, dir, gfp); ++ return ops->alloc_pages_op(dev, size, dma_handle, dir, gfp); + } + + struct page *dma_alloc_pages(struct device *dev, size_t size, +-- +2.43.0 + diff --git a/queue-6.6/dm-suspend-return-erestartsys-instead-of-eintr.patch b/queue-6.6/dm-suspend-return-erestartsys-instead-of-eintr.patch new file mode 100644 index 00000000000..5c949876838 --- /dev/null +++ b/queue-6.6/dm-suspend-return-erestartsys-instead-of-eintr.patch @@ -0,0 +1,48 @@ +From 9c4287531ba7f5fb57ad9806a993f49629e83c5d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 13 Aug 2024 12:38:51 +0200 +Subject: dm suspend: return -ERESTARTSYS instead of -EINTR + +From: Mikulas Patocka + +[ Upstream commit 1e1fd567d32fcf7544c6e09e0e5bc6c650da6e23 ] + +This commit changes device mapper, so that it returns -ERESTARTSYS +instead of -EINTR when it is interrupted by a signal (so that the ioctl +can be restarted). + +The manpage signal(7) says that the ioctl function should be restarted if +the signal was handled with SA_RESTART. + +Signed-off-by: Mikulas Patocka +Cc: stable@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/md/dm.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index f945ee453457b..8ec0a263744a5 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -2531,7 +2531,7 @@ static int dm_wait_for_bios_completion(struct mapped_device *md, unsigned int ta + break; + + if (signal_pending_state(task_state, current)) { +- r = -EINTR; ++ r = -ERESTARTSYS; + break; + } + +@@ -2556,7 +2556,7 @@ static int dm_wait_for_completion(struct mapped_device *md, unsigned int task_st + break; + + if (signal_pending_state(task_state, current)) { +- r = -EINTR; ++ r = -ERESTARTSYS; + break; + } + +-- +2.43.0 + diff --git a/queue-6.6/drm-amd-amdgpu-command-submission-parser-for-jpeg.patch b/queue-6.6/drm-amd-amdgpu-command-submission-parser-for-jpeg.patch new file mode 100644 index 00000000000..7633c274130 --- /dev/null +++ b/queue-6.6/drm-amd-amdgpu-command-submission-parser-for-jpeg.patch @@ -0,0 +1,166 @@ +From 1f9fe67cc7797d642cdb7e4b42cddd6f051dfb7b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Aug 2024 12:19:50 -0400 +Subject: drm/amd/amdgpu: command submission parser for JPEG + +From: David (Ming Qiang) Wu + +[ Upstream commit 470516c2925493594a690bc4d05b1f4471d9f996 ] + +Add JPEG IB command parser to ensure registers +in the command are within the JPEG IP block. + +Reviewed-by: Alex Deucher +Signed-off-by: David (Ming Qiang) Wu +Signed-off-by: Alex Deucher +(cherry picked from commit a7f670d5d8e77b092404ca8a35bb0f8f89ed3117) +Cc: stable@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 3 ++ + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 61 +++++++++++++++++++++++- + drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h | 6 +++ + drivers/gpu/drm/amd/amdgpu/soc15d.h | 6 +++ + 4 files changed, 75 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +index 4294f5e7bff9a..61668a784315f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -1057,6 +1057,9 @@ static int amdgpu_cs_patch_ibs(struct amdgpu_cs_parser *p, + r = amdgpu_ring_parse_cs(ring, p, job, ib); + if (r) + return r; ++ ++ if (ib->sa_bo) ++ ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); + } else { + ib->ptr = (uint32_t *)kptr; + r = amdgpu_ring_patch_cs_in_place(ring, p, job, ib); +diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c +index e8dad396fa102..78aaaee492e11 100644 +--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c ++++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c +@@ -23,6 +23,7 @@ + + #include "amdgpu.h" + #include "amdgpu_jpeg.h" ++#include "amdgpu_cs.h" + #include "soc15.h" + #include "soc15d.h" + #include "jpeg_v4_0_3.h" +@@ -769,7 +770,11 @@ static void jpeg_v4_0_3_dec_ring_emit_ib(struct amdgpu_ring *ring, + + amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JRBC_IB_VMID_INTERNAL_OFFSET, + 0, 0, PACKETJ_TYPE0)); +- amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8))); ++ ++ if (ring->funcs->parse_cs) ++ amdgpu_ring_write(ring, 0); ++ else ++ amdgpu_ring_write(ring, (vmid | (vmid << 4) | (vmid << 8))); + + amdgpu_ring_write(ring, PACKETJ(regUVD_LMI_JPEG_VMID_INTERNAL_OFFSET, + 0, 0, PACKETJ_TYPE0)); +@@ -1052,6 +1057,7 @@ static const struct amdgpu_ring_funcs jpeg_v4_0_3_dec_ring_vm_funcs = { + .get_rptr = jpeg_v4_0_3_dec_ring_get_rptr, + .get_wptr = jpeg_v4_0_3_dec_ring_get_wptr, + .set_wptr = jpeg_v4_0_3_dec_ring_set_wptr, ++ .parse_cs = jpeg_v4_0_3_dec_ring_parse_cs, + .emit_frame_size = + SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 + + SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 8 + +@@ -1216,3 +1222,56 @@ static void jpeg_v4_0_3_set_ras_funcs(struct amdgpu_device *adev) + { + adev->jpeg.ras = &jpeg_v4_0_3_ras; + } ++ ++/** ++ * jpeg_v4_0_3_dec_ring_parse_cs - command submission parser ++ * ++ * @parser: Command submission parser context ++ * @job: the job to parse ++ * @ib: the IB to parse ++ * ++ * Parse the command stream, return -EINVAL for invalid packet, ++ * 0 otherwise ++ */ ++int jpeg_v4_0_3_dec_ring_parse_cs(struct amdgpu_cs_parser *parser, ++ struct amdgpu_job *job, ++ struct amdgpu_ib *ib) ++{ ++ uint32_t i, reg, res, cond, type; ++ struct amdgpu_device *adev = parser->adev; ++ ++ for (i = 0; i < ib->length_dw ; i += 2) { ++ reg = CP_PACKETJ_GET_REG(ib->ptr[i]); ++ res = CP_PACKETJ_GET_RES(ib->ptr[i]); ++ cond = CP_PACKETJ_GET_COND(ib->ptr[i]); ++ type = CP_PACKETJ_GET_TYPE(ib->ptr[i]); ++ ++ if (res) /* only support 0 at the moment */ ++ return -EINVAL; ++ ++ switch (type) { ++ case PACKETJ_TYPE0: ++ if (cond != PACKETJ_CONDITION_CHECK0 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) { ++ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); ++ return -EINVAL; ++ } ++ break; ++ case PACKETJ_TYPE3: ++ if (cond != PACKETJ_CONDITION_CHECK3 || reg < JPEG_REG_RANGE_START || reg > JPEG_REG_RANGE_END) { ++ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); ++ return -EINVAL; ++ } ++ break; ++ case PACKETJ_TYPE6: ++ if (ib->ptr[i] == CP_PACKETJ_NOP) ++ continue; ++ dev_err(adev->dev, "Invalid packet [0x%08x]!\n", ib->ptr[i]); ++ return -EINVAL; ++ default: ++ dev_err(adev->dev, "Unknown packet type %d !\n", type); ++ return -EINVAL; ++ } ++ } ++ ++ return 0; ++} +diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h +index 22483dc663518..9598eda9d7156 100644 +--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h ++++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.h +@@ -46,6 +46,12 @@ + + #define JRBC_DEC_EXTERNAL_REG_WRITE_ADDR 0x18000 + ++#define JPEG_REG_RANGE_START 0x4000 ++#define JPEG_REG_RANGE_END 0x41c2 ++ + extern const struct amdgpu_ip_block_version jpeg_v4_0_3_ip_block; + ++int jpeg_v4_0_3_dec_ring_parse_cs(struct amdgpu_cs_parser *parser, ++ struct amdgpu_job *job, ++ struct amdgpu_ib *ib); + #endif /* __JPEG_V4_0_3_H__ */ +diff --git a/drivers/gpu/drm/amd/amdgpu/soc15d.h b/drivers/gpu/drm/amd/amdgpu/soc15d.h +index 2357ff39323f0..e74e1983da53a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/soc15d.h ++++ b/drivers/gpu/drm/amd/amdgpu/soc15d.h +@@ -76,6 +76,12 @@ + ((cond & 0xF) << 24) | \ + ((type & 0xF) << 28)) + ++#define CP_PACKETJ_NOP 0x60000000 ++#define CP_PACKETJ_GET_REG(x) ((x) & 0x3FFFF) ++#define CP_PACKETJ_GET_RES(x) (((x) >> 18) & 0x3F) ++#define CP_PACKETJ_GET_COND(x) (((x) >> 24) & 0xF) ++#define CP_PACKETJ_GET_TYPE(x) (((x) >> 28) & 0xF) ++ + /* Packet 3 types */ + #define PACKET3_NOP 0x10 + #define PACKET3_SET_BASE 0x11 +-- +2.43.0 + diff --git a/queue-6.6/drm-amd-display-adjust-cursor-position.patch b/queue-6.6/drm-amd-display-adjust-cursor-position.patch new file mode 100644 index 00000000000..5fd2db641b6 --- /dev/null +++ b/queue-6.6/drm-amd-display-adjust-cursor-position.patch @@ -0,0 +1,46 @@ +From 88b4f11df02c828240df4d0a5774856c9aa51018 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Aug 2024 16:16:35 -0600 +Subject: drm/amd/display: Adjust cursor position + +From: Rodrigo Siqueira + +[ Upstream commit 56fb276d0244d430496f249335a44ae114dd5f54 ] + +[why & how] +When the commit 9d84c7ef8a87 ("drm/amd/display: Correct cursor position +on horizontal mirror") was introduced, it used the wrong calculation for +the position copy for X. This commit uses the correct calculation for that +based on the original patch. + +Fixes: 9d84c7ef8a87 ("drm/amd/display: Correct cursor position on horizontal mirror") +Cc: Mario Limonciello +Cc: Alex Deucher +Acked-by: Wayne Lin +Signed-off-by: Rodrigo Siqueira +Signed-off-by: Tom Chung +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +(cherry picked from commit 8f9b23abbae5ffcd64856facd26a86b67195bc2f) +Cc: stable@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index e3f4d497d32d5..c9f13c3768431 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -3614,7 +3614,7 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) + (int)hubp->curs_attr.width || pos_cpy.x + <= (int)hubp->curs_attr.width + + pipe_ctx->plane_state->src_rect.x) { +- pos_cpy.x = 2 * viewport_width - temp_x; ++ pos_cpy.x = temp_x + viewport_width; + } + } + } else { +-- +2.43.0 + diff --git a/queue-6.6/drm-amd-display-enable-otg-synchronization-logic-for.patch b/queue-6.6/drm-amd-display-enable-otg-synchronization-logic-for.patch new file mode 100644 index 00000000000..f5dc4030c8c --- /dev/null +++ b/queue-6.6/drm-amd-display-enable-otg-synchronization-logic-for.patch @@ -0,0 +1,50 @@ +From 6b6b331862871739f86f274c8f134ed81c1a76ca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 2 Aug 2024 13:57:40 +0800 +Subject: drm/amd/display: Enable otg synchronization logic for DCN321 + +From: Loan Chen + +[ Upstream commit 0dbb81d44108a2a1004e5b485ef3fca5bc078424 ] + +[Why] +Tiled display cannot synchronize properly after S3. +The fix for commit 5f0c74915815 ("drm/amd/display: Fix for otg +synchronization logic") is not enable in DCN321, which causes +the otg is excluded from synchronization. + +[How] +Enable otg synchronization logic in dcn321. + +Fixes: 5f0c74915815 ("drm/amd/display: Fix for otg synchronization logic") +Cc: Mario Limonciello +Cc: Alex Deucher +Reviewed-by: Alvin Lee +Signed-off-by: Loan Chen +Signed-off-by: Tom Chung +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +(cherry picked from commit d6ed53712f583423db61fbb802606759e023bf7b) +Cc: stable@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c +index 8d73cceb485bf..aa4c64eec7b3d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c +@@ -1756,6 +1756,9 @@ static bool dcn321_resource_construct( + dc->caps.color.mpc.ogam_rom_caps.hlg = 0; + dc->caps.color.mpc.ocsc = 1; + ++ /* Use pipe context based otg sync logic */ ++ dc->config.use_pipe_ctx_sync_logic = true; ++ + dc->config.dc_mode_clk_limit_support = true; + /* read VBIOS LTTPR caps */ + { +-- +2.43.0 + diff --git a/queue-6.6/drm-amd-display-fix-cursor-offset-on-rotation-180.patch b/queue-6.6/drm-amd-display-fix-cursor-offset-on-rotation-180.patch new file mode 100644 index 00000000000..d7eeadcb247 --- /dev/null +++ b/queue-6.6/drm-amd-display-fix-cursor-offset-on-rotation-180.patch @@ -0,0 +1,55 @@ +From e6b69ebd0d7740bceeb37b44da3d1592fe3d324b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 31 Jan 2023 15:05:46 -0100 +Subject: drm/amd/display: fix cursor offset on rotation 180 + +From: Melissa Wen + +[ Upstream commit 737222cebecbdbcdde2b69475c52bcb9ecfeb830 ] + +[why & how] +Cursor gets clipped off in the middle of the screen with hw +rotation 180. Fix a miscalculation of cursor offset when it's +placed near the edges in the pipe split case. + +Cursor bugs with hw rotation were reported on AMD issue +tracker: +https://gitlab.freedesktop.org/drm/amd/-/issues/2247 + +The issues on rotation 270 was fixed by: +https://lore.kernel.org/amd-gfx/20221118125935.4013669-22-Brian.Chang@amd.com/ +that partially addressed the rotation 180 too. So, this patch is the +final bits for rotation 180. + +Reported-by: Xaver Hugl +Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/2247 +Reviewed-by: Harry Wentland +Fixes: 9d84c7ef8a87 ("drm/amd/display: Correct cursor position on horizontal mirror") +Signed-off-by: Melissa Wen +Signed-off-by: Hamza Mahfooz +Signed-off-by: Tom Chung +Tested-by: Daniel Wheeler +Signed-off-by: Alex Deucher +(cherry picked from commit 1fd2cf090096af8a25bf85564341cfc21cec659d) +Cc: stable@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index c9f13c3768431..ff38a85c4fa22 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -3521,7 +3521,7 @@ void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx) + (int)hubp->curs_attr.width || pos_cpy.x + <= (int)hubp->curs_attr.width + + pipe_ctx->plane_state->src_rect.x) { +- pos_cpy.x = temp_x + viewport_width; ++ pos_cpy.x = 2 * viewport_width - temp_x; + } + } + } else { +-- +2.43.0 + diff --git a/queue-6.6/mm-fix-endless-reclaim-on-machines-with-unaccepted-m.patch b/queue-6.6/mm-fix-endless-reclaim-on-machines-with-unaccepted-m.patch new file mode 100644 index 00000000000..d21e30022e3 --- /dev/null +++ b/queue-6.6/mm-fix-endless-reclaim-on-machines-with-unaccepted-m.patch @@ -0,0 +1,161 @@ +From 257552b33be3ab3792954e5cb5ae2c3b07283026 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 Aug 2024 14:48:47 +0300 +Subject: mm: fix endless reclaim on machines with unaccepted memory + +From: Kirill A. Shutemov + +[ Upstream commit 807174a93d24c456503692dc3f5af322ee0b640a ] + +Unaccepted memory is considered unusable free memory, which is not counted +as free on the zone watermark check. This causes get_page_from_freelist() +to accept more memory to hit the high watermark, but it creates problems +in the reclaim path. + +The reclaim path encounters a failed zone watermark check and attempts to +reclaim memory. This is usually successful, but if there is little or no +reclaimable memory, it can result in endless reclaim with little to no +progress. This can occur early in the boot process, just after start of +the init process when the only reclaimable memory is the page cache of the +init executable and its libraries. + +Make unaccepted memory free from watermark check point of view. This way +unaccepted memory will never be the trigger of memory reclaim. Accept +more memory in the get_page_from_freelist() if needed. + +Link: https://lkml.kernel.org/r/20240809114854.3745464-2-kirill.shutemov@linux.intel.com +Fixes: dcdfdd40fa82 ("mm: Add support for unaccepted memory") +Signed-off-by: Kirill A. Shutemov +Reported-by: Jianxiong Gao +Acked-by: David Hildenbrand +Tested-by: Jianxiong Gao +Cc: Borislav Petkov +Cc: Johannes Weiner +Cc: Kirill A. Shutemov +Cc: Matthew Wilcox +Cc: Mel Gorman +Cc: Mike Rapoport (Microsoft) +Cc: Tom Lendacky +Cc: Vlastimil Babka +Cc: [6.5+] +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + mm/page_alloc.c | 42 ++++++++++++++++++++---------------------- + 1 file changed, 20 insertions(+), 22 deletions(-) + +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 39bdbfb5313fb..edb32635037f4 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -302,7 +302,7 @@ EXPORT_SYMBOL(nr_online_nodes); + + static bool page_contains_unaccepted(struct page *page, unsigned int order); + static void accept_page(struct page *page, unsigned int order); +-static bool try_to_accept_memory(struct zone *zone, unsigned int order); ++static bool cond_accept_memory(struct zone *zone, unsigned int order); + static inline bool has_unaccepted_memory(void); + static bool __free_unaccepted(struct page *page); + +@@ -2830,9 +2830,6 @@ static inline long __zone_watermark_unusable_free(struct zone *z, + if (!(alloc_flags & ALLOC_CMA)) + unusable_free += zone_page_state(z, NR_FREE_CMA_PAGES); + #endif +-#ifdef CONFIG_UNACCEPTED_MEMORY +- unusable_free += zone_page_state(z, NR_UNACCEPTED); +-#endif + + return unusable_free; + } +@@ -3126,16 +3123,16 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags, + } + } + ++ cond_accept_memory(zone, order); ++ + mark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK); + if (!zone_watermark_fast(zone, order, mark, + ac->highest_zoneidx, alloc_flags, + gfp_mask)) { + int ret; + +- if (has_unaccepted_memory()) { +- if (try_to_accept_memory(zone, order)) +- goto try_this_zone; +- } ++ if (cond_accept_memory(zone, order)) ++ goto try_this_zone; + + #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT + /* +@@ -3189,10 +3186,8 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags, + + return page; + } else { +- if (has_unaccepted_memory()) { +- if (try_to_accept_memory(zone, order)) +- goto try_this_zone; +- } ++ if (cond_accept_memory(zone, order)) ++ goto try_this_zone; + + #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT + /* Try again if zone has deferred pages */ +@@ -6619,9 +6614,6 @@ static bool try_to_accept_memory_one(struct zone *zone) + struct page *page; + bool last; + +- if (list_empty(&zone->unaccepted_pages)) +- return false; +- + spin_lock_irqsave(&zone->lock, flags); + page = list_first_entry_or_null(&zone->unaccepted_pages, + struct page, lru); +@@ -6647,23 +6639,29 @@ static bool try_to_accept_memory_one(struct zone *zone) + return true; + } + +-static bool try_to_accept_memory(struct zone *zone, unsigned int order) ++static bool cond_accept_memory(struct zone *zone, unsigned int order) + { + long to_accept; +- int ret = false; ++ bool ret = false; ++ ++ if (!has_unaccepted_memory()) ++ return false; ++ ++ if (list_empty(&zone->unaccepted_pages)) ++ return false; + + /* How much to accept to get to high watermark? */ + to_accept = high_wmark_pages(zone) - + (zone_page_state(zone, NR_FREE_PAGES) - +- __zone_watermark_unusable_free(zone, order, 0)); ++ __zone_watermark_unusable_free(zone, order, 0) - ++ zone_page_state(zone, NR_UNACCEPTED)); + +- /* Accept at least one page */ +- do { ++ while (to_accept > 0) { + if (!try_to_accept_memory_one(zone)) + break; + ret = true; + to_accept -= MAX_ORDER_NR_PAGES; +- } while (to_accept > 0); ++ } + + return ret; + } +@@ -6706,7 +6704,7 @@ static void accept_page(struct page *page, unsigned int order) + { + } + +-static bool try_to_accept_memory(struct zone *zone, unsigned int order) ++static bool cond_accept_memory(struct zone *zone, unsigned int order) + { + return false; + } +-- +2.43.0 + diff --git a/queue-6.6/mm-vmalloc-fix-page-mapping-if-vm_area_alloc_pages-w.patch b/queue-6.6/mm-vmalloc-fix-page-mapping-if-vm_area_alloc_pages-w.patch new file mode 100644 index 00000000000..fc87697578f --- /dev/null +++ b/queue-6.6/mm-vmalloc-fix-page-mapping-if-vm_area_alloc_pages-w.patch @@ -0,0 +1,74 @@ +From 09369399e55a001e315d20eb951f822b702dc628 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 8 Aug 2024 20:19:56 +0800 +Subject: mm/vmalloc: fix page mapping if vm_area_alloc_pages() with high order + fallback to order 0 + +From: Hailong Liu + +[ Upstream commit 61ebe5a747da649057c37be1c37eb934b4af79ca ] + +The __vmap_pages_range_noflush() assumes its argument pages** contains +pages with the same page shift. However, since commit e9c3cda4d86e ("mm, +vmalloc: fix high order __GFP_NOFAIL allocations"), if gfp_flags includes +__GFP_NOFAIL with high order in vm_area_alloc_pages() and page allocation +failed for high order, the pages** may contain two different page shifts +(high order and order-0). This could lead __vmap_pages_range_noflush() to +perform incorrect mappings, potentially resulting in memory corruption. + +Users might encounter this as follows (vmap_allow_huge = true, 2M is for +PMD_SIZE): + +kvmalloc(2M, __GFP_NOFAIL|GFP_X) + __vmalloc_node_range_noprof(vm_flags=VM_ALLOW_HUGE_VMAP) + vm_area_alloc_pages(order=9) ---> order-9 allocation failed and fallback to order-0 + vmap_pages_range() + vmap_pages_range_noflush() + __vmap_pages_range_noflush(page_shift = 21) ----> wrong mapping happens + +We can remove the fallback code because if a high-order allocation fails, +__vmalloc_node_range_noprof() will retry with order-0. Therefore, it is +unnecessary to fallback to order-0 here. Therefore, fix this by removing +the fallback code. + +Link: https://lkml.kernel.org/r/20240808122019.3361-1-hailong.liu@oppo.com +Fixes: e9c3cda4d86e ("mm, vmalloc: fix high order __GFP_NOFAIL allocations") +Signed-off-by: Hailong Liu +Reported-by: Tangquan Zheng +Reviewed-by: Baoquan He +Reviewed-by: Uladzislau Rezki (Sony) +Acked-by: Barry Song +Acked-by: Michal Hocko +Cc: Matthew Wilcox +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + mm/vmalloc.c | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index 078f6b53f8d50..732ff66d1b513 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -3079,15 +3079,8 @@ vm_area_alloc_pages(gfp_t gfp, int nid, + page = alloc_pages(alloc_gfp, order); + else + page = alloc_pages_node(nid, alloc_gfp, order); +- if (unlikely(!page)) { +- if (!nofail) +- break; +- +- /* fall back to the zero order allocations */ +- alloc_gfp |= __GFP_NOFAIL; +- order = 0; +- continue; +- } ++ if (unlikely(!page)) ++ break; + + /* + * Higher order allocations must be able to be treated as +-- +2.43.0 + diff --git a/queue-6.6/platform-surface-aggregator-fix-warning-when-control.patch b/queue-6.6/platform-surface-aggregator-fix-warning-when-control.patch new file mode 100644 index 00000000000..544b05d791d --- /dev/null +++ b/queue-6.6/platform-surface-aggregator-fix-warning-when-control.patch @@ -0,0 +1,65 @@ +From f087c92a2ff9a60d85e67b06fae13b0726569285 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 11 Aug 2024 14:46:44 +0200 +Subject: platform/surface: aggregator: Fix warning when controller is + destroyed in probe +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Maximilian Luz + +[ Upstream commit bc923d594db21bee0ead128eb4bb78f7e77467a4 ] + +There is a small window in ssam_serial_hub_probe() where the controller +is initialized but has not been started yet. Specifically, between +ssam_controller_init() and ssam_controller_start(). Any failure in this +window, for example caused by a failure of serdev_device_open(), +currently results in an incorrect warning being emitted. + +In particular, any failure in this window results in the controller +being destroyed via ssam_controller_destroy(). This function checks the +state of the controller and, in an attempt to validate that the +controller has been cleanly shut down before we try and deallocate any +resources, emits a warning if that state is not SSAM_CONTROLLER_STOPPED. + +However, since we have only just initialized the controller and have not +yet started it, its state is SSAM_CONTROLLER_INITIALIZED. Note that this +is the only point at which the controller has this state, as it will +change after we start the controller with ssam_controller_start() and +never revert back. Further, at this point no communication has taken +place and the sender and receiver threads have not been started yet (and +we may not even have an open serdev device either). + +Therefore, it is perfectly safe to call ssam_controller_destroy() with a +state of SSAM_CONTROLLER_INITIALIZED. This, however, means that the +warning currently being emitted is incorrect. Fix it by extending the +check. + +Fixes: c167b9c7e3d6 ("platform/surface: Add Surface Aggregator subsystem") +Signed-off-by: Maximilian Luz +Link: https://lore.kernel.org/r/20240811124645.246016-1-luzmaximilian@gmail.com +Reviewed-by: Ilpo Järvinen +Signed-off-by: Ilpo Järvinen +Signed-off-by: Sasha Levin +--- + drivers/platform/surface/aggregator/controller.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/platform/surface/aggregator/controller.c b/drivers/platform/surface/aggregator/controller.c +index 7fc602e01487d..7e89f547999b2 100644 +--- a/drivers/platform/surface/aggregator/controller.c ++++ b/drivers/platform/surface/aggregator/controller.c +@@ -1354,7 +1354,8 @@ void ssam_controller_destroy(struct ssam_controller *ctrl) + if (ctrl->state == SSAM_CONTROLLER_UNINITIALIZED) + return; + +- WARN_ON(ctrl->state != SSAM_CONTROLLER_STOPPED); ++ WARN_ON(ctrl->state != SSAM_CONTROLLER_STOPPED && ++ ctrl->state != SSAM_CONTROLLER_INITIALIZED); + + /* + * Note: New events could still have been received after the previous +-- +2.43.0 + diff --git a/queue-6.6/riscv-entry-always-initialize-regs-a0-to-enosys.patch b/queue-6.6/riscv-entry-always-initialize-regs-a0-to-enosys.patch new file mode 100644 index 00000000000..24db130e661 --- /dev/null +++ b/queue-6.6/riscv-entry-always-initialize-regs-a0-to-enosys.patch @@ -0,0 +1,53 @@ +From 2655116dd112d497ae6c72bc4916b575a491880a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 27 Jun 2024 22:23:39 +0800 +Subject: riscv: entry: always initialize regs->a0 to -ENOSYS +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Celeste Liu + +[ Upstream commit 61119394631f219e23ce98bcc3eb993a64a8ea64 ] + +Otherwise when the tracer changes syscall number to -1, the kernel fails +to initialize a0 with -ENOSYS and subsequently fails to return the error +code of the failed syscall to userspace. For example, it will break +strace syscall tampering. + +Fixes: 52449c17bdd1 ("riscv: entry: set a0 = -ENOSYS only when syscall != -1") +Reported-by: "Dmitry V. Levin" +Reviewed-by: Björn Töpel +Cc: stable@vger.kernel.org +Signed-off-by: Celeste Liu +Link: https://lore.kernel.org/r/20240627142338.5114-2-CoelacanthusHex@gmail.com +Signed-off-by: Palmer Dabbelt +Signed-off-by: Sasha Levin +--- + arch/riscv/kernel/traps.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c +index 67d0073fb624d..2158b7a65d74f 100644 +--- a/arch/riscv/kernel/traps.c ++++ b/arch/riscv/kernel/traps.c +@@ -311,6 +311,7 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) + + regs->epc += 4; + regs->orig_a0 = regs->a0; ++ regs->a0 = -ENOSYS; + + riscv_v_vstate_discard(regs); + +@@ -318,8 +319,6 @@ asmlinkage __visible __trap_section void do_trap_ecall_u(struct pt_regs *regs) + + if (syscall >= 0 && syscall < NR_syscalls) + syscall_handler(regs, syscall); +- else if (syscall != -1) +- regs->a0 = -ENOSYS; + + syscall_exit_to_user_mode(regs); + } else { +-- +2.43.0 + diff --git a/queue-6.6/selftests-memfd_secret-don-t-build-memfd_secret-test.patch b/queue-6.6/selftests-memfd_secret-don-t-build-memfd_secret-test.patch new file mode 100644 index 00000000000..15d3c440ef4 --- /dev/null +++ b/queue-6.6/selftests-memfd_secret-don-t-build-memfd_secret-test.patch @@ -0,0 +1,81 @@ +From 5feeb82293b6117f33a54470add1c72805524ee0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 9 Aug 2024 12:56:42 +0500 +Subject: selftests: memfd_secret: don't build memfd_secret test on unsupported + arches + +From: Muhammad Usama Anjum + +[ Upstream commit 7c5e8d212d7d81991a580e7de3904ea213d9a852 ] + +[1] mentions that memfd_secret is only supported on arm64, riscv, x86 and +x86_64 for now. It doesn't support other architectures. I found the +build error on arm and decided to send the fix as it was creating noise on +KernelCI: + +memfd_secret.c: In function 'memfd_secret': +memfd_secret.c:42:24: error: '__NR_memfd_secret' undeclared (first use in this function); +did you mean 'memfd_secret'? + 42 | return syscall(__NR_memfd_secret, flags); + | ^~~~~~~~~~~~~~~~~ + | memfd_secret + +Hence I'm adding condition that memfd_secret should only be compiled on +supported architectures. + +Also check in run_vmtests script if memfd_secret binary is present before +executing it. + +Link: https://lkml.kernel.org/r/20240812061522.1933054-1-usama.anjum@collabora.com +Link: https://lore.kernel.org/all/20210518072034.31572-7-rppt@kernel.org/ [1] +Link: https://lkml.kernel.org/r/20240809075642.403247-1-usama.anjum@collabora.com +Fixes: 76fe17ef588a ("secretmem: test: add basic selftest for memfd_secret(2)") +Signed-off-by: Muhammad Usama Anjum +Reviewed-by: Shuah Khan +Acked-by: Mike Rapoport (Microsoft) +Cc: Albert Ou +Cc: James Bottomley +Cc: Mike Rapoport (Microsoft) +Cc: Palmer Dabbelt +Cc: Paul Walmsley +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/mm/Makefile | 2 ++ + tools/testing/selftests/mm/run_vmtests.sh | 3 +++ + 2 files changed, 5 insertions(+) + +diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile +index 8b2b9bb8bad10..c9fcbc6e5121e 100644 +--- a/tools/testing/selftests/mm/Makefile ++++ b/tools/testing/selftests/mm/Makefile +@@ -51,7 +51,9 @@ TEST_GEN_FILES += madv_populate + TEST_GEN_FILES += map_fixed_noreplace + TEST_GEN_FILES += map_hugetlb + TEST_GEN_FILES += map_populate ++ifneq (,$(filter $(ARCH),arm64 riscv riscv64 x86 x86_64)) + TEST_GEN_FILES += memfd_secret ++endif + TEST_GEN_FILES += migration + TEST_GEN_FILES += mkdirty + TEST_GEN_FILES += mlock-random-test +diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh +index 7fae86e482613..d7b2c9d07eec5 100755 +--- a/tools/testing/selftests/mm/run_vmtests.sh ++++ b/tools/testing/selftests/mm/run_vmtests.sh +@@ -329,8 +329,11 @@ CATEGORY="hmm" run_test bash ./test_hmm.sh smoke + # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests + CATEGORY="madv_populate" run_test ./madv_populate + ++if [ -x ./memfd_secret ] ++then + (echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 2>&1) | tap_prefix + CATEGORY="memfd_secret" run_test ./memfd_secret ++fi + + # KSM KSM_MERGE_TIME_HUGE_PAGES test with size of 100 + CATEGORY="ksm" run_test ./ksm_tests -H -s 100 +-- +2.43.0 + diff --git a/queue-6.6/selftests-mm-log-run_vmtests.sh-results-in-tap-forma.patch b/queue-6.6/selftests-mm-log-run_vmtests.sh-results-in-tap-forma.patch new file mode 100644 index 00000000000..4b4e918acf9 --- /dev/null +++ b/queue-6.6/selftests-mm-log-run_vmtests.sh-results-in-tap-forma.patch @@ -0,0 +1,174 @@ +From dbaebf623af8c10f669a56cbb7f5c57855426239 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Dec 2023 16:24:34 +0000 +Subject: selftests/mm: log run_vmtests.sh results in TAP format + +From: Ryan Roberts + +[ Upstream commit a3c5cc5129ef55ac6c69f468e5ee6e4b0cd8179c ] + +When running tests on a CI system (e.g. LAVA) it is useful to output test +results in TAP (Test Anything Protocol) format so that the CI can parse +the fine-grained results to show regressions. Many of the mm selftest +binaries already output using the TAP format. And the kselftests runner +(run_kselftest.sh) also uses the format. CI systems such as LAVA can +already handle nested TAP reports. However, with the mm selftests we have +3 levels of nesting (run_kselftest.sh -> run_vmtests.sh -> individual test +binaries) and the middle level did not previously support TAP, which +breaks the parser. + +Let's fix that by teaching run_vmtests.sh to output using the TAP format. +Ideally this would be opt-in via a command line argument to avoid the +possibility of breaking anyone's existing scripts that might scrape the +output. However, it is not possible to pass arguments to tests invoked +via run_kselftest.sh. So I've implemented an opt-out option (-n), which +will revert to the existing output format. + +Future changes to this file should be aware of 2 new conventions: + + - output that is part of the TAP reporting is piped through tap_output + - general output is piped through tap_prefix + +Link: https://lkml.kernel.org/r/20231214162434.3580009-1-ryan.roberts@arm.com +Signed-off-by: Ryan Roberts +Reviewed-by: Mark Brown +Tested-by: John Hubbard +Cc: Aishwarya TCV +Cc: Peter Xu +Cc: Shuah Khan +Signed-off-by: Andrew Morton +Stable-dep-of: 7c5e8d212d7d ("selftests: memfd_secret: don't build memfd_secret test on unsupported arches") +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/mm/run_vmtests.sh | 51 +++++++++++++++++------ + 1 file changed, 39 insertions(+), 12 deletions(-) + +diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh +index 7d31718ce8343..7fae86e482613 100755 +--- a/tools/testing/selftests/mm/run_vmtests.sh ++++ b/tools/testing/selftests/mm/run_vmtests.sh +@@ -5,6 +5,7 @@ + # Kselftest framework requirement - SKIP code is 4. + ksft_skip=4 + ++count_total=0 + count_pass=0 + count_fail=0 + count_skip=0 +@@ -17,6 +18,7 @@ usage: ${BASH_SOURCE[0]:-$0} [ options ] + -a: run all tests, including extra ones + -t: specify specific categories to tests to run + -h: display this message ++ -n: disable TAP output + + The default behavior is to run required tests only. If -a is specified, + will run all tests. +@@ -75,12 +77,14 @@ EOF + } + + RUN_ALL=false ++TAP_PREFIX="# " + +-while getopts "aht:" OPT; do ++while getopts "aht:n" OPT; do + case ${OPT} in + "a") RUN_ALL=true ;; + "h") usage ;; + "t") VM_SELFTEST_ITEMS=${OPTARG} ;; ++ "n") TAP_PREFIX= ;; + esac + done + shift $((OPTIND -1)) +@@ -182,30 +186,52 @@ fi + VADDR64=0 + echo "$ARCH64STR" | grep "$ARCH" &>/dev/null && VADDR64=1 + ++tap_prefix() { ++ sed -e "s/^/${TAP_PREFIX}/" ++} ++ ++tap_output() { ++ if [[ ! -z "$TAP_PREFIX" ]]; then ++ read str ++ echo $str ++ fi ++} ++ ++pretty_name() { ++ echo "$*" | sed -e 's/^\(bash \)\?\.\///' ++} ++ + # Usage: run_test [test binary] [arbitrary test arguments...] + run_test() { + if test_selected ${CATEGORY}; then ++ local test=$(pretty_name "$*") + local title="running $*" + local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -) +- printf "%s\n%s\n%s\n" "$sep" "$title" "$sep" ++ printf "%s\n%s\n%s\n" "$sep" "$title" "$sep" | tap_prefix + +- "$@" +- local ret=$? ++ ("$@" 2>&1) | tap_prefix ++ local ret=${PIPESTATUS[0]} ++ count_total=$(( count_total + 1 )) + if [ $ret -eq 0 ]; then + count_pass=$(( count_pass + 1 )) +- echo "[PASS]" ++ echo "[PASS]" | tap_prefix ++ echo "ok ${count_total} ${test}" | tap_output + elif [ $ret -eq $ksft_skip ]; then + count_skip=$(( count_skip + 1 )) +- echo "[SKIP]" ++ echo "[SKIP]" | tap_prefix ++ echo "ok ${count_total} ${test} # SKIP" | tap_output + exitcode=$ksft_skip + else + count_fail=$(( count_fail + 1 )) +- echo "[FAIL]" ++ echo "[FAIL]" | tap_prefix ++ echo "not ok ${count_total} ${test} # exit=$ret" | tap_output + exitcode=1 + fi + fi # test_selected + } + ++echo "TAP version 13" | tap_output ++ + CATEGORY="hugetlb" run_test ./hugepage-mmap + + shmmax=$(cat /proc/sys/kernel/shmmax) +@@ -222,9 +248,9 @@ CATEGORY="hugetlb" run_test ./hugepage-vmemmap + CATEGORY="hugetlb" run_test ./hugetlb-madvise + + if test_selected "hugetlb"; then +- echo "NOTE: These hugetlb tests provide minimal coverage. Use" +- echo " https://github.com/libhugetlbfs/libhugetlbfs.git for" +- echo " hugetlb regression testing." ++ echo "NOTE: These hugetlb tests provide minimal coverage. Use" | tap_prefix ++ echo " https://github.com/libhugetlbfs/libhugetlbfs.git for" | tap_prefix ++ echo " hugetlb regression testing." | tap_prefix + fi + + CATEGORY="mmap" run_test ./map_fixed_noreplace +@@ -303,7 +329,7 @@ CATEGORY="hmm" run_test bash ./test_hmm.sh smoke + # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests + CATEGORY="madv_populate" run_test ./madv_populate + +-echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ++(echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 2>&1) | tap_prefix + CATEGORY="memfd_secret" run_test ./memfd_secret + + # KSM KSM_MERGE_TIME_HUGE_PAGES test with size of 100 +@@ -358,6 +384,7 @@ CATEGORY="mkdirty" run_test ./mkdirty + + CATEGORY="mdwe" run_test ./mdwe_test + +-echo "SUMMARY: PASS=${count_pass} SKIP=${count_skip} FAIL=${count_fail}" ++echo "SUMMARY: PASS=${count_pass} SKIP=${count_skip} FAIL=${count_fail}" | tap_prefix ++echo "1..${count_total}" | tap_output + + exit $exitcode +-- +2.43.0 + diff --git a/queue-6.6/series b/queue-6.6/series index d1df0bfa156..1c868a970b3 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -223,3 +223,19 @@ nvme-fix-namespace-removal-list.patch gtp-pull-network-headers-in-gtp_dev_xmit.patch jfs-define-xtree-root-and-page-independently.patch i2c-stm32f7-add-atomic_xfer-method-to-driver.patch +riscv-entry-always-initialize-regs-a0-to-enosys.patch +dm-suspend-return-erestartsys-instead-of-eintr.patch +mm-fix-endless-reclaim-on-machines-with-unaccepted-m.patch +tools-testing-selftests-mm-run_vmtests.sh-lower-the-.patch +selftests-mm-log-run_vmtests.sh-results-in-tap-forma.patch +selftests-memfd_secret-don-t-build-memfd_secret-test.patch +change-alloc_pages-name-in-dma_map_ops-to-avoid-name.patch +mm-vmalloc-fix-page-mapping-if-vm_area_alloc_pages-w.patch +btrfs-replace-sb-s_blocksize-by-fs_info-sectorsize.patch +btrfs-send-allow-cloning-non-aligned-extent-if-it-en.patch +drm-amd-display-adjust-cursor-position.patch +drm-amd-display-enable-otg-synchronization-logic-for.patch +drm-amd-display-fix-cursor-offset-on-rotation-180.patch +drm-amd-amdgpu-command-submission-parser-for-jpeg.patch +platform-surface-aggregator-fix-warning-when-control.patch +alsa-hda-tas2781-use-correct-endian-conversion.patch diff --git a/queue-6.6/tools-testing-selftests-mm-run_vmtests.sh-lower-the-.patch b/queue-6.6/tools-testing-selftests-mm-run_vmtests.sh-lower-the-.patch new file mode 100644 index 00000000000..98a97e5e0ed --- /dev/null +++ b/queue-6.6/tools-testing-selftests-mm-run_vmtests.sh-lower-the-.patch @@ -0,0 +1,40 @@ +From 821403a42232c9a21623e425e50bbfbe9d3628ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Oct 2023 17:54:45 +0900 +Subject: tools/testing/selftests/mm/run_vmtests.sh: lower the ptrace + permissions + +From: Itaru Kitayama + +[ Upstream commit 2ffc27b15b11c9584ac46335c2ed2248d2aa4137 ] + +On Ubuntu and probably other distros, ptrace permissions are tightend a +bit by default; i.e., /proc/sys/kernel/yama/ptrace_score is set to 1. +This cases memfd_secret's ptrace attach test fails with a permission +error. Set it to 0 piror to running the program. + +Link: https://lkml.kernel.org/r/20231030-selftest-v1-1-743df68bb996@linux.dev +Signed-off-by: Itaru Kitayama +Cc: Shuah Khan +Signed-off-by: Andrew Morton +Stable-dep-of: 7c5e8d212d7d ("selftests: memfd_secret: don't build memfd_secret test on unsupported arches") +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/mm/run_vmtests.sh | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh +index 3e2bc818d566f..7d31718ce8343 100755 +--- a/tools/testing/selftests/mm/run_vmtests.sh ++++ b/tools/testing/selftests/mm/run_vmtests.sh +@@ -303,6 +303,7 @@ CATEGORY="hmm" run_test bash ./test_hmm.sh smoke + # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests + CATEGORY="madv_populate" run_test ./madv_populate + ++echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope + CATEGORY="memfd_secret" run_test ./memfd_secret + + # KSM KSM_MERGE_TIME_HUGE_PAGES test with size of 100 +-- +2.43.0 +