6.10.14-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainerPATCH 399/482 clk: qcom: clk-alpha-pll: Fix CAL_L_VAL override for LUCID EVO PLL
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ajit Pandey <[email protected]>
commit fff617979f97c773aaa9432c31cf62444b3bdbd4 upstream.
In LUCID EVO PLL CAL_L_VAL and L_VAL bitfields are part of single PLL_L_VAL register. Update for L_VAL bitfield values in PLL_L_VAL register using regmap_write() API in __alpha_pll_trion_set_rate callback will override LUCID EVO PLL initial configuration related to PLL_CAL_L_VAL bit fields in PLL_L_VAL register.
Observed random PLL lock failures during PLL enable due to such override in PLL calibration value. Use regmap_update_bits() with L_VAL bitfield mask instead of regmap_write() API to update only PLL_L_VAL bitfields in __alpha_pll_trion_set_rate callback.
--- drivers/clk/qcom/clk-alpha-pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/clk-alpha-pll.c +1 -1
@@ -1665,7 +1665,7 @@ static int __alpha_pll_trion_set_rate(stif (ret <0 )return ret; -regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); +regmap_update_bits (pll->clkr.regmap,PLL_L_VAL (pll),LUCID_EVO_PLL_L_VAL_MASK , l);regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a);/* Latch the PLL input */
Greg Kroah-Hartman
maintainerPATCH 400/482 smb: client: use actual path when queryfs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: wangrong <[email protected]>
commit a421e3fe0e6abe27395078f4f0cec5daf466caea upstream.
Due to server permission control, the client does not have access to the shared root directory, but can access subdirectories normally, so users usually mount the shared subdirectories directly. In this case, queryfs should use the actual path instead of the root directory to avoid the call returning an error (EACCES).
--- fs/smb/client/cifsfs.c | 13 ++++++++++++- fs/smb/client/cifsglob.h | 2 +- fs/smb/client/smb1ops.c | 2 +- fs/smb/client/smb2ops.c | 19 ++++++++++++------- 4 files changed, 26 insertions(+), 10 deletions(-)
fs/smb/client/cifsfs.c +12 -1
@@ -313,8 +313,17 @@ cifs_statfs(struct dentry *dentry, strucstruct TCP_Server_Info *server = tcon->ses->server;unsigned int xid;int rc =0 ; +const char *full_path; +void *page; xid =get_xid (); + page =alloc_dentry_path (); + + full_path =build_path_from_dentry (dentry, page); +if (IS_ERR (full_path)) { + rc =PTR_ERR (full_path); + goto statfs_out; + }if (le32_to_cpu (tcon->fsAttrInfo.MaxPathNameComponentLength) >0 ) buf->f_namelen =
@@ -330,8 +339,10 @@ cifs_statfs(struct dentry *dentry, struc buf->f_ffree =0 ;/* unlimited */ if (server->ops->queryfs) - rc = server->ops->queryfs (xid, tcon, cifs_sb, buf); + rc = server->ops->queryfs (xid, tcon, full_path, cifs_sb, buf); +statfs_out: +free_dentry_path (page);free_xid (xid);return rc; }
fs/smb/client/cifsglob.h +1 -1
@@ -482,7 +482,7 @@ struct smb_version_operations { __u16 net_fid, struct cifsInodeInfo *cifs_inode);/* query remote filesystem */ int (*queryfs)(const unsigned int ,struct cifs_tcon *, -struct cifs_sb_info *,struct kstatfs *); +const char *,struct cifs_sb_info *,struct kstatfs *);/* send mandatory brlock to the server */ int (*mand_lock)(const unsigned int ,struct cifsFileInfo *,__u64 ,__u64 ,__u32 ,int ,int ,bool );
fs/smb/client/smb1ops.c +1 -1
@@ -909,7 +909,7 @@ cifs_oplock_response(struct cifs_tcon *tstatic int cifs_queryfs (const unsigned int xid,struct cifs_tcon *tcon, -struct cifs_sb_info *cifs_sb,struct kstatfs *buf) +const char *path,struct cifs_sb_info *cifs_sb,struct kstatfs *buf) {int rc = -EOPNOTSUPP ;
fs/smb/client/smb2ops.c +12 -7
@@ -2816,7 +2816,7 @@ out_free_path:static int smb2_queryfs (const unsigned int xid,struct cifs_tcon *tcon, -struct cifs_sb_info *cifs_sb,struct kstatfs *buf) +const char *path,struct cifs_sb_info *cifs_sb,struct kstatfs *buf) {struct smb2_query_info_rsp *rsp;struct smb2_fs_full_size_info *info =NULL ;
@@ -2825,7 +2825,7 @@ smb2_queryfs(const unsigned int xid, strint rc; - rc = smb2_query_info_compound(xid, tcon, "", + rc = smb2_query_info_compound(xid, tcon, path, FILE_READ_ATTRIBUTES, FS_FULL_SIZE_INFORMATION, SMB2_O_INFO_FILESYSTEM,
@@ -2853,28 +2853,33 @@ qfs_exit:static int smb311_queryfs (const unsigned int xid,struct cifs_tcon *tcon, -struct cifs_sb_info *cifs_sb,struct kstatfs *buf) +const char *path,struct cifs_sb_info *cifs_sb,struct kstatfs *buf) {int rc; -__le16 srch_path =0 ;/* Null - open root of share */ +__le16 *utf16_path =NULL ;u8 oplock =SMB2_OPLOCK_LEVEL_NONE ;struct cifs_open_parms oparms;struct cifs_fid fid;if (!tcon->posix_extensions) -return smb2_queryfs (xid, tcon, cifs_sb, buf); +return smb2_queryfs (xid, tcon, path, cifs_sb, buf); oparms = (struct cifs_open_parms ) { .tcon = tcon, - .path ="" , + .path = path, .desired_access =FILE_READ_ATTRIBUTES , .disposition =FILE_OPEN , .create_options =cifs_create_options (cifs_sb,0 ), .fid = &fid, }; - rc =SMB2_open (xid, &oparms, &srch_path, &oplock,NULL ,NULL , + utf16_path =cifs_convert_path_to_utf16 (path, cifs_sb); +if (utf16_path ==NULL ) +return -ENOMEM ; + + rc =SMB2_open (xid, &oparms, utf16_path, &oplock,NULL ,NULL ,NULL ,NULL ); +kfree (utf16_path);if (rc)return rc;
Greg Kroah-Hartman
maintainerPATCH 401/482 smb3: fix incorrect mode displayed for read-only files
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve French <[email protected]>
commit 2f3017e7cc7515e0110a3733d8dca84de2a1d23d upstream.
Commands like "chmod 0444" mark a file readonly via the attribute flag (when mapping of mode bits into the ACL are not set, or POSIX extensions are not negotiated), but they were not reported correctly for stat of directories (they were reported ok for files and for "ls"). See example below:
root:~# ls /mnt2 -l
total 12
drwxr-xr-x 2 root root 0 Sep 21 18:03 normaldir
-rwxr-xr-x 1 root root 0 Sep 21 23:24 normalfile
dr-xr-xr-x 2 root root 0 Sep 21 17:55 readonly-dir
-r-xr-xr-x 1 root root 209716224 Sep 21 18:15 readonly-file
root:~# stat -c %a /mnt2/readonly-dir
755
root:~# stat -c %a /mnt2/readonly-file
555This fixes the stat of directories when ATTR_READONLY is set (in cases where the mode can not be obtained other ways).
root:~# stat -c %a /mnt2/readonly-dir
555--- fs/smb/client/inode.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
fs/smb/client/inode.c +11 -8
@@ -800,10 +800,6 @@ static void cifs_open_info_to_fattr(stru fattr->cf_mode =S_IFREG | cifs_sb->ctx->file_mode; fattr->cf_dtype =DT_REG ; -/* clear write bits if ATTR_READONLY is set */ -if (fattr->cf_cifsattrs &ATTR_READONLY ) - fattr->cf_mode &= ~(S_IWUGO ); -/* * Don't accept zero nlink from non-unix servers unless * delete is pending. Instead mark it as unknown.
@@ -816,6 +812,10 @@ static void cifs_open_info_to_fattr(stru } } +/* clear write bits if ATTR_READONLY is set */ +if (fattr->cf_cifsattrs &ATTR_READONLY ) + fattr->cf_mode &= ~(S_IWUGO ); + out_reparse:if (S_ISLNK (fattr->cf_mode)) {if (likely (data->symlink_target))
@@ -1233,11 +1233,14 @@ handle_mnt_opt: __func__, rc); goto out; } - } - -/* fill in remaining high mode bits e.g. SUID, VTX */ -if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL ) + }else if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_UNX_EMUL ) +/* fill in remaining high mode bits e.g. SUID, VTX */ cifs_sfu_mode (fattr, full_path, cifs_sb, xid); +else if (!(tcon->posix_extensions)) +/* clear write bits if ATTR_READONLY is set */ +if (fattr->cf_cifsattrs &ATTR_READONLY ) + fattr->cf_mode &= ~(S_IWUGO ); +/* check for Minshall+French symlinks */ if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_MF_SYMLINKS ) {
Greg Kroah-Hartman
maintainerPATCH 402/482 iio: magnetometer: ak8975: Fix reading for ak099xx sensors
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Barnabás Czémán <[email protected]>
commit 129464e86c7445a858b790ac2d28d35f58256bbe upstream.
Move ST2 reading with overflow handling after measurement data reading.
ST2 register read have to be read after read measurment data, because it means end of the reading and realease the lock on the data. Remove ST2 read skip on interrupt based waiting because ST2 required to be read out at and of the axis read.
--- drivers/iio/magnetometer/ak8975.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
drivers/iio/magnetometer/ak8975.c +16 -16
@@ -692,22 +692,8 @@ static int ak8975_start_read_axis(structif (ret <0 )return ret; -/* This will be executed only for non-interrupt based waiting case */ -if (ret & data->def->ctrl_masks[ST1_DRDY ]) { - ret =i2c_smbus_read_byte_data (client, - data->def->ctrl_regs[ST2 ]); -if (ret <0 ) { -dev_err (&client->dev,"Error in reading ST2\n" ); -return ret; - } -if (ret & (data->def->ctrl_masks[ST2_DERR ] | - data->def->ctrl_masks[ST2_HOFL ])) { -dev_err (&client->dev,"ST2 status error 0x%x\n" , ret); -return -EINVAL ; - } - } - -return 0 ; +/* Return with zero if the data is ready. */ +return !data->def->ctrl_regs[ST1_DRDY ]; }/* Retrieve raw flux value for one of the x, y, or z axis. */
@@ -734,6 +720,20 @@ static int ak8975_read_axis(struct iio_dif (ret <0 ) goto exit; +/* Read out ST2 for release lock on measurment data. */ + ret =i2c_smbus_read_byte_data (client, data->def->ctrl_regs[ST2 ]); +if (ret <0 ) { +dev_err (&client->dev,"Error in reading ST2\n" ); + goto exit; + } + +if (ret & (data->def->ctrl_masks[ST2_DERR ] | + data->def->ctrl_masks[ST2_HOFL ])) { +dev_err (&client->dev,"ST2 status error 0x%x\n" , ret); + ret = -EINVAL ; + goto exit; + } +mutex_unlock (&data->lock);pm_runtime_mark_last_busy (&data->client->dev);
Greg Kroah-Hartman
maintainerPATCH 403/482 vrf: revert "vrf: Remove unnecessary RCU-bh critical section"
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Willem de Bruijn <[email protected]>
commit b04c4d9eb4f25b950b33218e33b04c94e7445e51 upstream.
This reverts commit 504fc6f4f7f681d2a03aa5f68aad549d90eab853.
dev_queue_xmit_nit is expected to be called with BH disabled. __dev_queue_xmit has the following:
/* Disable soft irqs for various locks below. Also
* stops preemption for RCU.
*/
rcu_read_lock_bh();VRF must follow this invariant. The referenced commit removed this protection. Which triggered a lockdep warning:
================================
WARNING: inconsistent lock state
6.11.0 #1 Tainted: G W
--------------------------------
inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
btserver/134819 [HC0[0]:SC0[0]:HE1:SE1] takes:
ffff8882da30c118 (rlock-AF_PACKET){+.?.}-{2:2}, at: tpacket_rcv+0x863/0x3b30
{IN-SOFTIRQ-W} state was registered at:
lock_acquire+0x19a/0x4f0
_raw_spin_lock+0x27/0x40
packet_rcv+0xa33/0x1320
__netif_receive_skb_core.constprop.0+0xcb0/0x3a90
__netif_receive_skb_list_core+0x2c9/0x890
netif_receive_skb_list_internal+0x610/0xcc0
[...]
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(rlock-AF_PACKET);
<Interrupt>
lock(rlock-AF_PACKET);
*** DEADLOCK ***
Call Trace:
<TASK>
dump_stack_lvl+0x73/0xa0
mark_lock+0x102e/0x16b0
__lock_acquire+0x9ae/0x6170
lock_acquire+0x19a/0x4f0
_raw_spin_lock+0x27/0x40
tpacket_rcv+0x863/0x3b30
dev_queue_xmit_nit+0x709/0xa40
vrf_finish_direct+0x26e/0x340 [vrf]
vrf_l3_out+0x5f4/0xe80 [vrf]
__ip_local_out+0x51e/0x7a0
[...]--- drivers/net/vrf.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/vrf.c +2 -0
@@ -628,7 +628,9 @@ static void vrf_finish_direct(struct sk_eth_zero_addr (eth->h_dest); eth->h_proto = skb->protocol; +rcu_read_lock_bh ();dev_queue_xmit_nit (skb, vrf_dev); +rcu_read_unlock_bh ();skb_pull (skb,ETH_HLEN ); }
Greg Kroah-Hartman
maintainerPATCH 404/482 net: gso: fix tcp fraglist segmentation after pull from frag_list
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
commit 17bd3bd82f9f79f3feba15476c2b2c95a9b11ff8 upstream.
Detect tcp gso fraglist skbs with corrupted geometry (see below) and pass these to skb_segment instead of skb_segment_list, as the first can segment them correctly.
Valid SKB_GSO_FRAGLIST skbs
- consist of two or more segments
- the head_skb holds the protocol headers plus first gso_size
- one or more frag_list skbs hold exactly one segment
- all but the last must be gso_size
Optional datapath hooks such as NAT and BPF (bpf_skb_pull_data) can modify these skbs, breaking these invariants.
In extreme cases they pull all data into skb linear. For TCP, this causes a NULL ptr deref in __tcpv4_gso_segment_list_csum at tcp_hdr(seg->next).
Detect invalid geometry due to pull, by checking head_skb size. Don't just drop, as this may blackhole a destination. Convert to be able to pass to regular skb_segment.
Approach and description based on a patch by Willem de Bruijn.
--- net/ipv4/tcp_offload.c | 10 ++++++++-- net/ipv6/tcpv6_offload.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-)
net/ipv4/tcp_offload.c +8 -2
@@ -101,8 +101,14 @@ static struct sk_buff *tcp4_gso_segment(struct sk_buff *skb,if (!pskb_may_pull (skb,sizeof (struct tcphdr )))return ERR_PTR (-EINVAL ); -if (skb_shinfo (skb)->gso_type &SKB_GSO_FRAGLIST ) -return __tcp4_gso_segment_list (skb, features); +if (skb_shinfo (skb)->gso_type &SKB_GSO_FRAGLIST ) { +struct tcphdr *th =tcp_hdr (skb); + +if (skb_pagelen (skb) - th->doff *4 ==skb_shinfo (skb)->gso_size) +return __tcp4_gso_segment_list (skb, features); + + skb->ip_summed =CHECKSUM_NONE ; + }if (unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )) {const struct iphdr *iph =ip_hdr (skb);
net/ipv6/tcpv6_offload.c +8 -2
@@ -159,8 +159,14 @@ static struct sk_buff *tcp6_gso_segment(struct sk_buff *skb,if (!pskb_may_pull (skb,sizeof (*th)))return ERR_PTR (-EINVAL ); -if (skb_shinfo (skb)->gso_type &SKB_GSO_FRAGLIST ) -return __tcp6_gso_segment_list (skb, features); +if (skb_shinfo (skb)->gso_type &SKB_GSO_FRAGLIST ) { +struct tcphdr *th =tcp_hdr (skb); + +if (skb_pagelen (skb) - th->doff *4 ==skb_shinfo (skb)->gso_size) +return __tcp6_gso_segment_list (skb, features); + + skb->ip_summed =CHECKSUM_NONE ; + }if (unlikely (skb->ip_summed !=CHECKSUM_PARTIAL )) {const struct ipv6hdr *ipv6h =ipv6_hdr (skb);
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 405/482 gso: fix udp gso fraglist segmentation after pull from frag_list
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Willem de Bruijn <[email protected]>
commit a1e40ac5b5e9077fe1f7ae0eb88034db0f9ae1ab upstream.
Detect gso fraglist skbs with corrupted geometry (see below) and pass these to skb_segment instead of skb_segment_list, as the first can segment them correctly.
Valid SKB_GSO_FRAGLIST skbs
- consist of two or more segments
- the head_skb holds the protocol headers plus first gso_size
- one or more frag_list skbs hold exactly one segment
- all but the last must be gso_size
Optional datapath hooks such as NAT and BPF (bpf_skb_pull_data) can modify these skbs, breaking these invariants.
In extreme cases they pull all data into skb linear. For UDP, this causes a NULL ptr deref in __udpv4_gso_segment_list_csum at udp_hdr(seg->next)->dest.
Detect invalid geometry due to pull, by checking head_skb size. Don't just drop, as this may blackhole a destination. Convert to be able to pass to regular skb_segment.
--- net/ipv4/udp_offload.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
net/ipv4/udp_offload.c +20 -2
@@ -290,8 +290,26 @@ struct sk_buff *__udp_gso_segment(structreturn NULL ; } -if (skb_shinfo (gso_skb)->gso_type &SKB_GSO_FRAGLIST ) -return __udp_gso_segment_list (gso_skb, features, is_ipv6); +if (skb_shinfo (gso_skb)->gso_type &SKB_GSO_FRAGLIST ) { +/* Detect modified geometry and pass those to skb_segment. */ +if (skb_pagelen (gso_skb) -sizeof (*uh) ==skb_shinfo (gso_skb)->gso_size) +return __udp_gso_segment_list (gso_skb, features, is_ipv6); + +/* Setup csum, as fraglist skips this in udp4_gro_receive. */ + gso_skb->csum_start =skb_transport_header (gso_skb) - gso_skb->head; + gso_skb->csum_offset = offsetof(struct udphdr , check); + gso_skb->ip_summed =CHECKSUM_PARTIAL ; + + uh =udp_hdr (gso_skb); +if (is_ipv6) + uh->check = ~udp_v6_check (gso_skb->len, + &ipv6_hdr (gso_skb)->saddr, + &ipv6_hdr (gso_skb)->daddr,0 ); +else + uh->check = ~udp_v4_check (gso_skb->len, +ip_hdr (gso_skb)->saddr, +ip_hdr (gso_skb)->daddr,0 ); + }skb_pull (gso_skb,sizeof (*uh));
Greg Kroah-Hartman
maintainerPATCH 406/482 tomoyo: fallback to realpath if symlinks pathname does not exist
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit ada1986d07976d60bed5017aa38b7f7cf27883f7 upstream.
Alfred Agrell found that TOMOYO cannot handle execveat(AT_EMPTY_PATH) inside chroot environment where /dev and /proc are not mounted, for commit 51f39a1f0cea ("syscalls: implement execveat() system call") missed that TOMOYO tries to canonicalize argv[0] when the filename fed to the executed program as argv[0] is supplied using potentially nonexistent pathname.
Since "/dev/fd/<fd>" already lost symlink information used for obtaining that <fd>, it is too late to reconstruct symlink's pathname. Although <filename> part of "/dev/fd/<fd>/<filename>" might not be canonicalized, TOMOYO cannot use tomoyo_realpath_nofollow() when /dev or /proc is not mounted. Therefore, fallback to tomoyo_realpath_from_path() when tomoyo_realpath_nofollow() failed.
--- security/tomoyo/domain.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
security/tomoyo/domain.c +6 -3
@@ -723,10 +723,13 @@ int tomoyo_find_next_domain(struct linux ee->r.obj = &ee->obj; ee->obj.path1 = bprm->file->f_path;/* Get symlink's pathname of program. */ - retval = -ENOENT ; exename.name =tomoyo_realpath_nofollow (original_name); -if (!exename.name) - goto out; +if (!exename.name) { +/* Fallback to realpath if symlink's pathname does not exist. */ + exename.name =tomoyo_realpath_from_path (&bprm->file->f_path); +if (!exename.name) + goto out; + }tomoyo_fill_path_info (&exename); retry:/* Check 'aggregator' directive. */
Greg Kroah-Hartman
maintainerPATCH 407/482 net: stmmac: Fix zero-division error when disabling tc cbs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: KhaiWenTan <[email protected]>
commit 675faf5a14c14a2be0b870db30a70764df81e2df upstream.
The commit b8c43360f6e4 ("net: stmmac: No need to calculate speed divider when offload is disabled") allows the "port_transmit_rate_kbps" to be set to a value of 0, which is then passed to the "div_s64" function when tc-cbs is disabled. This leads to a zero-division error.
When tc-cbs is disabled, the idleslope, sendslope, and credit values the credit values are not required to be configured. Therefore, adding a return statement after setting the txQ mode to DCB when tc-cbs is disabled would prevent a zero-division error.
--- drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +1 -0
@@ -396,6 +396,7 @@ static int tc_setup_cbs(struct stmmac_prreturn ret; priv->plat->tx_queues_cfg[queue].mode_to_use =MTL_QUEUE_DCB ; +return 0 ; }/* Final adjustments for HW */
Greg Kroah-Hartman
maintainerPATCH 408/482 rtc: at91sam9: fix OF node leak in probe() error path
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
commit 73580e2ee6adfb40276bd420da3bb1abae204e10 upstream.
Driver is leaking an OF node reference obtained from of_parse_phandle_with_fixed_args().
--- drivers/rtc/rtc-at91sam9.c | 1 + 1 file changed, 1 insertion(+)
drivers/rtc/rtc-at91sam9.c +1 -0
@@ -368,6 +368,7 @@ static int at91_rtc_probe(struct platforreturn ret; rtc->gpbr =syscon_node_to_regmap (args.np); +of_node_put (args.np); rtc->gpbr_offset = args.args[0 ];if (IS_ERR (rtc->gpbr)) {dev_err (&pdev->dev,"failed to retrieve gpbr regmap, aborting.\n" );
Greg Kroah-Hartman
maintainerPATCH 409/482 Input: adp5589-keys - fix NULL pointer dereference
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
commit fb5cc65f973661241e4a2b7390b429aa7b330c69 upstream.
We register a devm action to call adp5589_clear_config() and then pass the i2c client as argument so that we can call i2c_get_clientdata() in order to get our device object. However, i2c_set_clientdata() is only being set at the end of the probe function which means that we'll get a NULL pointer dereference in case the probe function fails early.
--- drivers/input/keyboard/adp5589-keys.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/input/keyboard/adp5589-keys.c +3 -6
@@ -936,10 +936,9 @@ static int adp5589_keypad_add(struct adpstatic void adp5589_clear_config (void *data) { -struct i2c_client *client = data; -struct adp5589_kpad *kpad =i2c_get_clientdata (client); +struct adp5589_kpad *kpad = data; -adp5589_write (client, kpad->var->reg (ADP5589_GENERAL_CFG ),0 ); +adp5589_write (kpad->client, kpad->var->reg (ADP5589_GENERAL_CFG ),0 ); }static int adp5589_probe (struct i2c_client *client)
@@ -983,7 +982,7 @@ static int adp5589_probe(struct i2c_clie } error =devm_add_action_or_reset (&client->dev, adp5589_clear_config, - client); + kpad);if (error)return error;
@@ -1010,8 +1009,6 @@ static int adp5589_probe(struct i2c_clieif (error)return error; -i2c_set_clientdata (client, kpad); -dev_info (&client->dev,"Rev.%d keypad, irq %d\n" , revid, client->irq);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 410/482 Input: adp5589-keys - fix adp5589_gpio_get_value()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
commit c684771630e64bc39bddffeb65dd8a6612a6b249 upstream.
The adp5589 seems to have the same behavior as similar devices as explained in commit 910a9f5636f5 ("Input: adp5588-keys - get value from data out when dir is out").
Basically, when the gpio is set as output we need to get the value from ADP5589_GPO_DATA_OUT_A register instead of ADP5589_GPI_STATUS_A.
--- drivers/input/keyboard/adp5589-keys.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/input/keyboard/adp5589-keys.c +10 -3
@@ -391,10 +391,17 @@ static int adp5589_gpio_get_value(structstruct adp5589_kpad *kpad =gpiochip_get_data (chip);unsigned int bank = kpad->var->bank (kpad->gpiomap[off]);unsigned int bit = kpad->var->bit (kpad->gpiomap[off]); +int val; -return !!(adp5589_read (kpad->client, - kpad->var->reg (ADP5589_GPI_STATUS_A ) + bank) & - bit); +mutex_lock (&kpad->gpio_lock); +if (kpad->dir[bank] & bit) + val = kpad->dat_out[bank]; +else + val =adp5589_read (kpad->client, + kpad->var->reg (ADP5589_GPI_STATUS_A ) + bank); +mutex_unlock (&kpad->gpio_lock); + +return !!(val & bit); } static void adp5589_gpio_set_value(struct gpio_chip *chip,
Greg Kroah-Hartman
maintainerPATCH 411/482 cachefiles: fix dentry leak in cachefiles_open_file()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baokun Li <[email protected]>
commit da6ef2dffe6056aad3435e6cf7c6471c2a62187c upstream.
A dentry leak may be caused when a lookup cookie and a cull are concurrent:
P1 | P2
-----------------------------------------------------------cachefiles_lookup_cookie
cachefiles_look_up_object
lookup_one_positive_unlocked
// get dentry
cachefiles_cull
inode->i_flags |= S_KERNEL_FILE;
cachefiles_open_file
cachefiles_mark_inode_in_use
__cachefiles_mark_inode_in_use
can_use = false
if (!(inode->i_flags & S_KERNEL_FILE))
can_use = true
return false
return false
// Returns an error but doesn't put dentryAfter that the following WARNING will be triggered when the backend folder is umounted:
==================================================================
BUG: Dentry 000000008ad87947{i=7a,n=Dx_1_1.img} still in use (1) [unmount of ext4 sda]
WARNING: CPU: 4 PID: 359261 at fs/dcache.c:1767 umount_check+0x5d/0x70
CPU: 4 PID: 359261 Comm: umount Not tainted 6.6.0-dirty #25
RIP: 0010:umount_check+0x5d/0x70
Call Trace:
<TASK>
d_walk+0xda/0x2b0
do_one_tree+0x20/0x40
shrink_dcache_for_umount+0x2c/0x90
generic_shutdown_super+0x20/0x160
kill_block_super+0x1a/0x40
ext4_kill_sb+0x22/0x40
deactivate_locked_super+0x35/0x80
cleanup_mnt+0x104/0x160
==================================================================Whether cachefiles_open_file() returns true or false, the reference count obtained by lookup_positive_unlocked() in cachefiles_look_up_object() should be released.
Therefore release that reference count in cachefiles_look_up_object() to fix the above issue and simplify the code.
--- fs/cachefiles/namei.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/cachefiles/namei.c +3 -4
@@ -595,14 +595,12 @@ static bool cachefiles_open_file(struct* write and readdir but not lookup or open). */ touch_atime (&file->f_path); -dput (dentry);return true; check_failed:fscache_cookie_lookup_negative (object->cookie);cachefiles_unmark_inode_in_use (object, file);fput (file); -dput (dentry);if (ret == -ESTALE )return cachefiles_create_file (object);return false;
@@ -611,7 +609,6 @@ error_fput:fput (file); error:cachefiles_do_unmark_inode_in_use (object,d_inode (dentry)); -dput (dentry);return false; }
@@ -654,7 +651,9 @@ bool cachefiles_look_up_object(struct ca goto new_file; } -if (!cachefiles_open_file (object, dentry)) + ret =cachefiles_open_file (object, dentry); +dput (dentry); +if (!ret)return false;_leave (" = t [%lu]" ,file_inode (object->file)->i_ino);
Greg Kroah-Hartman
maintainerPATCH 412/482 ACPI: video: Add backlight=native quirk for Dell OptiPlex 5480 AIO
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit ac78288fe062b64e45a479eaae74aaaafcc8ecdd upstream.
Dell All In One (AIO) models released after 2017 may use a backlight controller board connected to an UART.
In DSDT this uart port will be defined as:
Name (_HID, "DELL0501")
Name (_CID, EisaId ("PNP0501")
The Dell OptiPlex 5480 AIO has an ACPI device for one of its UARTs with the above _HID + _CID. Loading the dell-uart-backlight driver fails with the following errors:
[ 18.261353] dell_uart_backlight serial0-0: Timed out waiting for response. [ 18.261356] dell_uart_backlight serial0-0: error -ETIMEDOUT: getting firmware version [ 18.261359] dell_uart_backlight serial0-0: probe with driver dell_uart_backlight failed with error -110
Indicating that there is no backlight controller board attached to the UART, while the GPU's native backlight control method does work.
Add a quirk to use the GPU's native backlight control method on this model.
--- drivers/acpi/video_detect.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/acpi/video_detect.c +9 -0
@@ -845,6 +845,15 @@ static const struct dmi_system_id video_* which need native backlight control nevertheless. */ { +/* https://github.com/zabbly/linux/issues/26 */ + .callback = video_detect_force_native, + /* Dell OptiPlex 5480 AIO */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 5480 AIO"), + }, + }, + {/* https://bugzilla.redhat.com/show_bug.cgi?id=2303936 */ .callback = video_detect_force_native,/* Dell OptiPlex 7760 AIO */
Greg Kroah-Hartman
maintainerPATCH 413/482 ACPI: resource: Remove duplicate Asus E1504GAB IRQ override
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 65bdebf38e5fac7c56a9e05d3479a707e6dc783c upstream.
Commit d2aaf1996504 ("ACPI: resource: Add DMI quirks for ASUS Vivobook E1504GA and E1504GAB") does exactly what the subject says, adding DMI matches for both the E1504GA and E1504GAB.
But DMI_MATCH() does a substring match, so checking for E1504GA will also match E1504GAB.
Drop the unnecessary E1504GAB entry since that is covered already by the E1504GA entry.
--- drivers/acpi/resource.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/acpi/resource.c +1 -8
@@ -511,19 +511,12 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = { }, }, { -/* Asus Vivobook E1504GA */ +/* Asus Vivobook E1504GA* */ .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), DMI_MATCH(DMI_BOARD_NAME, "E1504GA"), }, }, - { -/* Asus Vivobook E1504GAB */ - .matches = { -DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), - DMI_MATCH(DMI_BOARD_NAME, "E1504GAB"), - }, - }, {/* Asus Vivobook Pro N6506MV */ .matches = {
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 414/482 ACPI: resource: Loosen the Asus E1404GAB DMI match to also cover the E1404GA
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 63539defee17bf0cbd8e24078cf103efee9c6633 upstream.
Like other Asus Vivobooks, the Asus Vivobook Go E1404GA has a DSDT describing IRQ 1 as ActiveLow, while the kernel overrides to Edge_High.
$ sudo dmesg | grep DMI:.*BIOS
[ 0.000000] DMI: ASUSTeK COMPUTER INC. Vivobook Go E1404GA_E1404GA/E1404GA, BIOS E1404GA.302 08/23/2023
$ sudo cp /sys/firmware/acpi/tables/DSDT dsdt.dat
$ iasl -d dsdt.dat
$ grep -A 30 PS2K dsdt.dsl | grep IRQ -A 1
IRQ (Level, ActiveLow, Exclusive, )
{1}There already is an entry in the irq1_level_low_skip_override[] DMI match table for the "E1404GAB", change this to match on "E1404GA" to cover the E1404GA model as well (DMI_MATCH() does a substring match).
--- drivers/acpi/resource.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/acpi/resource.c +2 -2
@@ -504,10 +504,10 @@ static const struct dmi_system_id irq1_l }, }, { -/* Asus Vivobook Go E1404GAB */ +/* Asus Vivobook Go E1404GA* */ .matches = {DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), - DMI_MATCH(DMI_BOARD_NAME, "E1404GAB"), + DMI_MATCH(DMI_BOARD_NAME, "E1404GA"), }, }, {
Greg Kroah-Hartman
maintainerPATCH 415/482 ACPI: resource: Add Asus Vivobook X1704VAP to irq1_level_low_skip_override[]
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 2f80ce0b78c340e332f04a5801dee5e4ac8cfaeb upstream.
Like other Asus Vivobook models the X1704VAP has its keybopard IRQ (1) described as ActiveLow in the DSDT, which the kernel overrides to EdgeHigh which breaks the keyboard.
Add the X1704VAP to the irq1_level_low_skip_override[] quirk table to fix this.
--- drivers/acpi/resource.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/acpi/resource.c +7 -0
@@ -441,6 +441,13 @@ static const struct dmi_system_id irq1_l }, }, { +/* Asus Vivobook X1704VAP */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), + DMI_MATCH(DMI_BOARD_NAME, "X1704VAP"), + }, + }, + {/* Asus ExpertBook B1402CBA */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
Greg Kroah-Hartman
maintainerPATCH 416/482 ACPI: resource: Add Asus ExpertBook B2502CVA to irq1_level_low_skip_override[]
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 056301e7c7c886f96d799edd36f3406cc30e1822 upstream.
Like other Asus ExpertBook models the B2502CVA has its keybopard IRQ (1) described as ActiveLow in the DSDT, which the kernel overrides to EdgeHigh which breaks the keyboard.
Add the B2502CVA to the irq1_level_low_skip_override[] quirk table to fix this.
--- drivers/acpi/resource.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/acpi/resource.c +7 -0
@@ -511,6 +511,13 @@ static const struct dmi_system_id irq1_l }, }, { +/* Asus ExpertBook B2502CVA */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), + DMI_MATCH(DMI_BOARD_NAME, "B2502CVA"), + }, + }, + {/* Asus Vivobook Go E1404GA* */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
Greg Kroah-Hartman
maintainerPATCH 417/482 btrfs: fix a NULL pointer dereference when failed to start a new trasacntion
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qu Wenruo <[email protected]>
commit c3b47f49e83197e8dffd023ec568403bcdbb774b upstream.
[BUG]
Syzbot reported a NULL pointer dereference with the following crash:
FAULT_INJECTION: forcing a failure.
start_transaction+0x830/0x1670 fs/btrfs/transaction.c:676 prepare_to_relocate+0x31f/0x4c0 fs/btrfs/relocation.c:3642 relocate_block_group+0x169/0xd20 fs/btrfs/relocation.c:3678 ... BTRFS info (device loop0): balance: ended with status: -12 Oops: general protection fault, probably for non-canonical address 0xdffffc00000000cc: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000660-0x0000000000000667] RIP: 0010:btrfs_update_reloc_root+0x362/0xa80 fs/btrfs/relocation.c:926 Call Trace: <TASK> commit_fs_roots+0x2ee/0x720 fs/btrfs/transaction.c:1496 btrfs_commit_transaction+0xfaf/0x3740 fs/btrfs/transaction.c:2430 del_balance_item fs/btrfs/volumes.c:3678 [inline] reset_balance_state+0x25e/0x3c0 fs/btrfs/volumes.c:3742 btrfs_balance+0xead/0x10c0 fs/btrfs/volumes.c:4574 btrfs_ioctl_balance+0x493/0x7c0 fs/btrfs/ioctl.c:3673 vfs_ioctl fs/ioctl.c:51 [inline] __do_sys_ioctl fs/ioctl.c:907 [inline] __se_sys_ioctl+0xf9/0x170 fs/ioctl.c:893 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f
[CAUSE]
The allocation failure happens at the start_transaction() inside prepare_to_relocate(), and during the error handling we call unset_reloc_control(), which makes fs_info->balance_ctl to be NULL.
Then we continue the error path cleanup in btrfs_balance() by calling reset_balance_state() which will call del_balance_item() to fully delete the balance item in the root tree.
However during the small window between set_reloc_contrl() and unset_reloc_control(), we can have a subvolume tree update and created a reloc_root for that subvolume.
Then we go into the final btrfs_commit_transaction() of del_balance_item(), and into btrfs_update_reloc_root() inside commit_fs_roots().
That function checks if fs_info->reloc_ctl is in the merge_reloc_tree stage, but since fs_info->reloc_ctl is NULL, it results a NULL pointer dereference.
[FIX]
Just add extra check on fs_info->reloc_ctl insidebtrfs_update_reloc_root(), before checkingfs_info->reloc_ctl->merge_reloc_tree.
That DEAD_RELOC_TREE handling is to prevent further modification to the reloc tree during merge stage, but since there is no reloc_ctl at all, we do not need to bother that.
--- fs/btrfs/relocation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/relocation.c +1 -1
@@ -922,7 +922,7 @@ int btrfs_update_reloc_root(struct btrfsbtrfs_grab_root (reloc_root);/* root->reloc_root will stay until current relocation finished */ -if (fs_info->reloc_ctl->merge_reloc_tree && +if (fs_info->reloc_ctl && fs_info->reloc_ctl->merge_reloc_tree &&btrfs_root_refs (root_item) ==0 ) {set_bit (BTRFS_ROOT_DEAD_RELOC_TREE , &root->state);/*
Greg Kroah-Hartman
maintainerPATCH 418/482 btrfs: drop the backref cache during relocation if we commit
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <[email protected]>
commit db7e68b522c01eb666cfe1f31637775f18997811 upstream.
Since the inception of relocation we have maintained the backref cache across transaction commits, updating the backref cache with the new bytenr whenever we COWed blocks that were in the cache, and then updating their bytenr once we detected a transaction id change.
This works as long as we're only ever modifying blocks, not changing the structure of the tree.
However relocation does in fact change the structure of the tree. For example, if we are relocating a data extent, we will look up all the leaves that point to this data extent. We will then call do_relocation() on each of these leaves, which will COW down to the leaf and then update the file extent location.
But, a key feature of do_relocation() is the pending list. This is all the pending nodes that we modified when we updated the file extent item. We will then process all of these blocks via finish_pending_nodes, which calls do_relocation() on all of the nodes that led up to that leaf.
The purpose of this is to make sure we don't break sharing unless we absolutely have to. Consider the case that we have 3 snapshots that all point to this leaf through the same nodes, the initial COW would have created a whole new path. If we did this for all 3 snapshots we would end up with 3x the number of nodes we had originally. To avoid this we will cycle through each of the snapshots that point to each of these nodes and update their pointers to point at the new nodes.
Once we update the pointer to the new node we will drop the node we removed the link for and all of its children via btrfs_drop_subtree(). This is essentially just btrfs_drop_snapshot(), but for an arbitrary point in the snapshot.
The problem with this is that we will never reflect this in the backref cache. If we do this btrfs_drop_snapshot() for a node that is in the backref tree, we will leave the node in the backref tree. This becomes a problem when we change the transid, as now the backref cache has entire subtrees that no longer exist, but exist as if they still are pointed to by the same roots.
In the best case scenario you end up with "adding refs to an existing tree ref" errors from insert_inline_extent_backref(), where we attempt to link in nodes on roots that are no longer valid.
Worst case you will double free some random block and re-use it when there's still references to the block.
This is extremely subtle, and the consequences are quite bad. There isn't a way to make sure our backref cache is consistent between transid's.
In order to fix this we need to simply evict the entire backref cache anytime we cross transid's. This reduces performance in that we have to rebuild this backref cache every time we change transid's, but fixes the bug.
This has existed since relocation was added, and is a pretty critical bug. There's a lot more cleanup that can be done now that this functionality is going away, but this patch is as small as possible in order to fix the problem and make it easy for us to backport it to all the kernels it needs to be backported to.
Followup series will dismantle more of this code and simplify relocation drastically to remove this functionality.
We have a reproducer that reproduced the corruption within a few minutes of running. With this patch it survives several iterations/hours of running the reproducer.
--- fs/btrfs/backref.c | 12 +++++--- fs/btrfs/relocation.c | 75 ++------------------------------------------------ 2 files changed, 11 insertions(+), 76 deletions(-)
fs/btrfs/backref.c +8 -4
@@ -3179,10 +3179,14 @@ void btrfs_backref_release_cache(structbtrfs_backref_cleanup_node (cache, node); } - cache->last_trans =0 ; - -for (i =0 ; i <BTRFS_MAX_LEVEL ; i++) -ASSERT (list_empty (&cache->pending[i])); +for (i =0 ; i <BTRFS_MAX_LEVEL ; i++) { +while (!list_empty (&cache->pending[i])) { + node =list_first_entry (&cache->pending[i], + struct btrfs_backref_node, + list); +btrfs_backref_cleanup_node (cache, node); + } + }ASSERT (list_empty (&cache->pending_edge));ASSERT (list_empty (&cache->useless_node));ASSERT (list_empty (&cache->changed));
fs/btrfs/relocation.c +3 -72
93 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 419/482 btrfs: send: fix invalid clone operation for file that got its size decreased
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit fa630df665aa9ddce3a96ce7b54e10a38e4d2a2b upstream.
During an incremental send we may end up sending an invalid clone operation, for the last extent of a file which ends at an unaligned offset that matches the final i_size of the file in the send snapshot, in case the file had its initial size (the size in the parent snapshot) decreased in the send snapshot. In this case the destination will fail to apply the clone operation because its end offset is not sector size aligned and it ends before the current size of the file.
Sending the truncate operation always happens when we finish processing an inode, after we process all its extents (and xattrs, names, etc). So fix this by ensuring the file has a valid size before we send a clone operation for an unaligned extent that ends at the final i_size of the file. The size we truncate to matches the start offset of the clone range but it could be any value between that start offset and the final size of the file since the clone operation will expand the i_size if the current size is smaller than the end offset. The start offset of the range was chosen because it's always sector size aligned and avoids a truncation into the middle of a page, which results in dirtying the page due to filling part of it with zeroes and then making the clone operation at the receiver trigger IO.
The following test reproduces the issue:
$ cat test.sh #!/bin/bash
DEV=/dev/sdi
MNT=/mnt/sdi
mkfs.btrfs -f $DEV
mount $DEV $MNT
# Create a file with a size of 256K + 5 bytes, having two extents, one
# with a size of 128K and another one with a size of 128K + 5 bytes.
last_ext_size=$((128 * 1024 + 5))
xfs_io -f -d -c "pwrite -S 0xab -b 128K 0 128K" \
-c "pwrite -S 0xcd -b $last_ext_size 128K $last_ext_size" \
$MNT/foo# Another file which we will later clone foo into, but initially with
# a larger size than foo. xfs_io -f -c "pwrite -S 0xef 0 1M" $MNT/bar
btrfs subvolume snapshot -r $MNT/ $MNT/snap1
# Now resize bar and clone foo into it.
xfs_io -c "truncate 0" \
-c "reflink $MNT/foo" $MNT/barbtrfs subvolume snapshot -r $MNT/ $MNT/snap2
rm -f /tmp/send-full /tmp/send-inc
btrfs send -f /tmp/send-full $MNT/snap1 btrfs send -p $MNT/snap1 -f /tmp/send-inc $MNT/snap2
umount $MNT
mkfs.btrfs -f $DEV
mount $DEV $MNT
btrfs receive -f /tmp/send-full $MNT
btrfs receive -f /tmp/send-inc $MNT
umount $MNT
Running it before this patch:
$ ./test.sh (...) At subvol snap1 At snapshot snap2 ERROR: failed to clone extents to bar: Invalid argument
A test case for fstests will be sent soon.
--- fs/btrfs/send.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
fs/btrfs/send.c +22 -1
@@ -6188,8 +6188,29 @@ static int send_write_or_clone(struct seif (ret <0 )return ret; -if (clone_root->offset + num_bytes == info.size) +if (clone_root->offset + num_bytes == info.size) { +/* +* The final size of our file matches the end offset, but it may +* be that its current size is larger, so we have to truncate it +* to any value between the start offset of the range and the +* final i_size, otherwise the clone operation is invalid +* because it's unaligned and it ends before the current EOF. +* We do this truncate to the final i_size when we finish +* processing the inode, but it's too late by then. And here we +* truncate to the start offset of the range because it's always +* sector size aligned while if it were the final i_size it +* would result in dirtying part of a page, filling part of a +* page with zeroes and then having the clone operation at the +* receiver trigger IO and wait for it due to the dirty page. +*/ +if (sctx->parent_root !=NULL ) { + ret =send_truncate (sctx, sctx->cur_ino, + sctx->cur_inode_gen, offset); +if (ret <0 ) +return ret; + } goto clone_data; + } write_data: ret =send_extent_data (sctx, path, offset, num_bytes);
Greg Kroah-Hartman
maintainerPATCH 420/482 btrfs: wait for fixup workers before stopping cleaner kthread during umount
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Filipe Manana <[email protected]>
commit 41fd1e94066a815a7ab0a7025359e9b40e4b3576 upstream.
During unmount, at close_ctree(), we have the following steps in this order:
1) Park the cleaner kthread - this doesn't destroy the kthread, it basically halts its execution (wake ups against it work but do nothing);
2) We stop the cleaner kthread - this results in freeing the respective struct task_struct;
3) We call btrfs_stop_all_workers() which waits for any jobs running in all the work queues and then free the work queues.
Syzbot reported a case where a fixup worker resulted in a crash when doing a delayed iput on its inode while attempting to wake up the cleaner at btrfs_add_delayed_iput(), because the task_struct of the cleaner kthread was already freed. This can happen during unmount because we don't wait for any fixup workers still running before we call kthread_stop() against the cleaner kthread, which stops and free all its resources.
Fix this by waiting for any fixup workers at close_ctree() before we call kthread_stop() against the cleaner and run pending delayed iputs.
The stack traces reported by syzbot were the following:
BUG: KASAN: slab-use-after-free in __lock_acquire+0x77/0x2050 kernel/locking/lockdep.c:5065
Read of size 8 at addr ffff8880272a8a18 by task kworker/u8:3/52
CPU: 1 UID: 0 PID: 52 Comm: kworker/u8:3 Not tainted 6.12.0-rc1-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024
Workqueue: btrfs-fixup btrfs_work_helper
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:94 [inline]
dump_stack_lvl+0x241/0x360 lib/dump_stack.c:120
print_address_description mm/kasan/report.c:377 [inline]
print_report+0x169/0x550 mm/kasan/report.c:488
kasan_report+0x143/0x180 mm/kasan/report.c:601
__lock_acquire+0x77/0x2050 kernel/locking/lockdep.c:5065
lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5825
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
class_raw_spinlock_irqsave_constructor include/linux/spinlock.h:551 [inline]
try_to_wake_up+0xb0/0x1480 kernel/sched/core.c:4154
btrfs_writepage_fixup_worker+0xc16/0xdf0 fs/btrfs/inode.c:2842
btrfs_work_helper+0x390/0xc50 fs/btrfs/async-thread.c:314
process_one_work kernel/workqueue.c:3229 [inline]
process_scheduled_works+0xa63/0x1850 kernel/workqueue.c:3310
worker_thread+0x870/0xd30 kernel/workqueue.c:3391
kthread+0x2f0/0x390 kernel/kthread.c:389
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
</TASK>
Allocated by task 2:
kasan_save_stack mm/kasan/common.c:47 [inline]
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
unpoison_slab_object mm/kasan/common.c:319 [inline]
__kasan_slab_alloc+0x66/0x80 mm/kasan/common.c:345
kasan_slab_alloc include/linux/kasan.h:247 [inline]
slab_post_alloc_hook mm/slub.c:4086 [inline]
slab_alloc_node mm/slub.c:4135 [inline]
kmem_cache_alloc_node_noprof+0x16b/0x320 mm/slub.c:4187
alloc_task_struct_node kernel/fork.c:180 [inline]
dup_task_struct+0x57/0x8c0 kernel/fork.c:1107
copy_process+0x5d1/0x3d50 kernel/fork.c:2206
kernel_clone+0x223/0x880 kernel/fork.c:2787
kernel_thread+0x1bc/0x240 kernel/fork.c:2849
create_kthread kernel/kthread.c:412 [inline]
kthreadd+0x60d/0x810 kernel/kthread.c:765
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
Freed by task 61:
kasan_save_stack mm/kasan/common.c:47 [inline]
kasan_save_track+0x3f/0x80 mm/kasan/common.c:68
kasan_save_free_info+0x40/0x50 mm/kasan/generic.c:579
poison_slab_object mm/kasan/common.c:247 [inline]
__kasan_slab_free+0x59/0x70 mm/kasan/common.c:264
kasan_slab_free include/linux/kasan.h:230 [inline]
slab_free_hook mm/slub.c:2343 [inline]
slab_free mm/slub.c:4580 [inline]
kmem_cache_free+0x1a2/0x420 mm/slub.c:4682
put_task_struct include/linux/sched/task.h:144 [inline]
delayed_put_task_struct+0x125/0x300 kernel/exit.c:228
rcu_do_batch kernel/rcu/tree.c:2567 [inline]
rcu_core+0xaaa/0x17a0 kernel/rcu/tree.c:2823
handle_softirqs+0x2c5/0x980 kernel/softirq.c:554
__do_softirq kernel/softirq.c:588 [inline]
invoke_softirq kernel/softirq.c:428 [inline]
__irq_exit_rcu+0xf4/0x1c0 kernel/softirq.c:637
irq_exit_rcu+0x9/0x30 kernel/softirq.c:649
instr_sysvec_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1037 [inline]
sysvec_apic_timer_interrupt+0xa6/0xc0 arch/x86/kernel/apic/apic.c:1037
asm_sysvec_apic_timer_interrupt+0x1a/0x20 arch/x86/include/asm/idtentry.h:702
Last potentially related work creation:
kasan_save_stack+0x3f/0x60 mm/kasan/common.c:47
__kasan_record_aux_stack+0xac/0xc0 mm/kasan/generic.c:541
__call_rcu_common kernel/rcu/tree.c:3086 [inline]
call_rcu+0x167/0xa70 kernel/rcu/tree.c:3190
context_switch kernel/sched/core.c:5318 [inline]
__schedule+0x184b/0x4ae0 kernel/sched/core.c:6675
schedule_idle+0x56/0x90 kernel/sched/core.c:6793
do_idle+0x56a/0x5d0 kernel/sched/idle.c:354
cpu_startup_entry+0x42/0x60 kernel/sched/idle.c:424
start_secondary+0x102/0x110 arch/x86/kernel/smpboot.c:314
common_startup_64+0x13e/0x147
The buggy address belongs to the object at ffff8880272a8000
which belongs to the cache task_struct of size 7424
The buggy address is located 2584 bytes inside of
freed 7424-byte region [ffff8880272a8000, ffff8880272a9d00)
The buggy address belongs to the physical page:
page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x272a8
head: order:3 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0
flags: 0xfff00000000040(head|node=0|zone=1|lastcpupid=0x7ff)
page_type: f5(slab)
raw: 00fff00000000040 ffff88801bafa500 dead000000000122 0000000000000000
raw: 0000000000000000 0000000080040004 00000001f5000000 0000000000000000
head: 00fff00000000040 ffff88801bafa500 dead000000000122 0000000000000000
head: 0000000000000000 0000000080040004 00000001f5000000 0000000000000000
head: 00fff00000000003 ffffea00009caa01 ffffffffffffffff 0000000000000000
head: 0000000000000008 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected
page_owner tracks the page as allocated
page last allocated via order 3, migratetype Unmovable, gfp_mask 0xd20c0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC), pid 2, tgid 2 (kthreadd), ts 71247381401, free_ts 71214998153
set_page_owner include/linux/page_owner.h:32 [inline]
post_alloc_hook+0x1f3/0x230 mm/page_alloc.c:1537
prep_new_page mm/page_alloc.c:1545 [inline]
get_page_from_freelist+0x3039/0x3180 mm/page_alloc.c:3457
__alloc_pages_noprof+0x256/0x6c0 mm/page_alloc.c:4733
alloc_pages_mpol_noprof+0x3e8/0x680 mm/mempolicy.c:2265
alloc_slab_page+0x6a/0x120 mm/slub.c:2413
allocate_slab+0x5a/0x2f0 mm/slub.c:2579
new_slab mm/slub.c:2632 [inline]
___slab_alloc+0xcd1/0x14b0 mm/slub.c:3819
__slab_alloc+0x58/0xa0 mm/slub.c:3909
__slab_alloc_node mm/slub.c:3962 [inline]
slab_alloc_node mm/slub.c:4123 [inline]
kmem_cache_alloc_node_noprof+0x1fe/0x320 mm/slub.c:4187
alloc_task_struct_node kernel/fork.c:180 [inline]
dup_task_struct+0x57/0x8c0 kernel/fork.c:1107
copy_process+0x5d1/0x3d50 kernel/fork.c:2206
kernel_clone+0x223/0x880 kernel/fork.c:2787
kernel_thread+0x1bc/0x240 kernel/fork.c:2849
create_kthread kernel/kthread.c:412 [inline]
kthreadd+0x60d/0x810 kernel/kthread.c:765
ret_from_fork+0x4b/0x80 arch/x86/kernel/process.c:147
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
page last free pid 5230 tgid 5230 stack trace:
reset_page_owner include/linux/page_owner.h:25 [inline]
free_pages_prepare mm/page_alloc.c:1108 [inline]
free_unref_page+0xcd0/0xf00 mm/page_alloc.c:2638
discard_slab mm/slub.c:2678 [inline]
__put_partials+0xeb/0x130 mm/slub.c:3146
put_cpu_partial+0x17c/0x250 mm/slub.c:3221
__slab_free+0x2ea/0x3d0 mm/slub.c:4450
qlink_free mm/kasan/quarantine.c:163 [inline]
qlist_free_all+0x9a/0x140 mm/kasan/quarantine.c:179
kasan_quarantine_reduce+0x14f/0x170 mm/kasan/quarantine.c:286
__kasan_slab_alloc+0x23/0x80 mm/kasan/common.c:329
kasan_slab_alloc include/linux/kasan.h:247 [inline]
slab_post_alloc_hook mm/slub.c:4086 [inline]
slab_alloc_node mm/slub.c:4135 [inline]
kmem_cache_alloc_noprof+0x135/0x2a0 mm/slub.c:4142
getname_flags+0xb7/0x540 fs/namei.c:139
do_sys_openat2+0xd2/0x1d0 fs/open.c:1409
do_sys_open fs/open.c:1430 [inline]
__do_sys_openat fs/open.c:1446 [inline]
__se_sys_openat fs/open.c:1441 [inline]
__x64_sys_openat+0x247/0x2a0 fs/open.c:1441
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x77/0x7f
Memory state around the buggy address:
ffff8880272a8900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8880272a8980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff8880272a8a00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8880272a8a80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8880272a8b00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================--- fs/btrfs/disk-io.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
fs/btrfs/disk-io.c +11 -0
@@ -4272,6 +4272,17 @@ void __cold close_ctree(struct btrfs_fs_btrfs_cleanup_defrag_inodes (fs_info);/* +* Wait for any fixup workers to complete. +* If we don't wait for them here and they are still running by the time +* we call kthread_stop() against the cleaner kthread further below, we +* get an use-after-free on the cleaner because the fixup worker adds an +* inode to the list of delayed iputs and then attempts to wakeup the +* cleaner kthread, which was already stopped and destroyed. We parked +* already the cleaner, but below we run all pending delayed iputs. +*/ +btrfs_flush_workqueue (fs_info->fixup_workers); + +/* * After we parked the cleaner kthread, ordered extents may have * completed and created new delayed iputs. If one of the async reclaim * tasks is running and in the RUN_DELAYED_IPUTS flush state, then we
Greg Kroah-Hartman
maintainerPATCH 421/482 cpufreq: Avoid a bad reference count on CPU node
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Sabaté Solà <[email protected]>
commit c0f02536fffbbec71aced36d52a765f8c4493dc2 upstream.
In the parse_perf_domain function, if the call to of_parse_phandle_with_args returns an error, then the reference to the CPU device node that was acquired at the start of the function would not be properly decremented.
Address this by declaring the variable with the __free(device_node) cleanup attribute.
--- include/linux/cpufreq.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
include/linux/cpufreq.h +1 -5
@@ -1113,10 +1113,9 @@ static inline int parse_perf_domain(intconst char *cell_name, struct of_phandle_args *args) { - struct device_node *cpu_np; int ret; - cpu_np =of_cpu_device_node_get (cpu); + struct device_node *cpu_np __free(device_node) = of_cpu_device_node_get(cpu);if (!cpu_np)return -ENODEV ;
@@ -1124,9 +1123,6 @@ static inline int parse_perf_domain(int args);if (ret <0 )return ret; - -of_node_put (cpu_np); -return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 422/482 gpio: davinci: fix lazy disable
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emanuele Ghidoli <[email protected]>
commit 3360d41f4ac490282fddc3ccc0b58679aa5c065d upstream.
On a few platforms such as TI's AM69 device, disable_irq() fails to keep track of the interrupts that happen between disable_irq() and enable_irq() and those interrupts are missed. Use the ->irq_unmask() and ->irq_mask() methods instead of ->irq_enable() and ->irq_disable() to correctly keep track of edges when disable_irq is called.
This solves the issue of disable_irq() not working as expected on such platforms.
--- drivers/gpio/gpio-davinci.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpio/gpio-davinci.c +4 -4
@@ -289,7 +289,7 @@ static int davinci_gpio_probe(struct pla* serve as EDMA event triggers. */ -static void gpio_irq_disable (struct irq_data *d) +static void gpio_irq_mask (struct irq_data *d) {struct davinci_gpio_regs __iomem *g =irq2regs (d);uintptr_t mask = (uintptr_t )irq_data_get_irq_handler_data (d);
@@ -298,7 +298,7 @@ static void gpio_irq_disable(struct irq_writel_relaxed (mask, &g->clr_rising); } -static void gpio_irq_enable (struct irq_data *d) +static void gpio_irq_unmask (struct irq_data *d) {struct davinci_gpio_regs __iomem *g =irq2regs (d);uintptr_t mask = (uintptr_t )irq_data_get_irq_handler_data (d);
@@ -324,8 +324,8 @@ static int gpio_irq_type(struct irq_datastatic struct irq_chip gpio_irqchip = { .name ="GPIO" , - .irq_enable = gpio_irq_enable, - .irq_disable = gpio_irq_disable, + .irq_unmask = gpio_irq_unmask, + .irq_mask = gpio_irq_mask, .irq_set_type = gpio_irq_type, .flags =IRQCHIP_SET_TYPE_MASKED |IRQCHIP_SKIP_SET_WAKE , };
Greg Kroah-Hartman
maintainerPATCH 423/482 net: pcs: xpcs: fix the wrong register that was written back
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiawen Wu <[email protected]>
commit 93ef6ee5c20e9330477930ec6347672c9e0cf5a6 upstream.
The value is read from the register TXGBE_RX_GEN_CTL3, and it should be written back to TXGBE_RX_GEN_CTL3 when it changes some fields.
--- drivers/net/pcs/pcs-xpcs-wx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/pcs/pcs-xpcs-wx.c +1 -1
@@ -109,7 +109,7 @@ static void txgbe_pma_config_1g(struct dtxgbe_write_pma (xpcs,TXGBE_DFE_TAP_CTL0 ,0 ); val =txgbe_read_pma (xpcs,TXGBE_RX_GEN_CTL3 ); val =u16_replace_bits (val,0x4 ,TXGBE_RX_GEN_CTL3_LOS_TRSHLD0 ); -txgbe_write_pma (xpcs,TXGBE_RX_EQ_ATTN_CTL , val); +txgbe_write_pma (xpcs,TXGBE_RX_GEN_CTL3 , val);txgbe_write_pma (xpcs,TXGBE_MPLLA_CTL0 ,0x20 );txgbe_write_pma (xpcs,TXGBE_MPLLA_CTL3 ,0x46 );
Greg Kroah-Hartman
maintainerPATCH 424/482 Bluetooth: hci_event: Align BR/EDR JUST_WORKS paring with LE
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luiz Augusto von Dentz <[email protected]>
commit b25e11f978b63cb7857890edb3a698599cddb10e upstream.
This aligned BR/EDR JUST_WORKS method with LE which since 92516cd97fd4 ("Bluetooth: Always request for user confirmation for Just Works") always request user confirmation with confirm_hint set since the likes of bluetoothd have dedicated policy around JUST_WORKS method (e.g. main.conf:JustWorksRepairing).
CVE: CVE-2024-8805
--- net/bluetooth/hci_event.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
net/bluetooth/hci_event.c +5 -8
@@ -5325,19 +5325,16 @@ static void hci_user_confirm_request_evt goto unlock; } -/* If no side requires MITM protection; auto-accept */ +/* If no side requires MITM protection; use JUST_CFM method */ if ((!loc_mitm || conn->remote_cap ==HCI_IO_NO_INPUT_OUTPUT ) && (!rem_mitm || conn->io_capability ==HCI_IO_NO_INPUT_OUTPUT )) { -/* If we're not the initiators request authorization to -* proceed from user space (mgmt_user_confirm with -* confirm_hint set to 1). The exception is if neither -* side had MITM or if the local IO capability is -* NoInputNoOutput, in which case we do auto-accept +/* If we're not the initiator of request authorization and the +* local IO capability is not NoInputNoOutput, use JUST_WORKS +* method (mgmt_user_confirm with confirm_hint set to 1). */ if (!test_bit (HCI_CONN_AUTH_PEND , &conn->flags) && - conn->io_capability !=HCI_IO_NO_INPUT_OUTPUT && - (loc_mitm || rem_mitm)) { + conn->io_capability !=HCI_IO_NO_INPUT_OUTPUT ) {bt_dev_dbg (hdev,"Confirming auto-accept as acceptor" ); confirm_hint =1 ; goto confirm;
Greg Kroah-Hartman
maintainerPATCH 425/482 mac802154: Fix potential RCU dereference issue in mac802154_scan_worker
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiawei Ye <[email protected]>
commit bff1709b3980bd7f80be6786f64cc9a9ee9e56da upstream.
In the mac802154_scan_worker function, the scan_req->type field was accessed after the RCU read-side critical section was unlocked. According to RCU usage rules, this is illegal and can lead to unpredictable behavior, such as accessing memory that has been updated or causing use-after-free issues.
This possible bug was identified using a static analysis tool developed by myself, specifically designed to detect RCU-related issues.
To address this, the scan_req->type value is now stored in a local variable scan_req_type while still within the RCU read-side critical section. The scan_req_type is then used after the RCU lock is released, ensuring that the type value is safely accessed without violating RCU rules.
--- net/mac802154/scan.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
net/mac802154/scan.c +3 -1
@@ -176,6 +176,7 @@ void mac802154_scan_worker(struct work_sstruct ieee802154_local *local = container_of(work, struct ieee802154_local, scan_work.work);struct cfg802154_scan_request *scan_req; +enum nl802154_scan_types scan_req_type;struct ieee802154_sub_if_data *sdata;unsigned int scan_duration =0 ;struct wpan_phy *wpan_phy;
@@ -209,6 +210,7 @@ void mac802154_scan_worker(struct work_s } wpan_phy = scan_req->wpan_phy; + scan_req_type = scan_req->type; scan_req_duration = scan_req->duration;/* Look for the next valid chan */
@@ -246,7 +248,7 @@ void mac802154_scan_worker(struct work_s goto end_scan; } -if (scan_req->type ==NL802154_SCAN_ACTIVE ) { +if (scan_req_type ==NL802154_SCAN_ACTIVE ) { ret =mac802154_transmit_beacon_req (local, sdata);if (ret) dev_err(&sdata->dev->dev,
Greg Kroah-Hartman
maintainerPATCH 426/482 io_uring/net: harden multishot termination case for recv
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Axboe <[email protected]>
commit c314094cb4cfa6fc5a17f4881ead2dfebfa717a7 upstream.
If the recv returns zero, or an error, then it doesn't matter if more data has already been received for this buffer. A condition like that should terminate the multishot receive. Rather than pass in the collected return value, pass in whether to terminate or keep the recv going separately.
Note that this isn't a bug right now, as the only way to get there is via setting MSG_WAITALL with multishot receive. And if an application does that, then -EINVAL is returned anyway. But it seems like an easy bug to introduce, so let's make it a bit more explicit.
--- io_uring/net.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
io_uring/net.c +3 -1
@@ -1116,6 +1116,7 @@ int io_recv(struct io_kiocb *req, unsignint ret, min_ret =0 ;bool force_nonblock = issue_flags &IO_URING_F_NONBLOCK ;size_t len = sr->len; +bool mshot_finished;if (!(req->flags &REQ_F_POLLED ) && (sr->flags &IORING_RECVSEND_POLL_FIRST ))
@@ -1170,6 +1171,7 @@ out_free:req_set_fail (req); } + mshot_finished = ret <=0 ;if (ret >0 ) ret += sr->done_io;else if (sr->done_io)
@@ -1177,7 +1179,7 @@ out_free:else io_kbuf_recycle (req, issue_flags); -if (!io_recv_finish (req, &ret, kmsg, ret <=0 , issue_flags)) +if (!io_recv_finish (req, &ret, kmsg, mshot_finished, issue_flags)) goto retry_multishot;return ret;
Greg Kroah-Hartman
maintainerPATCH 427/482 ceph: fix cap ref leak via netfs init_request
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrick Donnelly <[email protected]>
commit ccda9910d8490f4fb067131598e4b2e986faa5a0 upstream.
Log recovered from a user's cluster:
<7>[ 5413.970692] ceph: get_cap_refs 00000000958c114b ret 1 got Fr
<7>[ 5413.970695] ceph: start_read 00000000958c114b, no cache cap
...
<7>[ 5473.934609] ceph: my wanted = Fr, used = Fr, dirty -
<7>[ 5473.934616] ceph: revocation: pAsLsXsFr -> pAsLsXs (revoking Fr)
<7>[ 5473.934632] ceph: __ceph_caps_issued 00000000958c114b cap 00000000f7784259 issued pAsLsXs
<7>[ 5473.934638] ceph: check_caps 10000000e68.fffffffffffffffe file_want - used Fr dirty - flushing - issued pAsLsXs revoking Fr retain pAsLsXsFsr AUTHONLY NOINVAL FLUSH_FORCEThe MDS subsequently complains that the kernel client is late releasing caps.
Approximately, a series of changes to this code by commits 49870056005c ("ceph: convert ceph_readpages to ceph_readahead"), 2de160417315 ("netfs: Change ->init_request() to return an error code") and a5c9dc445139 ("ceph: Make ceph_init_request() check caps on readahead") resulted in subtle resource cleanup to be missed. The main culprit is the change in error handling in 2de160417315 which meant that a failure in init_request() would no longer cause cleanup to be called. That would prevent the ceph_put_cap_refs() call which would cleanup the leaked cap ref.
--- fs/ceph/addr.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/ceph/addr.c +4 -1
@@ -468,8 +468,11 @@ static int ceph_init_request(struct netf rreq->netfs_priv = priv; out: -if (ret <0 ) +if (ret <0 ) { +if (got) +ceph_put_cap_refs (ceph_inode (inode), got);kfree (priv); + }return ret; }
Greg Kroah-Hartman
maintainerPATCH 428/482 tracing/hwlat: Fix a race during cpuhp processing
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Li <[email protected]>
commit 2a13ca2e8abb12ee43ada8a107dadca83f140937 upstream.
The cpuhp online/offline processing race also exists in percpu-mode hwlat tracer in theory, apply the fix too. That is:
T1 | T2
[CPUHP_ONLINE] | cpu_device_down()
hwlat_hotplug_workfn() |
| cpus_write_lock()
| takedown_cpu(1)
| cpus_write_unlock()
[CPUHP_OFFLINE] |
cpus_read_lock() |
start_kthread(1) |
cpus_read_unlock() |--- kernel/trace/trace_hwlat.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace_hwlat.c +2 -0
@@ -520,6 +520,8 @@ static void hwlat_hotplug_workfn(structif (!hwlat_busy || hwlat_data.thread_mode !=MODE_PER_CPU ) goto out_unlock; +if (!cpu_online (cpu)) + goto out_unlock;if (!cpumask_test_cpu (cpu, tr->tracing_cpumask)) goto out_unlock;
Greg Kroah-Hartman
maintainerPATCH 429/482 tracing/timerlat: Drop interface_lock in stop_kthread()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Li <[email protected]>
commit b484a02c9cedf8703eff8f0756f94618004bd165 upstream.
stop_kthread() is the offline callback for "trace/osnoise:online", since commit 5bfbcd1ee57b ("tracing/timerlat: Add interface_lock around clearing of kthread in stop_kthread()"), the following ABBA deadlock scenario is introduced:
T1 | T2 [BP] | T3 [AP]
osnoise_hotplug_workfn() | work_for_cpu_fn() | cpuhp_thread_fun()
| _cpu_down() | osnoise_cpu_die()
mutex_lock(&interface_lock) | | stop_kthread()
| cpus_write_lock() | mutex_lock(&interface_lock)
cpus_read_lock() | cpuhp_kick_ap() |As the interface_lock here in just for protecting the "kthread" field of the osn_var, use xchg() instead to fix this issue. Also use for_each_online_cpu() back in stop_per_cpu_kthreads() as it can take cpu_read_lock() again.
--- kernel/trace/trace_osnoise.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
kernel/trace/trace_osnoise.c +6 -7
@@ -1953,12 +1953,8 @@ static void stop_kthread(unsigned int cp {struct task_struct *kthread; -mutex_lock (&interface_lock); - kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread; + kthread =xchg_relaxed (&(per_cpu (per_cpu_osnoise_var, cpu).kthread),NULL );if (kthread) { -per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; -mutex_unlock (&interface_lock); -if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask) && !WARN_ON (!test_bit (OSN_WORKLOAD , &osnoise_options))) {kthread_stop (kthread);
@@ -1972,7 +1968,6 @@ static void stop_kthread(unsigned int cpput_task_struct (kthread); } }else { -mutex_unlock (&interface_lock);/* if no workload, just return */ if (!test_bit (OSN_WORKLOAD , &osnoise_options)) {/*
@@ -1994,8 +1989,12 @@ static void stop_per_cpu_kthreads(void) {int cpu; -for_each_possible_cpu (cpu) +cpus_read_lock (); + +for_each_online_cpu (cpu)stop_kthread (cpu); + +cpus_read_unlock (); }/*
Greg Kroah-Hartman
maintainerPATCH 430/482 tracing/timerlat: Fix a race during cpuhp processing
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Li <[email protected]>
commit 829e0c9f0855f26b3ae830d17b24aec103f7e915 upstream.
There is another found exception that the "timerlat/1" thread was scheduled on CPU0, and lead to timer corruption finally:
``` ODEBUG: init active (active state 0) object: ffff888237c2e108 object type: hrtimer hint: timerlat_irq+0x0/0x220 WARNING: CPU: 0 PID: 426 at lib/debugobjects.c:518 debug_print_object+0x7d/0xb0 Modules linked in: CPU: 0 UID: 0 PID: 426 Comm: timerlat/1 Not tainted 6.11.0-rc7+ #45 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 RIP: 0010:debug_print_object+0x7d/0xb0 ... Call Trace: <TASK> ? __warn+0x7c/0x110 ? debug_print_object+0x7d/0xb0 ? report_bug+0xf1/0x1d0 ? prb_read_valid+0x17/0x20 ? handle_bug+0x3f/0x70 ? exc_invalid_op+0x13/0x60 ? asm_exc_invalid_op+0x16/0x20 ? debug_print_object+0x7d/0xb0 ? debug_print_object+0x7d/0xb0 ? __pfx_timerlat_irq+0x10/0x10 __debug_object_init+0x110/0x150 hrtimer_init+0x1d/0x60 timerlat_main+0xab/0x2d0 ? __pfx_timerlat_main+0x10/0x10 kthread+0xb7/0xe0 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x2d/0x40 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> ```
After tracing the scheduling event, it was discovered that the migration of the "timerlat/1" thread was performed during thread creation. Further analysis confirmed that it is because the CPU online processing for osnoise is implemented through workers, which is asynchronous with the offline processing. When the worker was scheduled to create a thread, the CPU may has already been removed from the cpu_online_mask during the offline process, resulting in the inability to select the right CPU:
T1 | T2
[CPUHP_ONLINE] | cpu_device_down()
osnoise_hotplug_workfn() |
| cpus_write_lock()
| takedown_cpu(1)
| cpus_write_unlock()
[CPUHP_OFFLINE] |
cpus_read_lock() |
start_kthread(1) |
cpus_read_unlock() |To fix this, skip online processing if the CPU is already offline.
--- kernel/trace/trace_osnoise.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace_osnoise.c +2 -0
@@ -2094,6 +2094,8 @@ static void osnoise_hotplug_workfn(strucmutex_lock (&interface_lock);cpus_read_lock (); +if (!cpu_online (cpu)) + goto out_unlock;if (!cpumask_test_cpu (cpu, &osnoise_cpumask)) goto out_unlock;
Greg Kroah-Hartman
maintainerPATCH 431/482 tracing/timerlat: Fix duplicated kthread creation due to CPU online/offline
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Li <[email protected]>
commit 0bb0a5c12ecf36ad561542bbb95f96355e036a02 upstream.
osnoise_hotplug_workfn() is the asynchronous online callback for "trace/osnoise:online". It may be congested when a CPU goes online and offline repeatedly and is invoked for multiple times after a certain online.
This will lead to kthread leak and timer corruption. Add a check in start_kthread() to prevent this situation.
--- kernel/trace/trace_osnoise.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/trace/trace_osnoise.c +5 -2
@@ -2006,6 +2006,10 @@ static int start_kthread(unsigned int cpvoid *main = osnoise_main;char comm[24 ]; +/* Do not start a new thread if it is already running */ +if (per_cpu (per_cpu_osnoise_var, cpu).kthread) +return 0 ; +if (timerlat_enabled ()) {snprintf (comm,24 ,"timerlat/%d" , cpu); main = timerlat_main;
@@ -2060,11 +2064,10 @@ static int start_per_cpu_kthreads(void)if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask)) {struct task_struct *kthread; - kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread; + kthread =xchg_relaxed (&(per_cpu (per_cpu_osnoise_var, cpu).kthread),NULL );if (!WARN_ON (!kthread))kthread_stop (kthread); } -per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; }for_each_cpu (cpu, current_mask) {
Greg Kroah-Hartman
maintainerPATCH 432/482 rtla: Fix the help text in osnoise and timerlat top tools
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eder Zulian <[email protected]>
commit 3d7b8ea7a8a20a45d019382c4dc6ed79e8bb95cf upstream.
The help text in osnoise top and timerlat top had some minor errors and omissions. The -d option was missing the 's' (second) abbreviation and the error message for '-d' used '-D'.
--- tools/tracing/rtla/src/osnoise_top.c | 2 +- tools/tracing/rtla/src/timerlat_top.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/tracing/rtla/src/osnoise_top.c +1 -1
@@ -434,7 +434,7 @@ struct osnoise_top_params *osnoise_top_pcase 'd' : params->duration =parse_seconds_duration (optarg);if (!params->duration) -osnoise_top_usage (params,"Invalid -D duration\n" ); +osnoise_top_usage (params,"Invalid -d duration\n" );break ;case 'e' : tevent =trace_event_alloc (optarg);
tools/tracing/rtla/src/timerlat_top.c +2 -2
@@ -459,7 +459,7 @@ static void timerlat_top_usage(char *usa" -c/--cpus cpus: run the tracer only on the given cpus" ," -H/--house-keeping cpus: run rtla control threads only on the given cpus" ," -C/--cgroup[=cgroup_name]: set cgroup, if no cgroup_name is passed, the rtla's cgroup will be inherited" , -" -d/--duration time[m|h|d]: duration of the session in seconds" , +" -d/--duration time[s|m|h|d]: duration of the session" ," -D/--debug: print debug info" ," --dump-tasks: prints the task running on all CPUs if stop conditions are met (depends on !--no-aa)" , " -t/--trace[file]: save the stopped trace to [file|timerlat_trace.txt]",
@@ -613,7 +613,7 @@ static struct timerlat_top_paramscase 'd' : params->duration =parse_seconds_duration (optarg);if (!params->duration) -timerlat_top_usage ("Invalid -D duration\n" ); +timerlat_top_usage ("Invalid -d duration\n" );break ;case 'e' : tevent =trace_event_alloc (optarg);
Greg Kroah-Hartman
maintainerPATCH 433/482 firmware/sysfb: Disable sysfb for firmware buffers with unknown parent
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
commit ad604f0a4c040dcb8faf44dc72db25e457c28076 upstream.
The sysfb framebuffer handling only operates on graphics devices that provide the system's firmware framebuffer. If that device is not known, assume that any graphics device has been initialized by firmware.
Fixes a problem on i915 where sysfb does not release the firmware framebuffer after the native graphics driver loaded.
--- drivers/firmware/sysfb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/firmware/sysfb.c +3 -1
@@ -67,9 +67,11 @@ static bool sysfb_unregister(void)void sysfb_disable (struct device *dev) {struct screen_info *si = &screen_info; +struct device *parent;mutex_lock (&disable_lock); -if (!dev || dev ==sysfb_parent_dev (si)) { + parent =sysfb_parent_dev (si); +if (!dev || !parent || dev == parent) {sysfb_unregister (); disabled = true; }
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 434/482 close_range(): fix the logics in descriptor table trimming
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 678379e1d4f7443b170939525d3312cfc37bf86b upstream.
Cloning a descriptor table picks the size that would cover all currently opened files. That's fine for clone() and unshare(), but for close_range() there's an additional twist - we clone before we close, and it would be a shame to have
close_range(3, ~0U, CLOSE_RANGE_UNSHARE)
leave us with a huge descriptor table when we are not going to keep anything past stderr, just because some large file descriptor used to be open before our call has taken it out.
Unfortunately, it had been dealt with in an inherently racy way - sane_fdtable_size() gets a "don't copy anything past that" argument (passed via unshare_fd() and dup_fd()), close_range() decides how much should be trimmed and passes that to unshare_fd().
The problem is, a range that used to extend to the end of descriptor table back when close_range() had looked at it might very well have stuff grown after it by the time dup_fd() has allocated a new files_struct and started to figure out the capacity of fdtable to be attached to that.
That leads to interesting pathological cases; at the very least it's a QoI issue, since unshare(CLONE_FILES) is atomic in a sense that it takes a snapshot of descriptor table one might have observed at some point. Since CLOSE_RANGE_UNSHARE close_range() is supposed to be a combination of unshare(CLONE_FILES) with plain close_range(), ending up with a weird state that would never occur with unshare(2) is confusing, to put it mildly.
It's not hard to get rid of - all it takes is passing both ends of the range down to sane_fdtable_size(). There we are under ->files_lock, so the race is trivially avoided.
So we do the following:
* switch close_files() from calling unshare_fd() to callingdup_fd().
* undo the calling convention change done to unshare_fd() in60997c3d45d9 "close_range: add CLOSE_RANGE_UNSHARE"
* introduce struct fd_range, pass a pointer to that to dup_fd()
and sane_fdtable_size() instead of "trim everything past that point" they are currently getting. NULL means "we are not going to be punching any holes"; NR_OPEN_MAX is gone.
* make sane_fdtable_size() use find_last_bit() instead of
open-coding it; it's easier to follow that way.
* while we are at it, have dup_fd() report errors by returningERR_PTR(), no need to use a separate int *errorp argument.
--- fs/file.c | 93 +++++++++++++++++------------------------------- include/linux/fdtable.h | 8 ++-- kernel/fork.c | 32 +++++++--------- 3 files changed, 51 insertions(+), 82 deletions(-)
fs/file.c +33 -60
@@ -272,59 +272,45 @@ static inline bool fd_is_open(unsigned ireturn test_bit (fd, fdt->open_fds); } -static unsigned int count_open_files (struct fdtable *fdt) -{ -unsigned int size = fdt->max_fds; -unsigned int i; - -/* Find the last open fd */ -for (i = size /BITS_PER_LONG ; i >0 ; ) { -if (fdt->open_fds[--i]) -break ; - } - i = (i +1 ) *BITS_PER_LONG ; -return i; -} -/* * Note that a sane fdtable size always has to be a multiple of * BITS_PER_LONG, since we have bitmaps that are sized by this. * -* 'max_fds' will normally already be properly aligned, but it -* turns out that in the close_range() -> __close_range() -> -* unshare_fd() -> dup_fd() -> sane_fdtable_size() we can end -* up having a 'max_fds' value that isn't already aligned. -* -* Rather than make close_range() have to worry about this, -* just make that BITS_PER_LONG alignment be part of a sane -* fdtable size. Becuase that's really what it is. +* punch_hole is optional - when close_range() is asked to unshare +* and close, we don't need to copy descriptors in that range, so +* a smaller cloned descriptor table might suffice if the last +* currently opened descriptor falls into that range. */ -static unsigned int sane_fdtable_size (struct fdtable *fdt,unsigned int max_fds) +static unsigned int sane_fdtable_size (struct fdtable *fdt,struct fd_range *punch_hole) { -unsigned int count; +unsigned int last =find_last_bit (fdt->open_fds, fdt->max_fds); - count =count_open_files (fdt); -if (max_fds <NR_OPEN_DEFAULT ) - max_fds =NR_OPEN_DEFAULT ; -return ALIGN (min (count, max_fds),BITS_PER_LONG ); +if (last == fdt->max_fds) +return NR_OPEN_DEFAULT ; +if (punch_hole && punch_hole->to >= last && punch_hole->from <= last) { + last =find_last_bit (fdt->open_fds, punch_hole->from); +if (last == punch_hole->from) +return NR_OPEN_DEFAULT ; + } +return ALIGN (last +1 ,BITS_PER_LONG ); }/* -* Allocate a new files structure and copy contents from the -* passed in files structure. -* errorp will be valid only when the returned files_struct is NULL. +* Allocate a new descriptor table and copy contents from the passed in +* instance. Returns a pointer to cloned table on success, ERR_PTR() +* on failure. For 'punch_hole' see sane_fdtable_size(). */ -struct files_struct *dup_fd (struct files_struct *oldf,unsigned int max_fds,int *errorp) +struct files_struct *dup_fd (struct files_struct *oldf,struct fd_range *punch_hole) {struct files_struct *newf;struct file **old_fds, **new_fds;unsigned int open_files, i;struct fdtable *old_fdt, *new_fdt; +int error; - *errorp = -ENOMEM ; newf =kmem_cache_alloc (files_cachep,GFP_KERNEL );if (!newf) - goto out; +return ERR_PTR (-ENOMEM );atomic_set (&newf->count,1 );
@@ -341,7 +327,7 @@ struct files_struct *dup_fd(struct filesspin_lock (&oldf->file_lock); old_fdt =files_fdtable (oldf); - open_files =sane_fdtable_size (old_fdt, max_fds); + open_files =sane_fdtable_size (old_fdt, punch_hole);/* * Check whether we need to allocate a larger fd array and fd set.
@@ -354,14 +340,14 @@ struct files_struct *dup_fd(struct files new_fdt =alloc_fdtable (open_files -1 );if (!new_fdt) { - *errorp = -ENOMEM ; + error = -ENOMEM ; goto out_release; }/* beyond sysctl_nr_open; nothing to do */ if (unlikely (new_fdt->max_fds < open_files)) {__free_fdtable (new_fdt); - *errorp = -EMFILE ; + error = -EMFILE ; goto out_release; }
@@ -372,7 +358,7 @@ struct files_struct *dup_fd(struct files*/ spin_lock (&oldf->file_lock); old_fdt =files_fdtable (oldf); - open_files =sane_fdtable_size (old_fdt, max_fds); + open_files =sane_fdtable_size (old_fdt, punch_hole); }copy_fd_bitmaps (new_fdt, old_fdt, open_files /BITS_PER_LONG );
@@ -406,8 +392,7 @@ struct files_struct *dup_fd(struct files out_release:kmem_cache_free (files_cachep, newf); -out: -return NULL ; +return ERR_PTR (error); }static struct fdtable *close_files (struct files_struct * files)
@@ -748,37 +733,25 @@ int __close_range(unsigned fd, unsignedif (fd > max_fd)return -EINVAL ; -if (flags &CLOSE_RANGE_UNSHARE ) { -int ret; -unsigned int max_unshare_fds =NR_OPEN_MAX ; +if ((flags &CLOSE_RANGE_UNSHARE ) &&atomic_read (&cur_fds->count) >1 ) { +struct fd_range range = {fd, max_fd}, *punch_hole = ⦥/* * If the caller requested all fds to be made cloexec we always * copy all of the file descriptors since they still want to * use them. */ -if (!(flags &CLOSE_RANGE_CLOEXEC )) { -/* -* If the requested range is greater than the current -* maximum, we're closing everything so only copy all -* file descriptors beneath the lowest file descriptor. -*/ -rcu_read_lock (); -if (max_fd >=last_fd (files_fdtable (cur_fds))) - max_unshare_fds = fd; -rcu_read_unlock (); - } - - ret =unshare_fd (CLONE_FILES , max_unshare_fds, &fds); -if (ret) -return ret; +if (flags &CLOSE_RANGE_CLOEXEC ) + punch_hole =NULL ; + fds =dup_fd (cur_fds, punch_hole); +if (IS_ERR (fds)) +return PTR_ERR (fds);/* * We used to share our file descriptor table, and have now * created a private one, make sure we're using it below. */ -if (fds) -swap (cur_fds, fds); +swap (cur_fds, fds); }if (flags &CLOSE_RANGE_CLOEXEC )
include/linux/fdtable.h +4 -4
@@ -22,7 +22,6 @@* as this is the granularity returned by copy_fdset(). */ #define NR_OPEN_DEFAULT BITS_PER_LONG -#define NR_OPEN_MAX ~0Ustruct fdtable {unsigned int max_fds;
@@ -106,7 +105,10 @@ struct task_struct;void put_files_struct (struct files_struct *fs);int unshare_files (void ); -struct files_struct *dup_fd (struct files_struct *,unsigned ,int *) __latent_entropy; +struct fd_range { +unsigned int from, to; +}; +struct files_struct *dup_fd (struct files_struct *,struct fd_range *) __latent_entropy;void do_close_on_exec (struct files_struct *); int iterate_fd(struct files_struct *, unsigned, int (*)(const void *, struct file *, unsigned),
@@ -115,8 +117,6 @@ int iterate_fd(struct files_struct *, unextern int close_fd (unsigned int fd);extern int __close_range (unsigned int fd,unsigned int max_fd,unsigned int flags);extern struct file *file_close_fd (unsigned int fd); -extern int unshare_fd (unsigned long unshare_flags,unsigned int max_fds, -struct files_struct **new_fdp);extern struct kmem_cache *files_cachep;
kernel/fork.c +14 -18
@@ -1770,33 +1770,30 @@ static int copy_files(unsigned long clon int no_files) {struct files_struct *oldf, *newf; -int error =0 ;/* * A background process may not have any files ... */ oldf = current->files;if (!oldf) - goto out; +return 0 ;if (no_files) { tsk->files =NULL ; - goto out; +return 0 ; }if (clone_flags &CLONE_FILES ) {atomic_inc (&oldf->count); - goto out; +return 0 ; } - newf =dup_fd (oldf,NR_OPEN_MAX , &error); -if (!newf) - goto out; + newf =dup_fd (oldf,NULL ); +if (IS_ERR (newf)) +return PTR_ERR (newf); tsk->files = newf; - error =0 ; -out: -return error; +return 0 ; }static int copy_sighand (unsigned long clone_flags,struct task_struct *tsk)
@@ -3246,17 +3243,16 @@ static int unshare_fs(unsigned long unsh/* * Unshare file descriptor table if it is being shared */ -int unshare_fd (unsigned long unshare_flags,unsigned int max_fds, -struct files_struct **new_fdp) +static int unshare_fd (unsigned long unshare_flags,struct files_struct **new_fdp) {struct files_struct *fd = current->files; -int error =0 ;if ((unshare_flags &CLONE_FILES ) && (fd &&atomic_read (&fd->count) >1 )) { - *new_fdp =dup_fd (fd, max_fds, &error); -if (!*new_fdp) -return error; + fd =dup_fd (fd,NULL ); +if (IS_ERR (fd)) +return PTR_ERR (fd); + *new_fdp = fd; }return 0 ;
@@ -3314,7 +3310,7 @@ int ksys_unshare(unsigned long unshare_f err =unshare_fs (unshare_flags, &new_fs);if (err) goto bad_unshare_out; - err =unshare_fd (unshare_flags,NR_OPEN_MAX , &new_fd); + err =unshare_fd (unshare_flags, &new_fd);if (err) goto bad_unshare_cleanup_fs; err =unshare_userns (unshare_flags, &new_cred);
@@ -3406,7 +3402,7 @@ int unshare_files(void)struct files_struct *old, *copy =NULL ;int error; - error =unshare_fd (CLONE_FILES ,NR_OPEN_MAX , ©); + error =unshare_fd (CLONE_FILES , ©);if (error || !copy)return error;
Greg Kroah-Hartman
maintainerPATCH 435/482 drm/i915/gem: fix bitwise and logical AND mixup
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
commit 394b52462020b6cceff1f7f47fdebd03589574f3 upstream.
CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND is an int, defaulting to 250. When the wakeref is non-zero, it's either -1 or a dynamically allocated pointer, depending on CONFIG_DRM_I915_DEBUG_RUNTIME_PM. It's likely that the code works by coincidence with the bitwise AND, but with CONFIG_DRM_I915_DEBUG_RUNTIME_PM=y, there's the off chance that the condition evaluates to false, and intel_wakeref_auto() doesn't get called. Switch to the intended logical AND.
v2: Use != to avoid clang -Wconstant-logical-operand (Nathan)
--- drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/i915/gem/i915_gem_ttm.c +1 -1
@@ -1131,7 +1131,7 @@ static vm_fault_t vm_fault_ttm(struct vmGEM_WARN_ON (!i915_ttm_cpu_maps_iomem (bo->resource)); } -if (wakeref &CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND ) +if (wakeref &&CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND !=0 )intel_wakeref_auto (&to_i915 (obj->base.dev)->runtime_pm.userfault_wakeref,msecs_to_jiffies_timeout (CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND ));
Greg Kroah-Hartman
maintainerPATCH 436/482 drm/panthor: Dont add write fences to the shared BOs
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit f9e7ac6e2e9986c2ee63224992cb5c8276e46b2a upstream.
The only user (the mesa gallium driver) is already assuming explicit synchronization and doing the export/import dance on shared BOs. The only reason we were registering ourselves as writers on external BOs is because Xe, which was the reference back when we developed Panthor, was doing so. Turns out Xe was wrong, and we really want bookkeep on all registered fences, so userspace can explicitly upgrade those to read/write when needed.
--- drivers/gpu/drm/panthor/panthor_sched.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
drivers/gpu/drm/panthor/panthor_sched.c +1 -6
@@ -3436,13 +3436,8 @@ void panthor_job_update_resvs(struct drm { struct panthor_job *job = container_of(sched_job, struct panthor_job, base); -/* Still not sure why we want USAGE_WRITE for external objects, since I -* was assuming this would be handled through explicit syncs being imported -* to external BOs with DMA_BUF_IOCTL_IMPORT_SYNC_FILE, but other drivers -* seem to pass DMA_RESV_USAGE_WRITE, so there must be a good reason. -*/ panthor_vm_update_resvs (job->group->vm, exec, &sched_job->s_fence->finished, -DMA_RESV_USAGE_BOOKKEEP ,DMA_RESV_USAGE_WRITE ); +DMA_RESV_USAGE_BOOKKEEP ,DMA_RESV_USAGE_BOOKKEEP ); }void panthor_sched_unplug (struct panthor_device *ptdev)
Greg Kroah-Hartman
maintainerPATCH 437/482 drm/panthor: Fix access to uninitialized variable in tick_ctx_cleanup()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 282864cc5d3f144af0cdea1868ee2dc2c5110f0d upstream.
The group variable can't be used to retrieve ptdev in our second loop, because it points to the previously iterated list_head, not a valid group. Get the ptdev object from the scheduler instead.
--- drivers/gpu/drm/panthor/panthor_sched.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/panthor/panthor_sched.c +3 -2
@@ -2046,6 +2046,7 @@ static void tick_ctx_cleanup(struct panthor_scheduler *sched, struct panthor_sched_tick_ctx *ctx) { + struct panthor_device *ptdev = sched->ptdev;struct panthor_group *group, *tmp;u32 i;
@@ -2054,7 +2055,7 @@ tick_ctx_cleanup(struct panthor_scheduler *sched,/* If everything went fine, we should only have groups * to be terminated in the old_groups lists. */ -drm_WARN_ON (&group->ptdev->base, !ctx->csg_upd_failed_mask && +drm_WARN_ON (&ptdev->base, !ctx->csg_upd_failed_mask &&group_can_run (group));if (!group_can_run (group)) {
@@ -2077,7 +2078,7 @@ tick_ctx_cleanup(struct panthor_scheduler *sched,/* If everything went fine, the groups to schedule lists should * be empty. */ -drm_WARN_ON (&group->ptdev->base, +drm_WARN_ON (&ptdev->base, !ctx->csg_upd_failed_mask && !list_empty (&ctx->groups[i]));list_for_each_entry_safe (group, tmp, &ctx->groups[i], run_node) {
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 438/482 drm/panthor: Dont declare a queue blocked if deferred operations are pending
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 7a1f30afe97294281a2ba05977688385744f9844 upstream.
If deferred operations are pending, we want to wait for those to land before declaring the queue blocked on a SYNC_WAIT. We need this to deal with the case where the sync object is signalled through a deferred SYNC_{ADD,SET} from the same queue. If we don't do that and the group gets scheduled out before the deferred SYNC_{SET,ADD} is executed, we'll end up with a timeout, because no external SYNC_{SET,ADD} will make the scheduler reconsider the group for execution.
--- drivers/gpu/drm/panthor/panthor_sched.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpu/drm/panthor/panthor_sched.c +7 -1
@@ -1103,7 +1103,13 @@ cs_slot_sync_queue_state_locked(struct panthor_device *ptdev, u32 csg_id, u32 cslist_move_tail (&group->wait_node, &group->ptdev->scheduler->groups.waiting); } - group->blocked_queues |=BIT (cs_id); + +/* The queue is only blocked if there's no deferred operation +* pending, which can be checked through the scoreboard status. +*/ +if (!cs_iface->output->status_scoreboards) + group->blocked_queues |=BIT (cs_id); + queue->syncwait.gpu_va = cs_iface->output->status_wait_sync_ptr; queue->syncwait.ref = cs_iface->output->status_wait_sync_value; status_wait_cond = cs_iface->output->status_wait &CS_STATUS_WAIT_SYNC_COND_MASK ;
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 439/482 drm/sched: Fix dynamic job-flow control race
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
commit 440d52b370b03b366fd26ace36bab20552116145 upstream.
Fixes a race condition reported here: https://github.com/AsahiLinux/linux/issues/309#issuecomment-2238968609
The whole premise of lockless access to a single-producer-single- consumer queue is that there is just a single producer and single consumer. That means we can't call drm_sched_can_queue() (which is about queueing more work to the hw, not to the spsc queue) from anywhere other than the consumer (wq).
This call in the producer is just an optimization to avoid scheduling the consuming worker if it cannot yet queue more work to the hw. It is safe to drop this optimization to avoid the race condition.
--- drivers/gpu/drm/scheduler/sched_entity.c | 4 ++-- drivers/gpu/drm/scheduler/sched_main.c | 7 ++----- include/drm/gpu_scheduler.h | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-)
drivers/gpu/drm/scheduler/sched_entity.c +2 -2
@@ -380,7 +380,7 @@ static void drm_sched_entity_wakeup(struct dma_fence *f, container_of(cb, struct drm_sched_entity, cb);drm_sched_entity_clear_dep (f, cb); -drm_sched_wakeup (entity->rq->sched, entity); +drm_sched_wakeup (entity->rq->sched); }/**
@@ -612,7 +612,7 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job)if (drm_sched_policy ==DRM_SCHED_POLICY_FIFO )drm_sched_rq_update_fifo (entity, submit_ts); -drm_sched_wakeup (entity->rq->sched, entity); +drm_sched_wakeup (entity->rq->sched); } }EXPORT_SYMBOL (drm_sched_entity_push_job);
drivers/gpu/drm/scheduler/sched_main.c +2 -5
@@ -1022,15 +1022,12 @@ EXPORT_SYMBOL(drm_sched_job_cleanup);/** * drm_sched_wakeup - Wake up the scheduler if it is ready to queue * @sched: scheduler instance -* @entity: the scheduler entity * * Wake up the scheduler if we can queue jobs. */ -void drm_sched_wakeup (struct drm_gpu_scheduler *sched, -struct drm_sched_entity *entity) +void drm_sched_wakeup (struct drm_gpu_scheduler *sched) { -if (drm_sched_can_queue (sched, entity)) -drm_sched_run_job_queue (sched); +drm_sched_run_job_queue (sched); }/**
include/drm/gpu_scheduler.h +1 -1
@@ -574,7 +574,7 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity *entity,void drm_sched_tdr_queue_imm (struct drm_gpu_scheduler *sched);void drm_sched_job_cleanup (struct drm_sched_job *job); -void drm_sched_wakeup (struct drm_gpu_scheduler *sched,struct drm_sched_entity *entity); +void drm_sched_wakeup (struct drm_gpu_scheduler *sched);bool drm_sched_wqueue_ready (struct drm_gpu_scheduler *sched);void drm_sched_wqueue_stop (struct drm_gpu_scheduler *sched);void drm_sched_wqueue_start (struct drm_gpu_scheduler *sched);
Signature · 1 line
2.46.2
Greg Kroah-Hartman
maintainerPATCH 440/482 drm/sched: Add locking to drm_sched_entity_modify_sched
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
commit 4286cc2c953983d44d248c9de1c81d3a9643345c upstream.
Without the locking amdgpu currently can race between amdgpu_ctx_set_entity_priority() (via drm_sched_entity_modify_sched()) and drm_sched_job_arm(), leading to the latter accesing potentially inconsitent entity->sched_list and entity->num_sched_list pair.
v2:
* Improve commit message. (Philipp)
--- drivers/gpu/drm/scheduler/sched_entity.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/scheduler/sched_entity.c +2 -0
@@ -133,8 +133,10 @@ void drm_sched_entity_modify_sched(struc {WARN_ON (!num_sched_list || !sched_list); +spin_lock (&entity->rq_lock); entity->sched_list = sched_list; entity->num_sched_list = num_sched_list; +spin_unlock (&entity->rq_lock); }EXPORT_SYMBOL (drm_sched_entity_modify_sched);
Greg Kroah-Hartman
maintainerPATCH 441/482 drm/sched: Always wake up correct scheduler in drm_sched_entity_push_job
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
commit cbc8764e29c2318229261a679b2aafd0f9072885 upstream.
Since drm_sched_entity_modify_sched() can modify the entities run queue, lets make sure to only dereference the pointer once so both adding and waking up are guaranteed to be consistent.
Alternative of moving the spin_unlock to after the wake up would for now be more problematic since the same lock is taken inside drm_sched_rq_update_fifo().
v2:
* Improve commit message. (Philipp)
* Cache the scheduler pointer directly. (Christian)
--- drivers/gpu/drm/scheduler/sched_entity.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/gpu/drm/scheduler/sched_entity.c +8 -2
@@ -599,6 +599,9 @@ void drm_sched_entity_push_job(struct dr/* first job wakes up scheduler */ if (first) { +struct drm_gpu_scheduler *sched; +struct drm_sched_rq *rq; +/* Add the entity to the run queue */ spin_lock (&entity->rq_lock);if (entity->stopped) {
@@ -608,13 +611,16 @@ void drm_sched_entity_push_job(struct drreturn ; } -drm_sched_rq_add_entity (entity->rq, entity); + rq = entity->rq; + sched = rq->sched; + +drm_sched_rq_add_entity (rq, entity);spin_unlock (&entity->rq_lock);if (drm_sched_policy ==DRM_SCHED_POLICY_FIFO )drm_sched_rq_update_fifo (entity, submit_ts); -drm_sched_wakeup (entity->rq->sched); +drm_sched_wakeup (sched); } }EXPORT_SYMBOL (drm_sched_entity_push_job);
Greg Kroah-Hartman
maintainerPATCH 442/482 drm/sched: Always increment correct scheduler score
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
commit 087913e0ba2b3b9d7ccbafb2acf5dab9e35ae1d5 upstream.
Entities run queue can change during drm_sched_entity_push_job() so make sure to update the score consistently.
--- drivers/gpu/drm/scheduler/sched_entity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/scheduler/sched_entity.c +1 -1
@@ -586,7 +586,6 @@ void drm_sched_entity_push_job(struct drktime_t submit_ts;trace_drm_sched_job (sched_job, entity); -atomic_inc (entity->rq->sched->score);WRITE_ONCE (entity->last_user, current->group_leader);/*
@@ -614,6 +613,7 @@ void drm_sched_entity_push_job(struct dr rq = entity->rq; sched = rq->sched; +atomic_inc (sched->score);drm_sched_rq_add_entity (rq, entity);spin_unlock (&entity->rq_lock);
Greg Kroah-Hartman
maintainerPATCH 443/482 drm/amd/display: Add HDR workaround for specific eDP
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
commit 05af800704ee7187d9edd461ec90f3679b1c4aba upstream.
[WHY & HOW]
Some eDP panels suffer from flicking when HDR is enabled in KDE. This quirk works around it by skipping VSC that is incompatible with eDP panels.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 11 ++++++++++- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 4 ++++ drivers/gpu/drm/amd/display/dc/dc_types.h | 1 + 3 files changed, 15 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +10 -1
@@ -6389,12 +6389,21 @@ create_stream_for_sink(struct drm_connecif (stream->signal ==SIGNAL_TYPE_DISPLAY_PORT || stream->signal ==SIGNAL_TYPE_DISPLAY_PORT_MST || stream->signal ==SIGNAL_TYPE_EDP ) { +const struct dc_edid_caps *edid_caps; +unsigned int disable_colorimetry =0 ; + +if (aconnector->dc_sink) { + edid_caps = &aconnector->dc_sink->edid_caps; + disable_colorimetry = edid_caps->panel_patch.disable_colorimetry; + } +// // should decide stream support vsc sdp colorimetry capability // before building vsc info packet // stream->use_vsc_sdp_for_colorimetry = stream->link->dpcd_caps.dpcd_rev.raw >=0x14 && - stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED; + stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED && + !disable_colorimetry;if (stream->out_transfer_func.tf ==TRANSFER_FUNCTION_GAMMA22 ) tf =TRANSFER_FUNC_GAMMA_22 ;
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c +4 -0
@@ -72,6 +72,10 @@ static void apply_edid_quirks(struct ediDRM_DEBUG_DRIVER ("Clearing DPCD 0x317 on monitor with panel id %X\n" , panel_id); edid_caps->panel_patch.remove_sink_ext_caps = true;break ; +case drm_edid_encode_panel_id ('S' ,'D' ,'C' ,0x4154 ): +DRM_DEBUG_DRIVER ("Disabling VSC on monitor with panel id %X\n" , panel_id); + edid_caps->panel_patch.disable_colorimetry = true; +break ;default :return ; }
drivers/gpu/drm/amd/display/dc/dc_types.h +1 -0
@@ -178,6 +178,7 @@ struct dc_panel_patch {unsigned int skip_avmute;unsigned int mst_start_top_delay;unsigned int remove_sink_ext_caps; +unsigned int disable_colorimetry; };struct dc_edid_caps {
Greg Kroah-Hartman
maintainerPATCH 444/482 drm/amd/display: update DML2 policy EnhancedPrefetchScheduleAccelerationFinal DCN35
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yihan Zhu <[email protected]>
commit 0d5e5e8a0aa49ea2163abf128da3b509a6c58286 upstream.
[WHY & HOW]
Mismatch in DCN35 DML2 cause bw validation failed to acquire unexpected DPP pipe to cause grey screen and system hang. Remove EnhancedPrefetchScheduleAccelerationFinal value override to match HW spec.
--- drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c | 1 - 1 file changed, 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dml2/dml2_policy.c +0 -1
@@ -303,7 +303,6 @@ void build_unoptimized_policy_settings(eif (project == dml_project_dcn35 || project == dml_project_dcn351) { policy->DCCProgrammingAssumesScanDirectionUnknownFinal = false; - policy->EnhancedPrefetchScheduleAccelerationFinal =0 ; policy->AllowForPStateChangeOrStutterInVBlankFinal = dml_prefetch_support_uclk_fclk_and_stutter_if_possible;/*new*/ policy->UseOnlyMaxPrefetchModes =1 ; }
Greg Kroah-Hartman
maintainerPATCH 445/482 drm/amd/display: Fix system hang while resume with TBT monitor
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Chung <[email protected]>
commit 52d4e3fb3d340447dcdac0e14ff21a764f326907 upstream.
[Why]
Connected with a Thunderbolt monitor and do the suspend and the system may hang while resume.
The TBT monitor HPD will be triggered during the resume procedure and call the drm_client_modeset_probe() while
struct drm_connector connector->dev->master is NULL.
It will mess up the pipe topology after resume.
[How]
Skip the TBT monitor HPD during the resume procedure because we currently will probe the connectors after resume by default.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +6 -0
@@ -758,6 +758,12 @@ static void dmub_hpd_callback(struct amdreturn ; } +/* Skip DMUB HPD IRQ in suspend/resume. We will probe them later. */ +if (notify->type ==DMUB_NOTIFICATION_HPD && adev->in_suspend) { +DRM_INFO ("Skip DMUB HPD IRQ callback in suspend/resume\n" ); +return ; + } + link_index = notify->link_index; link = adev->dm.dc->links[link_index]; dev = adev->dm.ddev;
Greg Kroah-Hartman
maintainerPATCH 446/482 cpufreq: intel_pstate: Make hwp_notify_lock a raw spinlock
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
commit 8b4865cd904650cbed7f2407e653934c621b8127 upstream.
notify_hwp_interrupt() is called via sysvec_thermal() -> smp_thermal_vector() -> intel_thermal_interrupt() in hard irq context. For this reason it must not use a simple spin_lock that sleeps with PREEMPT_RT enabled. So convert it to a raw spinlock.
--- drivers/cpufreq/intel_pstate.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/cpufreq/intel_pstate.c +8 -8
@@ -1622,7 +1622,7 @@ static void intel_pstate_notify_work(struct work_struct *work)wrmsrl_on_cpu (cpudata->cpu,MSR_HWP_STATUS ,0 ); } -static DEFINE_SPINLOCK (hwp_notify_lock); +static DEFINE_RAW_SPINLOCK (hwp_notify_lock);static cpumask_t hwp_intr_enable_mask;void notify_hwp_interrupt (void )
@@ -1638,7 +1638,7 @@ void notify_hwp_interrupt(void)if (!(value &0x01 ))return ; -spin_lock_irqsave (&hwp_notify_lock, flags); +raw_spin_lock_irqsave (&hwp_notify_lock, flags);if (!cpumask_test_cpu (this_cpu, &hwp_intr_enable_mask)) goto ack_intr;
@@ -1646,13 +1646,13 @@ void notify_hwp_interrupt(void)schedule_delayed_work (&all_cpu_data[this_cpu]->hwp_notify_work,msecs_to_jiffies (10 )); -spin_unlock_irqrestore (&hwp_notify_lock, flags); +raw_spin_unlock_irqrestore (&hwp_notify_lock, flags);return ; ack_intr:wrmsrl_safe (MSR_HWP_STATUS ,0 ); -spin_unlock_irqrestore (&hwp_notify_lock, flags); +raw_spin_unlock_irqrestore (&hwp_notify_lock, flags); }static void intel_pstate_disable_hwp_interrupt (struct cpudata *cpudata)
@@ -1665,9 +1665,9 @@ static void intel_pstate_disable_hwp_interrupt(struct cpudata *cpudata)/* wrmsrl_on_cpu has to be outside spinlock as this can result in IPC */ wrmsrl_on_cpu (cpudata->cpu,MSR_HWP_INTERRUPT ,0x00 ); -spin_lock_irq (&hwp_notify_lock); +raw_spin_lock_irq (&hwp_notify_lock); cancel_work =cpumask_test_and_clear_cpu (cpudata->cpu, &hwp_intr_enable_mask); -spin_unlock_irq (&hwp_notify_lock); +raw_spin_unlock_irq (&hwp_notify_lock);if (cancel_work)cancel_delayed_work_sync (&cpudata->hwp_notify_work);
@@ -1677,10 +1677,10 @@ static void intel_pstate_enable_hwp_interrupt(struct cpudata *cpudata) {/* Enable HWP notification interrupt for guaranteed performance change */ if (boot_cpu_has (X86_FEATURE_HWP_NOTIFY )) { -spin_lock_irq (&hwp_notify_lock); +raw_spin_lock_irq (&hwp_notify_lock);INIT_DELAYED_WORK (&cpudata->hwp_notify_work, intel_pstate_notify_work);cpumask_set_cpu (cpudata->cpu, &hwp_intr_enable_mask); -spin_unlock_irq (&hwp_notify_lock); +raw_spin_unlock_irq (&hwp_notify_lock);/* wrmsrl_on_cpu has to be outside spinlock as this can result in IPC */ wrmsrl_on_cpu (cpudata->cpu,MSR_HWP_INTERRUPT ,0x01 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 447/482 kconfig: qconf: fix buffer overflow in debug links
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 984ed20ece1c6c20789ece040cbff3eb1a388fa9 ]
If you enable "Option -> Show Debug Info" and click a link, the program terminates with the following error:
*** buffer overflow detected ***: terminated
The buffer overflow is caused by the following line:
strcat(data, "$");
The buffer needs one more byte to accommodate the additional character.
--- scripts/kconfig/qconf.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/kconfig/qconf.cc +1 -1
@@ -1174,7 +1174,7 @@ void ConfigInfoView::clicked(const QUrl &url) { QByteArray str = url.toEncoded(); const std::size_t count = str.size(); - char *data = new char[count + 1]; + char *data = new char[count + 2]; // '$' + '\0' struct symbol **result; struct menu *m = NULL;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 448/482 arm64: cputype: Add Neoverse-N3 definitions
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 924725707d80bc2588cefafef76ff3f164d299bc ]
Add cputype definitions for Neoverse-N3. These will be used for errata detection in subsequent patches.
These values can be found in Table A-261 ("MIDR_EL1 bit descriptions") in issue 02 of the Neoverse-N3 TRM, which can be found at:
https://developer.arm.com/documentation/107997/0000/?lang=en
--- arch/arm64/include/asm/cputype.h | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/include/asm/cputype.h +2 -0
@@ -94,6 +94,7 @@#define ARM_CPU_PART_NEOVERSE_V3 0xD84#define ARM_CPU_PART_CORTEX_X925 0xD85#define ARM_CPU_PART_CORTEX_A725 0xD87 +#define ARM_CPU_PART_NEOVERSE_N3 0xD8E#define APM_CPU_PART_XGENE 0x000#define APM_CPU_VAR_POTENZA 0x00
@@ -176,6 +177,7 @@#define MIDR_NEOVERSE_V3 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V3)#define MIDR_CORTEX_X925 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X925)#define MIDR_CORTEX_A725 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A725) +#define MIDR_NEOVERSE_N3 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_N3)#define MIDR_THUNDERX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX)#define MIDR_THUNDERX_81XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_81XX)#define MIDR_THUNDERX_83XX MIDR_CPU_MODEL(ARM_CPU_IMP_CAVIUM, CAVIUM_CPU_PART_THUNDERX_83XX)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 449/482 arm64: errata: Expand speculative SSBS workaround once more
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 081eb7932c2b244f63317a982c5e3990e2c7fbdd ]
A number of Arm Ltd CPUs suffer from errata whereby an MSR to the SSBS special-purpose register does not affect subsequent speculative instructions, permitting speculative store bypassing for a window of time.
We worked around this for a number of CPUs in commits:
* 7187bb7d0b5c7dfa ("arm64: errata: Add workaround for Arm errata 3194386 and 3312417")
* 75b3c43eab594bfb ("arm64: errata: Expand speculative SSBS workaround")
* 145502cac7ea70b5 ("arm64: errata: Expand speculative SSBS workaround (again)")
Since then, a (hopefully final) batch of updates have been published, with two more affected CPUs. For the affected CPUs the existing mitigation is sufficient, as described in their respective Software Developer Errata Notice (SDEN) documents:
* Cortex-A715 (MP148) SDEN v15.0, erratum 3456084
https://developer.arm.com/documentation/SDEN-2148827/1500/
* Neoverse-N3 (MP195) SDEN v5.0, erratum 3456111
https://developer.arm.com/documentation/SDEN-3050973/0500/
Enable the existing mitigation by adding the relevant MIDRs to erratum_spec_ssbs_list, and update silicon-errata.rst and the Kconfig text accordingly.
--- Documentation/arch/arm64/silicon-errata.rst | 4 ++++ arch/arm64/Kconfig | 2 ++ arch/arm64/kernel/cpu_errata.c | 2 ++ 3 files changed, 8 insertions(+)
Documentation/arch/arm64/silicon-errata.rst +4 -0
@@ -146,6 +146,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A715 | #2645198 | ARM64_ERRATUM_2645198 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A715 | #3456084 | ARM64_ERRATUM_3194386 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A720 | #3456091 | ARM64_ERRATUM_3194386 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A725 | #3456106 | ARM64_ERRATUM_3194386 |
@@ -186,6 +188,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-N2 | #3324339 | ARM64_ERRATUM_3194386 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Neoverse-N3 | #3456111 | ARM64_ERRATUM_3194386 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-V1 | #1619801 | N/A | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Neoverse-V1 | #3324341 | ARM64_ERRATUM_3194386 |
arch/arm64/Kconfig +2 -0
@@ -1078,6 +1078,7 @@ config ARM64_ERRATUM_3194386 * ARM Cortex-A78C erratum 3324346 * ARM Cortex-A78C erratum 3324347 * ARM Cortex-A710 erratam 3324338 + * ARM Cortex-A715 errartum 3456084 * ARM Cortex-A720 erratum 3456091 * ARM Cortex-A725 erratum 3456106 * ARM Cortex-X1 erratum 3324344
@@ -1088,6 +1089,7 @@ config ARM64_ERRATUM_3194386 * ARM Cortex-X925 erratum 3324334 * ARM Neoverse-N1 erratum 3324349 * ARM Neoverse N2 erratum 3324339 + * ARM Neoverse-N3 erratum 3456111 * ARM Neoverse-V1 erratum 3324341 * ARM Neoverse V2 erratum 3324336 * ARM Neoverse-V3 erratum 3312417
arch/arm64/kernel/cpu_errata.c +2 -0
@@ -439,6 +439,7 @@ static const struct midr_range erratum_spec_ssbs_list[] = {MIDR_ALL_VERSIONS (MIDR_CORTEX_A78 ),MIDR_ALL_VERSIONS (MIDR_CORTEX_A78C ),MIDR_ALL_VERSIONS (MIDR_CORTEX_A710 ), +MIDR_ALL_VERSIONS (MIDR_CORTEX_A715 ),MIDR_ALL_VERSIONS (MIDR_CORTEX_A720 ),MIDR_ALL_VERSIONS (MIDR_CORTEX_A725 ), MIDR_ALL_VERSIONS(MIDR_CORTEX_X1),
@@ -450,6 +451,7 @@ static const struct midr_range erratum_spec_ssbs_list[] = {MIDR_ALL_VERSIONS (MIDR_MICROSOFT_AZURE_COBALT_100 ),MIDR_ALL_VERSIONS (MIDR_NEOVERSE_N1 ),MIDR_ALL_VERSIONS (MIDR_NEOVERSE_N2 ), +MIDR_ALL_VERSIONS (MIDR_NEOVERSE_N3 ),MIDR_ALL_VERSIONS (MIDR_NEOVERSE_V1 ),MIDR_ALL_VERSIONS (MIDR_NEOVERSE_V2 ), MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V3),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 450/482 uprobes: fix kernel info leak via "[uprobes]" vma
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov <[email protected]>
commit 34820304cc2cd1804ee1f8f3504ec77813d29c8e upstream.
xol_add_vma() maps the uninitialized page allocated by __create_xol_area() into userspace. On some architectures (x86) this memory is readable even without VM_READ, VM_EXEC results in the same pgprot_t as VM_EXEC|VM_READ, although this doesn't really matter, debugger can read this memory anyway.
--- kernel/events/uprobes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/events/uprobes.c +1 -1
@@ -1491,7 +1491,7 @@ static struct xol_area *__create_xol_area(unsigned long vaddr) area->xol_mapping.name ="[uprobes]" ; area->xol_mapping.pages = area->pages; - area->pages[0 ] =alloc_page (GFP_HIGHUSER ); + area->pages[0 ] =alloc_page (GFP_HIGHUSER | __GFP_ZERO);if (!area->pages[0 ]) goto free_bitmap; area->pages[1 ] =NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 451/482 mm: z3fold: deprecate CONFIG_Z3FOLD
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yosry Ahmed <[email protected]>
The z3fold compressed pages allocator is rarely used, most users use zsmalloc. The only disadvantage of zsmalloc in comparison is the dependency on MMU, and zbud is a more common option for !MMU as it was the default zswap allocator for a long time.
Historically, zsmalloc had worse latency than zbud and z3fold but offered better memory savings. This is no longer the case as shown by a simple recent analysis [1]. That analysis showed that z3fold does not have any advantage over zsmalloc or zbud considering both performance and memory usage. In a kernel build test on tmpfs in a limited cgroup, z3fold took 3% more time and used 1.8% more memory. The latency of zswap_load() was 7% higher, and that of zswap_store() was 10% higher. Zsmalloc is better in all metrics.
Moreover, z3fold apparently has latent bugs, which was made noticeable by a recent soft lockup bug report with z3fold [2]. Switching to zsmalloc not only fixed the problem, but also reduced the swap usage from 6~8G to 1~2G. Other users have also reported being bitten by mistakenly enabling z3fold.
Other than hurting users, z3fold is repeatedly causing wasted engineering effort. Apart from investigating the above bug, it came up in multiple development discussions (e.g. [3]) as something we need to handle, when there aren't any legit users (at least not intentionally).
The natural course of action is to deprecate z3fold, and remove in a few cycles if no objections are raised from active users. Next on the list should be zbud, as it offers marginal latency gains at the cost of huge memory waste when compared to zsmalloc. That one will need to wait until zsmalloc does not depend on MMU.
Rename the user-visible config option from CONFIG_Z3FOLD to CONFIG_Z3FOLD_DEPRECATED so that users with CONFIG_Z3FOLD=y get a new prompt with explanation during make oldconfig. Also, remove CONFIG_Z3FOLD=y from defconfigs.
[1]https://lore.kernel.org/lkml/CAJD7tkbRF6od-2x_L8-A1QL3=2Ww13sCj4S3i4bNndqF+3+_Vg@mail.gmail.com/ [2]https://lore.kernel.org/lkml/[email protected]/ [3]https://lore.kernel.org/lkml/CAJD7tkbnmeVugfunffSovJf9FAgy9rhBVt_tx=nxUveLUfqVsA@mail.gmail.com/
--- arch/loongarch/configs/loongson3_defconfig | 1 - arch/powerpc/configs/ppc64_defconfig | 1 - mm/Kconfig | 25 ++++++++++++++++------ 3 files changed, 19 insertions(+), 8 deletions(-)
arch/loongarch/configs/loongson3_defconfig +0 -1
@@ -96,7 +96,6 @@ CONFIG_ZPOOL=y CONFIG_ZSWAP=y CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD=y CONFIG_ZBUD=y -CONFIG_Z3FOLD=y CONFIG_ZSMALLOC=m # CONFIG_COMPAT_BRK is not set CONFIG_MEMORY_HOTPLUG=y
arch/powerpc/configs/ppc64_defconfig +0 -1
@@ -81,7 +81,6 @@ CONFIG_MODULE_SIG_SHA512=y CONFIG_PARTITION_ADVANCED=y CONFIG_BINFMT_MISC=m CONFIG_ZSWAP=y -CONFIG_Z3FOLD=y CONFIG_ZSMALLOC=y # CONFIG_SLAB_MERGE_DEFAULT is not set CONFIG_SLAB_FREELIST_RANDOM=y
mm/Kconfig +19 -6
@@ -146,12 +146,15 @@ config ZSWAP_ZPOOL_DEFAULT_ZBUD help Use the zbud allocator as the default allocator. -config ZSWAP_ZPOOL_DEFAULT_Z3FOLD - bool "z3fold" - select Z3FOLD +config ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED + bool "z3foldi (DEPRECATED)" + select Z3FOLD_DEPRECATED help Use the z3fold allocator as the default allocator. + Deprecated and scheduled for removal in a few cycles, + see CONFIG_Z3FOLD_DEPRECATED. + config ZSWAP_ZPOOL_DEFAULT_ZSMALLOC bool "zsmalloc" select ZSMALLOC
@@ -163,7 +166,7 @@ config ZSWAP_ZPOOL_DEFAULT string depends on ZSWAP default "zbud" if ZSWAP_ZPOOL_DEFAULT_ZBUD - default "z3fold" if ZSWAP_ZPOOL_DEFAULT_Z3FOLD + default "z3fold" if ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED default "zsmalloc" if ZSWAP_ZPOOL_DEFAULT_ZSMALLOC default ""
@@ -177,15 +180,25 @@ config ZBUD deterministic reclaim properties that make it preferable to a higher density approach when reclaim will be used. -config Z3FOLD - tristate "3:1 compression allocator (z3fold)" +config Z3FOLD_DEPRECATED + tristate "3:1 compression allocator (z3fold) (DEPRECATED)" depends on ZSWAP help + Deprecated and scheduled for removal in a few cycles. If you have + a good reason for using Z3FOLD over ZSMALLOC, please contact + [email protected] and the zswap maintainers. + A special purpose allocator for storing compressed pages. It is designed to store up to three compressed pages per physical page. It is a ZBUD derivative so the simplicity and determinism are still there. +config Z3FOLD + tristate + default y if Z3FOLD_DEPRECATED=y + default m if Z3FOLD_DEPRECATED=m + depends on Z3FOLD_DEPRECATED + config ZSMALLOC tristate prompt "N:1 compression allocator (zsmalloc)" if ZSWAP
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 452/482 drm/amd/display: Allow backlight to go below `AMDGPU_DM_DEFAULT_MIN_BACKLIGHT`
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit 87d749a6aab73d8069d0345afaa98297816cb220 ]
The issue with panel power savings compatibility below AMDGPU_DM_DEFAULT_MIN_BACKLIGHT happens at AMDGPU_DM_DEFAULT_MIN_BACKLIGHT as well.
That issue will be fixed separately, so don't prevent the backlight brightness from going that low.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -1
@@ -4176,7 +4176,7 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,int spread = caps.max_input_signal - caps.min_input_signal;if (caps.max_input_signal >AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || - caps.min_input_signal <AMDGPU_DM_DEFAULT_MIN_BACKLIGHT || + caps.min_input_signal <0 || spread >AMDGPU_DM_DEFAULT_MAX_BACKLIGHT || spread <AMDGPU_DM_MIN_SPREAD ) { DRM_DEBUG_KMS("DM: Invalid backlight caps: min=%d, max=%d\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 453/482 build-id: require program headers to be right after ELF header
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Dobriyan <[email protected]>
[ Upstream commit 961a2851324561caed579764ffbee3db82b32829 ]
Neither ELF spec not ELF loader require program header to be placed right after ELF header, but build-id code very much assumes such placement:
See
find_get_page(vma->vm_file->f_mapping, 0);
line and checks against PAGE_SIZE.
Returns errors for now until someone rewrites build-id parser to be more inline with load_elf_binary().
Stable-dep-of: 905415ff3ffb ("lib/buildid: harden build ID parsing logic")
--- lib/buildid.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
lib/buildid.c +14 -0
@@ -73,6 +73,13 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,Elf32_Phdr *phdr;int i; +/* +* FIXME +* Neither ELF spec nor ELF loader require that program headers +* start immediately after ELF header. +*/ +if (ehdr->e_phoff !=sizeof (Elf32_Ehdr)) +return -EINVAL ;/* only supports phdr that fits in one page */ if (ehdr->e_phnum > (PAGE_SIZE -sizeof (Elf32_Ehdr)) /sizeof (Elf32_Phdr))
@@ -98,6 +105,13 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,Elf64_Phdr *phdr;int i; +/* +* FIXME +* Neither ELF spec nor ELF loader require that program headers +* start immediately after ELF header. +*/ +if (ehdr->e_phoff !=sizeof (Elf64_Ehdr)) +return -EINVAL ;/* only supports phdr that fits in one page */ if (ehdr->e_phnum > (PAGE_SIZE -sizeof (Elf64_Ehdr)) /sizeof (Elf64_Phdr))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 454/482 lib/buildid: harden build ID parsing logic
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit 905415ff3ffb1d7e5afa62bacabd79776bd24606 ]
Harden build ID parsing logic, adding explicit READ_ONCE() where it's important to have a consistent value read and validated just once.
Also, as pointed out by Andi Kleen, we need to make sure that entire ELF note is within a page bounds, so move the overflow check up and add an extra note_size boundaries validation.
Fixes tag below points to the code that moved this code into lib/buildid.c, and then subsequently was used in perf subsystem, making this code exposed to perf_event_open() users in v5.12+.
--- lib/buildid.c | 76 +++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 32 deletions(-)
lib/buildid.c +44 -32
@@ -18,31 +18,37 @@ static int parse_build_id_buf(unsigned char *build_id,const void *note_start, Elf32_Word note_size) { - Elf32_Word note_offs = 0, new_offs; - -while (note_offs +sizeof (Elf32_Nhdr) < note_size) { -Elf32_Nhdr *nhdr = (Elf32_Nhdr *)(note_start + note_offs); + const char note_name[] = "GNU"; +const size_t note_name_sz =sizeof (note_name); +u64 note_off =0 , new_off, name_sz, desc_sz; +const char *data; + +while (note_off +sizeof (Elf32_Nhdr) < note_size && + note_off +sizeof (Elf32_Nhdr) > note_off/* overflow */ ) { +Elf32_Nhdr *nhdr = (Elf32_Nhdr *)(note_start + note_off); + + name_sz =READ_ONCE (nhdr->n_namesz); + desc_sz =READ_ONCE (nhdr->n_descsz); + + new_off = note_off +sizeof (Elf32_Nhdr); +if (check_add_overflow (new_off,ALIGN (name_sz,4 ), &new_off) || +check_add_overflow (new_off,ALIGN (desc_sz,4 ), &new_off) || + new_off > note_size) +break ;if (nhdr->n_type ==BUILD_ID && - nhdr->n_namesz ==sizeof ("GNU" ) && - !strcmp ((char *)(nhdr +1 ),"GNU" ) && - nhdr->n_descsz >0 && - nhdr->n_descsz <=BUILD_ID_SIZE_MAX ) { -memcpy (build_id, - note_start + note_offs + -ALIGN (sizeof ("GNU" ),4 ) +sizeof (Elf32_Nhdr), - nhdr->n_descsz); -memset (build_id + nhdr->n_descsz,0 , -BUILD_ID_SIZE_MAX - nhdr->n_descsz); + name_sz == note_name_sz && +memcmp (nhdr +1 , note_name, note_name_sz) ==0 && + desc_sz >0 && desc_sz <=BUILD_ID_SIZE_MAX ) { + data = note_start + note_off +ALIGN (note_name_sz,4 ); +memcpy (build_id, data, desc_sz); +memset (build_id + desc_sz,0 ,BUILD_ID_SIZE_MAX - desc_sz);if (size) - *size = nhdr->n_descsz; + *size = desc_sz;return 0 ; } - new_offs = note_offs +sizeof (Elf32_Nhdr) + -ALIGN (nhdr->n_namesz,4 ) +ALIGN (nhdr->n_descsz,4 ); -if (new_offs <= note_offs)/* overflow */ -break ; - note_offs = new_offs; + + note_off = new_off; }return -EINVAL ;
@@ -71,7 +77,7 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id, {Elf32_Ehdr *ehdr = (Elf32_Ehdr *)page_addr;Elf32_Phdr *phdr; -int i; +__u32 i, phnum;/* * FIXME
@@ -80,18 +86,19 @@ static int get_build_id_32(const void *page_addr, unsigned char *build_id,*/ if (ehdr->e_phoff !=sizeof (Elf32_Ehdr))return -EINVAL ; + + phnum =READ_ONCE (ehdr->e_phnum);/* only supports phdr that fits in one page */ -if (ehdr->e_phnum > - (PAGE_SIZE -sizeof (Elf32_Ehdr)) /sizeof (Elf32_Phdr)) +if (phnum > (PAGE_SIZE -sizeof (Elf32_Ehdr)) /sizeof (Elf32_Phdr))return -EINVAL ; phdr = (Elf32_Phdr *)(page_addr +sizeof (Elf32_Ehdr)); -for (i =0 ; i < ehdr->e_phnum; ++i) { +for (i =0 ; i < phnum; ++i) {if (phdr[i].p_type ==PT_NOTE && !parse_build_id (page_addr, build_id, size, - page_addr + phdr[i].p_offset, - phdr[i].p_filesz)) + page_addr +READ_ONCE (phdr[i].p_offset), +READ_ONCE (phdr[i].p_filesz)))return 0 ; }return -EINVAL ;
@@ -103,7 +110,7 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id, {Elf64_Ehdr *ehdr = (Elf64_Ehdr *)page_addr;Elf64_Phdr *phdr; -int i; +__u32 i, phnum;/* * FIXME
@@ -112,18 +119,19 @@ static int get_build_id_64(const void *page_addr, unsigned char *build_id,*/ if (ehdr->e_phoff !=sizeof (Elf64_Ehdr))return -EINVAL ; + + phnum =READ_ONCE (ehdr->e_phnum);/* only supports phdr that fits in one page */ -if (ehdr->e_phnum > - (PAGE_SIZE -sizeof (Elf64_Ehdr)) /sizeof (Elf64_Phdr)) +if (phnum > (PAGE_SIZE -sizeof (Elf64_Ehdr)) /sizeof (Elf64_Phdr))return -EINVAL ; phdr = (Elf64_Phdr *)(page_addr +sizeof (Elf64_Ehdr)); -for (i =0 ; i < ehdr->e_phnum; ++i) { +for (i =0 ; i < phnum; ++i) {if (phdr[i].p_type ==PT_NOTE && !parse_build_id (page_addr, build_id, size, - page_addr + phdr[i].p_offset, - phdr[i].p_filesz)) + page_addr +READ_ONCE (phdr[i].p_offset), +READ_ONCE (phdr[i].p_filesz)))return 0 ; }return -EINVAL ;
@@ -152,6 +160,10 @@ int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, page =find_get_page (vma->vm_file->f_mapping,0 );if (!page)return -EFAULT ;/* page not mapped */ +if (!PageUptodate (page)) { +put_page (page); +return -EFAULT ; + } ret = -EINVAL ; page_addr =kmap_local_page (page);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 455/482 drm/xe: Delete unused GuC submission_state.suspend
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Brost <[email protected]>
[ Upstream commit 3f371a98deada9aee53d908c9aa53f6cdcb1300b ]
GuC submission_state.suspend is unused, delete it.
Stable-dep-of: 2d2be279f1ca ("drm/xe: fix UAF around queue destruction")
--- drivers/gpu/drm/xe/xe_guc_submit.c | 4 ---- drivers/gpu/drm/xe/xe_guc_types.h | 9 --------- 2 files changed, 13 deletions(-)
drivers/gpu/drm/xe/xe_guc_submit.c +0 -4
@@ -251,7 +251,6 @@ static void primelockdep(struct xe_guc *guc)fs_reclaim_acquire (GFP_KERNEL );mutex_lock (&guc->submission_state.lock); -might_lock (&guc->submission_state.suspend.lock);mutex_unlock (&guc->submission_state.lock);fs_reclaim_release (GFP_KERNEL );
@@ -279,9 +278,6 @@ int xe_guc_submit_init(struct xe_guc *guc)xa_init (&guc->submission_state.exec_queue_lookup); -spin_lock_init (&guc->submission_state.suspend.lock); - guc->submission_state.suspend.context =dma_fence_context_alloc (1 ); -primelockdep (guc);return drmm_add_action_or_reset (&xe->drm, guc_submit_fini, guc);
drivers/gpu/drm/xe/xe_guc_types.h +0 -9
@@ -72,15 +72,6 @@ struct xe_guc {atomic_t stopped;/** @submission_state.lock: protects submission state */ struct mutex lock; -/** @submission_state.suspend: suspend fence state */ -struct { -/** @submission_state.suspend.lock: suspend fences lock */ -spinlock_t lock; -/** @submission_state.suspend.context: suspend fences context */ -u64 context; -/** @submission_state.suspend.seqno: suspend fences seqno */ -u32 seqno; - } suspend;#ifdef CONFIG_PROVE_LOCKING #define NUM_SUBMIT_WQ 256/** @submission_state.submit_wq_pool: submission ordered workqueues pool */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 456/482 drm/xe: fix UAF around queue destruction
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Auld <[email protected]>
[ Upstream commit 2d2be279f1ca9e7288282d4214f16eea8a727cdb ]
We currently do stuff like queuing the final destruction step on a random system wq, which will outlive the driver instance. With bad timing we can teardown the driver with one or more work workqueue still being alive leading to various UAF splats. Add a fini step to ensure user queues are properly torn down. At this point GuC should already be nuked so queue itself should no longer be referenced from hw pov.
v2 (Matt B)
- Looks much safer to use a waitqueue and then just wait for the xa_array to become empty before triggering the drain.
--- drivers/gpu/drm/xe/xe_device.c | 6 +++++- drivers/gpu/drm/xe/xe_device_types.h | 3 +++ drivers/gpu/drm/xe/xe_guc_submit.c | 26 +++++++++++++++++++++++++- drivers/gpu/drm/xe/xe_guc_types.h | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-)
drivers/gpu/drm/xe/xe_device.c +5 -1
@@ -231,6 +231,9 @@ static void xe_device_destroy(struct drm_device *dev, void *dummy)if (xe->unordered_wq)destroy_workqueue (xe->unordered_wq); +if (xe->destroy_wq) +destroy_workqueue (xe->destroy_wq); +ttm_device_fini (&xe->ttm); }
@@ -293,8 +296,9 @@ struct xe_device *xe_device_create(struct pci_dev *pdev, xe->preempt_fence_wq =alloc_ordered_workqueue ("xe-preempt-fence-wq" ,0 ); xe->ordered_wq =alloc_ordered_workqueue ("xe-ordered-wq" ,0 ); xe->unordered_wq =alloc_workqueue ("xe-unordered-wq" ,0 ,0 ); + xe->destroy_wq =alloc_workqueue ("xe-destroy-wq" ,0 ,0 );if (!xe->ordered_wq || !xe->unordered_wq || - !xe->preempt_fence_wq) { + !xe->preempt_fence_wq || !xe->destroy_wq) {/* * Cleanup done in xe_device_destroy via * drmm_add_action_or_reset register above
drivers/gpu/drm/xe/xe_device_types.h +3 -0
@@ -376,6 +376,9 @@ struct xe_device {/** @unordered_wq: used to serialize unordered work, mostly display */ struct workqueue_struct *unordered_wq; +/** @destroy_wq: used to serialize user destroy work, like queue */ +struct workqueue_struct *destroy_wq; +/** @tiles: device tiles */ struct xe_tile tiles[XE_MAX_TILES_PER_DEVICE ];
drivers/gpu/drm/xe/xe_guc_submit.c +25 -1
@@ -233,10 +233,26 @@ static struct workqueue_struct *get_submit_wq(struct xe_guc *guc) }#endif +static void xe_guc_submit_fini (struct xe_guc *guc) +{ +struct xe_device *xe =guc_to_xe (guc); +struct xe_gt *gt =guc_to_gt (guc); +int ret; + + ret =wait_event_timeout (guc->submission_state.fini_wq, +xa_empty (&guc->submission_state.exec_queue_lookup), +HZ *5 ); + +drain_workqueue (xe->destroy_wq); + +xe_gt_assert (gt, ret); +} +static void guc_submit_fini (struct drm_device *drm,void *arg) {struct xe_guc *guc = arg; +xe_guc_submit_fini (guc);xa_destroy (&guc->submission_state.exec_queue_lookup);free_submit_wq (guc); }
@@ -278,6 +294,8 @@ int xe_guc_submit_init(struct xe_guc *guc)xa_init (&guc->submission_state.exec_queue_lookup); +init_waitqueue_head (&guc->submission_state.fini_wq); +primelockdep (guc);return drmm_add_action_or_reset (&xe->drm, guc_submit_fini, guc);
@@ -294,6 +312,9 @@ static void __release_guc_id(struct xe_guc *guc, struct xe_exec_queue *q, u32 xaxe_guc_id_mgr_release_locked (&guc->submission_state.idm, q->guc->id, q->width); + +if (xa_empty (&guc->submission_state.exec_queue_lookup)) +wake_up (&guc->submission_state.fini_wq); }static int alloc_guc_id (struct xe_guc *guc,struct xe_exec_queue *q)
@@ -1025,13 +1046,16 @@ static void __guc_exec_queue_fini_async(struct work_struct *w)static void guc_exec_queue_fini_async (struct xe_exec_queue *q) { +struct xe_guc *guc =exec_queue_to_guc (q); +struct xe_device *xe =guc_to_xe (guc); +INIT_WORK (&q->guc->fini_async, __guc_exec_queue_fini_async);/* We must block on kernel engines so slabs are empty on driver unload */ if (q->flags &EXEC_QUEUE_FLAG_PERMANENT )__guc_exec_queue_fini_async (&q->guc->fini_async);else -queue_work (system_wq, &q->guc->fini_async); +queue_work (xe->destroy_wq, &q->guc->fini_async); }static void __guc_exec_queue_fini (struct xe_guc *guc,struct xe_exec_queue *q)
drivers/gpu/drm/xe/xe_guc_types.h +2 -0
@@ -81,6 +81,8 @@ struct xe_guc {#endif /** @submission_state.enabled: submission is enabled */ bool enabled; +/** @submission_state.fini_wq: submit fini wait queue */ +wait_queue_head_t fini_wq; } submission_state;/** @hwconfig: Hardware config state */ struct {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 457/482 sched: psi: fix bogus pressure spikes from aggregation race
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Weiner <[email protected]>
[ Upstream commit 3840cbe24cf060ea05a585ca497814609f5d47d1 ]
Brandon reports sporadic, non-sensical spikes in cumulative pressure time (total=) when reading cpu.pressure at a high rate. This is due to a race condition between reader aggregation and tasks changing states.
While it affects all states and all resources captured by PSI, in practice it most likely triggers with CPU pressure, since scheduling events are so frequent compared to other resource events.
The race context is the live snooping of ongoing stalls during a pressure read. The read aggregates per-cpu records for stalls that have concluded, but will also incorporate ad-hoc the duration of any active state that hasn't been recorded yet. This is important to get timely measurements of ongoing stalls. Those ad-hoc samples are calculated on-the-fly up to the current time on that CPU; since the stall hasn't concluded, it's expected that this is the minimum amount of stall time that will enter the per-cpu records once it does.
The problem is that the path that concludes the state uses a CPU clock read that is not synchronized against aggregators; the clock is read outside of the seqlock protection. This allows aggregators to race and snoop a stall with a longer duration than will actually be recorded.
With the recorded stall time being less than the last snapshot remembered by the aggregator, a subsequent sample will underflow and observe a bogus delta value, resulting in an erratic jump in pressure.
Fix this by moving the clock read of the state change into the seqlock protection. This ensures no aggregation can snoop live stalls past the time that's recorded when the state concludes.
--- kernel/sched/psi.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-)
kernel/sched/psi.c +12 -14
@@ -765,13 +765,14 @@ static void record_times(struct psi_group_cpu *groupc, u64 now) }static void psi_group_change (struct psi_group *group,int cpu, -unsigned int clear,unsigned int set,u64 now, +unsigned int clear,unsigned int set,bool wake_clock) {struct psi_group_cpu *groupc;unsigned int t, m;enum psi_states s;u32 state_mask; +u64 now;lockdep_assert_rq_held (cpu_rq (cpu)); groupc =per_cpu_ptr (group->pcpu, cpu);
@@ -786,6 +787,7 @@ static void psi_group_change(struct psi_group *group, int cpu,* SOME and FULL time these may have resulted in. */ write_seqcount_begin (&groupc->seq); + now =cpu_clock (cpu);/* * Start with TSK_ONCPU, which doesn't have a corresponding
@@ -899,18 +901,15 @@ void psi_task_change(struct task_struct *task, int clear, int set) {int cpu =task_cpu (task);struct psi_group *group; -u64 now;if (!task->pid)return ;psi_flags_change (task, clear, set); - now =cpu_clock (cpu); - group =task_psi_group (task);do { -psi_group_change (group, cpu, clear, set, now, true); +psi_group_change (group, cpu, clear, set, true); }while ((group = group->parent)); }
@@ -919,7 +918,6 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next, {struct psi_group *group, *common =NULL ;int cpu =task_cpu (prev); -u64 now =cpu_clock (cpu);if (next->pid) {psi_flags_change (next,0 ,TSK_ONCPU );
@@ -936,7 +934,7 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,break ; } -psi_group_change (group, cpu,0 ,TSK_ONCPU , now, true); +psi_group_change (group, cpu,0 ,TSK_ONCPU , true); }while ((group = group->parent)); }
@@ -974,7 +972,7 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,do {if (group == common)break ; -psi_group_change (group, cpu, clear, set, now, wake_clock); +psi_group_change (group, cpu, clear, set, wake_clock); }while ((group = group->parent));/*
@@ -986,7 +984,7 @@ void psi_task_switch(struct task_struct *prev, struct task_struct *next,if ((prev->psi_flags ^ next->psi_flags) & ~TSK_ONCPU ) { clear &= ~TSK_ONCPU ;for (; group; group = group->parent) -psi_group_change (group, cpu, clear, set, now, wake_clock); +psi_group_change (group, cpu, clear, set, wake_clock); } } }
@@ -997,8 +995,8 @@ void psi_account_irqtime(struct rq *rq, struct task_struct *curr, struct task_stint cpu =task_cpu (curr);struct psi_group *group;struct psi_group_cpu *groupc; -u64 now, irq;s64 delta; +u64 irq;if (static_branch_likely (&psi_disabled))return ;
@@ -1011,7 +1009,6 @@ void psi_account_irqtime(struct rq *rq, struct task_struct *curr, struct task_stif (prev &&task_psi_group (prev) == group)return ; - now =cpu_clock (cpu); irq =irq_time_read (cpu); delta = (s64)(irq - rq->psi_irq_time);if (delta <0 )
@@ -1019,12 +1016,15 @@ void psi_account_irqtime(struct rq *rq, struct task_struct *curr, struct task_st rq->psi_irq_time = irq; do { + u64 now; + if (!group->enabled) continue; groupc = per_cpu_ptr(group->pcpu, cpu); write_seqcount_begin(&groupc->seq); + now = cpu_clock(cpu); record_times(groupc, now); groupc->times[PSI_IRQ_FULL] += delta;
@@ -1223,11 +1223,9 @@ void psi_cgroup_restart(struct psi_group *group)for_each_possible_cpu (cpu) {struct rq *rq =cpu_rq (cpu);struct rq_flags rf; -u64 now;rq_lock_irq (rq, &rf); - now =cpu_clock (cpu); -psi_group_change (group, cpu,0 ,0 , now, true); +psi_group_change (group, cpu,0 ,0 , true);rq_unlock_irq (rq, &rf); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 458/482 sunrpc: change sp_nrthreads from atomic_t to unsigned int.
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
[ Upstream commit 60749cbe3d8ae572a6c7dda675de3e8b25797a18 ]
sp_nrthreads is only ever accessed under the service mutex
nlmsvc_mutex nfs_callback_mutex nfsd_mutex
so these is no need for it to be an atomic_t.
The fact that all code using it is single-threaded means that we can simplify svc_pool_victim and remove the temporary elevation of sp_nrthreads.
Stable-dep-of: aadc3bbea163 ("NFSD: Limit the number of concurrent async COPY operations")
--- fs/nfsd/nfsctl.c | 2 +- fs/nfsd/nfssvc.c | 2 +- include/linux/sunrpc/svc.h | 4 ++-- net/sunrpc/svc.c | 31 +++++++++++-------------------- 4 files changed, 15 insertions(+), 24 deletions(-)
fs/nfsd/nfsctl.c +1 -1
@@ -1746,7 +1746,7 @@ int nfsd_nl_threads_get_doit(struct sk_buff *skb, struct genl_info *info)struct svc_pool *sp = &nn->nfsd_serv->sv_pools[i]; err =nla_put_u32 (skb,NFSD_A_SERVER_THREADS , -atomic_read (&sp->sp_nrthreads)); + sp->sp_nrthreads);if (err) goto err_unlock; }
fs/nfsd/nfssvc.c +1 -1
@@ -705,7 +705,7 @@ int nfsd_get_nrthreads(int n, int *nthreads, struct net *net)if (serv)for (i =0 ; i < serv->sv_nrpools && i < n; i++) - nthreads[i] =atomic_read (&serv->sv_pools[i].sp_nrthreads); + nthreads[i] = serv->sv_pools[i].sp_nrthreads;return 0 ; }
include/linux/sunrpc/svc.h +2 -2
@@ -33,9 +33,9 @@* node traffic on multi-node NUMA NFS servers. */ struct svc_pool { -unsigned int sp_id;/* pool id; also node id on NUMA */ +unsigned int sp_id;/* pool id; also node id on NUMA */ struct lwq sp_xprts;/* pending transports */ -atomic_t sp_nrthreads;/* # of threads in pool */ +unsigned int sp_nrthreads;/* # of threads in pool */ struct list_head sp_all_threads;/* all server threads */ struct llist_head sp_idle_threads;/* idle server threads */
net/sunrpc/svc.c +11 -20
@@ -682,7 +682,7 @@ svc_prepare_thread(struct svc_serv *serv, struct svc_pool *pool, int node) serv->sv_nrthreads +=1 ;spin_unlock_bh (&serv->sv_lock); -atomic_inc (&pool->sp_nrthreads); + pool->sp_nrthreads +=1 ;/* Protected by whatever lock the service uses when calling * svc_set_num_threads()
@@ -737,31 +737,22 @@ svc_pool_victim(struct svc_serv *serv, struct svc_pool *target_pool,struct svc_pool *pool;unsigned int i; -retry: pool = target_pool; -if (pool !=NULL ) { -if (atomic_inc_not_zero (&pool->sp_nrthreads)) - goto found_pool; -return NULL ; - }else { +if (!pool) {for (i =0 ; i < serv->sv_nrpools; i++) { pool = &serv->sv_pools[--(*state) % serv->sv_nrpools]; -if (atomic_inc_not_zero (&pool->sp_nrthreads)) - goto found_pool; +if (pool->sp_nrthreads) +break ; } -return NULL ; } -found_pool: -set_bit (SP_VICTIM_REMAINS , &pool->sp_flags); -set_bit (SP_NEED_VICTIM , &pool->sp_flags); -if (!atomic_dec_and_test (&pool->sp_nrthreads)) +if (pool && pool->sp_nrthreads) { +set_bit (SP_VICTIM_REMAINS , &pool->sp_flags); +set_bit (SP_NEED_VICTIM , &pool->sp_flags);return pool; -/* Nothing left in this pool any more */ -clear_bit (SP_NEED_VICTIM , &pool->sp_flags); -clear_bit (SP_VICTIM_REMAINS , &pool->sp_flags); - goto retry; + } +return NULL ; } static int
@@ -840,7 +831,7 @@ svc_set_num_threads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)if (!pool) nrservs -= serv->sv_nrthreads;else - nrservs -=atomic_read (&pool->sp_nrthreads); + nrservs -= pool->sp_nrthreads;if (nrservs >0 )return svc_start_kthreads (serv, pool, nrservs);
@@ -928,7 +919,7 @@ svc_exit_thread(struct svc_rqst *rqstp)list_del_rcu (&rqstp->rq_all); -atomic_dec (&pool->sp_nrthreads); + pool->sp_nrthreads -=1 ;spin_lock_bh (&serv->sv_lock); serv->sv_nrthreads -=1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 459/482 NFSD: Async COPY result needs to return a write verifier
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 9ed666eba4e0a2bb8ffaa3739d830b64d4f2aaad ]
Currently, when NFSD handles an asynchronous COPY, it returns a zero write verifier, relying on the subsequent CB_OFFLOAD callback to pass the write verifier and a stable_how4 value to the client.
However, if the CB_OFFLOAD never arrives at the client (for example, if a network partition occurs just as the server sends the CB_OFFLOAD operation), the client will never receive this verifier. Thus, if the client sends a follow-up COMMIT, there is no way for the client to assess the COMMIT result.
The usual recovery for a missing CB_OFFLOAD is for the client to send an OFFLOAD_STATUS operation, but that operation does not carry a write verifier in its result. Neither does it carry a stable_how4 value, so the client /must/ send a COMMIT in this case -- which will always fail because currently there's still no write verifier in the COPY result.
Thus the server needs to return a normal write verifier in its COPY result even if the COPY operation is to be performed asynchronously.
If the server recognizes the callback stateid in subsequent OFFLOAD_STATUS operations, then obviously it has not restarted, and the write verifier the client received in the COPY result is still valid and can be used to assess a COMMIT of the copied data, if one is needed.
Stable-dep-of: aadc3bbea163 ("NFSD: Limit the number of concurrent async COPY operations")
--- fs/nfsd/nfs4proc.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-)
fs/nfsd/nfs4proc.c +8 -15
@@ -751,15 +751,6 @@ nfsd4_access(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, &access->ac_supported); } -static void gen_boot_verifier (nfs4_verifier *verifier,struct net *net) -{ -__be32 *verf = (__be32 *)verifier->data; - -BUILD_BUG_ON (2 *sizeof (*verf) !=sizeof (verifier->data)); - -nfsd_copy_write_verifier (verf,net_generic (net, nfsd_net_id)); -} -static __be32 nfsd4_commit (struct svc_rqst *rqstp,struct nfsd4_compound_state *cstate,union nfsd4_op_u *u)
@@ -1630,7 +1621,6 @@ static void nfsd4_init_copy_res(struct nfsd4_copy *copy, bool sync)test_bit (NFSD4_COPY_F_COMMITTED , ©->cp_flags) ?NFS_FILE_SYNC :NFS_UNSTABLE ;nfsd4_copy_set_sync (copy, sync); -gen_boot_verifier (©->cp_res.wr_verifier, copy->cp_clp->net); } static ssize_t _nfsd_copy_file_range(struct nfsd4_copy *copy,
@@ -1803,9 +1793,11 @@ static __be32 nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, union nfsd4_op_u *u) { + struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); +struct nfsd4_copy *async_copy =NULL ;struct nfsd4_copy *copy = &u->copy; +struct nfsd42_write_res *result;__be32 status; -struct nfsd4_copy *async_copy =NULL ;/* * Currently, async COPY is not reliable. Force all COPY
@@ -1814,6 +1806,9 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,*/ nfsd4_copy_set_sync (copy, true); + result = ©->cp_res; +nfsd_copy_write_verifier ((__be32 *)&result->wr_verifier.data, nn); + copy->cp_clp = cstate->clp;if (nfsd4_ssc_is_inter (copy)) {trace_nfsd_copy_inter (copy);
@@ -1838,8 +1833,6 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,memcpy (©->fh, &cstate->current_fh.fh_handle,sizeof (struct knfsd_fh ));if (nfsd4_copy_is_async (copy)) { -struct nfsd_net *nn =net_generic (SVC_NET (rqstp), nfsd_net_id); - status =nfserrno (-ENOMEM ); async_copy =kzalloc (sizeof (struct nfsd4_copy ),GFP_KERNEL );if (!async_copy)
@@ -1851,8 +1844,8 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, goto out_err;if (!nfs4_init_copy_state (nn, copy)) goto out_err; -memcpy (©->cp_res.cb_stateid, ©->cp_stateid.cs_stid, -sizeof (copy->cp_res.cb_stateid)); +memcpy (&result->cb_stateid, ©->cp_stateid.cs_stid, +sizeof (result->cb_stateid));dup_copy_fields (copy, async_copy); async_copy->copy_task =kthread_create (nfsd4_do_async_copy, async_copy,"%s" ,"copy thread" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 460/482 NFSD: Limit the number of concurrent async COPY operations
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit aadc3bbea163b6caaaebfdd2b6c4667fbc726752 ]
Nothing appears to limit the number of concurrent async COPY operations that clients can start. In addition, AFAICT each async COPY can copy an unlimited number of 4MB chunks, so can run for a long time. Thus IMO async COPY can become a DoS vector.
Add a restriction mechanism that bounds the number of concurrent background COPY operations. Start simple and try to be fair -- this patch implements a per-namespace limit.
An async COPY request that occurs while this limit is exceeded gets NFS4ERR_DELAY. The requesting client can choose to send the request again after a delay or fall back to a traditional read/write style copy.
If there is need to make the mechanism more sophisticated, we can visit that in future patches.
--- fs/nfsd/netns.h | 1 + fs/nfsd/nfs4proc.c | 11 +++++++++-- fs/nfsd/nfs4state.c | 1 + fs/nfsd/xdr4.h | 1 + 4 files changed, 12 insertions(+), 2 deletions(-)
fs/nfsd/netns.h +1 -0
@@ -148,6 +148,7 @@ struct nfsd_net {u32 s2s_cp_cl_id;struct idr s2s_cp_stateids;spinlock_t s2s_cp_lock; +atomic_t pending_async_copies;/* * Version information
fs/nfsd/nfs4proc.c +9 -2
@@ -1279,6 +1279,7 @@ static void nfs4_put_copy(struct nfsd4_copy *copy) {if (!refcount_dec_and_test (©->refcount))return ; +atomic_dec (©->cp_nn->pending_async_copies);kfree (copy->cp_src);kfree (copy); }
@@ -1833,10 +1834,16 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,memcpy (©->fh, &cstate->current_fh.fh_handle,sizeof (struct knfsd_fh ));if (nfsd4_copy_is_async (copy)) { - status =nfserrno (-ENOMEM ); async_copy =kzalloc (sizeof (struct nfsd4_copy ),GFP_KERNEL );if (!async_copy) goto out_err; + async_copy->cp_nn = nn; +/* Arbitrary cap on number of pending async copy operations */ +if (atomic_inc_return (&nn->pending_async_copies) > + (int )rqstp->rq_pool->sp_nrthreads) { +atomic_dec (&nn->pending_async_copies); + goto out_err; + }INIT_LIST_HEAD (&async_copy->copies);refcount_set (&async_copy->refcount,1 ); async_copy->cp_src =kmalloc (sizeof (*async_copy->cp_src),GFP_KERNEL );
@@ -1876,7 +1883,7 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, }if (async_copy)cleanup_async_copy (async_copy); - status =nfserrno (-ENOMEM ); + status = nfserr_jukebox; goto out; }
fs/nfsd/nfs4state.c +1 -0
@@ -8575,6 +8575,7 @@ static int nfs4_state_create_net(struct net *net)spin_lock_init (&nn->client_lock);spin_lock_init (&nn->s2s_cp_lock);idr_init (&nn->s2s_cp_stateids); +atomic_set (&nn->pending_async_copies,0 );spin_lock_init (&nn->blocked_locks_lock);INIT_LIST_HEAD (&nn->blocked_locks_lru);
fs/nfsd/xdr4.h +1 -0
@@ -713,6 +713,7 @@ struct nfsd4_copy {struct nfsd4_ssc_umount_item *ss_nsui;struct nfs_fh c_fh;nfs4_stateid stateid; +struct nfsd_net *cp_nn; };static inline void nfsd4_copy_set_sync (struct nfsd4_copy *copy,bool sync)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 461/482 net: mana: Add support for page sizes other than 4KB on ARM64
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haiyang Zhang <[email protected]>
[ Upstream commit 382d1741b5b2feffef7942dd074206372afe1a96 ]
As defined by the MANA Hardware spec, the queue size for DMA is 4KB minimal, and power of 2. And, the HWC queue size has to be exactly 4KB.
To support page sizes other than 4KB on ARM64, define the minimal queue size as a macro separately from the PAGE_SIZE, which we always assumed it to be 4KB before supporting ARM64.
Also, add MANA specific macros and update code related to size alignment, DMA region calculations, etc.
Stable-dep-of: 9e517a8e9d9a ("RDMA/mana_ib: use the correct page table index based on hardware page size")
--- drivers/net/ethernet/microsoft/Kconfig | 2 +- drivers/net/ethernet/microsoft/mana/gdma_main.c | 10 +++++----- drivers/net/ethernet/microsoft/mana/hw_channel.c | 14 +++++++------- drivers/net/ethernet/microsoft/mana/mana_en.c | 8 ++++---- drivers/net/ethernet/microsoft/mana/shm_channel.c | 13 +++++++------ include/net/mana/gdma.h | 10 +++++++++- include/net/mana/mana.h | 3 ++- 7 files changed, 35 insertions(+), 25 deletions(-)
drivers/net/ethernet/microsoft/Kconfig +1 -1
@@ -18,7 +18,7 @@ if NET_VENDOR_MICROSOFT config MICROSOFT_MANA tristate "Microsoft Azure Network Adapter (MANA) support" depends on PCI_MSI - depends on X86_64 || (ARM64 && !CPU_BIG_ENDIAN && ARM64_4K_PAGES) + depends on X86_64 || (ARM64 && !CPU_BIG_ENDIAN) depends on PCI_HYPERV select AUXILIARY_BUS select PAGE_POOL
drivers/net/ethernet/microsoft/mana/gdma_main.c +5 -5
@@ -182,7 +182,7 @@ int mana_gd_alloc_memory(struct gdma_context *gc, unsigned int length,dma_addr_t dma_handle;void *buf; -if (length <PAGE_SIZE || !is_power_of_2 (length)) +if (length <MANA_PAGE_SIZE || !is_power_of_2 (length))return -EINVAL ; gmi->dev = gc->dev;
@@ -717,7 +717,7 @@ EXPORT_SYMBOL_NS(mana_gd_destroy_dma_region, NET_MANA);static int mana_gd_create_dma_region (struct gdma_dev *gd,struct gdma_mem_info *gmi) { -unsigned int num_page = gmi->length /PAGE_SIZE ; +unsigned int num_page = gmi->length /MANA_PAGE_SIZE ;struct gdma_create_dma_region_req *req =NULL ;struct gdma_create_dma_region_resp resp = {};struct gdma_context *gc = gd->gdma_context;
@@ -727,10 +727,10 @@ static int mana_gd_create_dma_region(struct gdma_dev *gd,int err;int i; -if (length <PAGE_SIZE || !is_power_of_2 (length)) +if (length <MANA_PAGE_SIZE || !is_power_of_2 (length))return -EINVAL ; -if (offset_in_page (gmi->virt_addr) !=0 ) +if (!MANA_PAGE_ALIGNED (gmi->virt_addr))return -EINVAL ; hwc = gc->hwc.driver_data;
@@ -751,7 +751,7 @@ static int mana_gd_create_dma_region(struct gdma_dev *gd, req->page_addr_list_len = num_page;for (i =0 ; i < num_page; i++) - req->page_addr_list[i] = gmi->dma_handle + i *PAGE_SIZE ; + req->page_addr_list[i] = gmi->dma_handle + i *MANA_PAGE_SIZE ; err =mana_gd_send_request (gc, req_msg_size, req,sizeof (resp), &resp);if (err)
drivers/net/ethernet/microsoft/mana/hw_channel.c +7 -7
@@ -368,12 +368,12 @@ static int mana_hwc_create_cq(struct hw_channel_context *hwc, u16 q_depth,int err; eq_size =roundup_pow_of_two (GDMA_EQE_SIZE * q_depth); -if (eq_size <MINIMUM_SUPPORTED_PAGE_SIZE ) - eq_size =MINIMUM_SUPPORTED_PAGE_SIZE ; +if (eq_size <MANA_MIN_QSIZE ) + eq_size =MANA_MIN_QSIZE ; cq_size =roundup_pow_of_two (GDMA_CQE_SIZE * q_depth); -if (cq_size <MINIMUM_SUPPORTED_PAGE_SIZE ) - cq_size =MINIMUM_SUPPORTED_PAGE_SIZE ; +if (cq_size <MANA_MIN_QSIZE ) + cq_size =MANA_MIN_QSIZE ; hwc_cq =kzalloc (sizeof (*hwc_cq),GFP_KERNEL );if (!hwc_cq)
@@ -435,7 +435,7 @@ static int mana_hwc_alloc_dma_buf(struct hw_channel_context *hwc, u16 q_depth, dma_buf->num_reqs = q_depth; - buf_size =PAGE_ALIGN (q_depth * max_msg_size); + buf_size =MANA_PAGE_ALIGN (q_depth * max_msg_size); gmi = &dma_buf->mem_info; err =mana_gd_alloc_memory (gc, buf_size, gmi);
@@ -503,8 +503,8 @@ static int mana_hwc_create_wq(struct hw_channel_context *hwc,else queue_size =roundup_pow_of_two (GDMA_MAX_SQE_SIZE * q_depth); -if (queue_size <MINIMUM_SUPPORTED_PAGE_SIZE ) - queue_size =MINIMUM_SUPPORTED_PAGE_SIZE ; +if (queue_size <MANA_MIN_QSIZE ) + queue_size =MANA_MIN_QSIZE ; hwc_wq =kzalloc (sizeof (*hwc_wq),GFP_KERNEL );if (!hwc_wq)
drivers/net/ethernet/microsoft/mana/mana_en.c +4 -4
@@ -1901,10 +1901,10 @@ static int mana_create_txq(struct mana_port_context *apc,* to prevent overflow. */ txq_size =MAX_SEND_BUFFERS_PER_QUEUE *32 ; -BUILD_BUG_ON (!PAGE_ALIGNED (txq_size)); +BUILD_BUG_ON (!MANA_PAGE_ALIGNED (txq_size)); cq_size =MAX_SEND_BUFFERS_PER_QUEUE *COMP_ENTRY_SIZE ; - cq_size =PAGE_ALIGN (cq_size); + cq_size =MANA_PAGE_ALIGN (cq_size); gc = gd->gdma_context;
@@ -2203,8 +2203,8 @@ static struct mana_rxq *mana_create_rxq(struct mana_port_context *apc,if (err) goto out; - rq_size =PAGE_ALIGN (rq_size); - cq_size =PAGE_ALIGN (cq_size); + rq_size =MANA_PAGE_ALIGN (rq_size); + cq_size =MANA_PAGE_ALIGN (cq_size);/* Create RQ */ memset (&spec,0 ,sizeof (spec));
drivers/net/ethernet/microsoft/mana/shm_channel.c +7 -6
@@ -6,6 +6,7 @@#include <linux/io.h> #include <linux/mm.h> +#include <net/mana/gdma.h> #include <net/mana/shm_channel.h> #define PAGE_FRAME_L48_WIDTH_BYTES 6
@@ -155,8 +156,8 @@ int mana_smc_setup_hwc(struct shm_channel *sc, bool reset_vf, u64 eq_addr,return err; } -if (!PAGE_ALIGNED (eq_addr) || !PAGE_ALIGNED (cq_addr) || - !PAGE_ALIGNED (rq_addr) || !PAGE_ALIGNED (sq_addr)) +if (!MANA_PAGE_ALIGNED (eq_addr) || !MANA_PAGE_ALIGNED (cq_addr) || + !MANA_PAGE_ALIGNED (rq_addr) || !MANA_PAGE_ALIGNED (sq_addr))return -EINVAL ;if ((eq_msix_index &VECTOR_MASK ) != eq_msix_index)
@@ -183,7 +184,7 @@ int mana_smc_setup_hwc(struct shm_channel *sc, bool reset_vf, u64 eq_addr,/* EQ addr: low 48 bits of frame address */ shmem = (u64 *)ptr; - frame_addr =PHYS_PFN (eq_addr); + frame_addr =MANA_PFN (eq_addr); *shmem = frame_addr &PAGE_FRAME_L48_MASK ; all_addr_h4bits |= (frame_addr >>PAGE_FRAME_L48_WIDTH_BITS ) << (frame_addr_seq++ *PAGE_FRAME_H4_WIDTH_BITS );
@@ -191,7 +192,7 @@ int mana_smc_setup_hwc(struct shm_channel *sc, bool reset_vf, u64 eq_addr,/* CQ addr: low 48 bits of frame address */ shmem = (u64 *)ptr; - frame_addr =PHYS_PFN (cq_addr); + frame_addr =MANA_PFN (cq_addr); *shmem = frame_addr &PAGE_FRAME_L48_MASK ; all_addr_h4bits |= (frame_addr >>PAGE_FRAME_L48_WIDTH_BITS ) << (frame_addr_seq++ *PAGE_FRAME_H4_WIDTH_BITS );
@@ -199,7 +200,7 @@ int mana_smc_setup_hwc(struct shm_channel *sc, bool reset_vf, u64 eq_addr,/* RQ addr: low 48 bits of frame address */ shmem = (u64 *)ptr; - frame_addr =PHYS_PFN (rq_addr); + frame_addr =MANA_PFN (rq_addr); *shmem = frame_addr &PAGE_FRAME_L48_MASK ; all_addr_h4bits |= (frame_addr >>PAGE_FRAME_L48_WIDTH_BITS ) << (frame_addr_seq++ *PAGE_FRAME_H4_WIDTH_BITS );
@@ -207,7 +208,7 @@ int mana_smc_setup_hwc(struct shm_channel *sc, bool reset_vf, u64 eq_addr,/* SQ addr: low 48 bits of frame address */ shmem = (u64 *)ptr; - frame_addr =PHYS_PFN (sq_addr); + frame_addr =MANA_PFN (sq_addr); *shmem = frame_addr &PAGE_FRAME_L48_MASK ; all_addr_h4bits |= (frame_addr >>PAGE_FRAME_L48_WIDTH_BITS ) << (frame_addr_seq++ *PAGE_FRAME_H4_WIDTH_BITS );
include/net/mana/gdma.h +9 -1
@@ -224,7 +224,15 @@ struct gdma_dev {struct auxiliary_device *adev; }; -#define MINIMUM_SUPPORTED_PAGE_SIZE PAGE_SIZE +/* MANA_PAGE_SIZE is the DMA unit */ +#define MANA_PAGE_SHIFT 12 +#define MANA_PAGE_SIZE BIT(MANA_PAGE_SHIFT) +#define MANA_PAGE_ALIGN (x) ALIGN((x), MANA_PAGE_SIZE) +#define MANA_PAGE_ALIGNED (addr) IS_ALIGNED((unsigned long)(addr), MANA_PAGE_SIZE) +#define MANA_PFN (a) ((a) >> MANA_PAGE_SHIFT) + +/* Required by HW */ +#define MANA_MIN_QSIZE MANA_PAGE_SIZE#define GDMA_CQE_SIZE 64#define GDMA_EQE_SIZE 16
include/net/mana/mana.h +2 -1
@@ -42,7 +42,8 @@ enum TRI_STATE {#define MAX_SEND_BUFFERS_PER_QUEUE 256 -#define EQ_SIZE (8 * PAGE_SIZE) +#define EQ_SIZE (8 * MANA_PAGE_SIZE) +#define LOG2_EQ_THROTTLE 3#define MAX_PORTS_IN_MANA_DEV 256
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 462/482 RDMA/mana_ib: use the correct page table index based on hardware page size
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Long Li <[email protected]>
[ Upstream commit 9e517a8e9d9a303bf9bde35e5c5374795544c152 ]
MANA hardware uses 4k page size. When calculating the page table index, it should use the hardware page size, not the system page size.
--- drivers/infiniband/hw/mana/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/mana/main.c +1 -1
@@ -383,7 +383,7 @@ static int mana_ib_gd_create_dma_region(struct mana_ib_dev *dev, struct ib_umem create_req->length = umem->length; create_req->offset_in_page =ib_umem_dma_offset (umem, page_sz); - create_req->gdma_page_type =order_base_2 (page_sz) -PAGE_SHIFT ; + create_req->gdma_page_type =order_base_2 (page_sz) -MANA_PAGE_SHIFT ; create_req->page_count = num_pages_total; ibdev_dbg(&dev->ib_dev, "size_dma_region %lu num_pages_total %lu\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 463/482 remoteproc: k3-r5: Acquire mailbox handle during probe routine
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Beleswar Padhi <[email protected]>
[ Upstream commit f3f11cfe890733373ddbb1ce8991ccd4ee5e79e1 ]
Acquire the mailbox handle during device probe and do not release handle in stop/detach routine or error paths. This removes the redundant requests for mbox handle later during rproc start/attach. This also allows to defer remoteproc driver's probe if mailbox is not probed yet.
Stable-dep-of: 8fa052c29e50 ("remoteproc: k3-r5: Delay notification of wakeup event")
--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 78 +++++++++--------------- 1 file changed, 30 insertions(+), 48 deletions(-)
drivers/remoteproc/ti_k3_r5_remoteproc.c +30 -48
@@ -194,6 +194,10 @@ static void k3_r5_rproc_mbox_callback(struct mbox_client *client, void *data)const char *name = kproc->rproc->name;u32 msg =omap_mbox_message (data); +/* Do not forward message from a detached core */ +if (kproc->rproc->state ==RPROC_DETACHED ) +return ; +dev_dbg (dev,"mbox msg: 0x%x\n" , msg);switch (msg) {
@@ -229,6 +233,10 @@ static void k3_r5_rproc_kick(struct rproc *rproc, int vqid)mbox_msg_t msg = (mbox_msg_t )vqid;int ret; +/* Do not forward message to a detached core */ +if (kproc->rproc->state ==RPROC_DETACHED ) +return ; +/* send the index of the triggered virtqueue in the mailbox payload */ ret =mbox_send_message (kproc->mbox, (void *)msg);if (ret <0 )
@@ -399,12 +407,9 @@ static int k3_r5_rproc_request_mbox(struct rproc *rproc) client->knows_txdone = false; kproc->mbox =mbox_request_channel (client,0 ); -if (IS_ERR (kproc->mbox)) { - ret = -EBUSY ; -dev_err (dev,"mbox_request_channel failed: %ld\n" , -PTR_ERR (kproc->mbox)); -return ret; - } +if (IS_ERR (kproc->mbox)) +return dev_err_probe (dev,PTR_ERR (kproc->mbox), +"mbox_request_channel failed\n" );/* * Ping the remote processor, this is only for sanity-sake for now;
@@ -552,10 +557,6 @@ static int k3_r5_rproc_start(struct rproc *rproc)u32 boot_addr;int ret; - ret =k3_r5_rproc_request_mbox (rproc); -if (ret) -return ret; - boot_addr = rproc->bootaddr;/* TODO: add boot_addr sanity checking */ dev_dbg (dev,"booting R5F core using boot addr = 0x%x\n" , boot_addr);
@@ -564,7 +565,7 @@ static int k3_r5_rproc_start(struct rproc *rproc) core = kproc->core; ret =ti_sci_proc_set_config (core->tsp, boot_addr,0 ,0 );if (ret) - goto put_mbox; +return ret;/* unhalt/run all applicable cores */ if (cluster->mode ==CLUSTER_MODE_LOCKSTEP ) {
@@ -580,13 +581,12 @@ static int k3_r5_rproc_start(struct rproc *rproc)if (core != core0 && core0->rproc->state ==RPROC_OFFLINE ) {dev_err (dev,"%s: can not start core 1 before core 0\n" , __func__); - ret = -EPERM ; - goto put_mbox; +return -EPERM ; } ret =k3_r5_core_run (core);if (ret) - goto put_mbox; +return ret; }return 0 ;
@@ -596,8 +596,6 @@ static int k3_r5_rproc_start(struct rproc *rproc)if (k3_r5_core_halt (core))dev_warn (core->dev,"core halt back failed\n" ); } -put_mbox: -mbox_free_channel (kproc->mbox);return ret; }
@@ -658,8 +656,6 @@ static int k3_r5_rproc_stop(struct rproc *rproc) goto out; } -mbox_free_channel (kproc->mbox); -return 0 ; unroll_core_halt:
@@ -674,42 +670,22 @@ static int k3_r5_rproc_stop(struct rproc *rproc)/* * Attach to a running R5F remote processor (IPC-only mode) * -* The R5F attach callback only needs to request the mailbox, the remote -* processor is already booted, so there is no need to issue any TI-SCI -* commands to boot the R5F cores in IPC-only mode. This callback is invoked -* only in IPC-only mode. +* The R5F attach callback is a NOP. The remote processor is already booted, and +* all required resources have been acquired during probe routine, so there is +* no need to issue any TI-SCI commands to boot the R5F cores in IPC-only mode. +* This callback is invoked only in IPC-only mode and exists because +* rproc_validate() checks for its existence. */ -static int k3_r5_rproc_attach (struct rproc *rproc) -{ -struct k3_r5_rproc *kproc = rproc->priv; -struct device *dev = kproc->dev; -int ret; - - ret =k3_r5_rproc_request_mbox (rproc); -if (ret) -return ret; - -dev_info (dev,"R5F core initialized in IPC-only mode\n" ); -return 0 ; -} +static int k3_r5_rproc_attach (struct rproc *rproc) {return 0 ; }/* * Detach from a running R5F remote processor (IPC-only mode) * -* The R5F detach callback performs the opposite operation to attach callback -* and only needs to release the mailbox, the R5F cores are not stopped and -* will be left in booted state in IPC-only mode. This callback is invoked -* only in IPC-only mode. +* The R5F detach callback is a NOP. The R5F cores are not stopped and will be +* left in booted state in IPC-only mode. This callback is invoked only in +* IPC-only mode and exists for sanity sake. */ -static int k3_r5_rproc_detach (struct rproc *rproc) -{ -struct k3_r5_rproc *kproc = rproc->priv; -struct device *dev = kproc->dev; - -mbox_free_channel (kproc->mbox); -dev_info (dev,"R5F core deinitialized in IPC-only mode\n" ); -return 0 ; -} +static int k3_r5_rproc_detach (struct rproc *rproc) {return 0 ; }/* * This function implements the .get_loaded_rsc_table() callback and is used
@@ -1278,6 +1254,10 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev) kproc->rproc = rproc; core->rproc = rproc; + ret =k3_r5_rproc_request_mbox (rproc); +if (ret) +return ret; + ret =k3_r5_rproc_configure_mode (kproc);if (ret <0 ) goto err_config;
@@ -1396,6 +1376,8 @@ static void k3_r5_cluster_rproc_exit(void *data) } } +mbox_free_channel (kproc->mbox); +rproc_del (rproc);k3_r5_reserved_mem_exit (kproc);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 464/482 remoteproc: k3-r5: Delay notification of wakeup event
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Udit Kumar <[email protected]>
[ Upstream commit 8fa052c29e509f3e47d56d7fc2ca28094d78c60a ]
Few times, core1 was scheduled to boot first before core0, which leads to error:
'k3_r5_rproc_start: can not start core 1 before core 0'.
This was happening due to some scheduling between prepare and start callback. The probe function waits for event, which is getting triggered by prepare callback. To avoid above condition move event trigger to start instead of prepare callback.
--- drivers/remoteproc/ti_k3_r5_remoteproc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/remoteproc/ti_k3_r5_remoteproc.c +3 -2
@@ -469,8 +469,6 @@ static int k3_r5_rproc_prepare(struct rproc *rproc) ret);return ret; } - core->released_from_reset = true; -wake_up_interruptible (&cluster->core_transition);/* * Newer IP revisions like on J7200 SoCs support h/w auto-initialization
@@ -587,6 +585,9 @@ static int k3_r5_rproc_start(struct rproc *rproc) ret =k3_r5_core_run (core);if (ret)return ret; + + core->released_from_reset = true; +wake_up_interruptible (&cluster->core_transition); }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 465/482 iio: pressure: bmp280: Improve indentation and line wrapping
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasileios Amoiridis <[email protected]>
[ Upstream commit 439ce8961bdd2e925c1f6adc82ce9fe3931e2c08 ]
Fix indentations that are not following the standards, remove extra white lines and add missing white lines.
Stable-dep-of: b9065b0250e1 ("iio: pressure: bmp280: Fix regmap for BMP280 device")
--- drivers/iio/pressure/bmp280-core.c | 108 ++++++++++++++++------------- drivers/iio/pressure/bmp280-spi.c | 4 +- 2 files changed, 61 insertions(+), 51 deletions(-)
drivers/iio/pressure/bmp280-core.c +59 -49
@@ -52,7 +52,6 @@*/ enum {AC1 ,AC2 ,AC3 ,AC4 ,AC5 ,AC6 ,B1 ,B2 ,MB ,MC ,MD }; -enum bmp380_odr {BMP380_ODR_200HZ ,BMP380_ODR_100HZ ,
@@ -181,18 +180,19 @@ static int bmp280_read_calib(struct bmp280_data *data)struct bmp280_calib *calib = &data->calib.bmp280;int ret; -/* Read temperature and pressure calibration values. */ ret =regmap_bulk_read (data->regmap,BMP280_REG_COMP_TEMP_START , - data->bmp280_cal_buf,sizeof (data->bmp280_cal_buf)); + data->bmp280_cal_buf, +sizeof (data->bmp280_cal_buf));if (ret <0 ) {dev_err (data->dev, -"failed to read temperature and pressure calibration parameters\n" ); +"failed to read calibration parameters\n" );return ret; } -/* Toss the temperature and pressure calibration data into the entropy pool */ -add_device_randomness (data->bmp280_cal_buf,sizeof (data->bmp280_cal_buf)); +/* Toss calibration data into the entropy pool */ +add_device_randomness (data->bmp280_cal_buf, +sizeof (data->bmp280_cal_buf));/* Parse temperature calibration values. */ calib->T1 =le16_to_cpu (data->bmp280_cal_buf[T1 ]);
@@ -223,7 +223,7 @@ static int bme280_read_calib(struct bmp280_data *data)/* Load shared calibration params with bmp280 first */ ret =bmp280_read_calib (data);if (ret <0 ) { -dev_err (dev,"failed to read common bmp280 calibration parameters\n" ); +dev_err (dev,"failed to read calibration parameters\n" );return ret; }
@@ -283,6 +283,7 @@ static int bme280_read_calib(struct bmp280_data *data)return 0 ; } +/* * Returns humidity in percent, resolution is 0.01 percent. Output value of * "47445" represents 47445/1024 = 46.333 %RH.
@@ -305,7 +306,7 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data, var =clamp_val (var,0 ,419430400 );return var >>12 ; -}; +}/* * Returns temperature in DegC, resolution is 0.01 DegC. Output value of
@@ -538,7 +539,7 @@ static int bmp280_read_raw(struct iio_dev *indio_dev, }static int bmp280_write_oversampling_ratio_humid (struct bmp280_data *data, -int val) +int val) {const int *avail = data->chip_info->oversampling_humid_avail;const int n = data->chip_info->num_oversampling_humid_avail;
@@ -563,7 +564,7 @@ static int bmp280_write_oversampling_ratio_humid(struct bmp280_data *data, }static int bmp280_write_oversampling_ratio_temp (struct bmp280_data *data, -int val) +int val) {const int *avail = data->chip_info->oversampling_temp_avail;const int n = data->chip_info->num_oversampling_temp_avail;
@@ -588,7 +589,7 @@ static int bmp280_write_oversampling_ratio_temp(struct bmp280_data *data, }static int bmp280_write_oversampling_ratio_press (struct bmp280_data *data, -int val) +int val) {const int *avail = data->chip_info->oversampling_press_avail;const int n = data->chip_info->num_oversampling_press_avail;
@@ -772,13 +773,12 @@ static int bmp280_chip_config(struct bmp280_data *data)int ret; ret =regmap_write_bits (data->regmap,BMP280_REG_CTRL_MEAS , -BMP280_OSRS_TEMP_MASK | -BMP280_OSRS_PRESS_MASK | -BMP280_MODE_MASK , - osrs |BMP280_MODE_NORMAL ); +BMP280_OSRS_TEMP_MASK | +BMP280_OSRS_PRESS_MASK | +BMP280_MODE_MASK , + osrs |BMP280_MODE_NORMAL );if (ret <0 ) { -dev_err (data->dev, -"failed to write ctrl_meas register\n" ); +dev_err (data->dev,"failed to write ctrl_meas register\n" );return ret; }
@@ -786,8 +786,7 @@ static int bmp280_chip_config(struct bmp280_data *data)BMP280_FILTER_MASK , BMP280_FILTER_4X);if (ret <0 ) { -dev_err (data->dev, -"failed to write config register\n" ); +dev_err (data->dev,"failed to write config register\n" );return ret; }
@@ -926,8 +925,8 @@ static int bmp380_cmd(struct bmp280_data *data, u8 cmd) }/* -* Returns temperature in Celsius degrees, resolution is 0.01º C. Output value of -* "5123" equals 51.2º C. t_fine carries fine temperature as global value. +* Returns temperature in Celsius degrees, resolution is 0.01º C. Output value +* of "5123" equals 51.2º C. t_fine carries fine temperature as global value. * * Taken from datasheet, Section Appendix 9, "Compensation formula" and repo * https://github.com/BoschSensortec/BMP3-Sensor-API.
@@ -1069,7 +1068,8 @@ static int bmp380_read_calib(struct bmp280_data *data)/* Read temperature and pressure calibration data */ ret =regmap_bulk_read (data->regmap,BMP380_REG_CALIB_TEMP_START , - data->bmp380_cal_buf,sizeof (data->bmp380_cal_buf)); + data->bmp380_cal_buf, +sizeof (data->bmp380_cal_buf));if (ret) {dev_err (data->dev,"failed to read temperature calibration parameters\n" );
@@ -1077,7 +1077,8 @@ static int bmp380_read_calib(struct bmp280_data *data) }/* Toss the temperature calibration data into the entropy pool */ -add_device_randomness (data->bmp380_cal_buf,sizeof (data->bmp380_cal_buf)); +add_device_randomness (data->bmp380_cal_buf, +sizeof (data->bmp380_cal_buf));/* Parse calibration values */ calib->T1 =get_unaligned_le16 (&data->bmp380_cal_buf[BMP380_T1 ]);
@@ -1159,7 +1160,8 @@ static int bmp380_chip_config(struct bmp280_data *data)/* Configure output data rate */ ret =regmap_update_bits_check (data->regmap,BMP380_REG_ODR , -BMP380_ODRS_MASK , data->sampling_freq, &aux); +BMP380_ODRS_MASK , data->sampling_freq, + &aux);if (ret) {dev_err (data->dev,"failed to write ODR selection register\n" );return ret;
@@ -1178,12 +1180,13 @@ static int bmp380_chip_config(struct bmp280_data *data)if (change) {/* -* The configurations errors are detected on the fly during a measurement -* cycle. If the sampling frequency is too low, it's faster to reset -* the measurement loop than wait until the next measurement is due. +* The configurations errors are detected on the fly during a +* measurement cycle. If the sampling frequency is too low, it's +* faster to reset the measurement loop than wait until the next +* measurement is due. * -* Resets sensor measurement loop toggling between sleep and normal -* operating modes. +* Resets sensor measurement loop toggling between sleep and +* normal operating modes. */ ret = regmap_write_bits(data->regmap, BMP380_REG_POWER_CONTROL, BMP380_MODE_MASK,
@@ -1201,22 +1204,21 @@ static int bmp380_chip_config(struct bmp280_data *data)return ret; }/* -* Waits for measurement before checking configuration error flag. -* Selected longest measure time indicated in section 3.9.1 -* in the datasheet. +* Waits for measurement before checking configuration error +* flag. Selected longest measure time indicated in +* section 3.9.1 in the datasheet. */ msleep (80 );/* Check config error flag */ ret =regmap_read (data->regmap,BMP380_REG_ERROR , &tmp);if (ret) { -dev_err (data->dev, -"failed to read error register\n" ); +dev_err (data->dev,"failed to read error register\n" );return ret; }if (tmp &BMP380_ERR_CONF_MASK ) {dev_warn (data->dev, -"sensor flagged configuration as incompatible\n" ); +"sensor flagged configuration as incompatible\n" );return -EINVAL ; } }
@@ -1317,9 +1319,11 @@ static int bmp580_nvm_operation(struct bmp280_data *data, bool is_write) }/* Start NVM operation sequence */ - ret =regmap_write (data->regmap,BMP580_REG_CMD ,BMP580_CMD_NVM_OP_SEQ_0 ); + ret =regmap_write (data->regmap,BMP580_REG_CMD , +BMP580_CMD_NVM_OP_SEQ_0 );if (ret) { -dev_err (data->dev,"failed to send nvm operation's first sequence\n" ); +dev_err (data->dev, +"failed to send nvm operation's first sequence\n" );return ret; }if (is_write) {
@@ -1327,7 +1331,8 @@ static int bmp580_nvm_operation(struct bmp280_data *data, bool is_write) ret =regmap_write (data->regmap,BMP580_REG_CMD ,BMP580_CMD_NVM_WRITE_SEQ_1 );if (ret) { -dev_err (data->dev,"failed to send nvm write sequence\n" ); +dev_err (data->dev, +"failed to send nvm write sequence\n" );return ret; }/* Datasheet says on 4.8.1.2 it takes approximately 10ms */
@@ -1338,7 +1343,8 @@ static int bmp580_nvm_operation(struct bmp280_data *data, bool is_write) ret =regmap_write (data->regmap,BMP580_REG_CMD ,BMP580_CMD_NVM_READ_SEQ_1 );if (ret) { -dev_err (data->dev,"failed to send nvm read sequence\n" ); +dev_err (data->dev, +"failed to send nvm read sequence\n" );return ret; }/* Datasheet says on 4.8.1.1 it takes approximately 200us */
@@ -1501,8 +1507,8 @@ static int bmp580_nvmem_read(void *priv, unsigned int offset, void *val,if (ret) goto exit; - ret =regmap_bulk_read (data->regmap,BMP580_REG_NVM_DATA_LSB , &data->le16, -sizeof (data->le16)); + ret =regmap_bulk_read (data->regmap,BMP580_REG_NVM_DATA_LSB , + &data->le16,sizeof (data->le16));if (ret) {dev_err (data->dev,"error reading nvm data regs\n" ); goto exit;
@@ -1546,7 +1552,8 @@ static int bmp580_nvmem_write(void *priv, unsigned int offset, void *val,while (bytes >=sizeof (*buf)) { addr = bmp580_nvmem_addrs[offset /sizeof (*buf)]; - ret =regmap_write (data->regmap,BMP580_REG_NVM_ADDR ,BMP580_NVM_PROG_EN | + ret =regmap_write (data->regmap,BMP580_REG_NVM_ADDR , +BMP580_NVM_PROG_EN |FIELD_PREP (BMP580_NVM_ROW_ADDR_MASK , addr));if (ret) {dev_err (data->dev,"error writing nvm address\n" );
@@ -1554,8 +1561,8 @@ static int bmp580_nvmem_write(void *priv, unsigned int offset, void *val, } data->le16 =cpu_to_le16 (*buf++); - ret =regmap_bulk_write (data->regmap,BMP580_REG_NVM_DATA_LSB , &data->le16, -sizeof (data->le16)); + ret =regmap_bulk_write (data->regmap,BMP580_REG_NVM_DATA_LSB , + &data->le16,sizeof (data->le16));if (ret) {dev_err (data->dev,"error writing LSB NVM data regs\n" ); goto exit;
@@ -1662,7 +1669,8 @@ static int bmp580_chip_config(struct bmp280_data *data)BMP580_OSR_PRESS_EN ; ret =regmap_update_bits_check (data->regmap,BMP580_REG_OSR_CONFIG , -BMP580_OSR_TEMP_MASK |BMP580_OSR_PRESS_MASK | +BMP580_OSR_TEMP_MASK | +BMP580_OSR_PRESS_MASK |BMP580_OSR_PRESS_EN , reg_val, &aux);if (ret) {
@@ -1713,7 +1721,8 @@ static int bmp580_chip_config(struct bmp280_data *data)*/ ret =regmap_read (data->regmap,BMP580_REG_EFF_OSR , &tmp);if (ret) { -dev_err (data->dev,"error reading effective OSR register\n" ); +dev_err (data->dev, +"error reading effective OSR register\n" );return ret; }if (!(tmp &BMP580_EFF_OSR_VALID_ODR )) {
@@ -1848,7 +1857,8 @@ static int bmp180_read_calib(struct bmp280_data *data) }/* Toss the calibration data into the entropy pool */ -add_device_randomness (data->bmp180_cal_buf,sizeof (data->bmp180_cal_buf)); +add_device_randomness (data->bmp180_cal_buf, +sizeof (data->bmp180_cal_buf)); calib->AC1 =be16_to_cpu (data->bmp180_cal_buf[AC1 ]); calib->AC2 =be16_to_cpu (data->bmp180_cal_buf[AC2 ]);
@@ -1963,8 +1973,7 @@ static u32 bmp180_compensate_press(struct bmp280_data *data, s32 adc_press)return p + ((x1 + x2 +3791 ) >>4 ); } -static int bmp180_read_press (struct bmp280_data *data, -int *val,int *val2) +static int bmp180_read_press (struct bmp280_data *data,int *val,int *val2) {u32 comp_press;s32 adc_press;
@@ -2241,6 +2250,7 @@ static int bmp280_runtime_resume(struct device *dev) ret =regulator_bulk_enable (BMP280_NUM_SUPPLIES , data->supplies);if (ret)return ret; +usleep_range (data->start_up_time, data->start_up_time +100 );return data->chip_info->chip_config (data); }
drivers/iio/pressure/bmp280-spi.c +2 -2
@@ -13,7 +13,7 @@#include "bmp280.h" static int bmp280_regmap_spi_write (void *context,const void *data, -size_t count) +size_t count) {struct spi_device *spi =to_spi_device (context);u8 buf[2 ];
@@ -29,7 +29,7 @@ static int bmp280_regmap_spi_write(void *context, const void *data, }static int bmp280_regmap_spi_read (void *context,const void *reg, -size_t reg_size,void *val,size_t val_size) +size_t reg_size,void *val,size_t val_size) {struct spi_device *spi =to_spi_device (context);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 466/482 iio: pressure: bmp280: Use BME prefix for BME280 specifics
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasileios Amoiridis <[email protected]>
[ Upstream commit b23be4cd99a6f1f46963b87952632268174e62c1 ]
Change the rest of the defines and function names that are used specifically by the BME280 humidity sensor to BME280 as it is done for the rest of the BMP{0,1,3,5}80 sensors.
Stable-dep-of: b9065b0250e1 ("iio: pressure: bmp280: Fix regmap for BMP280 device")
--- drivers/iio/pressure/bmp280-core.c | 37 +++++++++++------------ drivers/iio/pressure/bmp280-regmap.c | 8 ++--- drivers/iio/pressure/bmp280.h | 45 +++++++++++++++------------- 3 files changed, 46 insertions(+), 44 deletions(-)
drivers/iio/pressure/bmp280-core.c +18 -19
@@ -235,14 +235,14 @@ static int bme280_read_calib(struct bmp280_data *data)* Humidity data is only available on BME280. */ - ret =regmap_read (data->regmap,BMP280_REG_COMP_H1 , &tmp); + ret =regmap_read (data->regmap,BME280_REG_COMP_H1 , &tmp);if (ret <0 ) {dev_err (dev,"failed to read H1 comp value\n" );return ret; } calib->H1 = tmp; - ret =regmap_bulk_read (data->regmap,BMP280_REG_COMP_H2 , + ret =regmap_bulk_read (data->regmap,BME280_REG_COMP_H2 , &data->le16,sizeof (data->le16));if (ret <0 ) {dev_err (dev,"failed to read H2 comp value\n" );
@@ -250,14 +250,14 @@ static int bme280_read_calib(struct bmp280_data *data) } calib->H2 =sign_extend32 (le16_to_cpu (data->le16),15 ); - ret =regmap_read (data->regmap,BMP280_REG_COMP_H3 , &tmp); + ret =regmap_read (data->regmap,BME280_REG_COMP_H3 , &tmp);if (ret <0 ) {dev_err (dev,"failed to read H3 comp value\n" );return ret; } calib->H3 = tmp; - ret =regmap_bulk_read (data->regmap,BMP280_REG_COMP_H4 , + ret =regmap_bulk_read (data->regmap,BME280_REG_COMP_H4 , &data->be16,sizeof (data->be16));if (ret <0 ) {dev_err (dev,"failed to read H4 comp value\n" );
@@ -266,15 +266,15 @@ static int bme280_read_calib(struct bmp280_data *data) calib->H4 =sign_extend32 (((be16_to_cpu (data->be16) >>4 ) &0xff0 ) | (be16_to_cpu (data->be16) &0xf ),11 ); - ret =regmap_bulk_read (data->regmap,BMP280_REG_COMP_H5 , + ret =regmap_bulk_read (data->regmap,BME280_REG_COMP_H5 , &data->le16,sizeof (data->le16));if (ret <0 ) {dev_err (dev,"failed to read H5 comp value\n" );return ret; } - calib->H5 =sign_extend32 (FIELD_GET (BMP280_COMP_H5_MASK ,le16_to_cpu (data->le16)),11 ); + calib->H5 =sign_extend32 (FIELD_GET (BME280_COMP_H5_MASK ,le16_to_cpu (data->le16)),11 ); - ret =regmap_read (data->regmap,BMP280_REG_COMP_H6 , &tmp); + ret =regmap_read (data->regmap,BME280_REG_COMP_H6 , &tmp);if (ret <0 ) {dev_err (dev,"failed to read H6 comp value\n" );return ret;
@@ -290,7 +290,7 @@ static int bme280_read_calib(struct bmp280_data *data)* * Taken from BME280 datasheet, Section 4.2.3, "Compensation formula". */ -static u32 bmp280_compensate_humidity (struct bmp280_data *data, +static u32 bme280_compensate_humidity (struct bmp280_data *data,s32 adc_humidity) {struct bmp280_calib *calib = &data->calib.bmp280;
@@ -430,7 +430,7 @@ static int bmp280_read_press(struct bmp280_data *data,return IIO_VAL_FRACTIONAL ; } -static int bmp280_read_humid (struct bmp280_data *data,int *val,int *val2) +static int bme280_read_humid (struct bmp280_data *data,int *val,int *val2) {u32 comp_humidity;s32 adc_humidity;
@@ -441,7 +441,7 @@ static int bmp280_read_humid(struct bmp280_data *data, int *val, int *val2)if (ret <0 )return ret; - ret =regmap_bulk_read (data->regmap,BMP280_REG_HUMIDITY_MSB , + ret =regmap_bulk_read (data->regmap,BME280_REG_HUMIDITY_MSB , &data->be16,sizeof (data->be16));if (ret <0 ) {dev_err (data->dev,"failed to read humidity\n" );
@@ -454,7 +454,7 @@ static int bmp280_read_humid(struct bmp280_data *data, int *val, int *val2)dev_err (data->dev,"reading humidity skipped\n" );return -EIO ; } - comp_humidity =bmp280_compensate_humidity (data, adc_humidity); + comp_humidity =bme280_compensate_humidity (data, adc_humidity); *val = comp_humidity *1000 /1024 ;
@@ -538,7 +538,7 @@ static int bmp280_read_raw(struct iio_dev *indio_dev,return ret; } -static int bmp280_write_oversampling_ratio_humid (struct bmp280_data *data, +static int bme280_write_oversampling_ratio_humid (struct bmp280_data *data,int val) {const int *avail = data->chip_info->oversampling_humid_avail;
@@ -682,7 +682,7 @@ static int bmp280_write_raw(struct iio_dev *indio_dev,mutex_lock (&data->lock);switch (chan->type) {case IIO_HUMIDITYRELATIVE : - ret =bmp280_write_oversampling_ratio_humid (data, val); + ret =bme280_write_oversampling_ratio_humid (data, val);break ;case IIO_PRESSURE : ret =bmp280_write_oversampling_ratio_press (data, val);
@@ -832,16 +832,15 @@ EXPORT_SYMBOL_NS(bmp280_chip_info, IIO_BMP280);static int bme280_chip_config (struct bmp280_data *data) { -u8 osrs =FIELD_PREP (BMP280_OSRS_HUMIDITY_MASK , data->oversampling_humid +1 ); +u8 osrs =FIELD_PREP (BME280_OSRS_HUMIDITY_MASK , data->oversampling_humid +1 );int ret;/* * Oversampling of humidity must be set before oversampling of * temperature/pressure is set to become effective. */ - ret =regmap_update_bits (data->regmap,BMP280_REG_CTRL_HUMIDITY , -BMP280_OSRS_HUMIDITY_MASK , osrs); - + ret =regmap_update_bits (data->regmap,BME280_REG_CTRL_HUMIDITY , +BME280_OSRS_HUMIDITY_MASK , osrs);if (ret <0 )return ret;
@@ -869,12 +868,12 @@ const struct bmp280_chip_info bme280_chip_info = { .oversampling_humid_avail = bmp280_oversampling_avail, .num_oversampling_humid_avail = ARRAY_SIZE(bmp280_oversampling_avail), - .oversampling_humid_default = BMP280_OSRS_HUMIDITY_16X - 1, + .oversampling_humid_default = BME280_OSRS_HUMIDITY_16X - 1, .chip_config = bme280_chip_config, .read_temp = bmp280_read_temp, .read_press = bmp280_read_press, - .read_humid = bmp280_read_humid, + .read_humid = bme280_read_humid, .read_calib = bme280_read_calib, };EXPORT_SYMBOL_NS (bme280_chip_info,IIO_BMP280 );
drivers/iio/pressure/bmp280-regmap.c +4 -4
@@ -45,7 +45,7 @@ static bool bmp280_is_writeable_reg(struct device *dev, unsigned int reg) {switch (reg) {case BMP280_REG_CONFIG : -case BMP280_REG_CTRL_HUMIDITY : +case BME280_REG_CTRL_HUMIDITY :case BMP280_REG_CTRL_MEAS :case BMP280_REG_RESET :return true;
@@ -57,8 +57,8 @@ static bool bmp280_is_writeable_reg(struct device *dev, unsigned int reg)static bool bmp280_is_volatile_reg (struct device *dev,unsigned int reg) {switch (reg) { -case BMP280_REG_HUMIDITY_LSB : -case BMP280_REG_HUMIDITY_MSB : +case BME280_REG_HUMIDITY_LSB : +case BME280_REG_HUMIDITY_MSB :case BMP280_REG_TEMP_XLSB :case BMP280_REG_TEMP_LSB :case BMP280_REG_TEMP_MSB :
@@ -167,7 +167,7 @@ const struct regmap_config bmp280_regmap_config = { .reg_bits = 8, .val_bits = 8, - .max_register = BMP280_REG_HUMIDITY_LSB, + .max_register = BME280_REG_HUMIDITY_LSB, .cache_type = REGCACHE_RBTREE, .writeable_reg = bmp280_is_writeable_reg,
drivers/iio/pressure/bmp280.h +24 -21
75 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 467/482 iio: pressure: bmp280: Fix regmap for BMP280 device
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasileios Amoiridis <[email protected]>
[ Upstream commit b9065b0250e1705935445ede0a18c1850afe7b75 ]
Up to now, the BMP280 device is using the regmap of the BME280 which has registers that exist only in the BME280 device.
--- drivers/iio/pressure/bmp280-core.c | 2 +- drivers/iio/pressure/bmp280-regmap.c | 45 ++++++++++++++++++++++++++-- drivers/iio/pressure/bmp280.h | 1 + 3 files changed, 44 insertions(+), 4 deletions(-)
drivers/iio/pressure/bmp280-core.c +1 -1
@@ -853,7 +853,7 @@ const struct bmp280_chip_info bme280_chip_info = { .id_reg = BMP280_REG_ID, .chip_id = bme280_chip_ids, .num_chip_id = ARRAY_SIZE(bme280_chip_ids), - .regmap_config = &bmp280_regmap_config, + .regmap_config = &bme280_regmap_config, .start_up_time = 2000, .channels = bmp280_channels, .num_channels = 3,
drivers/iio/pressure/bmp280-regmap.c +42 -3
76 lines not on this page · raw message
drivers/iio/pressure/bmp280.h +1 -0
@@ -470,6 +470,7 @@ extern const struct bmp280_chip_info bmp580_chip_info;/* Regmap configurations */ extern const struct regmap_config bmp180_regmap_config;extern const struct regmap_config bmp280_regmap_config; +extern const struct regmap_config bme280_regmap_config;extern const struct regmap_config bmp380_regmap_config;extern const struct regmap_config bmp580_regmap_config;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 468/482 iio: pressure: bmp280: Fix waiting time for BMP3xx configuration
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vasileios Amoiridis <[email protected]>
[ Upstream commit 262a6634bcc4f0c1c53d13aa89882909f281a6aa ]
According to the datasheet, both pressure and temperature can go up to oversampling x32. With this option, the maximum measurement time is not 80ms (this is for press x32 and temp x2), but it is 130ms nominal (calculated from table 3.9.2) and since most of the maximum values are around +15%, it is configured to 150ms.
--- drivers/iio/pressure/bmp280-core.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/iio/pressure/bmp280-core.c +4 -3
@@ -1204,10 +1204,11 @@ static int bmp380_chip_config(struct bmp280_data *data) }/* * Waits for measurement before checking configuration error -* flag. Selected longest measure time indicated in -* section 3.9.1 in the datasheet. +* flag. Selected longest measurement time, calculated from +* formula in datasheet section 3.9.2 with an offset of ~+15% +* as it seen as well in table 3.9.1. */ -msleep (80 ); +msleep (150 );/* Check config error flag */ ret =regmap_read (data->regmap,BMP380_REG_ERROR , &tmp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 469/482 r8169: Fix spelling mistake: "tx_underun" -> "tx_underrun"
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
[ Upstream commit 8df9439389a44fb2cc4ef695e08d6a8870b1616c ]
There is a spelling mistake in the struct field tx_underun, rename it to tx_underrun.
Stable-dep-of: ced8e8b8f40a ("r8169: add tally counter fields added with RTL8125")
--- drivers/net/ethernet/realtek/r8169_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/realtek/r8169_main.c +2 -2
@@ -576,7 +576,7 @@ struct rtl8169_counters {__le64 rx_broadcast;__le32 rx_multicast;__le16 tx_aborted; -__le16 tx_underun; +__le16 tx_underrun; };struct rtl8169_tc_offsets {
@@ -1841,7 +1841,7 @@ static void rtl8169_get_ethtool_stats(struct net_device *dev, data[9 ] =le64_to_cpu (counters->rx_broadcast); data[10 ] =le32_to_cpu (counters->rx_multicast); data[11 ] =le16_to_cpu (counters->tx_aborted); - data[12 ] =le16_to_cpu (counters->tx_underun); + data[12 ] =le16_to_cpu (counters->tx_underrun); }static void rtl8169_get_strings (struct net_device *dev,u32 stringset,u8 *data)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 470/482 r8169: add tally counter fields added with RTL8125
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit ced8e8b8f40accfcce4a2bbd8b150aa76d5eff9a ]
RTL8125 added fields to the tally counter, what may result in the chip dma'ing these new fields to unallocated memory. Therefore make sure that the allocated memory area is big enough to hold all of the tally counter values, even if we use only parts of it.
--- drivers/net/ethernet/realtek/r8169_main.c | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+)
drivers/net/ethernet/realtek/r8169_main.c +27 -0
@@ -577,6 +577,33 @@ struct rtl8169_counters {__le32 rx_multicast;__le16 tx_aborted;__le16 tx_underrun; +/* new since RTL8125 */ +__le64 tx_octets; +__le64 rx_octets; +__le64 rx_multicast64; +__le64 tx_unicast64; +__le64 tx_broadcast64; +__le64 tx_multicast64; +__le32 tx_pause_on; +__le32 tx_pause_off; +__le32 tx_pause_all; +__le32 tx_deferred; +__le32 tx_late_collision; +__le32 tx_all_collision; +__le32 tx_aborted32; +__le32 align_errors32; +__le32 rx_frame_too_long; +__le32 rx_runt; +__le32 rx_pause_on; +__le32 rx_pause_off; +__le32 rx_pause_all; +__le32 rx_unknown_opcode; +__le32 rx_mac_error; +__le32 tx_underrun32; +__le32 rx_mac_missed; +__le32 rx_tcam_dropped; +__le32 tdu; +__le32 rdu; };struct rtl8169_tc_offsets {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 471/482 ACPI: battery: Simplify battery hook locking
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 86309cbed26139e1caae7629dcca1027d9a28e75 ]
Move the conditional locking from __battery_hook_unregister() into battery_hook_unregister() and rename the low-level function to simplify the locking during battery hook removal.
Stable-dep-of: 76959aff14a0 ("ACPI: battery: Fix possible crash when unregistering a battery hook")
--- drivers/acpi/battery.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/acpi/battery.c +9 -9
@@ -703,28 +703,28 @@ static LIST_HEAD(acpi_battery_list);static LIST_HEAD (battery_hook_list);static DEFINE_MUTEX (hook_mutex); -static void __battery_hook_unregister (struct acpi_battery_hook *hook,int lock) +static void battery_hook_unregister_unlocked (struct acpi_battery_hook *hook) {struct acpi_battery *battery; +/* * In order to remove a hook, we first need to * de-register all the batteries that are registered. */ -if (lock) -mutex_lock (&hook_mutex);list_for_each_entry (battery, &acpi_battery_list, list) {if (!hook->remove_battery (battery->bat, hook))power_supply_changed (battery->bat); }list_del (&hook->list); -if (lock) -mutex_unlock (&hook_mutex); +pr_info ("extension unregistered: %s\n" , hook->name); }void battery_hook_unregister (struct acpi_battery_hook *hook) { -__battery_hook_unregister (hook,1 ); +mutex_lock (&hook_mutex); +battery_hook_unregister_unlocked (hook); +mutex_unlock (&hook_mutex); }EXPORT_SYMBOL_GPL (battery_hook_unregister);
@@ -750,7 +750,7 @@ void battery_hook_register(struct acpi_battery_hook *hook)* hooks. */ pr_err ("extension failed to load: %s" , hook->name); -__battery_hook_unregister (hook,0 ); +battery_hook_unregister_unlocked (hook); goto end; }
@@ -789,7 +789,7 @@ static void battery_hook_add_battery(struct acpi_battery *battery)*/ pr_err ("error in extension, unloading: %s" , hook_node->name); -__battery_hook_unregister (hook_node,0 ); +battery_hook_unregister_unlocked (hook_node); } }mutex_unlock (&hook_mutex);
@@ -822,7 +822,7 @@ static void __exit battery_hook_exit(void)* need to remove the hooks. */ list_for_each_entry_safe (hook, ptr, &battery_hook_list, list) { -__battery_hook_unregister (hook,1 ); +battery_hook_unregister (hook); }mutex_destroy (&hook_mutex); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 472/482 ACPI: battery: Fix possible crash when unregistering a battery hook
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 76959aff14a0012ad6b984ec7686d163deccdc16 ]
When a battery hook returns an error when adding a new battery, then the battery hook is automatically unregistered.
However the battery hook provider cannot know that, so it will later call battery_hook_unregister() on the already unregistered battery hook, resulting in a crash.
Fix this by using the list head to mark already unregistered battery hooks as already being unregistered so that they can be ignored by battery_hook_unregister().
--- drivers/acpi/battery.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/acpi/battery.c +9 -3
@@ -715,7 +715,7 @@ static void battery_hook_unregister_unlocked(struct acpi_battery_hook *hook)if (!hook->remove_battery (battery->bat, hook))power_supply_changed (battery->bat); } -list_del (&hook->list); +list_del_init (&hook->list);pr_info ("extension unregistered: %s\n" , hook->name); }
@@ -723,7 +723,14 @@ static void battery_hook_unregister_unlocked(struct acpi_battery_hook *hook)void battery_hook_unregister (struct acpi_battery_hook *hook) {mutex_lock (&hook_mutex); -battery_hook_unregister_unlocked (hook); +/* +* Ignore already unregistered battery hooks. This might happen +* if a battery hook was previously unloaded due to an error when +* adding a new battery. +*/ +if (!list_empty (&hook->list)) +battery_hook_unregister_unlocked (hook); +mutex_unlock (&hook_mutex); }EXPORT_SYMBOL_GPL (battery_hook_unregister);
@@ -733,7 +740,6 @@ void battery_hook_register(struct acpi_battery_hook *hook)struct acpi_battery *battery;mutex_lock (&hook_mutex); -INIT_LIST_HEAD (&hook->list);list_add (&hook->list, &battery_hook_list);/* * Now that the driver is registered, we need
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 473/482 drm/rockchip: vop: enable VOP_FEATURE_INTERNAL_RGB on RK3066
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
commit 6ed51ba95e27221ce87979bd2ad5926033b9e1b9 upstream.
The RK3066 does have RGB display output, so it should be marked as such.
--- drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/rockchip/rockchip_vop_reg.c +1 -0
@@ -515,6 +515,7 @@ static const struct vop_data rk3066_vop .output = &rk3066_output, .win = rk3066_vop_win_data, .win_size = ARRAY_SIZE(rk3066_vop_win_data), + .feature = VOP_FEATURE_INTERNAL_RGB, .max_output = { 1920, 1080 }, };
Greg Kroah-Hartman
maintainerPATCH 474/482 Revert "drm/amd/display: Skip Recompute DSC Params if no Stream on Link"
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Gray <[email protected]>
This reverts commit 6f9c39e8169384d2a5ca9bf323a0c1b81b3d0f3a.
duplicated a change made in 6.10.570275bb960c71d313254473d38c14e7101cee5ad
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 3 --- 1 file changed, 3 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +0 -3
@@ -1267,9 +1267,6 @@ static bool is_dsc_need_re_compute(if (new_stream_on_link_num ==0 )return false; -if (new_stream_on_link_num ==0 ) -return false; -/* check current_state if there stream on link but it is not in * new request state */
Greg Kroah-Hartman
maintainerPATCH 475/482 drm/sched: revert "Always increment correct scheduler score"
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
commit abf201f6ce14c4ceeccde5471bdf59614b83a3d8 upstream.
This reverts commit 087913e0ba2b3b9d7ccbafb2acf5dab9e35ae1d5.
It turned out that the original code was correct since the rq can only change when there is no armed job for an entity.
This change here broke the logic since we only incremented the counter for the first job, so revert it.
--- drivers/gpu/drm/scheduler/sched_entity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/scheduler/sched_entity.c +1 -1
@@ -586,6 +586,7 @@ void drm_sched_entity_push_job(struct drktime_t submit_ts;trace_drm_sched_job (sched_job, entity); +atomic_inc (entity->rq->sched->score);WRITE_ONCE (entity->last_user, current->group_leader);/*
@@ -613,7 +614,6 @@ void drm_sched_entity_push_job(struct dr rq = entity->rq; sched = rq->sched; -atomic_inc (sched->score);drm_sched_rq_add_entity (rq, entity);spin_unlock (&entity->rq_lock);
Greg Kroah-Hartman
maintainerPATCH 476/482 rxrpc: Fix a race between socket set up and I/O thread creation
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit bc212465326e8587325f520a052346f0b57360e6 upstream.
In rxrpc_open_socket(), it sets up the socket and then sets up the I/O thread that will handle it. This is a problem, however, as there's a gap between the two phases in which a packet may come into rxrpc_encap_rcv() from the UDP packet but we oops when trying to wake the not-yet created I/O thread.
As a quick fix, just make rxrpc_encap_rcv() discard the packet if there's no I/O thread yet.
A better, but more intrusive fix would perhaps be to rearrange things such that the socket creation is done by the I/O thread.
--- net/rxrpc/ar-internal.h | 2 +- net/rxrpc/io_thread.c | 10 ++++++++-- net/rxrpc/local_object.c | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-)
net/rxrpc/ar-internal.h +1 -1
@@ -1058,7 +1058,7 @@ bool rxrpc_direct_abort(struct sk_buff *int rxrpc_io_thread (void *data);static inline void rxrpc_wake_up_io_thread (struct rxrpc_local *local) { -wake_up_process (local->io_thread); +wake_up_process (READ_ONCE (local->io_thread)); }static inline bool rxrpc_protocol_error (struct sk_buff *skb,enum rxrpc_abort_reason why)
net/rxrpc/io_thread.c +8 -2
@@ -27,11 +27,17 @@ int rxrpc_encap_rcv(struct sock *udp_sk, {struct sk_buff_head *rx_queue;struct rxrpc_local *local =rcu_dereference_sk_user_data (udp_sk); +struct task_struct *io_thread;if (unlikely (!local)) {kfree_skb (skb);return 0 ; } + io_thread =READ_ONCE (local->io_thread); +if (!io_thread) { +kfree_skb (skb); +return 0 ; + }if (skb->tstamp ==0 ) skb->tstamp =ktime_get_real ();
@@ -47,7 +53,7 @@ int rxrpc_encap_rcv(struct sock *udp_sk,#endif skb_queue_tail (rx_queue, skb); -rxrpc_wake_up_io_thread (local); +wake_up_process (io_thread);return 0 ; }
@@ -565,7 +571,7 @@ int rxrpc_io_thread(void *data)__set_current_state (TASK_RUNNING );rxrpc_see_local (local, rxrpc_local_stop);rxrpc_destroy_local (local); - local->io_thread =NULL ; +WRITE_ONCE (local->io_thread,NULL );rxrpc_see_local (local, rxrpc_local_stopped);return 0 ; }
net/rxrpc/local_object.c +1 -1
@@ -232,7 +232,7 @@ static int rxrpc_open_socket(struct rxrp }wait_for_completion (&local->io_thread_ready); - local->io_thread = io_thread; +WRITE_ONCE (local->io_thread, io_thread);_leave (" = 0" );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 477/482 vhost/scsi: null-ptr-dereference in vhost_scsi_get_req()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoran Zhang <[email protected]>
commit 221af82f606d928ccef19a16d35633c63026f1be upstream.
Since commit 3f8ca2e115e5 ("vhost/scsi: Extract common handling code from control queue handler") a null pointer dereference bug can be triggered when guest sends an SCSI AN request.
In vhost_scsi_ctl_handle_vq(), vc.target is assigned with &v_req.tmf.lun[1] within a switch-case block and is then passed to vhost_scsi_get_req() which extracts vc->req and tpg. However, for a VIRTIO_SCSI_T_AN_* request, tpg is not required, so vc.target is set to NULL in this branch. Later, in vhost_scsi_get_req(), vc->target is dereferenced without being checked, leading to a null pointer dereference bug. This bug can be triggered from guest.
When this bug occurs, the vhost_worker process is killed while holding vq->mutex and the corresponding tpg will remain occupied indefinitely.
Below is the KASAN report:
Oops: general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 1 PID: 840 Comm: poc Not tainted 6.10.0+ #1 Hardware name: QEMU Ubuntu 24.04 PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 RIP: 0010:vhost_scsi_get_req+0x165/0x3a0 Code: 00 fc ff df 48 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 2b 02 00 00 48 b8 00 00 00 00 00 fc ff df 4d 8b 65 30 4c 89 e2 48 c1 ea 03 <0f> b6 04 02 4c 89 e2 83 e2 07 38 d0 7f 08 84 c0 0f 85 be 01 00 00 RSP: 0018:ffff888017affb50 EFLAGS: 00010246 RAX: dffffc0000000000 RBX: ffff88801b000000 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff888017affcb8 RBP: ffff888017affb80 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: ffff888017affc88 R14: ffff888017affd1c R15: ffff888017993000 FS: 000055556e076500(0000) GS:ffff88806b100000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000200027c0 CR3: 0000000010ed0004 CR4: 0000000000370ef0 Call Trace: <TASK> ? show_regs+0x86/0xa0 ? die_addr+0x4b/0xd0 ? exc_general_protection+0x163/0x260 ? asm_exc_general_protection+0x27/0x30 ? vhost_scsi_get_req+0x165/0x3a0 vhost_scsi_ctl_handle_vq+0x2a4/0xca0 ? __pfx_vhost_scsi_ctl_handle_vq+0x10/0x10 ? __switch_to+0x721/0xeb0 ? __schedule+0xda5/0x5710 ? __kasan_check_write+0x14/0x30 ? _raw_spin_lock+0x82/0xf0 vhost_scsi_ctl_handle_kick+0x52/0x90 vhost_run_work_list+0x134/0x1b0 vhost_task_fn+0x121/0x350 ... </TASK> ---[ end trace 0000000000000000 ]---
Let's add a check in vhost_scsi_get_req.
Message-Id: <[email protected]>
--- drivers/vhost/scsi.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)
drivers/vhost/scsi.c +14 -11
@@ -1029,20 +1029,23 @@ vhost_scsi_get_req(struct vhost_virtqueu/* virtio-scsi spec requires byte 0 of the lun to be 1 */ vq_err (vq,"Illegal virtio-scsi lun: %u\n" , *vc->lunp); }else { -struct vhost_scsi_tpg **vs_tpg, *tpg; +struct vhost_scsi_tpg **vs_tpg, *tpg =NULL ; - vs_tpg =vhost_vq_get_backend (vq);/* validated at handler entry */ - - tpg =READ_ONCE (vs_tpg[*vc->target]); -if (unlikely (!tpg)) { -vq_err (vq,"Target 0x%x does not exist\n" , *vc->target); - }else { -if (tpgp) - *tpgp = tpg; - ret =0 ; +if (vc->target) { +/* validated at handler entry */ + vs_tpg =vhost_vq_get_backend (vq); + tpg =READ_ONCE (vs_tpg[*vc->target]); +if (unlikely (!tpg)) { +vq_err (vq,"Target 0x%x does not exist\n" , *vc->target); + goto out; + } } - } +if (tpgp) + *tpgp = tpg; + ret =0 ; + } +out:return ret; }
Greg Kroah-Hartman
maintainerPATCH 478/482 ALSA: control: Fix leftover snd_power_unref()
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit fef1ac950c600ba50ef4d65ca03c8dae9be7f9ea upstream.
One snd_power_unref() was forgotten and left at __snd_ctl_elem_info() in the previous change for reorganizing the locking order.
--- sound/core/control.c | 1 - 1 file changed, 1 deletion(-)
sound/core/control.c +0 -1
@@ -1165,7 +1165,6 @@ static int __snd_ctl_elem_info(struct sn info->access =0 ;#endif result = kctl->info (kctl, info); -snd_power_unref (card);if (result >=0 ) {snd_BUG_ON (info->access); index_offset =snd_ctl_get_ioff (kctl, &info->id);
Greg Kroah-Hartman
maintainerPATCH 479/482 crypto: octeontx* - Select CRYPTO_AUTHENC
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit c398cb8eb0a263a1b7a18892d9f244751689675c upstream.
Select CRYPTO_AUTHENC as the function crypto_authenec_extractkeys may not be available without it.
--- drivers/crypto/marvell/Kconfig | 2 ++ 1 file changed, 2 insertions(+)
drivers/crypto/marvell/Kconfig +2 -0
@@ -28,6 +28,7 @@ config CRYPTO_DEV_OCTEONTX_CPT select CRYPTO_SKCIPHER select CRYPTO_HASH select CRYPTO_AEAD + select CRYPTO_AUTHENC select CRYPTO_DEV_MARVELL help This driver allows you to utilize the Marvell Cryptographic
@@ -47,6 +48,7 @@ config CRYPTO_DEV_OCTEONTX2_CPT select CRYPTO_SKCIPHER select CRYPTO_HASH select CRYPTO_AEAD + select CRYPTO_AUTHENC select NET_DEVLINK help This driver allows you to utilize the Marvell Cryptographic
Greg Kroah-Hartman
maintainerPATCH 480/482 drm/amd/display: Revert Avoid overflow assignment
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabe Teeger <[email protected]>
commit e80f8f491df873ea2e07c941c747831234814612 upstream.
This reverts commit a15268787b79 ("drm/amd/display: Avoid overflow assignment in link_dp_cts") Due to regression causing DPMS hang.
--- drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 2 +- drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c | 3 +-- drivers/gpu/drm/amd/display/include/dpcd_defs.h | 1 - 3 files changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/display/dc/dc_dp_types.h +1 -1
@@ -727,7 +727,7 @@ struct dp_audio_test_data_flags {struct dp_audio_test_data {struct dp_audio_test_data_flags flags; -uint32_t sampling_rate; +uint8_t sampling_rate;uint8_t channel_count;uint8_t pattern_type;uint8_t pattern_period[8 ];
drivers/gpu/drm/amd/display/dc/link/accessories/link_dp_cts.c +1 -2
@@ -775,8 +775,7 @@ bool dp_set_test_pattern(core_link_read_dpcd (link,DP_TRAINING_PATTERN_SET , &training_pattern.raw,sizeof (training_pattern)); -if (pattern <=PHY_TEST_PATTERN_END_DP11 ) - training_pattern.v1_3.LINK_QUAL_PATTERN_SET = pattern; + training_pattern.v1_3.LINK_QUAL_PATTERN_SET = pattern;core_link_write_dpcd (link,DP_TRAINING_PATTERN_SET , &training_pattern.raw,sizeof (training_pattern));
drivers/gpu/drm/amd/display/include/dpcd_defs.h +0 -1
@@ -76,7 +76,6 @@ enum dpcd_phy_test_patterns {PHY_TEST_PATTERN_D10_2 ,PHY_TEST_PATTERN_SYMBOL_ERROR ,PHY_TEST_PATTERN_PRBS7 , -PHY_TEST_PATTERN_END_DP11 =PHY_TEST_PATTERN_PRBS7 ,PHY_TEST_PATTERN_80BIT_CUSTOM ,/* For DP1.2 only */ PHY_TEST_PATTERN_CP2520_1 , PHY_TEST_PATTERN_CP2520_2,
Greg Kroah-Hartman
maintainerPATCH 481/482 perf report: Fix segfault when sym sort key is not used
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
commit 9af2efee41b27a0f386fb5aa95d8d0b4b5d9fede upstream.
The fields in the hist_entry are filled on-demand which means they only have meaningful values when relevant sort keys are used.
So if neither of 'dso' nor 'sym' sort keys are used, the map/symbols in the hist entry can be garbage. So it shouldn't access it unconditionally.
I got a segfault, when I wanted to see cgroup profiles.
$ sudo perf record -a --all-cgroups --synth=cgroup true
$ sudo perf report -s cgroup
Program received signal SIGSEGV, Segmentation fault. 0x00005555557a8d90 in map__dso (map=0x0) at util/map.h:48
48 return RC_CHK_ACCESS(map)->dso;
(gdb) bt
#0 0x00005555557a8d90 in map__dso (map=0x0) at util/map.h:48
#1 0x00005555557aa39b in map__load (map=0x0) at util/map.c:344
#2 0x00005555557aa592 in map__find_symbol (map=0x0, addr=140736115941088) at util/map.c:385
#3 0x00005555557ef000 in hists__findnew_entry (hists=0x555556039d60, entry=0x7fffffffa4c0, al=0x7fffffffa8c0, sample_self=true)
at util/hist.c:644
#4 0x00005555557ef61c in __hists__add_entry (hists=0x555556039d60, al=0x7fffffffa8c0, sym_parent=0x0, bi=0x0, mi=0x0, ki=0x0,
block_info=0x0, sample=0x7fffffffaa90, sample_self=true, ops=0x0) at util/hist.c:761
#5 0x00005555557ef71f in hists__add_entry (hists=0x555556039d60, al=0x7fffffffa8c0, sym_parent=0x0, bi=0x0, mi=0x0, ki=0x0,
sample=0x7fffffffaa90, sample_self=true) at util/hist.c:779
#6 0x00005555557f00fb in iter_add_single_normal_entry (iter=0x7fffffffa900, al=0x7fffffffa8c0) at util/hist.c:1015
#7 0x00005555557f09a7 in hist_entry_iter__add (iter=0x7fffffffa900, al=0x7fffffffa8c0, max_stack_depth=127, arg=0x7fffffffbce0)
at util/hist.c:1260
#8 0x00005555555ba7ce in process_sample_event (tool=0x7fffffffbce0, event=0x7ffff7c14128, sample=0x7fffffffaa90, evsel=0x555556039ad0,
machine=0x5555560388e8) at builtin-report.c:334
#9 0x00005555557b30c8 in evlist__deliver_sample (evlist=0x555556039010, tool=0x7fffffffbce0, event=0x7ffff7c14128,
sample=0x7fffffffaa90, evsel=0x555556039ad0, machine=0x5555560388e8) at util/session.c:1232
#10 0x00005555557b32bc in machines__deliver_event (machines=0x5555560388e8, evlist=0x555556039010, event=0x7ffff7c14128,
sample=0x7fffffffaa90, tool=0x7fffffffbce0, file_offset=110888, file_path=0x555556038ff0 "perf.data") at util/session.c:1271
#11 0x00005555557b3848 in perf_session__deliver_event (session=0x5555560386d0, event=0x7ffff7c14128, tool=0x7fffffffbce0,
file_offset=110888, file_path=0x555556038ff0 "perf.data") at util/session.c:1354
#12 0x00005555557affaf in ordered_events__deliver_event (oe=0x555556038e60, event=0x555556135aa0) at util/session.c:132
#13 0x00005555557bb605 in do_flush (oe=0x555556038e60, show_progress=false) at util/ordered-events.c:245
#14 0x00005555557bb95c in __ordered_events__flush (oe=0x555556038e60, how=OE_FLUSH__ROUND, timestamp=0) at util/ordered-events.c:324
#15 0x00005555557bba46 in ordered_events__flush (oe=0x555556038e60, how=OE_FLUSH__ROUND) at util/ordered-events.c:342
#16 0x00005555557b1b3b in perf_event__process_finished_round (tool=0x7fffffffbce0, event=0x7ffff7c15bb8, oe=0x555556038e60)
at util/session.c:780
#17 0x00005555557b3b27 in perf_session__process_user_event (session=0x5555560386d0, event=0x7ffff7c15bb8, file_offset=117688,
file_path=0x555556038ff0 "perf.data") at util/session.c:1406As you can see the entry->ms.map was NULL even if he->ms.map has a value. This is because 'sym' sort key is not given, so it cannot assume whether he->ms.sym and entry->ms.sym is the same. I only checked the 'sym' sort key here as it implies 'dso' behavior (so maps are the same).
--- tools/perf/util/hist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/hist.c +1 -1
@@ -636,7 +636,7 @@ static struct hist_entry *hists__findnew* mis-adjust symbol addresses when computing * the history counter to increment. */ -if (he->ms.map != entry->ms.map) { +if (hists__has (hists, sym) && he->ms.map != entry->ms.map) {if (he->ms.sym) {u64 addr = he->ms.sym->start; he->ms.sym =map__find_symbol (entry->ms.map, addr);
Greg Kroah-Hartman
maintainerPATCH 482/482 drm/amd/display: enable_hpo_dp_link_output: Check link_res->hpo_dp_link_enc before using it
In reply to Greg Kroah-Hartman6.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
commit d925c04d974c657d10471c0c2dba3bc9c7d994ee upstream.
[WHAT & HOW]
Functions dp_enable_link_phy and dp_disable_link_phy can pass link_res without initializing hpo_dp_link_enc and it is necessary to check for null before dereferencing.
This fixes 1 FORWARD_NULL issue reported by Coverity.
--- drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_hpo_dp.c +5 -0
@@ -110,6 +110,11 @@ void enable_hpo_dp_link_output(struct dc enum clock_source_id clock_source, const struct dc_link_settings *link_settings) { +if (!link_res->hpo_dp_link_enc) { +DC_LOG_ERROR ("%s: invalid hpo_dp_link_enc\n" , __func__); +return ; + } +if (link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating) link->dc->res_pool->dccg->funcs->set_symclk32_le_root_clock_gating( link->dc->res_pool->dccg,
Am 08.10.2024 um 14:01 schrieb Greg Kroah-Hartman:
Quoted 4 lines
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.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 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
The LTP syscalls fanotify22 test failed (broken).
This regression is noticed on linux.6.10.y, linux.6.11.y and linux.6.6.y.
We are bisecting this issue.
ltp-syscalls
- fanotify22
Test log,
-----------
fanotify16.c:751[ 452.527701] EXT4-fs error (device loop0):
__ext4_remount:6522: comm fanotify22: Abort forced by user tst_device.c:96: TINFO: Found free device 0 '/dev/loop0' tst_test.c:1106: TINFO: Formatting /dev/loop0 with ext4 opts='' extra opts='' mke2fs 1.47.1 (20-May-2024)
tst_test.c:1120: TINFO: Mounting /dev/loop0 to /scratch/ltp-6nPLv2EGcV/LTP_fanbDvQcT/test_mnt fstyp=ext4 flags=0 tst_test.c:1733: TINFO: LTP version: 20240524
tst_test.c:1617: TINFO: Timeout per run is 0h 02m 30s fanotify.h:122: TINFO: fid(test_mnt/internal_dir/bad_dir) = 6bd2dab9.86fe4716.7e82.df82837f.0...
fanotify.h:122: TINFO: fid(test_mnt/internal_dir) = 6bd2dab9.86fe4716.7e81.beaa198d.0...
fanotify22.c:278: TINFO: Umounting /scratch/ltp-6nPLv2EGcV/LTP_fanbDvQcT/test_mnt
debugfs 1.47.1 (20-May-2024)
debugfs 1.47.1 (20-May-2024)
fanotify22.c:281: TINFO: Mounting /dev/loop0 to /scratch/ltp-6nPLv2EGcV/LTP_fanbDvQcT/test_mnt fstyp=ext4 flags=0 fanotify.h:122: TINFO: fid(test_mnt) = 6bd2dab9.86fe4716.2.0.0... fanotify22.c:59: TINFO: Mounting /dev/loop0 to /scratch/ltp-6nPLv2EGcV/LTP_fanbDvQcT/test_mnt fstyp=ext4 flags=21 fanotify22.c:59: TBROK: mount(/dev/loop0, test_mnt, ext4, 33, 0x5659a1d5) failed: EROFS (30)
HINT: You _MAY_ be missing kernel fixes:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=124e7c61deb2
Summary:
passed 0 failed 0 broken 1
--
Linaro LKFT
https://lkft.linaro.org
Quoted 20 lines · Naresh Kamboju
Quoted 17 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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/v6.x/stable-review/patch-6.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
Quoted 7 lines
Quoted 1 line
greg k-h
The LTP syscalls fanotify22 test failed (broken).
This regression is noticed on linux.6.10.y, linux.6.11.y and linux.6.6.y.We are bisecting this issue.
The bisection pointed to patch b1a855f8a4fd ("ext4: don't set SB_RDONLY after filesystem errors")
[ Upstream commit d3476f3dad4ad68ae5f6b008ea6591d1520da5d8 ]
Reverting patch b1a855f8a4fd ("ext4: don't set SB_RDONLY after filesystem errors") makes
ltp-syscalls/fanotify22 pass.
That said, I also checked Linus tree and fanotify22 fails there too. Reverting the upstream
patch d3476f3dad4a ("ext4: don't set SB_RDONLY after filesystem errors") from Linux tree
v6.12-rc2-58-g75b607fab38d and run syscalls/fanotify22 it pass.
Any ideas whats wrong here?
Cheers,
Anders
Hi!
Work in progress, see:
https://lists.linux.it/pipermail/ltp/2024-October/040433.html
Signature · 2 lines
Cyril Hrubis [email protected]
Quoted 4 lines · Cyril Hrubis
Hi!
Work in progress, see:
https://lists.linux.it/pipermail/ltp/2024-October/040433.html
Sasha Levin
maintainerQuoted 7 lines · Jan Stancek
Quoted 4 lines · Cyril Hrubis
Hi!
Work in progress, see:
https://lists.linux.it/pipermail/ltp/2024-October/040433.html
I'll drop the offending commit, we can grab it along with the fix once it lands in Linus's tree.
Signature · 2 lines
Thanks, Sasha
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.10:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.10.14-rc1-gd44129966591
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Jon
Sasha Levin
maintainerQuoted 26 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.10:
10 builds: 10 pass, 0 fail 26 boots: 26 pass, 0 fail 116 tests: 116 pass, 0 fail
Quoted 7 lines
Linux version: 6.10.14-rc1-gd44129966591
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04Tested-by Jon Hunter <[email protected]>
Did this one not fail on the same cgroup issue as 6.11? we had the offending commit in all trees.
Signature · 2 lines
Thanks, Sasha
Jon Hunter
maintainerQuoted 33 lines · Sasha Levin
Quoted 32 lines · Jon Hunter
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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/v6.x/stable-review/patch-6.10.14-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-6.10.y and the diffstat can be found below.Quoted 3 lines
thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.10:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.10.14-rc1-gd44129966591
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000, tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04
Quoted 4 lines
Quoted 1 line
Tested-by Jon Hunter <[email protected]>Did this one not fail on the same cgroup issue as 6.11? we had the offending commit in all trees.
I did not see any failure there. However, same tests are run and so it should have. I can run it again to double check.
Jon
Signature · 1 line
nvpublic
Jon Hunter
maintainerQuoted 35 lines · Jon Hunter
Quoted 33 lines · Sasha Levin
Quoted 32 lines · Jon Hunter
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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/v6.x/stable-review/patch-6.10.14-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-6.10.y and the diffstat can be found below.Quoted 3 lines
thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.10:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.10.14-rc1-gd44129966591
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000, tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04
Quoted 7 lines
Quoted 4 lines
Quoted 1 line
Tested-by Jon Hunter <[email protected]>Did this one not fail on the same cgroup issue as 6.11? we had the offending commit in all trees.
I did not see any failure there. However, same tests are run and so it should have. I can run it again to double check.
I doubled checked and I don't see warning with this kernel. Odd.
Jon
Signature · 1 line
nvpublic
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Building passed on amd64, arm64, loongarch64, ppc64el, and riscv64. Smoke testing passed on 9 amd64 and 1 arm64 test systems.
https://github.com/AOSC-Dev/aosc-os-abbs/pull/8222
Signature · 2 lines
Best Regards, Kexy Biscuit
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.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 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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.10.14-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.10.y
and the diffstat can be found below.thanks,
greg k-h
Hi,
Please find the KernelCI report below :-
OVERVIEW
Builds: 24 passed, 1 failed
Boot tests: 510 passed, 0 failed
CI systems: maestro
REVISION
Commit
name:
hash: d44129966591836e3ff248d0af2358f1b8f7bc28
Checked out from
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
linux-6.10.y
BUILDS
- i386 (defconfig+kcidebug+x86-board)
Build error:drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.c:219:1: error:
the frame size of 1192 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
config:
https://kciapistagingstorage1.file.core.windows.net/early-access/kbuild-gcc-12-x86-kcidebug-6705246a7ef7358befb78db3/.config?sv=2022-11-02&ss=f&srt=sco&sp=r&se=2024-10-17T19:19:12Z&st=2023-10-17T11:19:12Z&spr=https&sig=sLmFlvZHXRrZsSGubsDUIvTiv%2BtzgDq6vALfkrtWnv8%3D
BOOT TESTS
No new boot failures found
Thanks,
KernelCI team
Am 10.10.2024 um 10:58 schrieb Muhammad Usama Anjum:
Quoted 31 lines
Please find the KernelCI report below :-
OVERVIEW
Builds: 24 passed, 1 failed
Boot tests: 510 passed, 0 failed
CI systems: maestro
REVISION
Commit
name:
hash:d44129966591836e3ff248d0af2358f1b8f7bc28
Checked out fromhttps://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
linux-6.10.yBUILDS
- i386 (defconfig+kcidebug+x86-board)
Build error:drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.c:219:1: error:
the frame size of 1192 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
config:
https://kciapistagingstorage1.file.core.windows.net/early-access/kbuild-gcc-12-x86-kcidebug-6705246a7ef7358befb78db3/.config?sv=2022-11-02&ss=f&srt=sco&sp=r&se=2024-10-17T19:19:12Z&st=2023-10-17T11:19:12Z&spr=https&sig=sLmFlvZHXRrZsSGubsDUIvTiv%2BtzgDq6vALfkrtWnv8%3D
Quoted 9 lines
BOOT TESTS
No new boot failures found
Tested-by kernelci.org bot <[email protected]>Thanks,
KernelCI team
I do all my kernel build tests with CONFIG_WERROR=Y, and I found that due to THIS driver, I had to increase CONFIG_FRAME_WARN to 2048 from its default 1024 (which comes from my PVE oldconfig). This avoids this warning/error. However I don't know whether a driver, or any function, using a larger stack frame than 1024 bytes will generally be a problem.
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 Tue, 08 Oct 2024 14:01:03 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +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
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.10.14 release. There are 482 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 Thu, 10 Oct 2024 11:55:15 +0000. Anything received after that time might be too late.
This release, as well as 6.6.54 and 6.11.3, is crash-for-crash compatible with the upstream kernel.
...
Unable to handle kernel NULL pointer dereference at virtual address 00000000 when read [00000000] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT ARM Modules linked in: CPU: 0 PID: 1 Comm: swapper Not tainted 6.10.14 #1 Hardware name: Freescale i.MX25 (Device Tree Support) PC is at timecounter_read+0xc/0xbc LR is at fec_ptp_save_state+0x28/0x6c pc : [<c00c4e84>] lr : [<c08691fc>] psr: 60000193
sp : c8825ca8 ip : 00000000 fp : c1e6c6a0
r10: 00000000 r9 : c183b90c r8 : c1f6d810
r7 : c7ef4eec r6 : c1e6c904 r5 : 40000113 r4 : c1e6c940
r3 : 00000000 r2 : 00000000 r1 : 00000001 r0 : 00000000
Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none
Control: 00093177 Table: 80004000 DAC: 00000053
Register r0 information: NULL pointer
Register r1 information: non-paged memory
Register r2 information: NULL pointer
Register r3 information: NULL pointer
Register r4 information: slab kmalloc-4k start c1e6b000 data offset 4096 pointer offset 2368 size 4096 allocated at kvmalloc_node_noprof+0x14/0x108
__kmalloc_node_noprof+0x3a0/0x504
kvmalloc_node_noprof+0x14/0x108
alloc_netdev_mqs+0x5c/0x454
alloc_etherdev_mqs+0x1c/0x30...
Caused by:
Quoted 3 lines
Csókás, Bence <[email protected]>
net: fec: Restart PPS after link state change
Guenter