6.12.68-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 152/169 iio: core: add missing mutex_destroy in iio_dev_release()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit f5d203467a31798191365efeb16cd619d2c8f23a ]
Add missing mutex_destroy() call in iio_dev_release() to properly clean up the mutex initialized in iio_device_alloc(). Ensure proper resource cleanup and follows kernel practices.
Found by code review.
While at it, create a lockdep key before mutex initialisation. This will help with converting it to the better API in the future.
Stable-dep-of: 9910159f0659 ("iio: core: add separate lockdep class for info_exist_lock")
--- drivers/iio/industrialio-core.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/iio/industrialio-core.c +7 -2
@@ -1628,6 +1628,9 @@ static void iio_dev_release(struct deviciio_device_detach_buffers (indio_dev); +mutex_destroy (&iio_dev_opaque->info_exist_lock); +mutex_destroy (&iio_dev_opaque->mlock); +lockdep_unregister_key (&iio_dev_opaque->mlock_key);ida_free (&iio_ida, iio_dev_opaque->id);
@@ -1672,8 +1675,7 @@ struct iio_dev *iio_device_alloc(struct indio_dev->dev.type = &iio_device_type; indio_dev->dev.bus = &iio_bus_type;device_initialize (&indio_dev->dev); -mutex_init (&iio_dev_opaque->mlock); -mutex_init (&iio_dev_opaque->info_exist_lock); +INIT_LIST_HEAD (&iio_dev_opaque->channel_attr_list); iio_dev_opaque->id =ida_alloc (&iio_ida,GFP_KERNEL );
@@ -1696,6 +1698,9 @@ struct iio_dev *iio_device_alloc(structlockdep_register_key (&iio_dev_opaque->mlock_key);lockdep_set_class (&iio_dev_opaque->mlock, &iio_dev_opaque->mlock_key); +mutex_init (&iio_dev_opaque->mlock); +mutex_init (&iio_dev_opaque->info_exist_lock); +return indio_dev; }EXPORT_SYMBOL (iio_device_alloc);
Greg Kroah-Hartman
maintainerPATCH 153/169 iio: core: Replace lockdep_set_class() + mutex_init() by combined call
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit c76ba4b2644424b8dbacee80bb40991eac29d39e ]
Replace lockdep_set_class() + mutex_init() by combined call mutex_init_with_key().
Stable-dep-of: 9910159f0659 ("iio: core: add separate lockdep class for info_exist_lock")
--- drivers/iio/industrialio-core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/iio/industrialio-core.c +1 -2
@@ -1696,9 +1696,8 @@ struct iio_dev *iio_device_alloc(structINIT_LIST_HEAD (&iio_dev_opaque->ioctl_handlers);lockdep_register_key (&iio_dev_opaque->mlock_key); -lockdep_set_class (&iio_dev_opaque->mlock, &iio_dev_opaque->mlock_key); -mutex_init (&iio_dev_opaque->mlock); +mutex_init_with_key (&iio_dev_opaque->mlock, &iio_dev_opaque->mlock_key);mutex_init (&iio_dev_opaque->info_exist_lock);return indio_dev;
Greg Kroah-Hartman
maintainerPATCH 154/169 iio: core: add separate lockdep class for info_exist_lock
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rasmus Villemoes <[email protected]>
[ Upstream commit 9910159f06590c17df4fbddedaabb4c0201cc4cb ]
When one iio device is a consumer of another, it is possible that the ->info_exist_lock of both ends up being taken when reading the value of the consumer device.
Since they currently belong to the same lockdep class (being initialized in a single location with mutex_init()), that results in a lockdep warning
CPU0
----
lock(&iio_dev_opaque->info_exist_lock);
lock(&iio_dev_opaque->info_exist_lock);*** DEADLOCK ***
May be due to missing lock nesting notation
4 locks held by sensors/414:
#0: c31fd6dc (&p->lock){+.+.}-{3:3}, at: seq_read_iter+0x44/0x4e4
#1: c4f5a1c4 (&of->mutex){+.+.}-{3:3}, at: kernfs_seq_start+0x1c/0xac
#2: c2827548 (kn->active#34){.+.+}-{0:0}, at: kernfs_seq_start+0x30/0xac
#3: c1dd2b68 (&iio_dev_opaque->info_exist_lock){+.+.}-{3:3}, at: iio_read_channel_processed_scale+0x24/0xd8
stack backtrace: CPU: 0 UID: 0 PID: 414 Comm: sensors Not tainted 6.17.11 #5 NONE Hardware name: Generic AM33XX (Flattened Device Tree) Call trace: unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x44/0x60 dump_stack_lvl from print_deadlock_bug+0x2b8/0x334 print_deadlock_bug from __lock_acquire+0x13a4/0x2ab0 __lock_acquire from lock_acquire+0xd0/0x2c0 lock_acquire from __mutex_lock+0xa0/0xe8c __mutex_lock from mutex_lock_nested+0x1c/0x24 mutex_lock_nested from iio_read_channel_raw+0x20/0x6c iio_read_channel_raw from rescale_read_raw+0x128/0x1c4 rescale_read_raw from iio_channel_read+0xe4/0xf4 iio_channel_read from iio_read_channel_processed_scale+0x6c/0xd8 iio_read_channel_processed_scale from iio_hwmon_read_val+0x68/0xbc iio_hwmon_read_val from dev_attr_show+0x18/0x48 dev_attr_show from sysfs_kf_seq_show+0x80/0x110 sysfs_kf_seq_show from seq_read_iter+0xdc/0x4e4 seq_read_iter from vfs_read+0x238/0x2e4 vfs_read from ksys_read+0x6c/0xec ksys_read from ret_fast_syscall+0x0/0x1c
Just as the mlock_key already has its own lockdep class, add a lock_class_key for the info_exist mutex.
Note that this has in theory been a problem since before IIO first left staging, but it only occurs when a chain of consumers is in use and that is not often done.
--- drivers/iio/industrialio-core.c | 4 +++- include/linux/iio/iio-opaque.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/iio/industrialio-core.c +3 -1
@@ -1631,6 +1631,7 @@ static void iio_dev_release(struct devicmutex_destroy (&iio_dev_opaque->info_exist_lock);mutex_destroy (&iio_dev_opaque->mlock); +lockdep_unregister_key (&iio_dev_opaque->info_exist_key);lockdep_unregister_key (&iio_dev_opaque->mlock_key);ida_free (&iio_ida, iio_dev_opaque->id);
@@ -1696,9 +1697,10 @@ struct iio_dev *iio_device_alloc(structINIT_LIST_HEAD (&iio_dev_opaque->ioctl_handlers);lockdep_register_key (&iio_dev_opaque->mlock_key); +lockdep_register_key (&iio_dev_opaque->info_exist_key);mutex_init_with_key (&iio_dev_opaque->mlock, &iio_dev_opaque->mlock_key); -mutex_init (&iio_dev_opaque->info_exist_lock); +mutex_init_with_key (&iio_dev_opaque->info_exist_lock, &iio_dev_opaque->info_exist_key);return indio_dev; }
include/linux/iio/iio-opaque.h +2 -0
@@ -14,6 +14,7 @@* @mlock: lock used to prevent simultaneous device state changes * @mlock_key: lockdep class for iio_dev lock * @info_exist_lock: lock to prevent use during removal +* @info_exist_key: lockdep class for info_exist lock * @trig_readonly: mark the current trigger immutable * @event_interface: event chrdevs associated with interrupt lines * @attached_buffers: array of buffers statically attached by the driver
@@ -47,6 +48,7 @@ struct iio_dev_opaque {struct mutex mlock;struct lock_class_key mlock_key;struct mutex info_exist_lock; +struct lock_class_key info_exist_key;bool trig_readonly;struct iio_event_interface *event_interface;struct iio_buffer **attached_buffers;
Greg Kroah-Hartman
maintainerPATCH 155/169 iio: adc: exynos_adc: fix OF populate on driver rebind
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
[ Upstream commit ea6b4feba85e996e840e0b661bc42793df6eb701 ]
Since commit c6e126de43e7 ("of: Keep track of populated platform devices") child devices will not be created by of_platform_populate() if the devices had previously been deregistered individually so that the OF_POPULATED flag is still set in the corresponding OF nodes.
Switch to using of_platform_depopulate() instead of open coding so that the child devices are created if the driver is rebound.
--- drivers/iio/adc/exynos_adc.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-)
drivers/iio/adc/exynos_adc.c +2 -11
@@ -721,14 +721,7 @@ static const struct iio_chan_spec exynos ADC_CHANNEL(9, "adc9"), }; -static int exynos_adc_remove_devices (struct device *dev,void *c) -{ -struct platform_device *pdev =to_platform_device (dev); - -platform_device_unregister (pdev); -return 0 ; -}static int exynos_adc_ts_open (struct input_dev *dev) {
@@ -929,8 +922,7 @@ static int exynos_adc_probe(struct platfreturn 0 ; err_of_populate: -device_for_each_child (&indio_dev->dev,NULL , - exynos_adc_remove_devices); +of_platform_depopulate (&indio_dev->dev);if (has_ts) {input_unregister_device (info->input);free_irq (info->tsirq, info);
@@ -959,8 +951,7 @@ static void exynos_adc_remove(struct plafree_irq (info->tsirq, info);input_unregister_device (info->input); } -device_for_each_child (&indio_dev->dev,NULL , - exynos_adc_remove_devices); +of_platform_depopulate (&indio_dev->dev);iio_device_unregister (indio_dev);free_irq (info->irq, info);if (info->data->exit_hw)
Greg Kroah-Hartman
maintainerPATCH 156/169 exfat: fix refcount leak in exfat_find
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shuhao Fu <[email protected]>
[ Upstream commit 9aee8de970f18c2aaaa348e3de86c38e2d956c1d ]
Fix refcount leaks in exfat_find related to exfat_get_dentry_set.
Function exfat_get_dentry_set would increase the reference counter of es->bh on success. Therefore, exfat_put_dentry_set must be called after exfat_get_dentry_set to ensure refcount consistency. This patch relocate two checks to avoid possible leaks.
--- fs/exfat/namei.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
fs/exfat/namei.c +10 -10
@@ -638,16 +638,6 @@ static int exfat_find(struct inode *dir, info->valid_size =le64_to_cpu (ep2->dentry.stream.valid_size); info->size =le64_to_cpu (ep2->dentry.stream.size); -if (info->valid_size <0 ) { -exfat_fs_error (sb,"data valid size is invalid(%lld)" , info->valid_size); -return -EIO ; - } - -if (unlikely (EXFAT_B_TO_CLU_ROUND_UP (info->size, sbi) > sbi->used_clusters)) { -exfat_fs_error (sb,"data size is invalid(%lld)" , info->size); -return -EIO ; - } - info->start_clu =le32_to_cpu (ep2->dentry.stream.start_clu);if (!is_valid_cluster (sbi, info->start_clu) && info->size) { exfat_warn(sb, "start_clu is invalid cluster(0x%x)",
@@ -685,6 +675,16 @@ static int exfat_find(struct inode *dir, 0);exfat_put_dentry_set (&es, false); +if (info->valid_size <0 ) { +exfat_fs_error (sb,"data valid size is invalid(%lld)" , info->valid_size); +return -EIO ; + } + +if (unlikely (EXFAT_B_TO_CLU_ROUND_UP (info->size, sbi) > sbi->used_clusters)) { +exfat_fs_error (sb,"data size is invalid(%lld)" , info->size); +return -EIO ; + } +if (ei->start_clu ==EXFAT_FREE_CLUSTER ) { exfat_fs_error(sb, "non-zero size file starts with zero cluster (size : %llu, p_dir : %u, entry : 0x%08x)",
Greg Kroah-Hartman
maintainerPATCH 157/169 sched_ext: Fix possible deadlock in the deferred_irq_workfn()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zqiang <[email protected]>
[ Upstream commit a257e974210320ede524f340ffe16bf4bf0dda1e ]
For PREEMPT_RT=y kernels, the deferred_irq_workfn() is executed in the per-cpu irq_work/* task context and not disable-irq, if the rq returned by container_of() is current CPU's rq, the following scenarios may occur:
lock(&rq->__lock);
<Interrupt>
lock(&rq->__lock);
This commit use IRQ_WORK_INIT_HARD() to replace init_irq_work() to initialize rq->scx.deferred_irq_work, make the deferred_irq_workfn() is always invoked in hard-irq context.
--- kernel/sched/ext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/ext.c +1 -1
@@ -6044,7 +6044,7 @@ void __init init_sched_ext_class(void)BUG_ON (!zalloc_cpumask_var (&rq->scx.cpus_to_kick_if_idle,GFP_KERNEL ));BUG_ON (!zalloc_cpumask_var (&rq->scx.cpus_to_preempt,GFP_KERNEL ));BUG_ON (!zalloc_cpumask_var (&rq->scx.cpus_to_wait,GFP_KERNEL )); -init_irq_work (&rq->scx.deferred_irq_work, deferred_irq_workfn); + rq->scx.deferred_irq_work =IRQ_WORK_INIT_HARD (deferred_irq_workfn);init_irq_work (&rq->scx.kick_cpus_irq_work, kick_cpus_irq_workfn);if (cpu_online (cpu))
Greg Kroah-Hartman
maintainerPATCH 158/169 fs/ntfs3: Initialize allocated memory before use
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartlomiej Kubik <[email protected]>
[ Upstream commit a8a3ca23bbd9d849308a7921a049330dc6c91398 ]
KMSAN reports: Multiple uninitialized values detected:
- KMSAN: uninit-value in ntfs_read_hdr (3)
- KMSAN: uninit-value in bcmp (3)
Memory is allocated by __getname(), which is a wrapper for kmem_cache_alloc(). This memory is used before being properly cleared. Change kmem_cache_alloc() to kmem_cache_zalloc() to properly allocate and clear memory before use.
--- fs/ntfs3/inode.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/ntfs3/inode.c +3 -4
@@ -1301,7 +1301,7 @@ int ntfs_create_inode(struct mnt_idmap * fa |=FILE_ATTRIBUTE_READONLY ;/* Allocate PATH_MAX bytes. */ - new_de =__getname (); + new_de =kmem_cache_zalloc (names_cachep,GFP_KERNEL );if (!new_de) { err = -ENOMEM ; goto out1;
@@ -1734,10 +1734,9 @@ int ntfs_link_inode(struct inode *inode,struct NTFS_DE *de;/* Allocate PATH_MAX bytes. */ - de =__getname (); + de =kmem_cache_zalloc (names_cachep,GFP_KERNEL );if (!de)return -ENOMEM ; -memset (de,0 ,PATH_MAX );/* Mark rw ntfs as dirty. It will be cleared at umount. */ ntfs_set_state (sbi,NTFS_DIRTY_DIRTY );
@@ -1773,7 +1772,7 @@ int ntfs_unlink_inode(struct inode *dir,return -EINVAL ;/* Allocate PATH_MAX bytes. */ - de =__getname (); + de =kmem_cache_zalloc (names_cachep,GFP_KERNEL );if (!de)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 159/169 accel/ivpu: Fix race condition when unbinding BOs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Rusinowicz <[email protected]>
[ Upstream commit 00812636df370bedf4e44a0c81b86ea96bca8628 ]
Fix 'Memory manager not clean during takedown' warning that occurs when ivpu_gem_bo_free() removes the BO from the BOs list before it gets unmapped. Then file_priv_unbind() triggers a warning in drm_mm_takedown() during context teardown.
Protect the unmapping sequence with bo_list_lock to ensure the BO is always fully unmapped when removed from the list. This ensures the BO is either fully unmapped at context teardown time or present on the list and unmapped by file_priv_unbind().
[ The context change is due to the commit e0c0891cd63b ("accel/ivpu: Rework bind/unbind of imported buffers") and the proper adoption is done. ]
--- drivers/accel/ivpu/ivpu_gem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/accel/ivpu/ivpu_gem.c +2 -1
@@ -240,7 +240,6 @@ static void ivpu_gem_bo_free(struct drm_mutex_lock (&vdev->bo_list_lock);list_del (&bo->bo_list_node); -mutex_unlock (&vdev->bo_list_lock);drm_WARN_ON (&vdev->drm, !drm_gem_is_imported (&bo->base.base) && !dma_resv_test_signaled (obj->resv,DMA_RESV_USAGE_READ ));
@@ -248,6 +247,8 @@ static void ivpu_gem_bo_free(struct drm_drm_WARN_ON (&vdev->drm, bo->base.vaddr);ivpu_bo_unbind_locked (bo); +mutex_unlock (&vdev->bo_list_lock); +drm_WARN_ON (&vdev->drm, bo->mmu_mapped);drm_WARN_ON (&vdev->drm, bo->ctx);
Greg Kroah-Hartman
maintainerPATCH 160/169 btrfs: fix racy bitfield write in btrfs_clear_space_info_full()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Burkov <[email protected]>
[ Upstream commit 38e818718c5e04961eea0fa8feff3f100ce40408 ]
Quoted 1 line
From the memory-barriers.txt document regarding memory barrier ordering
guarantees:
(*) These guarantees do not apply to bitfields, because compilers often
generate code to modify these using non-atomic read-modify-write sequences. Do not attempt to use bitfields to synchronize parallel algorithms.
(*) Even in cases where bitfields are protected by locks, all fields
in a given bitfield must be protected by one lock. If two fields in a given bitfield are protected by different locks, the compiler's non-atomic read-modify-write sequences can cause an update to one field to corrupt the value of an adjacent field.
btrfs_space_info has a bitfield sharing an underlying word consisting of the fields full, chunk_alloc, and flush:
struct btrfs_space_info {
struct btrfs_fs_info * fs_info; /* 0 8 */
struct btrfs_space_info * parent; /* 8 8 */ ...
int clamp; /* 172 4 */
unsigned int full:1; /* 176: 0 4 */
unsigned int chunk_alloc:1; /* 176: 1 4 */
unsigned int flush:1; /* 176: 2 4 */
...
Therefore, to be safe from parallel read-modify-writes losing a write to one of the bitfield members protected by a lock, all writes to all the bitfields must use the lock. They almost universally do, except for btrfs_clear_space_info_full() which iterates over the space_infos and writes out found->full = 0 without a lock.
Imagine that we have one thread completing a transaction in which we finished deleting a block_group and are thus calling btrfs_clear_space_info_full() while simultaneously the data reclaim ticket infrastructure is running do_async_reclaim_data_space():
T1 T2btrfs_commit_transaction
btrfs_clear_space_info_full
data_sinfo->full = 0
READ: full:0, chunk_alloc:0, flush:1
do_async_reclaim_data_space(data_sinfo)
spin_lock(&space_info->lock);
if(list_empty(tickets))
space_info->flush = 0;
READ: full: 0, chunk_alloc:0, flush:1
MOD/WRITE: full: 0, chunk_alloc:0, flush:0
spin_unlock(&space_info->lock);
return;MOD/WRITE: full:0, chunk_alloc:0, flush:1
and now data_sinfo->flush is 1 but the reclaim worker has exited. This breaks the invariant that flush is 0 iff there is no work queued or running. Once this invariant is violated, future allocations that go into __reserve_bytes() will add tickets to space_info->tickets but will see space_info->flush is set to 1 and not queue the work. After this, they will block forever on the resulting ticket, as it is now impossible to kick the worker again.
I also confirmed by looking at the assembly of the affected kernel that it is doing RMW operations. For example, to set the flush (3rd) bit to 0, the assembly is:
andb $0xfb,0x60(%rbx)
and similarly for setting the full (1st) bit to 0:
andb $0xfe,-0x20(%rax)
So I think this is really a bug on practical systems. I have observed a number of systems in this exact state, but am currently unable to reproduce it.
Rather than leaving this footgun lying around for the future, take advantage of the fact that there is room in the struct anyway, and that it is already quite large and simply change the three bitfield members to bools. This avoids writes to space_info->full having any effect on writes to space_info->flush, regardless of locking.
[ The context change is due to the commit cc0517fe779f ("btrfs: tweak extent/chunk allocation for space_info sub-space") in v6.16 which is irrelevant to the logic of this patch. ]
--- fs/btrfs/block-group.c | 6 +++--- fs/btrfs/space-info.c | 22 +++++++++++----------- fs/btrfs/space-info.h | 6 +++--- 3 files changed, 17 insertions(+), 17 deletions(-)
fs/btrfs/block-group.c +3 -3
@@ -4195,7 +4195,7 @@ int btrfs_chunk_alloc(struct btrfs_transmutex_unlock (&fs_info->chunk_mutex); }else {/* Proceed with allocation */ - space_info->chunk_alloc =1 ; + space_info->chunk_alloc = true; wait_for_alloc = false;spin_unlock (&space_info->lock); }
@@ -4244,7 +4244,7 @@ int btrfs_chunk_alloc(struct btrfs_transspin_lock (&space_info->lock);if (ret <0 ) {if (ret == -ENOSPC ) - space_info->full =1 ; + space_info->full = true;else goto out; }else {
@@ -4254,7 +4254,7 @@ int btrfs_chunk_alloc(struct btrfs_trans space_info->force_alloc =CHUNK_ALLOC_NO_FORCE ; out: - space_info->chunk_alloc =0 ; + space_info->chunk_alloc = false;spin_unlock (&space_info->lock);mutex_unlock (&fs_info->chunk_mutex);
fs/btrfs/space-info.c +11 -11
@@ -183,7 +183,7 @@ void btrfs_clear_space_info_full(structstruct btrfs_space_info *found;list_for_each_entry (found, head, list) - found->full =0 ; + found->full = false; }/*
@@ -364,7 +364,7 @@ void btrfs_add_bg_to_space_info(struct b found->bytes_readonly += block_group->bytes_super;btrfs_space_info_update_bytes_zone_unusable (info, found, block_group->zone_unusable);if (block_group->length >0 ) - found->full =0 ; + found->full = false;btrfs_try_granting_tickets (info, found);spin_unlock (&found->lock);
@@ -1140,7 +1140,7 @@ static void btrfs_async_reclaim_metadataspin_lock (&space_info->lock); to_reclaim =btrfs_calc_reclaim_metadata_size (fs_info, space_info);if (!to_reclaim) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1152,7 +1152,7 @@ static void btrfs_async_reclaim_metadataflush_space (fs_info, space_info, to_reclaim, flush_state, false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1195,7 +1195,7 @@ static void btrfs_async_reclaim_metadata flush_state =FLUSH_DELAYED_ITEMS_NR ; commit_cycles--; }else { - space_info->flush =0 ; + space_info->flush = false; } }else { flush_state =FLUSH_DELAYED_ITEMS_NR ;
@@ -1357,7 +1357,7 @@ static void btrfs_async_reclaim_data_spaspin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1368,7 +1368,7 @@ static void btrfs_async_reclaim_data_spaflush_space (fs_info, space_info,U64_MAX ,ALLOC_CHUNK_FORCE , false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1385,7 +1385,7 @@ static void btrfs_async_reclaim_data_spa data_flush_states[flush_state], false);spin_lock (&space_info->lock);if (list_empty (&space_info->tickets)) { - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock);return ; }
@@ -1402,7 +1402,7 @@ static void btrfs_async_reclaim_data_spaif (maybe_fail_all_tickets (fs_info, space_info)) flush_state =0 ;else - space_info->flush =0 ; + space_info->flush = false; }else { flush_state =0 ; }
@@ -1418,7 +1418,7 @@ static void btrfs_async_reclaim_data_spa aborted_fs:maybe_fail_all_tickets (fs_info, space_info); - space_info->flush =0 ; + space_info->flush = false;spin_unlock (&space_info->lock); }
@@ -1787,7 +1787,7 @@ static int __reserve_bytes(struct btrfs_*/ maybe_clamp_preempt (fs_info, space_info); - space_info->flush =1 ; + space_info->flush = true; trace_btrfs_trigger_flush(fs_info, space_info->flags, orig_bytes, flush,
fs/btrfs/space-info.h +3 -3
@@ -136,11 +136,11 @@ struct btrfs_space_info {flushing. The value is >> clamp, so turns out to be a 2^clamp divisor. */ - unsigned int full:1; /* indicates that we cannot allocate any more +bool full;/* indicates that we cannot allocate any more chunks for this space */ - unsigned int chunk_alloc:1; /* set if we are allocating a chunk */ +bool chunk_alloc;/* set if we are allocating a chunk */ - unsigned int flush:1; /* set if we are trying to make space */ +bool flush;/* set if we are trying to make space */ unsigned int force_alloc;/* set if we need to force a chunk alloc for this space */
Greg Kroah-Hartman
maintainerPATCH 161/169 wifi: ath11k: fix RCU stall while reaping monitor destination ring
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: P Praneesh <[email protected]>
[ Upstream commit 16c6c35c03ea73054a1f6d3302a4ce4a331b427d ]
While processing the monitor destination ring, MSDUs are reaped from the link descriptor based on the corresponding buf_id.
However, sometimes the driver cannot obtain a valid buffer corresponding to the buf_id received from the hardware. This causes an infinite loop in the destination processing, resulting in a kernel crash.
kernel log:ath11k_pci 0000:58:00.0: data msdu_pop: invalid buf_id 309 ath11k_pci 0000:58:00.0: data dp_rx_monitor_link_desc_return failed ath11k_pci 0000:58:00.0: data msdu_pop: invalid buf_id 309 ath11k_pci 0000:58:00.0: data dp_rx_monitor_link_desc_return failed
Fix this by skipping the problematic buf_id and reaping the next entry, replacing the break with the next MSDU processing.
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath11k/dp_rx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/ath/ath11k/dp_rx.c +2 -2
@@ -4777,7 +4777,7 @@ ath11k_dp_rx_mon_mpdu_pop(struct ath11kif (!msdu) {ath11k_dbg (ar->ab,ATH11K_DBG_DATA ,"msdu_pop: invalid buf_id %d\n" , buf_id); -break ; + goto next_msdu; } rxcb =ATH11K_SKB_RXCB (msdu);if (!rxcb->unmapped) {
@@ -5404,7 +5404,7 @@ ath11k_dp_rx_full_mon_mpdu_pop(struct at"full mon msdu_pop: invalid buf_id %d\n" , buf_id);spin_unlock_bh (&rx_ring->idr_lock); -break ; + goto next_msdu; }idr_remove (&rx_ring->bufs_idr, buf_id);spin_unlock_bh (&rx_ring->idr_lock);
Greg Kroah-Hartman
maintainerPATCH 162/169 vsock/virtio: Move length check to callers of virtio_vsock_skb_rx_put()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit 87dbae5e36613a6020f3d64a2eaeac0a1e0e6dc6]
virtio_vsock_skb_rx_put() only calls skb_put() if the length in the packet header is not zero even though skb_put() handles this case gracefully.
Remove the functionally redundant check from virtio_vsock_skb_rx_put() and, on the assumption that this is a worthwhile optimisation for handling credit messages, augment the existing length checks in virtio_transport_rx_work() to elide the call for zero-length payloads. Since the callers all have the length, extend virtio_vsock_skb_rx_put() to take it as an additional parameter rather than fish it back out of the packet header.
Note that the vhost code already has similar logic in vhost_vsock_alloc_skb().
Message-Id: <[email protected]>
--- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 9 ++------- net/vmw_vsock/virtio_transport.c | 4 +++- 3 files changed, 6 insertions(+), 9 deletions(-)
drivers/vhost/vsock.c +1 -1
@@ -376,7 +376,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqreturn NULL ; } -virtio_vsock_skb_rx_put (skb); +virtio_vsock_skb_rx_put (skb, payload_len); nbytes =copy_from_iter (skb->data, payload_len, &iov_iter);if (nbytes != payload_len) {
include/linux/virtio_vsock.h +2 -7
@@ -47,14 +47,9 @@ static inline void virtio_vsock_skb_cleaVIRTIO_VSOCK_SKB_CB (skb)->tap_delivered = false; } -static inline void virtio_vsock_skb_rx_put (struct sk_buff *skb) +static inline void virtio_vsock_skb_rx_put (struct sk_buff *skb,u32 len) { -u32 len; - - len =le32_to_cpu (virtio_vsock_hdr (skb)->len); - -if (len >0 ) -skb_put (skb, len); +skb_put (skb, len); }static inline struct sk_buff *virtio_vsock_alloc_skb (unsigned int size,gfp_t mask)
net/vmw_vsock/virtio_transport.c +3 -1
@@ -656,7 +656,9 @@ static void virtio_transport_rx_work(strcontinue ; } -virtio_vsock_skb_rx_put (skb); +if (payload_len) +virtio_vsock_skb_rx_put (skb, payload_len); +virtio_transport_deliver_tap_pkt (skb);virtio_transport_recv_pkt (&virtio_transport, skb); }
Greg Kroah-Hartman
maintainerPATCH 163/169 vsock/virtio: Rename virtio_vsock_alloc_skb()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit 2304c64a2866c58534560c63dc6e79d09b8f8d8d]
In preparation for nonlinear allocations for large SKBs, rename virtio_vsock_alloc_skb() to virtio_vsock_alloc_linear_skb() to indicate that it returns linear SKBs unconditionally and switch all callers over to this new interface for now.
No functional change.
Message-Id: <[email protected]>
--- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 3 ++- net/vmw_vsock/virtio_transport.c | 2 +- net/vmw_vsock/virtio_transport_common.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-)
drivers/vhost/vsock.c +1 -1
@@ -349,7 +349,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqreturn NULL ;/* len contains both payload and hdr */ - skb =virtio_vsock_alloc_skb (len,GFP_KERNEL ); + skb =virtio_vsock_alloc_linear_skb (len,GFP_KERNEL );if (!skb)return NULL ;
include/linux/virtio_vsock.h +2 -1
@@ -52,7 +52,8 @@ static inline void virtio_vsock_skb_rx_pskb_put (skb, len); } -static inline struct sk_buff *virtio_vsock_alloc_skb (unsigned int size,gfp_t mask) +static inline struct sk_buff * +virtio_vsock_alloc_linear_skb (unsigned int size,gfp_t mask) {struct sk_buff *skb;
net/vmw_vsock/virtio_transport.c +1 -1
@@ -316,7 +316,7 @@ static void virtio_vsock_rx_fill(struct vq = vsock->vqs[VSOCK_VQ_RX ]; do { - skb = virtio_vsock_alloc_skb(total_len, GFP_KERNEL); + skb = virtio_vsock_alloc_linear_skb(total_len, GFP_KERNEL); if (!skb) break;
net/vmw_vsock/virtio_transport_common.c +1 -1
@@ -263,7 +263,7 @@ static struct sk_buff *virtio_transport_if (!zcopy) skb_len += payload_len; - skb =virtio_vsock_alloc_skb (skb_len,GFP_KERNEL ); + skb =virtio_vsock_alloc_linear_skb (skb_len,GFP_KERNEL );if (!skb)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 164/169 vsock/virtio: Move SKB allocation lower-bound check to callers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit fac6b82e0f3eaca33c8c67ec401681b21143ae17]
virtio_vsock_alloc_linear_skb() checks that the requested size is at least big enough for the packet header (VIRTIO_VSOCK_SKB_HEADROOM).
Of the three callers of virtio_vsock_alloc_linear_skb(), only vhost_vsock_alloc_skb() can potentially pass a packet smaller than the header size and, as it already has a check against the maximum packet size, extend its bounds checking to consider the minimum packet size and remove the check from virtio_vsock_alloc_linear_skb().
Message-Id: <[email protected]>
--- drivers/vhost/vsock.c | 3 ++- include/linux/virtio_vsock.h | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-)
drivers/vhost/vsock.c +2 -1
@@ -345,7 +345,8 @@ vhost_vsock_alloc_skb(struct vhost_virtq len =iov_length (vq->iov, out); -if (len >VIRTIO_VSOCK_MAX_PKT_BUF_SIZE +VIRTIO_VSOCK_SKB_HEADROOM ) +if (len <VIRTIO_VSOCK_SKB_HEADROOM || + len >VIRTIO_VSOCK_MAX_PKT_BUF_SIZE +VIRTIO_VSOCK_SKB_HEADROOM )return NULL ;/* len contains both payload and hdr */
include/linux/virtio_vsock.h +0 -3
@@ -57,9 +57,6 @@ virtio_vsock_alloc_linear_skb(unsigned i {struct sk_buff *skb; -if (size <VIRTIO_VSOCK_SKB_HEADROOM ) -return NULL ; - skb =alloc_skb (size, mask);if (!skb)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 165/169 vsock/virtio: Rename virtio_vsock_skb_rx_put()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit 8ca76151d2c8219edea82f1925a2a25907ff6a9d]
In preparation for using virtio_vsock_skb_rx_put() when populating SKBs on the vsock TX path, rename virtio_vsock_skb_rx_put() to virtio_vsock_skb_put().
No functional change.
Message-Id: <[email protected]>
--- drivers/vhost/vsock.c | 2 +- include/linux/virtio_vsock.h | 2 +- net/vmw_vsock/virtio_transport.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/vhost/vsock.c +1 -1
@@ -377,7 +377,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqreturn NULL ; } -virtio_vsock_skb_rx_put (skb, payload_len); +virtio_vsock_skb_put (skb, payload_len); nbytes =copy_from_iter (skb->data, payload_len, &iov_iter);if (nbytes != payload_len) {
include/linux/virtio_vsock.h +1 -1
@@ -47,7 +47,7 @@ static inline void virtio_vsock_skb_cleaVIRTIO_VSOCK_SKB_CB (skb)->tap_delivered = false; } -static inline void virtio_vsock_skb_rx_put (struct sk_buff *skb,u32 len) +static inline void virtio_vsock_skb_put (struct sk_buff *skb,u32 len) {skb_put (skb, len); }
net/vmw_vsock/virtio_transport.c +1 -1
@@ -657,7 +657,7 @@ static void virtio_transport_rx_work(str }if (payload_len) -virtio_vsock_skb_rx_put (skb, payload_len); +virtio_vsock_skb_put (skb, payload_len);virtio_transport_deliver_tap_pkt (skb);virtio_transport_recv_pkt (&virtio_transport, skb);
Greg Kroah-Hartman
maintainerPATCH 166/169 vhost/vsock: Allocate nonlinear SKBs for handling large receive buffers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit ab9aa2f3afc2713c14f6c4c6b90c9a0933b837f1]
When receiving a packet from a guest, vhost_vsock_handle_tx_kick() calls vhost_vsock_alloc_linear_skb() to allocate and fill an SKB with the receive data. Unfortunately, these are always linear allocations and can therefore result in significant pressure on kmalloc() considering that the maximum packet size (VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) is a little over 64KiB, resulting in a 128KiB allocation for each packet.
Rework the vsock SKB allocation so that, for sizes with page order greater than PAGE_ALLOC_COSTLY_ORDER, a nonlinear SKB is allocated instead with the packet header in the SKB and the receive data in the fragments. Finally, add a debug warning if virtio_vsock_skb_rx_put() is ever called on an SKB with a non-zero length, as this would be destructive for the nonlinear case.
Message-Id: <[email protected]>
--- drivers/vhost/vsock.c | 8 +++----- include/linux/virtio_vsock.h | 32 +++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-)
drivers/vhost/vsock.c +3 -5
@@ -350,7 +350,7 @@ vhost_vsock_alloc_skb(struct vhost_virtqreturn NULL ;/* len contains both payload and hdr */ - skb =virtio_vsock_alloc_linear_skb (len,GFP_KERNEL ); + skb =virtio_vsock_alloc_skb (len,GFP_KERNEL );if (!skb)return NULL ;
@@ -379,10 +379,8 @@ vhost_vsock_alloc_skb(struct vhost_virtqvirtio_vsock_skb_put (skb, payload_len); - nbytes =copy_from_iter (skb->data, payload_len, &iov_iter); -if (nbytes != payload_len) { -vq_err (vq,"Expected %zu byte payload, got %zu bytes\n" , - payload_len, nbytes); +if (skb_copy_datagram_from_iter (skb,0 , &iov_iter, payload_len)) { +vq_err (vq,"Failed to copy %zu byte payload\n" , payload_len);kfree_skb (skb);return NULL ; }
include/linux/virtio_vsock.h +29 -3
@@ -49,22 +49,48 @@ static inline void virtio_vsock_skb_cleastatic inline void virtio_vsock_skb_put (struct sk_buff *skb,u32 len) { -skb_put (skb, len); +DEBUG_NET_WARN_ON_ONCE (skb->len); + +if (skb_is_nonlinear (skb)) + skb->len = len; +else +skb_put (skb, len); }static inline struct sk_buff * -virtio_vsock_alloc_linear_skb (unsigned int size,gfp_t mask) +__virtio_vsock_alloc_skb_with_frags (unsigned int header_len, +unsigned int data_len, +gfp_t mask) {struct sk_buff *skb; +int err; - skb =alloc_skb (size, mask); + skb =alloc_skb_with_frags (header_len, data_len, +PAGE_ALLOC_COSTLY_ORDER , &err, mask);if (!skb)return NULL ;skb_reserve (skb,VIRTIO_VSOCK_SKB_HEADROOM ); + skb->data_len = data_len;return skb; } +static inline struct sk_buff * +virtio_vsock_alloc_linear_skb (unsigned int size,gfp_t mask) +{ +return __virtio_vsock_alloc_skb_with_frags (size,0 , mask); +} + +static inline struct sk_buff *virtio_vsock_alloc_skb (unsigned int size,gfp_t mask) +{ +if (size <=SKB_WITH_OVERHEAD (PAGE_SIZE <<PAGE_ALLOC_COSTLY_ORDER )) +return virtio_vsock_alloc_linear_skb (size, mask); + + size -=VIRTIO_VSOCK_SKB_HEADROOM ; +return __virtio_vsock_alloc_skb_with_frags (VIRTIO_VSOCK_SKB_HEADROOM , + size, mask); +} +static inline void virtio_vsock_skb_queue_head (struct sk_buff_head *list,struct sk_buff *skb) {
Greg Kroah-Hartman
maintainerPATCH 167/169 vsock/virtio: Allocate nonlinear SKBs for handling large transmit buffers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit 6693731487a8145a9b039bc983d77edc47693855]
When transmitting a vsock packet, virtio_transport_send_pkt_info() calls virtio_transport_alloc_linear_skb() to allocate and fill SKBs with the transmit data. Unfortunately, these are always linear allocations and can therefore result in significant pressure on kmalloc() considering that the maximum packet size (VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + VIRTIO_VSOCK_SKB_HEADROOM) is a little over 64KiB, resulting in a 128KiB allocation for each packet.
Rework the vsock SKB allocation so that, for sizes with page order greater than PAGE_ALLOC_COSTLY_ORDER, a nonlinear SKB is allocated instead with the packet header in the SKB and the transmit data in the fragments. Note that this affects both the vhost and virtio transports.
Message-Id: <[email protected]>
--- net/vmw_vsock/virtio_transport_common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/vmw_vsock/virtio_transport_common.c +3 -2
@@ -111,7 +111,8 @@ static int virtio_transport_fill_skb(str &info->msg->msg_iter, len); -return memcpy_from_msg (skb_put (skb, len), info->msg, len); +virtio_vsock_skb_put (skb, len); +return skb_copy_datagram_from_iter (skb,0 , &info->msg->msg_iter, len); } static void virtio_transport_init_hdr(struct sk_buff *skb,
@@ -263,7 +264,7 @@ static struct sk_buff *virtio_transport_if (!zcopy) skb_len += payload_len; - skb =virtio_vsock_alloc_linear_skb (skb_len,GFP_KERNEL ); + skb =virtio_vsock_alloc_skb (skb_len,GFP_KERNEL );if (!skb)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 168/169 net: Introduce skb_copy_datagram_from_iter_full()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit b08a784a5d1495c42ff9b0c70887d49211cddfe0]
In a similar manner to copy_from_iter()/copy_from_iter_full(), introduce skb_copy_datagram_from_iter_full() which reverts the iterator to its initial state when returning an error.
A subsequent fix for a vsock regression will make use of this new function.
--- include/linux/skbuff.h | 2 ++ net/core/datagram.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+)
include/linux/skbuff.h +2 -0
@@ -4117,6 +4117,8 @@ int skb_copy_and_hash_datagram_iter(cons struct ahash_request *hash);int skb_copy_datagram_from_iter (struct sk_buff *skb,int offset,struct iov_iter *from,int len); +int skb_copy_datagram_from_iter_full (struct sk_buff *skb,int offset, +struct iov_iter *from,int len);int zerocopy_sg_from_iter (struct sk_buff *skb,struct iov_iter *frm);void skb_free_datagram (struct sock *sk,struct sk_buff *skb);int skb_kill_datagram (struct sock *sk,struct sk_buff *skb,unsigned int flags);
net/core/datagram.c +14 -0
@@ -621,6 +621,20 @@ fault: }EXPORT_SYMBOL (skb_copy_datagram_from_iter); +int skb_copy_datagram_from_iter_full (struct sk_buff *skb,int offset, +struct iov_iter *from,int len) +{ +struct iov_iter_state state; +int ret; + +iov_iter_save_state (from, &state); + ret =skb_copy_datagram_from_iter (skb, offset, from, len); +if (ret) +iov_iter_restore (from, &state); +return ret; +} +EXPORT_SYMBOL (skb_copy_datagram_from_iter_full); +int zerocopy_fill_skb_from_iter (struct sk_buff *skb,struct iov_iter *from,size_t length) {
Greg Kroah-Hartman
maintainerPATCH 169/169 vsock/virtio: Fix message iterator handling on transmit path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[Upstream commit 7fb1291257ea1e27dbc3f34c6a37b4d640aafdd7]
Commit 6693731487a8 ("vsock/virtio: Allocate nonlinear SKBs for handling large transmit buffers") converted the virtio vsock transmit path to utilise nonlinear SKBs when handling large buffers. As part of this change, virtio_transport_fill_skb() was updated to call skb_copy_datagram_from_iter() instead of memcpy_from_msg() as the latter expects a single destination buffer and cannot handle nonlinear SKBs correctly.
Unfortunately, during this conversion, I overlooked the error case when the copying function returns -EFAULT due to a fault on the input buffer in userspace. In this case, memcpy_from_msg() reverts the iterator to its initial state thanks to copy_from_iter_full() whereas skb_copy_datagram_from_iter() leaves the iterator partially advanced. This results in a WARN_ONCE() from the vsock code, which expects the iterator to stay in sync with the number of bytes transmitted so that virtio_transport_send_pkt_info() can return -EFAULT when it is called again:
------------[ cut here ]------------ 'send_pkt()' returns 0, but 65536 expected WARNING: CPU: 0 PID: 5503 at net/vmw_vsock/virtio_transport_common.c:428 virtio_transport_send_pkt_info+0xd11/0xf00 net/vmw_vsock/virtio_transport_common.c:426 Modules linked in: CPU: 0 UID: 0 PID: 5503 Comm: syz.0.17 Not tainted 6.16.0-syzkaller-12063-g37816488247d #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014
Call virtio_transport_fill_skb_full() to restore the previous iterator behaviour.
--- net/vmw_vsock/virtio_transport_common.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/vmw_vsock/virtio_transport_common.c +5 -3
@@ -106,13 +106,15 @@ static int virtio_transport_fill_skb(str size_t len, bool zcopy) { +struct msghdr *msg = info->msg; +if (zcopy) - return __zerocopy_sg_from_iter(info->msg, NULL, skb, - &info->msg->msg_iter, +return __zerocopy_sg_from_iter (msg,NULL , skb, + &msg->msg_iter, len);virtio_vsock_skb_put (skb, len); -return skb_copy_datagram_from_iter (skb,0 , &info->msg->msg_iter, len); +return skb_copy_datagram_from_iter_full (skb,0 , &msg->msg_iter, len); } static void virtio_transport_init_hdr(struct sk_buff *skb,
# Librecast Test Results
020/020 [ OK ] liblcrq
010/010 [ OK ] libmld
120/120 [ OK ] liblibrecast
CPU/kernel: Linux auntie 6.12.68-rc1-g559b99a93134 #1 SMP PREEMPT_DYNAMIC Wed Jan 28 18:40:27 -00 2026 x86_64 AMD Ryzen 9 9950X 16-Core Processor AuthenticAMD GNU/Linux
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.68-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Hi!
Please update my email address. I no longer have access to @denx address, new one is [email protected] .
Thanks and best regards,
Pavel
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
test_progs, test_progs-no_alu32, test_progs-cpuv4, test_maps, test_verifier in BPF selftests all passes[1] on x86_64.
1: https://github.com/shunghsiyu/libbpf/actions/runs/21450963930/job/61779347559
Am 28.01.2026 um 16:21 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Builds, boots and works on my 2-socket Ivy Bridge Xeon E5-2697 v2 server. No dmesg oddities or regressions found.
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
6.12.68-rc1 built and run on my x86_64 test system (AMD Ryzen 9 9900X, System76 thelio-mira-r4-n3). No errors or regressions.
Thanks,
Slade
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Compiled and tested on
- Verdin AM62
- Verdin iMX8MP
- Toradex SMARC iMX8MP
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.68-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.12:
10 builds: 10 pass, 0 fail
28 boots: 28 pass, 0 fail
133 tests: 133 pass, 0 failLinux version: 6.12.68-rc1-g559b99a93134
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra186-p3509-0000+p3636-0001, tegra194-p2972-0000,
tegra194-p3509-0000+p3668-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.68-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.12.68-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,
greg k-h
Builds successfully. Boots and works on qemu and Dell XPS 15 9520 w/ Intel Core i7-12600H
Thanks,
Brett
The kernel, bpf tool, perf tool, and kselftest builds fine for v6.12.68-rc1 on x86 and arm64 Azure VM.
Thanks,
Hardik
Quoted 8 lines · On Wed, 28 Jan 2026 16:21:23 +0100 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
Boot-tested under QEMU for Rust x86_64, arm64 and riscv64; built-tested for loongarch64:
Thanks!
Cheers,
Miguel
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.12.68 release. There are 169 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 30 Jan 2026 14:53:02 +0000. Anything received after that time might be too late.
Yeah, I delayed sending the results. But:
No problems seen on x86_64 and aarch64 with our testing.
Thanks,
Harshit
Quoted 8 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/
patch-6.12.68-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.12.y
and the diffstat can be found below.thanks,