7.2.12-rc1 review
Greg Kroah-Hartman
maintainercover 7.2.12-rc1 review
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v7.x/stable-review/patch-7.2.12-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-7.2.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 7.2.12-rc1
Richard Fitzgerald <[email protected]>
ASoC: cs35l56: Add DAI for SDCA OT25 stream
Toke Høiland-Jørgensen <[email protected]>
wifi: atk9k: Revert "wifi: ath9k: reject short WMI command responses"
Hamza Mahfooz <[email protected]>
net: mana: reserve RX buffer headroom to fix forwarding performance
Dipayaan Roy <[email protected]>
net: mana: refactor mana_get_strings() and mana_get_sset_count() to use switch
Christian Brauner <[email protected]>
readdir: take no inode lock on an immutable directory
Christian Brauner <[email protected]>
nullfs: refuse file locks
Tejun Heo <[email protected]>
sched_ext: Fix CPU hotplug hang when a dying CPU's tasks sit in the BPF scheduler
Mikulas Patocka <[email protected]>
dm-integrity: validate the superblock on resume
Mikulas Patocka <[email protected]>
dm-integrity: fix NULL pointer dereference when the 'R' flag is used
Lubos Rendek <[email protected]>
nfsd: fix all-zero stateid in CB_OFFLOAD for async COPY
-------------
Diffstat:
Makefile | 4 +- drivers/md/dm-integrity.c | 55 +++++++++++++ drivers/net/ethernet/microsoft/mana/mana_bpf.c | 8 +- drivers/net/ethernet/microsoft/mana/mana_en.c | 60 ++++++++++---- drivers/net/ethernet/microsoft/mana/mana_ethtool.c | 95 +++++++++++++--------- drivers/net/wireless/ath/ath9k/wmi.c | 16 +--- drivers/net/wireless/ath/ath9k/wmi.h | 1 - fs/nfsd/nfs4proc.c | 2 + fs/nullfs.c | 30 +++++++ fs/readdir.c | 13 ++- include/linux/fs.h | 2 + include/net/mana/mana.h | 14 +++- include/sound/cs35l56.h | 1 + kernel/sched/ext/ext.c | 29 ++++++- kernel/sched/sched.h | 5 +- sound/soc/codecs/cs35l56-sdw.c | 9 +- sound/soc/codecs/cs35l56.c | 54 ++++++++++++ 17 files changed, 312 insertions(+), 86 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/10 nfsd: fix all-zero stateid in CB_OFFLOAD for async COPY
7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lubos Rendek <[email protected]>
[ There is no upstream commit: this fixes the 7.2.y backport of
d0beaee498e1. Mainline fixed the problem as part of the async COPY rework in commit f307b4f7ed17 ("nfsd: split nfsd4_copy into transient and durable async copy objects"), which is too risky to backport. ]
Since commit 14b978e8d05c ("nfsd: fix stale s2s_cp_stateids IDR entry for async COPY"), nfsd4_copy() calls dup_copy_fields() before the copy stateid is created and then writes the new stateid only into the COPY result. The async copy's own cp_res.cb_stateid stays zero, so nfsd4_send_cb_offload() sends CB_OFFLOAD with an all-zero stateid. The client cannot match it to its pending COPY and waits forever in nfs42_proc_copy().
Also copy the new stateid into async_copy->cp_res.cb_stateid. Calling dup_copy_fields() after nfs4_init_copy_state() instead is not an option, because dup_copy_fields() also copies cp_stateid and would overwrite the stateid that the backport moved to the async copy.
Tested on 7.2.10 with an NFSv4.2 server-side COPY between two
exports: with this change the copy completes and CB_OFFLOAD carries the same stateid as the COPY reply. Without it, cp(1) hangs on 7.2.4 and 7.2.9; the affected code in nfsd4_copy() is the same in 7.2.10.
--- fs/nfsd/nfs4proc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfsd/nfs4proc.c +2 -0
@@ -2243,6 +2243,8 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, goto out_dec_async_copy_err;memcpy (&result->cb_stateid, &async_copy->cp_stateid.cs_stid,sizeof (result->cb_stateid)); +memcpy (&async_copy->cp_res.cb_stateid, &async_copy->cp_stateid.cs_stid, +sizeof (async_copy->cp_res.cb_stateid));if ((READ_ONCE (copy->nf_dst->nf_file->f_mode) &FMODE_NOCMTIME ) !=0 ) async_copy->attr_update = true;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 2/10 dm-integrity: fix NULL pointer dereference when the R flag is used
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit 7d4d4f3b668d708d94f62ecdd33ac330a6fd8a84 ]
If the dm-integrity device has the SB_FLAG_DIRTY_BITMAP flag set and the user activates the device in the 'R' mode, a crash in dm_integrity_resume happens because the function attempts to read the journal containing the bitmap.
This patch makes dm-integrity skip any writes to the device in dm_integrity_resume if the device is activated in the 'R' mode.
Stable-dep-of: fc79aeb86a2c ("dm-integrity: validate the superblock on resume")
--- drivers/md/dm-integrity.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/md/dm-integrity.c +5 -0
@@ -3874,6 +3874,10 @@ static void dm_integrity_resume(struct dm_target *ti) r =sync_rw_sb (ic,REQ_OP_READ );if (r)dm_integrity_io_error (ic,"reading superblock" , r); + +if (ic->mode =='R' ) + goto skip_writes; +if ((ic->sb->flags & flags) != flags) { ic->sb->flags |= flags; r =sync_rw_sb (ic,REQ_OP_WRITE |REQ_FUA );
@@ -3983,6 +3987,7 @@ static void dm_integrity_resume(struct dm_target *ti) } } +skip_writes: ic->reboot_notifier.notifier_call = dm_integrity_reboot; ic->reboot_notifier.next =NULL ; ic->reboot_notifier.priority =INT_MAX -1 ;/* be notified after md and before hardware drivers */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 3/10 dm-integrity: validate the superblock on resume
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit fc79aeb86a2c244c1f1894e2d8f2966fe2b60fa2 ]
dm_integrity_resume() re-reads the superblock from the device so that it picks up the flags and the recalculate position. It performs no validation on the result, while the constructor validates the superblock it reads and sizes all the in-memory structures according to it. The user may modify the superblock on the underlying device while the dm-integrity device is suspended, so that the two no longer agree.
In particular, access_journal_data() shifts the journal entry index by ic->sb->log2_sectors_per_block, while ic->journal_section_sectors and the journal page list were computed with the value that was present at constructor time. Increasing log2_sectors_per_block makes the index run past the end of the journal, and dm-integrity then writes 512 bytes through lowmem_page_address(NULL).
Snapshot the validated superblock in the constructor and refuse to resume if any of the fields that describe the on-disk geometry changed.
--- drivers/md/dm-integrity.c | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
drivers/md/dm-integrity.c +50 -0
@@ -180,6 +180,7 @@ struct dm_integrity_c {struct dm_bufio_client *bufio;struct workqueue_struct *metadata_wq;struct superblock *sb; +struct superblock *sb_copy;unsigned int journal_pages;unsigned int n_bitmap_blocks;
@@ -3857,6 +3858,35 @@ static void dm_integrity_postsuspend(struct dm_target *ti) ic->journal_uptodate = true; } +/* +* The superblock is re-read from the device on every resume, so that we pick +* up the flags and the recalculate position. The geometry described by the +* superblock must not change though - the in-memory structures (and the +* journal in particular) were sized according to the superblock that was +* validated in the constructor. Reject a superblock that was modified behind +* our back. +* +* Only the fields that the driver never rewrites may be tested here. In +* particular, "version" is recalculated by sb_set_version on every superblock +* write and it depends on SB_FLAG_RECALCULATING and SB_FLAG_DIRTY_BITMAP, and +* SB_FLAG_DISCARD_KEYED may be set by dm_integrity_resume itself. +*/ +static bool superblock_changed (struct dm_integrity_c *ic) +{ +const __le32 immutable_flags =cpu_to_le32 (SB_FLAG_HAVE_JOURNAL_MAC | +SB_FLAG_FIXED_PADDING | +SB_FLAG_FIXED_HMAC | +SB_FLAG_INLINE ); + +return memcmp (ic->sb->magic, ic->sb_copy->magic,sizeof (ic->sb->magic)) !=0 || + ic->sb->log2_interleave_sectors != ic->sb_copy->log2_interleave_sectors || + ic->sb->integrity_tag_size != ic->sb_copy->integrity_tag_size || + ic->sb->journal_sections != ic->sb_copy->journal_sections || + ic->sb->log2_sectors_per_block != ic->sb_copy->log2_sectors_per_block || + ((ic->sb->flags ^ ic->sb_copy->flags) & immutable_flags) !=0 || +memcmp (ic->sb->salt, ic->sb_copy->salt,SALT_SIZE ) !=0 ; +} +static void dm_integrity_resume (struct dm_target *ti) {struct dm_integrity_c *ic = ti->private;
@@ -3875,6 +3905,18 @@ static void dm_integrity_resume(struct dm_target *ti)if (r)dm_integrity_io_error (ic,"reading superblock" , r); +if (unlikely (superblock_changed (ic))) { +/* +* Restore the superblock that we validated in the constructor, +* so that the rest of the driver doesn't operate on values +* that don't match the in-memory structures. +*/ +memcpy (ic->sb, ic->sb_copy,sizeof (struct superblock )); +DMERR ("The superblock was changed while the device was suspended" ); +dm_integrity_io_error (ic,"superblock check" , -EINVAL ); + goto skip_writes; + } +if (ic->mode =='R' ) goto skip_writes;
@@ -5421,6 +5463,13 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned int argc, char **argv ic->just_formatted = true; } + ic->sb_copy =kmemdup (ic->sb,sizeof (struct superblock ),GFP_KERNEL ); +if (!ic->sb_copy) { + ti->error ="Cannot allocate superblock copy" ; + r = -ENOMEM ; + goto bad; + } +if (!ic->meta_dev && ic->mode !='I' ) { r =dm_set_target_max_io_len (ti,1U << ic->sb->log2_interleave_sectors);if (r)
@@ -5519,6 +5568,7 @@ static void dm_integrity_dtr(struct dm_target *ti)kvfree (ic->journal_tree);if (ic->sb)free_pages_exact (ic->sb,SB_SECTORS <<SECTOR_SHIFT ); +kfree (ic->sb_copy);if (ic->internal_shash)crypto_free_shash (ic->internal_shash);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 4/10 sched_ext: Fix CPU hotplug hang when a dying CPUs tasks sit in the BPF scheduler
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
[ Upstream commit d35a535d3e3e71f92a051d94e415f43612c4edfc ]
A CPU going down has to empty its own rq. Its hotplug thread waits in sched_cpu_wait_empty() until nothing else is left, and the only thing that wakes it is balance_push(), which runs from __schedule() on the dying CPU and pushes off the migratable tasks the CPU picks.
sched_ext breaks this. A task sitting on a user DSQ or held by the BPF scheduler is still counted on its rq, but an inactive CPU no longer calls ops.dispatch() and can't pull the task back. The dying CPU goes idle with the task still counted, and one of two things happens:
- Another CPU consumes the task. The rq empties without a __schedule() on the dying CPU, so the hotplug thread is never woken and cpu_down() hangs holding cpu_hotplug_lock.
- The task is affine only to the dying CPU. Nothing can move it, and the offline stalls until the watchdog ejects the BPF scheduler.
When the rq goes offline, re-enqueue every task on it that isn't already on the local DSQ. An enqueue on an offline rq lands on the local DSQ, so the dying CPU itself picks the tasks and balance_push() pushes them off, the same as for the other sched classes. From then on no sched_ext path on another CPU can pull a task off the rq.
ops.dispatch() currently stops as soon as the CPU goes inactive, and CPU hotplug then waits for an RCU grace period before taking the rq offline. A BPF-held task affine only to the dying CPU and preempted inside an RCU read-side critical section would block that grace period, and the rq would never go offline. Test SCX_RQ_ONLINE directly so that ops.dispatch() keeps running until the rq goes offline. Only the dying CPU's own hotplug thread clears the flag during teardown, and task_can_run_on_remote_rq() still keeps other rqs' tasks off the CPU.
--- kernel/sched/ext/ext.c | 29 ++++++++++++++++++++++++++--- kernel/sched/sched.h | 5 +++-- 2 files changed, 29 insertions(+), 5 deletions(-)
kernel/sched/ext/ext.c +26 -3
@@ -2031,8 +2031,8 @@ static void set_task_runnable(struct rq *rq, struct task_struct *p) }/* -* list_add_tail() must be used. scx_bypass() depends on tasks being -* appended to the runnable_list. +* list_add_tail() must be used. scx_bypass() and rq_offline_scx() +* depend on tasks being appended to the runnable_list. */ list_add_tail (&p->scx.runnable_node, &rq->scx.runnable_list); }
@@ -2868,7 +2868,13 @@ scx_dispatch_sched(struct scx_sched *sch, struct rq *rq,#endif /* CONFIG_EXT_SUB_SCHED */ } -if (unlikely (!SCX_HAS_OP (sch, dispatch)) || !scx_rq_online (rq)) +/* +* scx_rq_online() can't be used. Its cpu_active() test goes false +* before CPU hotplug waits for an RCU grace period, and +* rq_offline_scx() moves this CPU's tasks to the local DSQ only after +* the wait. The grace period can depend on those tasks running. +*/ +if (unlikely (!SCX_HAS_OP (sch, dispatch)) || !(rq->scx.flags &SCX_RQ_ONLINE ))return SCX_DSP_NONE ; dspc->rq = rq;
@@ -3608,7 +3614,24 @@ static void rq_online_scx(struct rq *rq)static void rq_offline_scx (struct rq *rq) { +struct task_struct *p, *n; + rq->scx.flags &= ~SCX_RQ_ONLINE ; + +/* sched domain rebuilds call rq_offline with the CPU staying alive */ +if (cpu_active (cpu_of (rq))) +return ; + +/* +* An offline CPU no longer calls ops.dispatch(). Re-enqueue its tasks +* onto the local DSQ so that they run here and balance_push() moves +* them off. +*/ +list_for_each_entry_safe_reverse (p, n, &rq->scx.runnable_list, scx.runnable_node) { +if (p->scx.dsq == &rq->scx.local_dsq) +continue ; +guard (sched_change)(p,DEQUEUE_SAVE |DEQUEUE_MOVE |DEQUEUE_NOCLOCK ); + } }static bool check_rq_for_timeouts (struct rq *rq)
kernel/sched/sched.h +3 -2
@@ -4185,8 +4185,9 @@ extern void balance_callbacks(struct rq *rq, struct balance_callback *head);* after which it is enqueued again. * * Typically this must be called while holding task_rq_lock, since most/all -* properties are serialized under those locks. There is currently one -* exception to this rule in sched/ext which only holds rq->lock. +* properties are serialized under those locks. There are currently two +* exceptions to this rule in sched/ext which only hold rq->lock: scx_bypass() +* and rq_offline_scx(). */ /*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 5/10 nullfs: refuse file locks
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
[ Upstream commit 31a1fb90624d7e275db775a29a0e00a7f8b3df63 ]
Refuse flock() and POSIX locks on nullfs. Its one inode is the root of every kernel thread and the following patches make it the directory that stands in for an unmounted mount, so a lock taken through one such directory would block the locks of every other holder and F_GETLK would tell them the pid of the holder. Give the directory file operations of its own: what libfs gives an empty directory plus ->lock and ->flock that fail with ENOLCK, the way a filesystem without lock support does.
Stable-dep-of: e08f57a7dcb8 ("readdir: take no inode lock on an immutable directory")
--- fs/nullfs.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
fs/nullfs.c +29 -0
@@ -8,6 +8,34 @@ static const struct super_operations nullfs_super_operations = { .statfs = simple_statfs, }; +static loff_t nullfs_dir_llseek (struct file *file,loff_t offset,int whence) +{ +/* an empty directory has two entries . and .. at offsets 0 and 1 */ +return generic_file_llseek_size (file, offset, whence,2 ,2 ); +} + +static int nullfs_dir_readdir (struct file *file,struct dir_context *ctx) +{ +dir_emit_dots (file, ctx); +return 0 ; +} + +/* the one inode of nullfs is shared by every holder, so no locks on it */ +static int nullfs_nolock (struct file *file,int cmd,struct file_lock *fl) +{ +return -ENOLCK ; +} + +/* what libfs gives an empty directory, plus the refusal of file locks */ +static const struct file_operations nullfs_dir_operations = { + .llseek = nullfs_dir_llseek, + .read = generic_read_dir, + .iterate_shared = nullfs_dir_readdir, + .fsync = noop_fsync, + .lock = nullfs_nolock, + .flock = nullfs_nolock, +}; +static int nullfs_fs_fill_super (struct super_block *s,struct fs_context *fc) {struct inode *inode;
@@ -28,6 +56,7 @@ static int nullfs_fs_fill_super(struct super_block *s, struct fs_context *fc)/* nullfs is permanently empty... */ make_empty_dir_inode (inode); + inode->i_fop = &nullfs_dir_operations;simple_inode_init_ts (inode); inode->i_ino =1 ;/* ... and immutable, reading it leaves no trace either. */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 6/10 readdir: take no inode lock on an immutable directory
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian Brauner <[email protected]>
[ Upstream commit e08f57a7dcb83818c058e415988c23beb6c5a47f ]
iterate_dir() takes the directory's i_rwsem shared and holds it across ->iterate_shared(). For a directory that never has an entry and is never removed the lock keeps nothing still, it only orders every reader and every writer of that inode behind each other.
For the directory of a nullfs instance that matters. The instance of the initial mount namespace is the root of every empty mount namespace and the private instance is the root of every kernel thread, so one inode is shared across users who have nothing else in common. And a reader can hold the lock for as long as it likes: back the getdents() buffer with a mapping of a file on a FUSE mount of your own, let the copy of "." and ".." fault and let the server wait. Queue an exclusive taker behind it, a mkdir() in that directory goes through start_dirop() before the read-only mount is reported, and from then on every lookup that misses the dcache in that directory, every create and every mount on it waits until the server answers. One user of an empty mount namespace stalls all the others.
Add FOP_IMMUTABLE for the file operations of a directory that never changes and is never removed and let iterate_dir() skip the lock for it. The flag never changes for a file, ->f_pos is protected by f_pos_lock since directories are FMODE_ATOMIC_POS, IS_DEADDIR can't be set on such a directory and neither touch_atime() nor fsnotify take i_rwsem. Set it on the nullfs directory. The placeholder directories of libfs never have an entry either but their owners remove them, so they keep the lock.
--- fs/nullfs.c | 1 + fs/readdir.c | 13 +++++++++---- include/linux/fs.h | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-)
fs/nullfs.c +1 -0
@@ -34,6 +34,7 @@ static const struct file_operations nullfs_dir_operations = { .fsync = noop_fsync, .lock = nullfs_nolock, .flock = nullfs_nolock, + .fop_flags = FOP_IMMUTABLE, };static int nullfs_fs_fill_super (struct super_block *s,struct fs_context *fc)
fs/readdir.c +9 -4
@@ -87,6 +87,8 @@ EXPORT_SYMBOL(wrap_directory_iterator);int iterate_dir (struct file *file,struct dir_context *ctx) {struct inode *inode =file_inode (file); +/* never an entry, never removed: nothing for the lock to keep still */ +bool locked = !(file->f_op->fop_flags &FOP_IMMUTABLE );int res = -ENOTDIR ;if (!file->f_op->iterate_shared)
@@ -100,9 +102,11 @@ int iterate_dir(struct file *file, struct dir_context *ctx)if (res) goto out; - res =down_read_killable (&inode->i_rwsem); -if (res) - goto out; +if (locked) { + res =down_read_killable (&inode->i_rwsem); +if (res) + goto out; + } res = -ENOENT ;if (!IS_DEADDIR (inode)) {
@@ -112,7 +116,8 @@ int iterate_dir(struct file *file, struct dir_context *ctx)fsnotify_access (file);file_accessed (file); } -inode_unlock_shared (inode); +if (locked) +inode_unlock_shared (inode); out:return res; }
include/linux/fs.h +2 -0
@@ -1980,6 +1980,8 @@ struct file_operations {#define FOP_ASYNC_LOCK ((__force fop_flags_t)(1 << 6))/* File system supports uncached read/write buffered IO */ #define FOP_DONTCACHE ((__force fop_flags_t)(1 << 7)) +/* Never changes and is never removed, readdir of a directory takes no lock */ +#define FOP_IMMUTABLE ((__force fop_flags_t)(1 << 8))/* Wrap a directory iterator that needs exclusive inode access */ int wrap_directory_iterator(struct file *, struct dir_context *,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 7/10 net: mana: refactor mana_get_strings() and mana_get_sset_count() to use switch
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipayaan Roy <[email protected]>
[ Upstream commit d52f80731055ee43b36bf60088679aca97a484da ]
Refactor mana_get_strings() and mana_get_sset_count() from if/else to switch statements in preparation for adding ethtool private flags support which requires handling ETH_SS_PRIV_FLAGS.
No functional change.
Stable-dep-of: 259c4a519100 ("net: mana: reserve RX buffer headroom to fix forwarding performance")
--- .../ethernet/microsoft/mana/mana_ethtool.c | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-)
drivers/net/ethernet/microsoft/mana/mana_ethtool.c +46 -29
@@ -138,53 +138,70 @@ static int mana_get_sset_count(struct net_device *ndev, int stringset)struct mana_port_context *apc =netdev_priv (ndev);unsigned int num_queues = apc->num_queues; -if (stringset !=ETH_SS_STATS ) +switch (stringset) { +case ETH_SS_STATS : +return ARRAY_SIZE (mana_eth_stats) + +ARRAY_SIZE (mana_phy_stats) + +ARRAY_SIZE (mana_hc_stats) + + num_queues * (MANA_STATS_RX_COUNT +MANA_STATS_TX_COUNT ); +default :return -EINVAL ; - -return ARRAY_SIZE (mana_eth_stats) +ARRAY_SIZE (mana_phy_stats) +ARRAY_SIZE (mana_hc_stats) + - num_queues * (MANA_STATS_RX_COUNT +MANA_STATS_TX_COUNT ); + } } -static void mana_get_strings (struct net_device *ndev,u32 stringset,u8 *data) +static void mana_get_strings_stats (struct mana_port_context *apc,u8 **data) { -struct mana_port_context *apc =netdev_priv (ndev);unsigned int num_queues = apc->num_queues;int i, j; -if (stringset !=ETH_SS_STATS ) -return ;for (i =0 ; i <ARRAY_SIZE (mana_eth_stats); i++) -ethtool_puts (&data, mana_eth_stats[i].name); +ethtool_puts (data, mana_eth_stats[i].name);for (i =0 ; i <ARRAY_SIZE (mana_hc_stats); i++) -ethtool_puts (&data, mana_hc_stats[i].name); +ethtool_puts (data, mana_hc_stats[i].name);for (i =0 ; i <ARRAY_SIZE (mana_phy_stats); i++) -ethtool_puts (&data, mana_phy_stats[i].name); +ethtool_puts (data, mana_phy_stats[i].name);for (i =0 ; i < num_queues; i++) { -ethtool_sprintf (&data,"rx_%d_packets" , i); -ethtool_sprintf (&data,"rx_%d_bytes" , i); -ethtool_sprintf (&data,"rx_%d_xdp_drop" , i); -ethtool_sprintf (&data,"rx_%d_xdp_tx" , i); -ethtool_sprintf (&data,"rx_%d_xdp_redirect" , i); -ethtool_sprintf (&data,"rx_%d_pkt_len0_err" , i); +ethtool_sprintf (data,"rx_%d_packets" , i); +ethtool_sprintf (data,"rx_%d_bytes" , i); +ethtool_sprintf (data,"rx_%d_xdp_drop" , i); +ethtool_sprintf (data,"rx_%d_xdp_tx" , i); +ethtool_sprintf (data,"rx_%d_xdp_redirect" , i); +ethtool_sprintf (data,"rx_%d_pkt_len0_err" , i);for (j =0 ; j <MANA_RXCOMP_OOB_NUM_PPI -1 ; j++) -ethtool_sprintf (&data,"rx_%d_coalesced_cqe_%d" , i, j +2 ); +ethtool_sprintf (data, +"rx_%d_coalesced_cqe_%d" , + i, + j +2 ); }for (i =0 ; i < num_queues; i++) { -ethtool_sprintf (&data,"tx_%d_packets" , i); -ethtool_sprintf (&data,"tx_%d_bytes" , i); -ethtool_sprintf (&data,"tx_%d_xdp_xmit" , i); -ethtool_sprintf (&data,"tx_%d_tso_packets" , i); -ethtool_sprintf (&data,"tx_%d_tso_bytes" , i); -ethtool_sprintf (&data,"tx_%d_tso_inner_packets" , i); -ethtool_sprintf (&data,"tx_%d_tso_inner_bytes" , i); -ethtool_sprintf (&data,"tx_%d_long_pkt_fmt" , i); -ethtool_sprintf (&data,"tx_%d_short_pkt_fmt" , i); -ethtool_sprintf (&data,"tx_%d_csum_partial" , i); -ethtool_sprintf (&data,"tx_%d_mana_map_err" , i); +ethtool_sprintf (data,"tx_%d_packets" , i); +ethtool_sprintf (data,"tx_%d_bytes" , i); +ethtool_sprintf (data,"tx_%d_xdp_xmit" , i); +ethtool_sprintf (data,"tx_%d_tso_packets" , i); +ethtool_sprintf (data,"tx_%d_tso_bytes" , i); +ethtool_sprintf (data,"tx_%d_tso_inner_packets" , i); +ethtool_sprintf (data,"tx_%d_tso_inner_bytes" , i); +ethtool_sprintf (data,"tx_%d_long_pkt_fmt" , i); +ethtool_sprintf (data,"tx_%d_short_pkt_fmt" , i); +ethtool_sprintf (data,"tx_%d_csum_partial" , i); +ethtool_sprintf (data,"tx_%d_mana_map_err" , i); + } +} + +static void mana_get_strings (struct net_device *ndev,u32 stringset,u8 *data) +{ +struct mana_port_context *apc =netdev_priv (ndev); + +switch (stringset) { +case ETH_SS_STATS : +mana_get_strings_stats (apc, &data); +break ; +default : +break ; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 8/10 net: mana: reserve RX buffer headroom to fix forwarding performance
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hamza Mahfooz <[email protected]>
[ Upstream commit 259c4a519100e9182f264f8009ee212b32774277 ]
Commit 730ff06d3f5c ("net: mana: Use page pool fragments for RX buffers instead of full pages to improve memory efficiency.") started handing out RX buffers with zero headroom so that two buffers fit into one page at the default MTU.
The MANA TX path, however, stores the per scatter-gather entry DMA mappings in struct mana_skb_head at skb->head, and mana_start_xmit() therefore calls skb_cow_head(skb, MANA_HEADROOM). The port advertises this requirement as ndev->needed_headroom = MANA_HEADROOM.
As a result every packet that is received and then forwarded out of a MANA port fails the skb_cow() in ip_forward() and gets reallocated and copied by pskb_expand_head(). This is invisible to a plain RX or TX workload, but it puts a full skb reallocation plus memcpy on the hot path of every single forwarded packet, which is exactly what a router/NVA workload does.
Restore the headroom. Note that reserving MANA_HEADROOM (232) is not
enough: ip_forward() asks for LL_RESERVED_SPACE(dev), which rounds hard_header_len + needed_headroom up to HH_DATA_MOD and is 256 bytes on ethernet. Use LL_RESERVED_SPACE() directly so the value keeps tracking both constants. Also, since LL_RESERVED_SPACE() tracks MANA_HEADROOM, it grows with MAX_SKB_FRAGS and for MAX_SKB_FRAGS >= 19 it is greater than 256, so we have to account for that by using the headroom the RX queue actually uses (instead of assuming XDP_PACKET_HEADROOM) and turning MANA_XDP_MTU_MAX into MANA_XDP_MTU_MAX(ndev) (note that at the default CONFIG_MAX_SKB_FRAGS=17 they are equivalent).
At the default MTU on a 4K page this means a buffer no longer fits twice into a page (SKB_DATA_ALIGN(1500 + MANA_RXBUF_PAD + 256) = 2112), so the frag-vs-single decision is now made by computing the real buffer size instead of comparing the MTU against PAGE_SIZE / 2. The page_pool fragment path is still used wherever at least two buffers genuinely fit, e.g. on 16K and 64K page sizes.
Measured on an Azure VM with a MANA NIC acting as a forwarding NVA (UDP, 1400 byte payload, 4 streams, 8 Gbps offered, only the forwarding node's kernel differs), 8 runs each, median:
forwarded pps throughput
before 272,830 3.06 Gbps after 390,560 4.37 Gbps (+43%)
perf on the forwarding node, same workload:
memset_orig __pi_memcpy pskb_expand_head
before 10.07% 3.96% present after 0.94% 0.64% gone
--- .../net/ethernet/microsoft/mana/mana_bpf.c | 8 +-- drivers/net/ethernet/microsoft/mana/mana_en.c | 60 ++++++++++++++----- include/net/mana/mana.h | 14 ++++- 3 files changed, 63 insertions(+), 19 deletions(-)
drivers/net/ethernet/microsoft/mana/mana_bpf.c +4 -4
@@ -91,7 +91,7 @@ u32 mana_run_xdp(struct net_device *ndev, struct mana_rxq *rxq, goto out;xdp_init_buff (xdp,PAGE_SIZE , &rxq->xdp_rxq); -xdp_prepare_buff (xdp, buf_va,XDP_PACKET_HEADROOM , pkt_len, true); +xdp_prepare_buff (xdp, buf_va, rxq->headroom, pkt_len, true); act =bpf_prog_run_xdp (prog, xdp);
@@ -183,9 +183,9 @@ static int mana_xdp_set(struct net_device *ndev, struct bpf_prog *prog,if (!old_prog && !prog)return 0 ; -if (prog && ndev->mtu >MANA_XDP_MTU_MAX ) { +if (prog && ndev->mtu >MANA_XDP_MTU_MAX (ndev)) {netdev_err (ndev,"XDP: mtu:%u too large, mtu_max:%lu\n" , - ndev->mtu,MANA_XDP_MTU_MAX ); + ndev->mtu,MANA_XDP_MTU_MAX (ndev));NL_SET_ERR_MSG_MOD (extack,"XDP: mtu too large" );return -EOPNOTSUPP ;
@@ -238,7 +238,7 @@ static int mana_xdp_set(struct net_device *ndev, struct bpf_prog *prog,bpf_prog_put (old_prog);if (prog) - ndev->max_mtu = min_t(unsigned int, MANA_XDP_MTU_MAX, + ndev->max_mtu = min_t(unsigned int, MANA_XDP_MTU_MAX(ndev), gc->adapter_mtu -ETH_HLEN );else ndev->max_mtu = gc->adapter_mtu -ETH_HLEN ;
drivers/net/ethernet/microsoft/mana/mana_en.c +46 -14
83 lines not on this page · raw message
include/net/mana/mana.h +13 -1
@@ -328,7 +328,18 @@ struct mana_recv_buf_oob {#define MANA_RXBUF_PAD (SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) \ + ETH_HLEN) -#define MANA_XDP_MTU_MAX (PAGE_SIZE - MANA_RXBUF_PAD - XDP_PACKET_HEADROOM) +/* Headroom an RX buffer has to reserve while XDP is attached: the XDP program +* needs XDP_PACKET_HEADROOM, and the TX path needs LL_RESERVED_SPACE() (see +* mana_get_rxbuf_headroom()). LL_RESERVED_SPACE() grows with MAX_SKB_FRAGS and +* exceeds XDP_PACKET_HEADROOM once CONFIG_MAX_SKB_FRAGS is 19 or more. +*/ +static inline u32 mana_xdp_headroom (struct net_device *ndev) +{ +return max_t (u32,LL_RESERVED_SPACE (ndev),XDP_PACKET_HEADROOM ); +} + +#define MANA_XDP_MTU_MAX (ndev) \ + (PAGE_SIZE - MANA_RXBUF_PAD - mana_xdp_headroom(ndev))struct mana_rxq {struct gdma_queue *gdma_rq;
@@ -625,6 +636,7 @@ int mana_query_link_cfg(struct mana_port_context *apc);int mana_set_bw_clamp (struct mana_port_context *apc,u32 speed,int enable_clamping);void mana_query_phy_stats (struct mana_port_context *apc); +bool mana_single_rxbuf_per_page_forced (struct mana_port_context *apc,u32 mtu);int mana_pre_alloc_rxbufs (struct mana_port_context *apc,int mtu,int num_queues);void mana_pre_dealloc_rxbufs (struct mana_port_context *apc);void mana_unmap_skb (struct sk_buff *skb,struct mana_port_context *apc);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 9/10 wifi: atk9k: Revert "wifi: ath9k: reject short WMI command responses"
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 90201351a862182bdabfc1ad1c97b1e1b6ed5931 ]
This reverts commit 93ce8ea70451e800601bc9444aa33043de15d67b.
Mehmet reported that the offending commit breaks his AR9271 USB adapter which uses zero-length replies to commands that don't return a value. Revert the whole thing to restore the functionality.
--- drivers/net/wireless/ath/ath9k/wmi.c | 16 ++-------------- drivers/net/wireless/ath/ath9k/wmi.h | 1 - 2 files changed, 2 insertions(+), 15 deletions(-)
drivers/net/wireless/ath/ath9k/wmi.c +2 -14
@@ -206,16 +206,9 @@ static void ath9k_wmi_rsp_callback(struct wmi *wmi, struct sk_buff *skb) {skb_pull (skb,sizeof (struct wmi_cmd_hdr )); -if (wmi->cmd_rsp_buf && wmi->cmd_rsp_len) { -if (skb->len < wmi->cmd_rsp_len) { - wmi->cmd_rsp_status = -EMSGSIZE ; - goto complete; - } +if (wmi->cmd_rsp_buf !=NULL && wmi->cmd_rsp_len !=0 )memcpy (wmi->cmd_rsp_buf, skb->data, wmi->cmd_rsp_len); - } - wmi->cmd_rsp_status =0 ; -complete:complete (&wmi->cmd_wait); }
@@ -307,7 +300,6 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,/* record the rsp buffer and length */ wmi->cmd_rsp_buf = rsp_buf; wmi->cmd_rsp_len = rsp_len; - wmi->cmd_rsp_status =0 ; wmi->last_seq_id = wmi->tx_seq_id;spin_unlock_irqrestore (&wmi->wmi_lock, flags);
@@ -364,13 +356,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,return -ETIMEDOUT ; } -spin_lock_irqsave (&wmi->wmi_lock, flags); - ret = wmi->cmd_rsp_status; -spin_unlock_irqrestore (&wmi->wmi_lock, flags); -mutex_unlock (&wmi->op_mutex); -return ret; +return 0 ; out:ath_dbg (common,WMI ,"WMI failure for: %s\n" ,wmi_cmd_to_name (cmd_id));
drivers/net/wireless/ath/ath9k/wmi.h +0 -1
@@ -157,7 +157,6 @@ struct wmi {u16 tx_seq_id;u8 *cmd_rsp_buf;u32 cmd_rsp_len; -int cmd_rsp_status;bool stopped;struct list_head pending_tx_events;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 10/10 ASoC: cs35l56: Add DAI for SDCA OT25 stream
In reply to Greg Kroah-Hartman7.2-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Fitzgerald <[email protected]>
[ Upstream commit 86c8360c97f66fa7830fd930e2dc69374007284b ]
Add a DAI for the SDCA OT25 stream on SoundWire DP4.
The SDCA-defined OT25 stream is an amp reference feedback, typically used for AEC. The firmware outputs this on DP4. The firmware owns all control registers for this stream so there are no mixer controls or any other configuration options.
--- include/sound/cs35l56.h | 1 + sound/soc/codecs/cs35l56-sdw.c | 9 ++++-- sound/soc/codecs/cs35l56.c | 54 ++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-)
include/sound/cs35l56.h +1 -0
@@ -312,6 +312,7 @@ struct snd_ctl_elem_value;#define CS35L56_SDW1_PLAYBACK_PORT 1#define CS35L56_SDW1_CAPTURE_PORT 3 +#define CS35L56_OT25_CAPTURE_PORT 4#define CS35L56_NUM_BULK_SUPPLIES 3#define CS35L56_NUM_DSP_REGIONS 5
sound/soc/codecs/cs35l56-sdw.c +7 -2
@@ -295,11 +295,11 @@ static int cs35l56_sdw_read_prop(struct sdw_slave *peripheral)if (ret ==0 ) prop->clk_stop_mode1 = !!clock_stop_1; - ports =devm_kcalloc (cs35l56->base.dev,2 ,sizeof (*ports),GFP_KERNEL ); + ports =devm_kcalloc (cs35l56->base.dev,3 ,sizeof (*ports),GFP_KERNEL );if (!ports)return -ENOMEM ; - prop->source_ports =BIT (CS35L56_SDW1_CAPTURE_PORT ); + prop->source_ports =BIT (CS35L56_SDW1_CAPTURE_PORT ) |BIT (CS35L56_OT25_CAPTURE_PORT ); prop->sink_ports =BIT (CS35L56_SDW1_PLAYBACK_PORT ); prop->paging_support = true; prop->quirks =SDW_SLAVE_QUIRKS_INVALID_INITIAL_PARITY ;
@@ -315,6 +315,11 @@ static int cs35l56_sdw_read_prop(struct sdw_slave *peripheral) ports[1 ].num =CS35L56_SDW1_CAPTURE_PORT ; ports[1 ].type =SDW_DPN_FULL ; ports[1 ].ch_prep_timeout =10 ; + +/* DP4 - capture */ + ports[2 ].num =CS35L56_OT25_CAPTURE_PORT ; + ports[2 ].type =SDW_DPN_FULL ; + ports[2 ].ch_prep_timeout =10 ; prop->src_dpn_prop = &ports[1 ]; dev_dbg(&peripheral->dev, "clock stop mode 1 supported: %s\n",
sound/soc/codecs/cs35l56.c +54 -0
90 lines not on this page · raw message
Signature · 1 line
2.53.0
Hi
kernel build / boot test on x86_64 (Intel).
No regressions here.
Thanks
# Librecast Test Results
044/044 [ OK ] liblcrq
010/010 [ OK ] libmld
120/120 [ OK ] liblibrecast
CPU/kernel: Linux auntie 7.2.12-rc1-g590446e5a2fe #2 SMP PREEMPT_DYNAMIC Sat Oct 17 16:46:51 -00 2026 x86_64 AMD Ryzen 9 9950X 16-Core Processor AuthenticAMD GNU/Linux
Am 17.10.2026 um 17:54 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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-2697v2 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 · On Sat, 17 Oct 2026 17:54:29 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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 and arm32:
I see some objtool warnings with Rust nightly (there was a change upstream to core), so I will send a patch to mainline as usual.
Thanks!
Cheers,
Miguel
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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.
Build and boot tested with QEMU for x86_64, i386, arm64, and riscv across multiple configurations, and boots on AMD Ryzen 7 5800H. No regressions observed.
Quoted 4 lines · On Sat, 17 Oct 2026 17:54:29 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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.
This rc kernel passes DAMON functionality test [1] on my test machine.
[1] https://github.com/damonitor/damon-tests/tree/next/corr
Thanks,
SJ
[...]
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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.
Built, booted, and tested on hardware for x86_64:
- AMD Ryzen 9 5900X, Nvidia RTX 3080 (nouveau)
No regressions found.
Thanks!
Sean
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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/v7.x/stable-review/patch-7.2.12-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-7.2.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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/v7.x/stable-review/patch-7.2.12-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-7.2.y
and the diffstat can be found below.thanks,
greg k-h
Tested on my amd64 DIY NAS and an arm64 virtual machine. Working well, no regressions observed.
Signature · 1 line
-Barry K. Nathan <[email protected]>
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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/v7.x/stable-review/patch-7.2.12-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-7.2.y
and the diffstat can be found below.thanks,
greg k-h
Linux version 7.2.12-rc1 tested.
Build successfully completed.
Boot successfully completed.
No dmesg regressions.
Video output normal.
Sound output normal.
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
[ 0.000000] Linux version 7.2.12-rc1rv-g590446e5a2fe
(takeshi@ThinkPadX1Gen10J0764) (gcc (GCC) 16.2.1 20260810, GNU ld (GNU Binutils) 2.47) #1 SMP PREEMPT_DYNAMIC Mon Oct 19 16:42:14 JST 2026
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-7.2.y
Best regards,
Pavel
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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/v7.x/stable-review/patch-7.2.12-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-7.2.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
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 7.2.12 release. There are 10 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 Mon, 19 Oct 2026 15:50:51 +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/v7.x/stable-review/patch-7.2.12-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-7.2.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah