6.9.4-rc1 review
Subsystems (10)
Greg Kroah-Hartman
maintainerPATCH 279/374 cifs: Fix missing set of remote_i_size
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 93a43155127fec0f8cc942d63b76668c2f8f69fa ]
Occasionally, the generic/001 xfstest will fail indicating corruption in one of the copy chains when run on cifs against a server that supports FSCTL_DUPLICATE_EXTENTS_TO_FILE (eg. Samba with a share on btrfs). The problem is that the remote_i_size value isn't updated by cifs_setsize() when called by smb2_duplicate_extents(), but i_size *is*.
This may cause cifs_remap_file_range() to then skip the bit after calling ->duplicate_extents() that sets sizes.
Fix this by calling netfs_resize_file() in smb2_duplicate_extents() before calling cifs_setsize() to set i_size.
This means we don't then need to call netfs_resize_file() upon return from ->duplicate_extents(), but we also fix the test to compare against the pre-dup inode size.
[Note that this goes back before the addition of remote_i_size with the netfs_inode struct. It should probably have been setting cifsi->server_eof previously.]
--- fs/smb/client/cifsfs.c | 6 +++--- fs/smb/client/smb2ops.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
fs/smb/client/cifsfs.c +3 -3
@@ -1277,7 +1277,7 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,struct cifsFileInfo *smb_file_src = src_file->private_data;struct cifsFileInfo *smb_file_target = dst_file->private_data;struct cifs_tcon *target_tcon, *src_tcon; -unsigned long long destend, fstart, fend, new_size; +unsigned long long destend, fstart, fend, old_size, new_size;unsigned int xid;int rc;
@@ -1344,6 +1344,7 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off, goto unlock;if (fend > target_cifsi->netfs.zero_point) target_cifsi->netfs.zero_point = fend +1 ; + old_size = target_cifsi->netfs.remote_i_size;/* Discard all the folios that overlap the destination region. */ cifs_dbg (FYI ,"about to discard pages %llx-%llx\n" , fstart, fend);
@@ -1356,9 +1357,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,if (target_tcon->ses->server->ops->duplicate_extents) { rc = target_tcon->ses->server->ops->duplicate_extents (xid, smb_file_src, smb_file_target, off, len, destoff); -if (rc ==0 && new_size >i_size_read (target_inode)) { +if (rc ==0 && new_size > old_size) {truncate_setsize (target_inode, new_size); -netfs_resize_file (&target_cifsi->netfs, new_size, true);fscache_resize_cookie (cifs_inode_cookie (target_inode), new_size); }
fs/smb/client/smb2ops.c +1 -0
@@ -2028,6 +2028,7 @@ smb2_duplicate_extents(const unsigned int xid,* size will be queried on next revalidate, but it is important * to make sure that file's cached size is updated immediately */ +netfs_resize_file (netfs_inode (inode), dest_off + len, true);cifs_setsize (inode, dest_off + len); } rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 280/374 tracing/probes: fix error check in parse_btf_field()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carlos López <[email protected]>
[ Upstream commit e569eb34970281438e2b48a3ef11c87459fcfbcb ]
btf_find_struct_member() might return NULL or an error via the ERR_PTR() macro. However, its caller in parse_btf_field() only checks for the NULL condition. Fix this by using IS_ERR() and returning the error up the stack.
--- kernel/trace/trace_probe.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/trace/trace_probe.c +4 -0
@@ -553,6 +553,10 @@ static int parse_btf_field(char *fieldname, const struct btf_type *type, anon_offs =0 ; field =btf_find_struct_member (ctx->btf, type, fieldname, &anon_offs); +if (IS_ERR (field)) { +trace_probe_log_err (ctx->offset,BAD_BTF_TID ); +return PTR_ERR (field); + }if (!field) {trace_probe_log_err (ctx->offset,NO_BTF_FIELD );return -ENOENT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 281/374 tpm_tis_spi: Account for SPI header when allocating TPM SPI xfer buffer
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew R. Ochs <[email protected]>
[ Upstream commit 195aba96b854dd664768f382cd1db375d8181f88 ]
The TPM SPI transfer mechanism uses MAX_SPI_FRAMESIZE for computing the maximum transfer length and the size of the transfer buffer. As such, it does not account for the 4 bytes of header that prepends the SPI data frame. This can result in out-of-bounds accesses and was confirmed with KASAN.
Introduce SPI_HDRSIZE to account for the header and use to allocate the transfer buffer.
--- drivers/char/tpm/tpm_tis_spi_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/char/tpm/tpm_tis_spi_main.c +2 -1
@@ -37,6 +37,7 @@#include "tpm_tis_spi.h" #define MAX_SPI_FRAMESIZE 64 +#define SPI_HDRSIZE 4/* * TCG SPI flow control is documented in section 6.4 of the spec[1]. In short,
@@ -247,7 +248,7 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,int tpm_tis_spi_init (struct spi_device *spi,struct tpm_tis_spi_phy *phy,int irq,const struct tpm_tis_phy_ops *phy_ops) { - phy->iobuf =devm_kmalloc (&spi->dev,MAX_SPI_FRAMESIZE ,GFP_KERNEL ); + phy->iobuf =devm_kmalloc (&spi->dev,SPI_HDRSIZE +MAX_SPI_FRAMESIZE ,GFP_KERNEL );if (!phy->iobuf)return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 282/374 tcp: reduce accepted window in NEW_SYN_RECV state
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit f4dca95fc0f6350918f2e6727e35b41f7f86fcce upstream.
Jason commit made checks against ACK sequence less strict and can be exploited by attackers to establish spoofed flows with less probes.
Innocent users might use tcp_rmem[1] == 1,000,000,000, or something more reasonable.
An attacker can use a regular TCP connection to learn the server initial tp->rcv_wnd, and use it to optimize the attack.
If we make sure that only the announced window (smaller than 65535) is used for ACK validation, we force an attacker to use 65537 packets to complete the 3WHS (assuming server ISN is unknown)
--- include/net/request_sock.h | 12 ++++++++++++ net/ipv4/tcp_ipv4.c | 7 +------ net/ipv4/tcp_minisocks.c | 7 +++++-- net/ipv6/tcp_ipv6.c | 7 +------ 4 files changed, 19 insertions(+), 14 deletions(-)
include/net/request_sock.h +12 -0
@@ -282,4 +282,16 @@ static inline int reqsk_queue_len_young( return atomic_read(&queue->young); } +/* RFC 7323 2.3 Using the Window Scale Option +* The window field (SEG.WND) of every outgoing segment, with the +* exception of <SYN> segments, MUST be right-shifted by +* Rcv.Wind.Shift bits. +* +* This means the SEG.WND carried in SYNACK can not exceed 65535. +* We use this property to harden TCP stack while in NEW_SYN_RECV state. +*/ +static inline u32 tcp_synack_window (const struct request_sock *req) +{ +return min (req->rsk_rcv_wnd,65535U ); +}#endif /* _REQUEST_SOCK_H */
net/ipv4/tcp_ipv4.c +1 -6
@@ -1143,14 +1143,9 @@ static void tcp_v4_reqsk_send_ack(const#endif } -/* RFC 7323 2.3 -* The window field (SEG.WND) of every outgoing segment, with the -* exception of <SYN> segments, MUST be right-shifted by -* Rcv.Wind.Shift bits: -*/ tcp_v4_send_ack(sk, skb, seq, tcp_rsk(req)->rcv_nxt, - req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, + tcp_synack_window(req) >> inet_rsk(req)->rcv_wscale, tcp_rsk_tsval(tcp_rsk(req)), READ_ONCE(req->ts_recent), 0, &key,
net/ipv4/tcp_minisocks.c +5 -2
@@ -783,8 +783,11 @@ struct sock *tcp_check_req(struct sock */* RFC793: "first check sequence number". */ - if (paws_reject || !tcp_in_window(TCP_SKB_CB(skb)->seq, TCP_SKB_CB(skb)->end_seq, - tcp_rsk(req)->rcv_nxt, tcp_rsk(req)->rcv_nxt + req->rsk_rcv_wnd)) { + if (paws_reject || !tcp_in_window(TCP_SKB_CB(skb)->seq, + TCP_SKB_CB(skb)->end_seq, + tcp_rsk(req)->rcv_nxt, + tcp_rsk(req)->rcv_nxt + + tcp_synack_window(req))) { /* Out of window: send ACK and drop. */ if (!(flg & TCP_FLAG_RST) && !tcp_oow_rate_limited(sock_net(sk), skb,
net/ipv6/tcp_ipv6.c +1 -6
@@ -1268,15 +1268,10 @@ static void tcp_v6_reqsk_send_ack(const/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV * sk->sk_state == TCP_SYN_RECV -> for Fast Open. */ -/* RFC 7323 2.3 -* The window field (SEG.WND) of every outgoing segment, with the -* exception of <SYN> segments, MUST be right-shifted by -* Rcv.Wind.Shift bits: -*/ tcp_v6_send_ack(sk, skb, (sk->sk_state == TCP_LISTEN) ? tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt, tcp_rsk(req)->rcv_nxt, - req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, + tcp_synack_window(req) >> inet_rsk(req)->rcv_wscale, tcp_rsk_tsval(tcp_rsk(req)), READ_ONCE(req->ts_recent), sk->sk_bound_dev_if, &key, ipv6_get_dsfield(ipv6_hdr(skb)), 0,
Greg Kroah-Hartman
maintainerPATCH 283/374 netfilter: nfnetlink_queue: acquire rcu_read_lock() in instance_destroy_rcu()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit dc21c6cc3d6986d938efbf95de62473982c98dec ]
syzbot reported that nf_reinject() could be called without rcu_read_lock() :
WARNING: suspicious RCU usage 6.9.0-rc7-syzkaller-02060-g5c1672705a1a #0 Not tainted
net/netfilter/nfnetlink_queue.c:263 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
2 locks held by syz-executor.4/13427:
#0: ffffffff8e334f60 (rcu_callback){....}-{0:0}, at: rcu_lock_acquire include/linux/rcupdate.h:329 [inline] #0: ffffffff8e334f60 (rcu_callback){....}-{0:0}, at: rcu_do_batch kernel/rcu/tree.c:2190 [inline] #0: ffffffff8e334f60 (rcu_callback){....}-{0:0}, at: rcu_core+0xa86/0x1830 kernel/rcu/tree.c:2471 #1: ffff88801ca92958 (&inst->lock){+.-.}-{2:2}, at: spin_lock_bh include/linux/spinlock.h:356 [inline] #1: ffff88801ca92958 (&inst->lock){+.-.}-{2:2}, at: nfqnl_flush net/netfilter/nfnetlink_queue.c:405 [inline] #1: ffff88801ca92958 (&inst->lock){+.-.}-{2:2}, at: instance_destroy_rcu+0x30/0x220 net/netfilter/nfnetlink_queue.c:172
stack backtrace: CPU: 0 PID: 13427 Comm: syz-executor.4 Not tainted 6.9.0-rc7-syzkaller-02060-g5c1672705a1a #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 04/02/2024 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:114 lockdep_rcu_suspicious+0x221/0x340 kernel/locking/lockdep.c:6712 nf_reinject net/netfilter/nfnetlink_queue.c:323 [inline] nfqnl_reinject+0x6ec/0x1120 net/netfilter/nfnetlink_queue.c:397 nfqnl_flush net/netfilter/nfnetlink_queue.c:410 [inline] instance_destroy_rcu+0x1ae/0x220 net/netfilter/nfnetlink_queue.c:172 rcu_do_batch kernel/rcu/tree.c:2196 [inline] rcu_core+0xafd/0x1830 kernel/rcu/tree.c:2471 handle_softirqs+0x2d6/0x990 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:1043 [inline] sysvec_apic_timer_interrupt+0xa6/0xc0 arch/x86/kernel/apic/apic.c:1043 </IRQ> <TASK>
--- net/netfilter/nfnetlink_queue.c | 2 ++ 1 file changed, 2 insertions(+)
net/netfilter/nfnetlink_queue.c +2 -0
@@ -169,7 +169,9 @@ instance_destroy_rcu(struct rcu_head *head) struct nfqnl_instance *inst = container_of(head, struct nfqnl_instance, rcu); +rcu_read_lock ();nfqnl_flush (inst,NULL ,0 ); +rcu_read_unlock ();kfree (inst);module_put (THIS_MODULE ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 284/374 netfilter: ipset: Add list flush to cancel_gc
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Maltsev <[email protected]>
[ Upstream commit c1193d9bbbd379defe9be3c6de566de684de8a6f ]
Flushing list in cancel_gc drops references to other lists right away, without waiting for RCU to destroy list. Fixes race when referenced ipsets can't be destroyed while referring list is scheduled for destroy.
--- net/netfilter/ipset/ip_set_list_set.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/ipset/ip_set_list_set.c +3 -0
@@ -549,6 +549,9 @@ list_set_cancel_gc(struct ip_set *set)if (SET_WITH_TIMEOUT (set))timer_shutdown_sync (&map->gc); + +/* Flush list to drop references to other ipsets */ +list_set_flush (set); }static const struct ip_set_type_variant set_variant = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 285/374 netfilter: nft_payload: restore vlan q-in-q match support
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit aff5c01fa1284d606f8e7cbdaafeef2511bb46c1 ]
Revert f6ae9f120dad ("netfilter: nft_payload: add C-VLAN support").
f41f72d09ee1 ("netfilter: nft_payload: simplify vlan header handling") already allows to match on inner vlan tags by subtract the vlan header size to the payload offset which has been popped and stored in skbuff metadata fields.
--- net/netfilter/nft_payload.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-)
net/netfilter/nft_payload.c +7 -16
@@ -45,36 +45,27 @@ nft_payload_copy_vlan(u32 *d, const struct sk_buff *skb, u8 offset, u8 len)int mac_off =skb_mac_header (skb) - skb->data;u8 *vlanh, *dst_u8 = (u8 *) d;struct vlan_ethhdr veth; -u8 vlan_hlen =0 ; - -if ((skb->protocol ==htons (ETH_P_8021AD ) || - skb->protocol ==htons (ETH_P_8021Q )) && - offset >=VLAN_ETH_HLEN && offset <VLAN_ETH_HLEN +VLAN_HLEN ) - vlan_hlen +=VLAN_HLEN ; vlanh = (u8 *) &veth; -if (offset <VLAN_ETH_HLEN + vlan_hlen) { +if (offset <VLAN_ETH_HLEN ) {u8 ethlen = len; -if (vlan_hlen && -skb_copy_bits (skb, mac_off, &veth,VLAN_ETH_HLEN ) <0 ) -return false; -else if (!nft_payload_rebuild_vlan_hdr (skb, mac_off, &veth)) +if (!nft_payload_rebuild_vlan_hdr (skb, mac_off, &veth))return false; -if (offset + len >VLAN_ETH_HLEN + vlan_hlen) - ethlen -= offset + len -VLAN_ETH_HLEN - vlan_hlen; +if (offset + len >VLAN_ETH_HLEN ) + ethlen -= offset + len -VLAN_ETH_HLEN ; -memcpy (dst_u8, vlanh + offset - vlan_hlen, ethlen); +memcpy (dst_u8, vlanh + offset, ethlen); len -= ethlen;if (len ==0 )return true; dst_u8 += ethlen; - offset =ETH_HLEN + vlan_hlen; + offset =ETH_HLEN ; }else { - offset -=VLAN_HLEN + vlan_hlen; + offset -=VLAN_HLEN ; }return skb_copy_bits (skb, offset + mac_off, dst_u8, len) ==0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 286/374 spi: Dont mark message DMA mapped when no transfer in it is
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 9f788ba457b45b0ce422943fcec9fa35c4587764 ]
There is no need to set the DMA mapped flag of the message if it has no mapped transfers. Moreover, it may give the code a chance to take the wrong paths, i.e. to exercise DMA related APIs on unmapped data. Make __spi_map_msg() to bail earlier on the above mentioned cases.
--- drivers/spi/spi.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/spi/spi.c +4 -0
@@ -1242,6 +1242,7 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg)else rx_dev = ctlr->dev.parent; + ret = -ENOMSG ;list_for_each_entry (xfer, &msg->transfers, transfer_list) {/* The sync is done before each transfer. */ unsigned long attrs =DMA_ATTR_SKIP_CPU_SYNC ;
@@ -1271,6 +1272,9 @@ static int __spi_map_msg(struct spi_controller *ctlr, struct spi_message *msg) } } } +/* No transfer has been mapped, bail out with success */ +if (ret) +return 0 ; ctlr->cur_rx_dma_dev = rx_dev; ctlr->cur_tx_dma_dev = tx_dev;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 287/374 spi: stm32: Revert change that enabled controller before asserting CS
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit a827ad9b3c2fc243e058595533f91ce41a312527 ]
On stm32mp157 enabling the controller before asserting CS makes the hardware trigger spurious interrupts in a tight loop and the transfers fail. Revert the commit that swapped the order of enable and CS. This reintroduces the problem that swapping was supposed to fix, which however is less grave.
--- drivers/spi/spi-stm32.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/spi/spi-stm32.c +12 -2
@@ -1016,8 +1016,10 @@ static irqreturn_t stm32fx_spi_irq_event(int irq, void *dev_id)static irqreturn_t stm32fx_spi_irq_thread (int irq,void *dev_id) {struct spi_controller *ctrl = dev_id; +struct stm32_spi *spi =spi_controller_get_devdata (ctrl);spi_finalize_current_transfer (ctrl); +stm32fx_spi_disable (spi);return IRQ_HANDLED ; }
@@ -1185,8 +1187,6 @@ static int stm32_spi_prepare_msg(struct spi_controller *ctrl, ~clrb) | setb, spi->base + spi->cfg->regs->cpol.reg); -stm32_spi_enable (spi); -spin_unlock_irqrestore (&spi->lock, flags);return 0 ;
@@ -1204,6 +1204,7 @@ static void stm32fx_spi_dma_tx_cb(void *data)if (spi->cur_comm ==SPI_SIMPLEX_TX || spi->cur_comm ==SPI_3WIRE_TX ) {spi_finalize_current_transfer (spi->ctrl); +stm32fx_spi_disable (spi); } }
@@ -1218,6 +1219,7 @@ static void stm32_spi_dma_rx_cb(void *data)struct stm32_spi *spi = data;spi_finalize_current_transfer (spi->ctrl); + spi->cfg->disable (spi); }/**
@@ -1305,6 +1307,8 @@ static int stm32fx_spi_transfer_one_irq(struct stm32_spi *spi)stm32_spi_set_bits (spi,STM32FX_SPI_CR2 , cr2); +stm32_spi_enable (spi); +/* starting data transfer when buffer is loaded */ if (spi->tx_buf) spi->cfg->write_tx (spi);
@@ -1341,6 +1345,8 @@ static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)spin_lock_irqsave (&spi->lock, flags); +stm32_spi_enable (spi); +/* Be sure to have data in fifo before starting data transfer */ if (spi->tx_buf)stm32h7_spi_write_txfifo (spi);
@@ -1372,6 +1378,8 @@ static void stm32fx_spi_transfer_one_dma_start(struct stm32_spi *spi)*/ stm32_spi_set_bits (spi,STM32FX_SPI_CR2 ,STM32FX_SPI_CR2_ERRIE ); } + +stm32_spi_enable (spi); }/**
@@ -1405,6 +1413,8 @@ static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)stm32_spi_set_bits (spi,STM32H7_SPI_IER , ier); +stm32_spi_enable (spi); +if (STM32_SPI_HOST_MODE (spi))stm32_spi_set_bits (spi,STM32H7_SPI_CR1 ,STM32H7_SPI_CR1_CSTART ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 288/374 dma-mapping: benchmark: fix up kthread-related error handling
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit bb9025f4432f8c158322cf2c04c2b492f23eb511 ]
kthread creation failure is invalidly handled inside do_map_benchmark(). The put_task_struct() calls on the error path are supposed to balance the get_task_struct() calls which only happen after all the kthreads are successfully created. Rollback using kthread_stop() for already created kthreads in case of such failure.
In normal situation call kthread_stop_put() to gracefully stop kthreads and put their task refcounts. This should be done for all started kthreads.
Found by Linux Verification Center (linuxtesting.org).
--- kernel/dma/map_benchmark.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
kernel/dma/map_benchmark.c +10 -6
@@ -118,6 +118,8 @@ static int do_map_benchmark(struct map_benchmark_data *map)if (IS_ERR (tsk[i])) {pr_err ("create dma_map thread failed\n" ); ret =PTR_ERR (tsk[i]); +while (--i >=0 ) +kthread_stop (tsk[i]); goto out; }
@@ -139,13 +141,17 @@ static int do_map_benchmark(struct map_benchmark_data *map)msleep_interruptible (map->bparam.seconds *1000 ); -/* wait for the completion of benchmark threads */ +/* wait for the completion of all started benchmark threads */ for (i =0 ; i < threads; i++) { - ret =kthread_stop (tsk[i]); -if (ret) - goto out; +int kthread_ret =kthread_stop_put (tsk[i]); + +if (kthread_ret) + ret = kthread_ret; } +if (ret) + goto out; + loops =atomic64_read (&map->loops);if (likely (loops >0 )) {u64 map_variance, unmap_variance;
@@ -170,8 +176,6 @@ static int do_map_benchmark(struct map_benchmark_data *map) } out: -for (i =0 ; i < threads; i++) -put_task_struct (tsk[i]);put_device (map->dev);kfree (tsk);return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 289/374 dma-mapping: benchmark: fix node id validation
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit 1ff05e723f7ca30644b8ec3fb093f16312e408ad ]
While validating node ids in map_benchmark_ioctl(), node_possible() may be provided with invalid argument outside of [0,MAX_NUMNODES-1] range leading to:
BUG: KASAN: wild-memory-access in map_benchmark_ioctl (kernel/dma/map_benchmark.c:214) Read of size 8 at addr 1fffffff8ccb6398 by task dma_map_benchma/971 CPU: 7 PID: 971 Comm: dma_map_benchma Not tainted 6.9.0-rc6 #37 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) Call Trace: <TASK>
dump_stack_lvl (lib/dump_stack.c:117)kasan_report (mm/kasan/report.c:603)kasan_check_range (mm/kasan/generic.c:189)variable_test_bit (arch/x86/include/asm/bitops.h:227) [inline] arch_test_bit (arch/x86/include/asm/bitops.h:239) [inline] _test_bit at (include/asm-generic/bitops/instrumented-non-atomic.h:142) [inline] node_state (include/linux/nodemask.h:423) [inline] map_benchmark_ioctl (kernel/dma/map_benchmark.c:214) full_proxy_unlocked_ioctl (fs/debugfs/file.c:333)__x64_sys_ioctl (fs/ioctl.c:890)do_syscall_64 (arch/x86/entry/common.c:83) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
Compare node ids with sane bounds first. NUMA_NO_NODE is considered a special valid case meaning that benchmarking kthreads won't be bound to a cpuset of a given node.
Found by Linux Verification Center (linuxtesting.org).
--- kernel/dma/map_benchmark.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/dma/map_benchmark.c +2 -1
@@ -212,7 +212,8 @@ static long map_benchmark_ioctl(struct file *file, unsigned int cmd, }if (map->bparam.node !=NUMA_NO_NODE && - !node_possible (map->bparam.node)) { + (map->bparam.node <0 || map->bparam.node >=MAX_NUMNODES || + !node_possible (map->bparam.node))) {pr_err ("invalid numa node\n" );return -EINVAL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 290/374 dma-mapping: benchmark: handle NUMA_NO_NODE correctly
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit e64746e74f717961250a155e14c156616fcd981f ]
cpumask_of_node() can be called for NUMA_NO_NODE inside do_map_benchmark() resulting in the following sanitizer report:
UBSAN: array-index-out-of-bounds in ./arch/x86/include/asm/topology.h:72:28 index -1 is out of range for type 'cpumask [64][1]' CPU: 1 PID: 990 Comm: dma_map_benchma Not tainted 6.9.0-rc6 #29 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) Call Trace: <TASK>
dump_stack_lvl (lib/dump_stack.c:117)ubsan_epilogue (lib/ubsan.c:232) __ubsan_handle_out_of_bounds (lib/ubsan.c:429) cpumask_of_node (arch/x86/include/asm/topology.h:72) [inline] do_map_benchmark (kernel/dma/map_benchmark.c:104) map_benchmark_ioctl (kernel/dma/map_benchmark.c:246) full_proxy_unlocked_ioctl (fs/debugfs/file.c:333) __x64_sys_ioctl (fs/ioctl.c:890)do_syscall_64 (arch/x86/entry/common.c:83) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130)
Use cpumask_of_node() in place when binding a kernel thread to a cpuset of a particular node.
Note that the provided node id is checked inside map_benchmark_ioctl(). It's just a NUMA_NO_NODE case which is not handled properly later.
Found by Linux Verification Center (linuxtesting.org).
--- kernel/dma/map_benchmark.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
kernel/dma/map_benchmark.c +1 -2
@@ -101,7 +101,6 @@ static int do_map_benchmark(struct map_benchmark_data *map)struct task_struct **tsk;int threads = map->bparam.threads;int node = map->bparam.node; -const cpumask_t *cpu_mask =cpumask_of_node (node);u64 loops;int ret =0 ;int i;
@@ -124,7 +123,7 @@ static int do_map_benchmark(struct map_benchmark_data *map) }if (node !=NUMA_NO_NODE ) -kthread_bind_mask (tsk[i], cpu_mask); +kthread_bind_mask (tsk[i],cpumask_of_node (node)); }/* clear the old value in the previous benchmark */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 291/374 nvme: fix multipath batched completion accounting
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit 2fe7b422460d14b33027d8770f7be8d26bcb2639 ]
Batched completions were missing the io stats accounting and bio trace events. Move the common code to a helper and call it from the batched and non-batched functions.
--- drivers/nvme/host/core.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/nvme/host/core.c +10 -5
@@ -414,6 +414,14 @@ static inline void nvme_end_req_zoned(struct request *req) } } +static inline void __nvme_end_req (struct request *req) +{ +nvme_end_req_zoned (req); +nvme_trace_bio_complete (req); +if (req->cmd_flags &REQ_NVME_MPATH ) +nvme_mpath_end_request (req); +} +static inline void nvme_end_req (struct request *req) {blk_status_t status =nvme_error_status (nvme_req (req)->status);
@@ -424,10 +432,7 @@ static inline void nvme_end_req(struct request *req)else nvme_log_error (req); } -nvme_end_req_zoned (req); -nvme_trace_bio_complete (req); -if (req->cmd_flags &REQ_NVME_MPATH ) -nvme_mpath_end_request (req); +__nvme_end_req (req);blk_mq_end_request (req, status); }
@@ -476,7 +481,7 @@ void nvme_complete_batch_req(struct request *req) {trace_nvme_complete_rq (req);nvme_cleanup_cmd (req); -nvme_end_req_zoned (req); +__nvme_end_req (req); }EXPORT_SYMBOL_GPL (nvme_complete_batch_req);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 292/374 nvme-multipath: fix io accounting on failover
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit a2e4c5f5f68dbd206f132bc709b98dea64afc3b8 ]
There are io stats accounting that needs to be handled, so don't call blk_mq_end_request() directly. Use the existing nvme_end_req() helper that already handles everything.
--- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/multipath.c | 3 ++- drivers/nvme/host/nvme.h | 1 + 3 files changed, 4 insertions(+), 2 deletions(-)
drivers/nvme/host/core.c +1 -1
@@ -422,7 +422,7 @@ static inline void __nvme_end_req(struct request *req)nvme_mpath_end_request (req); } -static inline void nvme_end_req (struct request *req) +void nvme_end_req (struct request *req) {blk_status_t status =nvme_error_status (nvme_req (req)->status);
drivers/nvme/host/multipath.c +2 -1
@@ -118,7 +118,8 @@ void nvme_failover_req(struct request *req)blk_steal_bios (&ns->head->requeue_list, req);spin_unlock_irqrestore (&ns->head->requeue_lock, flags); -blk_mq_end_request (req,0 ); +nvme_req (req)->status =0 ; +nvme_end_req (req);kblockd_schedule_work (&ns->head->requeue_work); }
drivers/nvme/host/nvme.h +1 -0
@@ -767,6 +767,7 @@ static inline bool nvme_state_terminal(struct nvme_ctrl *ctrl) } } +void nvme_end_req (struct request *req);void nvme_complete_rq (struct request *req);void nvme_complete_batch_req (struct request *req);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 293/374 nvmet: fix ns enable/disable possible hang
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Grimberg <[email protected]>
[ Upstream commit f97914e35fd98b2b18fb8a092e0a0799f73afdfe ]
When disabling an nvmet namespace, there is a period where the subsys->lock is released, as the ns disable waits for backend IO to complete, and the ns percpu ref to be properly killed. The original intent was to avoid taking the subsystem lock for a prolong period as other processes may need to acquire it (for example new incoming connections).
However, it opens up a window where another process may come in and enable the ns, (re)intiailizing the ns percpu_ref, causing the disable sequence to hang.
Solve this by taking the global nvmet_config_sem over the entire configfs enable/disable sequence.
--- drivers/nvme/target/configfs.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/nvme/target/configfs.c +8 -0
@@ -676,10 +676,18 @@ static ssize_t nvmet_ns_enable_store(struct config_item *item,if (kstrtobool (page, &enable))return -EINVAL ; +/* +* take a global nvmet_config_sem because the disable routine has a +* window where it releases the subsys-lock, giving a chance to +* a parallel enable to concurrently execute causing the disable to +* have a misaccounting of the ns percpu_ref. +*/ +down_write (&nvmet_config_sem);if (enable) ret =nvmet_ns_enable (ns);else nvmet_ns_disable (ns); +up_write (&nvmet_config_sem);return ret ? ret : count; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 294/374 drm/amd/display: Enable colorspace property for MST connectors
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit 8195979d2dd995d60c2663adf54c69c1bf4eadd1 ]
MST colorspace property support was disabled due to a series of warnings that came up when the device was plugged in since the properties weren't made at device creation. Create the properties in advance instead.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +3 -0
@@ -613,6 +613,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, &connector->base, dev->mode_config.tile_property, 0); + connector->colorspace_property = master->base.colorspace_property; +if (connector->colorspace_property) +drm_connector_attach_colorspace_property (connector);drm_connector_set_path_property (connector, pathprop);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 295/374 net: phy: micrel: set soft_reset callback to genphy_soft_reset for KSZ8061
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathieu Othacehe <[email protected]>
[ Upstream commit 128d54fbcb14b8717ecf596d3dbded327b9980b3 ]
Following a similar reinstate for the KSZ8081 and KSZ9031.
Older kernels would use the genphy_soft_reset if the PHY did not implement a .soft_reset.
The KSZ8061 errata described here:
https://ww1.microchip.com/downloads/en/DeviceDoc/KSZ8061-Errata-DS80000688B.pdf
and worked around with 232ba3a51c ("net: phy: Micrel KSZ8061: link failure after cable connect") is back again without this soft reset.
--- drivers/net/phy/micrel.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/phy/micrel.c +1 -0
@@ -4814,6 +4814,7 @@ static struct phy_driver ksphy_driver[] = {/* PHY_BASIC_FEATURES */ .probe = kszphy_probe, .config_init = ksz8061_config_init, + .soft_reset = genphy_soft_reset, .config_intr = kszphy_config_intr, .handle_interrupt = kszphy_handle_interrupt, .suspend = kszphy_suspend,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 296/374 net/mlx5: Lag, do bond only if slaves agree on roce state
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maher Sanalla <[email protected]>
[ Upstream commit 51ef9305b8f40946d65c40368ffb4c14636d369a ]
Currently, the driver does not enforce that lag bond slaves must have matching roce capabilities. Yet, in mlx5_do_bond(), the driver attempts to enable roce on all vports of the bond slaves, causing the following syndrome when one slave has no roce fw support:
mlx5_cmd_out_err:809:(pid 25427): MODIFY_NIC_VPORT_CONTEXT(0×755) op_mod(0×0) failed, status bad parameter(0×3), syndrome (0xc1f678), err(-22)
Thus, create HW lag only if bond's slaves agree on roce state, either all slaves have roce support resulting in a roce lag bond, or none do, resulting in a raw eth bond.
--- drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c +10 -2
@@ -720,6 +720,7 @@ bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)struct mlx5_core_dev *dev;u8 mode;#endif +bool roce_support;int i;for (i =0 ; i < ldev->ports; i++)
@@ -746,6 +747,11 @@ bool mlx5_lag_check_prereq(struct mlx5_lag *ldev)if (mlx5_sriov_is_enabled (ldev->pf[i].dev))return false;#endif + roce_support =mlx5_get_roce_state (ldev->pf[MLX5_LAG_P1 ].dev); +for (i =1 ; i < ldev->ports; i++) +if (mlx5_get_roce_state (ldev->pf[i].dev) != roce_support) +return false; +return true; }
@@ -913,8 +919,10 @@ static void mlx5_do_bond(struct mlx5_lag *ldev) }else if (roce_lag) { dev0->priv.flags &= ~MLX5_PRIV_FLAGS_DISABLE_IB_ADEV ;mlx5_rescan_drivers_locked (dev0); -for (i =1 ; i < ldev->ports; i++) -mlx5_nic_vport_enable_roce (ldev->pf[i].dev); +for (i =1 ; i < ldev->ports; i++) { +if (mlx5_get_roce_state (ldev->pf[i].dev)) +mlx5_nic_vport_enable_roce (ldev->pf[i].dev); + } }else if (shared_fdb) {int i;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 297/374 net/mlx5: Do not query MPIR on embedded CPU function
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tariq Toukan <[email protected]>
[ Upstream commit fca3b4791850b7e2181f0b3195b66d53df83151b ]
A proper query to MPIR needs to set the correct value in the depth field. On embedded CPU this value is not necessarily zero. As there is no real use case for multi-PF netdev on the embedded CPU of the smart NIC, block this option.
This fixes the following failure:ACCESS_REG(0x805) op_mod(0x1) failed, status bad system state(0x4), syndrome (0x685f19), err(-5)
--- drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c +8 -4
@@ -100,10 +100,6 @@ static bool ft_create_alias_supported(struct mlx5_core_dev *dev)static bool mlx5_sd_is_supported (struct mlx5_core_dev *dev,u8 host_buses) { -/* Feature is currently implemented for PFs only */ -if (!mlx5_core_is_pf (dev)) -return false; -/* Honor the SW implementation limit */ if (host_buses >MLX5_SD_MAX_GROUP_SZ )return false;
@@ -162,6 +158,14 @@ static int sd_init(struct mlx5_core_dev *dev)bool sdm;int err; +/* Feature is currently implemented for PFs only */ +if (!mlx5_core_is_pf (dev)) +return 0 ; + +/* Block on embedded CPU PFs */ +if (mlx5_core_is_ecpf (dev)) +return 0 ; +if (!MLX5_CAP_MCAM_REG (dev, mpir))return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 298/374 net/mlx5: Fix MTMP register capability offset in MCAM register
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gal Pressman <[email protected]>
[ Upstream commit 1b9f86c6d53245dab087f1b2c05727b5982142ff ]
The MTMP register (0x900a) capability offset is off-by-one, move it to the right place.
--- include/linux/mlx5/mlx5_ifc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/mlx5/mlx5_ifc.h +2 -2
@@ -10267,9 +10267,9 @@ struct mlx5_ifc_mcam_access_reg_bits {u8 mfrl[0x1 ];u8 regs_39_to_32[0x8 ]; -u8 regs_31_to_10[0x16 ]; +u8 regs_31_to_11[0x15 ];u8 mtmp[0x1 ]; -u8 regs_8_to_0[0x9 ]; +u8 regs_9_to_0[0xa ]; };struct mlx5_ifc_mcam_access_reg_bits1 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 299/374 net/mlx5: Use mlx5_ipsec_rx_status_destroy to correctly delete status rules
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rahul Rameshbabu <[email protected]>
[ Upstream commit 16d66a4fa81da07bc4ed19f4e53b87263c2f8d38 ]
rx_create no longer allocates a modify_hdr instance that needs to be cleaned up. The mlx5_modify_header_dealloc call will lead to a NULL pointer dereference. A leak in the rules also previously occurred since there are now two rules populated related to status.
BUG: kernel NULL pointer dereference, address: 0000000000000000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 109907067 P4D 109907067 PUD 116890067 PMD 0 Oops: 0000 [#1] SMP CPU: 1 PID: 484 Comm: ip Not tainted 6.9.0-rc2-rrameshbabu+ #254 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Arch Linux 1.16.3-1-1 04/01/2014 RIP: 0010:mlx5_modify_header_dealloc+0xd/0x70 <snip> Call Trace: <TASK> ? show_regs+0x60/0x70 ? __die+0x24/0x70 ? page_fault_oops+0x15f/0x430 ? free_to_partial_list.constprop.0+0x79/0x150 ? do_user_addr_fault+0x2c9/0x5c0 ? exc_page_fault+0x63/0x110 ? asm_exc_page_fault+0x27/0x30 ? mlx5_modify_header_dealloc+0xd/0x70 rx_create+0x374/0x590 rx_add_rule+0x3ad/0x500 ? rx_add_rule+0x3ad/0x500 ? mlx5_cmd_exec+0x2c/0x40 ? mlx5_create_ipsec_obj+0xd6/0x200 mlx5e_accel_ipsec_fs_add_rule+0x31/0xf0 mlx5e_xfrm_add_state+0x426/0xc00 <snip>
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_fs.c +1 -2
@@ -750,8 +750,7 @@ static int rx_create(struct mlx5_core_dev *mdev, struct mlx5e_ipsec *ipsec, err_fs_ft:if (rx->allow_tunnel_mode)mlx5_eswitch_unblock_encap (mdev); -mlx5_del_flow_rules (rx->status.rule); -mlx5_modify_header_dealloc (mdev, rx->status.modify_hdr); +mlx5_ipsec_rx_status_destroy (ipsec, rx); err_add:mlx5_destroy_flow_table (rx->ft.status); err_fs_ft_status:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 300/374 net/mlx5e: Fix IPsec tunnel mode offload feature check
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rahul Rameshbabu <[email protected]>
[ Upstream commit 9a52f6d44f4521773b4699b4ed34b8e21d5a175c ]
Remove faulty check disabling checksum offload and GSO for offload of simple IPsec tunnel L4 traffic. Comment previously describing the deleted code incorrectly claimed the check prevented double tunnel (or three layers of ip headers).
--- .../mellanox/mlx5/core/en_accel/ipsec_rxtx.h | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h +5 -12
@@ -97,18 +97,11 @@ mlx5e_ipsec_feature_check(struct sk_buff *skb, netdev_features_t features)if (!x || !x->xso.offload_handle) goto out_disable; -if (xo->inner_ipproto) { -/* Cannot support tunnel packet over IPsec tunnel mode -* because we cannot offload three IP header csum -*/ -if (x->props.mode ==XFRM_MODE_TUNNEL ) - goto out_disable; - -/* Only support UDP or TCP L4 checksum */ -if (xo->inner_ipproto !=IPPROTO_UDP && - xo->inner_ipproto !=IPPROTO_TCP ) - goto out_disable; - } +/* Only support UDP or TCP L4 checksum */ +if (xo->inner_ipproto && + xo->inner_ipproto !=IPPROTO_UDP && + xo->inner_ipproto !=IPPROTO_TCP ) + goto out_disable;return features;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 301/374 net/mlx5e: Use rx_missed_errors instead of rx_dropped for reporting buffer exhaustion
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Carolina Jubran <[email protected]>
[ Upstream commit 5c74195d5dd977e97556e6fa76909b831c241230 ]
Previously, the driver incorrectly used rx_dropped to report device buffer exhaustion.
According to the documentation, rx_dropped should not be used to count packets dropped due to buffer exhaustion, which is the purpose of rx_missed_errors.
Use rx_missed_errors as intended for counting packets dropped due to buffer exhaustion.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +1 -1
@@ -3790,7 +3790,7 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)mlx5e_fold_sw_stats64 (priv, stats); } - stats->rx_dropped = priv->stats.qcnt.rx_out_of_buffer; + stats->rx_missed_errors = priv->stats.qcnt.rx_out_of_buffer; stats->rx_length_errors = PPORT_802_3_GET(pstats, a_in_range_length_errors) +
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 302/374 net/mlx5e: Fix UDP GSO for encapsulated packets
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gal Pressman <[email protected]>
[ Upstream commit 83fea49f2711fc90c0d115b0ed04046b45155b65 ]
When the skb is encapsulated, adjust the inner UDP header instead of the outer one, and account for UDP header (instead of TCP) in the inline header size calculation.
--- .../net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h | 8 +++++++- drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h +7 -1
@@ -102,8 +102,14 @@ static inline void mlx5e_udp_gso_handle_tx_skb(struct sk_buff *skb) {int payload_len =skb_shinfo (skb)->gso_size +sizeof (struct udphdr ); +struct udphdr *udphdr; -udp_hdr (skb)->len =htons (payload_len); +if (skb->encapsulation) + udphdr = (struct udphdr *)skb_inner_transport_header (skb); +else + udphdr =udp_hdr (skb); + + udphdr->len =htons (payload_len); }struct mlx5e_accel_tx_state {
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +5 -1
@@ -153,7 +153,11 @@ mlx5e_tx_get_gso_ihs(struct mlx5e_txqsq *sq, struct sk_buff *skb, int *hopbyhop) *hopbyhop =0 ;if (skb->encapsulation) { - ihs =skb_inner_tcp_all_headers (skb); +if (skb_shinfo (skb)->gso_type &SKB_GSO_UDP_L4 ) + ihs =skb_inner_transport_offset (skb) + +sizeof (struct udphdr ); +else + ihs =skb_inner_tcp_all_headers (skb); stats->tso_inner_packets++; stats->tso_inner_bytes += skb->len - ihs; }else {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 303/374 dma-buf/sw-sync: dont enable IRQ from sync_print_obj()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
[ Upstream commit b794918961516f667b0c745aebdfebbb8a98df39 ]
Since commit a6aa8fca4d79 ("dma-buf/sw-sync: Reduce irqsave/irqrestore from known context") by error replaced spin_unlock_irqrestore() with spin_unlock_irq() for both sync_debugfs_show() and sync_print_obj() despite sync_print_obj() is called from sync_debugfs_show(), lockdep complains inconsistent lock state warning.
Use plain spin_{lock,unlock}() for sync_print_obj(), for sync_debugfs_show() is already using spin_{lock,unlock}_irq().
--- drivers/dma-buf/sync_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/dma-buf/sync_debug.c +2 -2
@@ -110,12 +110,12 @@ static void sync_print_obj(struct seq_file *s, struct sync_timeline *obj)seq_printf (s,"%s: %d\n" , obj->name, obj->value); -spin_lock_irq (&obj->lock); +spin_lock (&obj->lock);/* Caller already disabled IRQ. */ list_for_each (pos, &obj->pt_list) { struct sync_pt *pt = container_of(pos, struct sync_pt, link);sync_print_fence (s, &pt->base, false); } -spin_unlock_irq (&obj->lock); +spin_unlock (&obj->lock); } static void sync_print_sync_file(struct seq_file *s,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 304/374 bpf: Fix potential integer overflow in resolve_btfids
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Friedrich Vock <[email protected]>
[ Upstream commit 44382b3ed6b2787710c8ade06c0e97f5970a47c8 ]
err is a 32-bit integer, but elf_update returns an off_t, which is 64-bit at least on 64-bit platforms. If symbols_patch is called on a binary between 2-4GB in size, the result will be negative when cast to a 32-bit integer, which the code assumes means an error occurred. This can wrongly trigger build failures when building very large kernel images.
--- tools/bpf/resolve_btfids/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/bpf/resolve_btfids/main.c +1 -1
@@ -728,7 +728,7 @@ static int sets_patch(struct object *obj)static int symbols_patch (struct object *obj) { -int err; +off_t err; if (__symbols_patch(obj, &obj->structs) || __symbols_patch(obj, &obj->unions) ||
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 305/374 netkit: Fix setting mac address in l2 mode
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit d6fe532b7499e4575f9647879b7a34625817fe7f ]
When running Cilium connectivity test suite with netkit in L2 mode, we found that it is expected to be able to specify a custom MAC address for the devices, in particular, cilium-cni obtains the specified MAC address by querying the endpoint and sets the MAC address of the interface inside the Pod. Thus, fix the missing support in netkit for L2 mode.
--- drivers/net/netkit.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)
drivers/net/netkit.c +21 -5
@@ -155,6 +155,16 @@ static void netkit_set_multicast(struct net_device *dev)/* Nothing to do, we receive whatever gets pushed to us! */ } +static int netkit_set_macaddr (struct net_device *dev,void *sa) +{ +struct netkit *nk =netkit_priv (dev); + +if (nk->mode !=NETKIT_L2 ) +return -EOPNOTSUPP ; + +return eth_mac_addr (dev, sa); +} +static void netkit_set_headroom (struct net_device *dev,int headroom) {struct netkit *nk =netkit_priv (dev), *nk2;
@@ -198,6 +208,7 @@ static const struct net_device_ops netkit_netdev_ops = { .ndo_start_xmit = netkit_xmit, .ndo_set_rx_mode = netkit_set_multicast, .ndo_set_rx_headroom = netkit_set_headroom, + .ndo_set_mac_address = netkit_set_macaddr, .ndo_get_iflink = netkit_get_iflink, .ndo_get_peer_dev = netkit_peer_dev, .ndo_get_stats64 = netkit_get_stats,
@@ -300,9 +311,11 @@ static int netkit_validate(struct nlattr *tb[], struct nlattr *data[],if (!attr)return 0 ; -NL_SET_ERR_MSG_ATTR (extack, attr, -"Setting Ethernet address is not supported" ); -return -EOPNOTSUPP ; +if (nla_len (attr) !=ETH_ALEN ) +return -EINVAL ; +if (!is_valid_ether_addr (nla_data (attr))) +return -EADDRNOTAVAIL ; +return 0 ; }static struct rtnl_link_ops netkit_link_ops;
@@ -365,6 +378,9 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,strscpy (ifname,"nk%d" ,IFNAMSIZ ); ifname_assign_type =NET_NAME_ENUM ; } +if (mode !=NETKIT_L2 && + (tb[IFLA_ADDRESS ] || tbp[IFLA_ADDRESS ])) +return -EOPNOTSUPP ; net =rtnl_link_get_net (src_net, tbp);if (IS_ERR (net))
@@ -379,7 +395,7 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,netif_inherit_tso_max (peer, dev); -if (mode ==NETKIT_L2 ) +if (mode ==NETKIT_L2 && !(ifmp && tbp[IFLA_ADDRESS ]))eth_hw_addr_random (peer);if (ifmp && dev->ifindex) peer->ifindex = ifmp->ifi_index;
@@ -402,7 +418,7 @@ static int netkit_new_link(struct net *src_net, struct net_device *dev,if (err <0 ) goto err_configure_peer; -if (mode ==NETKIT_L2 ) +if (mode ==NETKIT_L2 && !tb[IFLA_ADDRESS ])eth_hw_addr_random (dev);if (tb[IFLA_IFNAME ])nla_strscpy (dev->name, tb[IFLA_IFNAME ],IFNAMSIZ );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 306/374 netkit: Fix pkt_type override upon netkit pass verdict
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 3998d184267dfcff858aaa84d3de17429253629d ]
When running Cilium connectivity test suite with netkit in L2 mode, we found that compared to tcx a few tests were failing which pushed traffic into an L7 proxy sitting in host namespace. The problem in particular is around the invocation of eth_type_trans() in netkit.
In case of tcx, this is run before the tcx ingress is triggered inside host namespace and thus if the BPF program uses the bpf_skb_change_type() helper the newly set type is retained. However, in case of netkit, the late eth_type_trans() invocation overrides the earlier decision from the BPF program which eventually leads to the test failure.
Instead of eth_type_trans(), split out the relevant parts, meaning, reset of mac header and call to eth_skb_pkt_type() before the BPF program is run in order to have the same behavior as with tcx, and refactor a small helper called eth_skb_pull_mac() which is run in case it's passed up the stack where the mac header must be pulled. With this all connectivity tests pass.
--- drivers/net/netkit.c | 4 +++- include/linux/etherdevice.h | 8 ++++++++ net/ethernet/eth.c | 4 +--- 3 files changed, 12 insertions(+), 4 deletions(-)
drivers/net/netkit.c +3 -1
@@ -55,6 +55,7 @@ static void netkit_prep_forward(struct sk_buff *skb, bool xnet)skb_scrub_packet (skb, xnet); skb->priority =0 ;nf_skip_egress (skb, true); +skb_reset_mac_header (skb); }static struct netkit *netkit_priv (const struct net_device *dev)
@@ -78,6 +79,7 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev) skb_orphan_frags(skb, GFP_ATOMIC))) goto drop;netkit_prep_forward (skb, !net_eq (dev_net (dev),dev_net (peer))); +eth_skb_pkt_type (skb, peer); skb->dev = peer; entry =rcu_dereference (nk->active);if (entry)
@@ -85,7 +87,7 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev)switch (ret) {case NETKIT_NEXT :case NETKIT_PASS : - skb->protocol =eth_type_trans (skb, skb->dev); +eth_skb_pull_mac (skb);skb_postpull_rcsum (skb,eth_hdr (skb),ETH_HLEN );if (likely (__netif_rx (skb) ==NET_RX_SUCCESS )) {dev_sw_netstats_tx_add (dev,1 , len);
include/linux/etherdevice.h +8 -0
@@ -632,6 +632,14 @@ static inline void eth_skb_pkt_type(struct sk_buff *skb, } } +static inline struct ethhdr *eth_skb_pull_mac (struct sk_buff *skb) +{ +struct ethhdr *eth = (struct ethhdr *)skb->data; + +skb_pull_inline (skb,ETH_HLEN ); +return eth; +} +/** * eth_skb_pad - Pad buffer to mininum number of octets for Ethernet frame * @skb: Buffer to pad
net/ethernet/eth.c +1 -3
@@ -161,9 +161,7 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) skb->dev = dev;skb_reset_mac_header (skb); - eth = (struct ethhdr *)skb->data; -skb_pull_inline (skb,ETH_HLEN ); - + eth =eth_skb_pull_mac (skb);eth_skb_pkt_type (skb, dev);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 307/374 ALSA: core: Remove debugfs at disconnection
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 495000a38634e640e2fd02f7e4f1512ccc92d770 ]
The card-specific debugfs entries are removed at the last stage of card free phase, and it's performed after synchronization of the closes of all opened fds. This works fine for most cases, but it can be potentially problematic for a hotplug device like USB-audio. Due to the nature of snd_card_free_when_closed(), the card free isn't called immediately after the driver removal for a hotplug device, but it's left until the last fd is closed. It implies that the card debugfs entries also remain. Meanwhile, when a new device is inserted before the last close and the very same card slot is assigned, the driver tries to create the card debugfs root again on the very same path. This conflicts with the remaining entry, and results in the kernel warning such as:
debugfs: Directory 'card0' with parent 'sound' already present!
with the missing debugfs entry afterwards.
For avoiding such conflicts, remove debugfs entries at the device disconnection phase instead. The jack kctl debugfs entries get removed in snd_jack_dev_disconnect() instead of each kctl private_free.
--- sound/core/init.c | 9 +++++---- sound/core/jack.c | 21 ++++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-)
sound/core/init.c +5 -4
@@ -539,6 +539,11 @@ void snd_card_disconnect(struct snd_card *card)synchronize_irq (card->sync_irq);snd_info_card_disconnect (card); +#ifdef CONFIG_SND_DEBUG +debugfs_remove (card->debugfs_root); + card->debugfs_root =NULL ; +#endif +if (card->registered) {device_del (&card->card_dev); card->registered = false;
@@ -590,10 +595,6 @@ static int snd_card_do_free(struct snd_card *card)dev_warn (card->dev,"unable to free card info\n" );/* Not fatal error */ } -#ifdef CONFIG_SND_DEBUG -debugfs_remove (card->debugfs_root); - card->debugfs_root =NULL ; -#endif if (card->release_completion)complete (card->release_completion);if (!card->managed)
sound/core/jack.c +14 -7
@@ -37,11 +37,15 @@ static const int jack_switch_types[SND_JACK_SWITCH_TYPES] = { };#endif /* CONFIG_SND_JACK_INPUT_DEV */ +static void snd_jack_remove_debugfs (struct snd_jack *jack); +static int snd_jack_dev_disconnect (struct snd_device *device) { -#ifdef CONFIG_SND_JACK_INPUT_DEV struct snd_jack *jack = device->device_data; +snd_jack_remove_debugfs (jack); + +#ifdef CONFIG_SND_JACK_INPUT_DEV guard (mutex)(&jack->input_dev_lock);if (!jack->input_dev)return 0 ;
@@ -381,10 +385,14 @@ static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,return 0 ; } -static void snd_jack_debugfs_clear_inject_node (struct snd_jack_kctl *jack_kctl) +static void snd_jack_remove_debugfs (struct snd_jack *jack) { -debugfs_remove (jack_kctl->jack_debugfs_root); - jack_kctl->jack_debugfs_root =NULL ; +struct snd_jack_kctl *jack_kctl; + +list_for_each_entry (jack_kctl, &jack->kctl_list, list) { +debugfs_remove (jack_kctl->jack_debugfs_root); + jack_kctl->jack_debugfs_root =NULL ; + } }#else /* CONFIG_SND_JACK_INJECTION_DEBUG */ static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
@@ -393,7 +401,7 @@ static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack, return 0; } -static void snd_jack_debugfs_clear_inject_node (struct snd_jack_kctl *jack_kctl) +static void snd_jack_remove_debugfs (struct snd_jack *jack) { }#endif /* CONFIG_SND_JACK_INJECTION_DEBUG */
@@ -404,7 +412,6 @@ static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl) jack_kctl = kctl->private_data;if (jack_kctl) { -snd_jack_debugfs_clear_inject_node (jack_kctl);list_del (&jack_kctl->list);kfree (jack_kctl); }
@@ -497,8 +504,8 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, .dev_free = snd_jack_dev_free, #ifdef CONFIG_SND_JACK_INPUT_DEV .dev_register = snd_jack_dev_register, - .dev_disconnect = snd_jack_dev_disconnect,#endif /* CONFIG_SND_JACK_INPUT_DEV */ + .dev_disconnect = snd_jack_dev_disconnect, };if (initial_kctl) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 308/374 ALSA: hda/realtek: Adjust G814JZR to use SPI init for amp
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luke D. Jones <[email protected]>
[ Upstream commit 2be46155d792d629e8fe3188c2cde176833afe36 ]
The 2024 ASUS ROG G814J model is much the same as the 2023 model and the 2023 16" version. We can use the same Cirrus Amp quirk.
--- sound/pci/hda/patch_realtek.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +1 -1
@@ -10294,7 +10294,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1043 ,0x3030 ,"ASUS ZN270IE" ,ALC256_FIXUP_ASUS_AIO_GPIO2 ),SND_PCI_QUIRK (0x1043 ,0x3a20 ,"ASUS G614JZR" ,ALC245_FIXUP_CS35L41_SPI_2 ),SND_PCI_QUIRK (0x1043 ,0x3a30 ,"ASUS G814JVR/JIR" ,ALC245_FIXUP_CS35L41_SPI_2 ), -SND_PCI_QUIRK (0x1043 ,0x3a40 ,"ASUS G814JZR" ,ALC245_FIXUP_CS35L41_SPI_2 ), +SND_PCI_QUIRK (0x1043 ,0x3a40 ,"ASUS G814JZR" ,ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS ),SND_PCI_QUIRK (0x1043 ,0x3a50 ,"ASUS G834JYR/JZR" ,ALC245_FIXUP_CS35L41_SPI_2 ),SND_PCI_QUIRK (0x1043 ,0x3a60 ,"ASUS G634JYR/JZR" ,ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS ), SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 309/374 enic: Validate length of nl attributes in enic_set_vf_port
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roded Zats <[email protected]>
[ Upstream commit e8021b94b0412c37bcc79027c2e382086b6ce449 ]
enic_set_vf_port assumes that the nl attribute IFLA_PORT_PROFILE is of length PORT_PROFILE_MAX and that the nl attributes IFLA_PORT_INSTANCE_UUID, IFLA_PORT_HOST_UUID are of length PORT_UUID_MAX. These attributes are validated (in the function do_setlink in rtnetlink.c) using the nla_policy ifla_port_policy. The policy defines IFLA_PORT_PROFILE as NLA_STRING, IFLA_PORT_INSTANCE_UUID as NLA_BINARY and IFLA_PORT_HOST_UUID as NLA_STRING. That means that the length validation using the policy is for the max size of the attributes and not on exact size so the length of these attributes might be less than the sizes that enic_set_vf_port expects. This might cause an out of bands
read access in the memcpys of the data of these
attributes in enic_set_vf_port.
--- drivers/net/ethernet/cisco/enic/enic_main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/net/ethernet/cisco/enic/enic_main.c +12 -0
@@ -1117,18 +1117,30 @@ static int enic_set_vf_port(struct net_device *netdev, int vf, pp->request =nla_get_u8 (port[IFLA_PORT_REQUEST ]);if (port[IFLA_PORT_PROFILE ]) { +if (nla_len (port[IFLA_PORT_PROFILE ]) !=PORT_PROFILE_MAX ) { +memcpy (pp, &prev_pp,sizeof (*pp)); +return -EINVAL ; + } pp->set |=ENIC_SET_NAME ;memcpy (pp->name,nla_data (port[IFLA_PORT_PROFILE ]),PORT_PROFILE_MAX ); }if (port[IFLA_PORT_INSTANCE_UUID ]) { +if (nla_len (port[IFLA_PORT_INSTANCE_UUID ]) !=PORT_UUID_MAX ) { +memcpy (pp, &prev_pp,sizeof (*pp)); +return -EINVAL ; + } pp->set |=ENIC_SET_INSTANCE ;memcpy (pp->instance_uuid,nla_data (port[IFLA_PORT_INSTANCE_UUID ]),PORT_UUID_MAX ); }if (port[IFLA_PORT_HOST_UUID ]) { +if (nla_len (port[IFLA_PORT_HOST_UUID ]) !=PORT_UUID_MAX ) { +memcpy (pp, &prev_pp,sizeof (*pp)); +return -EINVAL ; + } pp->set |=ENIC_SET_HOST ;memcpy (pp->host_uuid,nla_data (port[IFLA_PORT_HOST_UUID ]),PORT_UUID_MAX );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 310/374 af_unix: Annotate data-race around unix_sk(sk)->addr.
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 97e1db06c7bb948da10ba85acad8030b56886593 ]
Once unix_sk(sk)->addr is assigned under net->unx.table.locks and unix_sk(sk)->bindlock, *(unix_sk(sk)->addr) and unix_sk(sk)->path are fully set up, and unix_sk(sk)->addr is never changed.
unix_getname() and unix_copy_addr() access the two fields locklessly, and commit ae3b564179bf ("missing barriers in some of unix_sock ->addr and ->path accesses") added smp_store_release() and smp_load_acquire() pairs.
In other functions, we still read unix_sk(sk)->addr locklessly to check if the socket is bound, and KCSAN complains about it. [0]
Given these functions have no dependency for *(unix_sk(sk)->addr) and unix_sk(sk)->path, READ_ONCE() is enough to annotate the data-race.
Note that it is safe to access unix_sk(sk)->addr locklessly if the socket is found in the hash table. For example, the lockless read of otheru->addr in unix_stream_connect() is safe.
Note also that newu->addr there is of the child socket that is still not accessible from userspace, and smp_store_release() publishes the address in case the socket is accept()ed and unix_getname() / unix_copy_addr() is called.
[0]:
BUG: KCSAN: data-race in unix_bind / unix_listen
write (marked) to 0xffff88805f8d1840 of 8 bytes by task 13723 on cpu 0:
__unix_set_addr_hash net/unix/af_unix.c:329 [inline] unix_bind_bsd net/unix/af_unix.c:1241 [inline] unix_bind+0x881/0x1000 net/unix/af_unix.c:1319 __sys_bind+0x194/0x1e0 net/socket.c:1847 __do_sys_bind net/socket.c:1858 [inline] __se_sys_bind net/socket.c:1856 [inline] __x64_sys_bind+0x40/0x50 net/socket.c:1856 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x4f/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x46/0x4e
read to 0xffff88805f8d1840 of 8 bytes by task 13724 on cpu 1:
unix_listen+0x72/0x180 net/unix/af_unix.c:734 __sys_listen+0xdc/0x160 net/socket.c:1881 __do_sys_listen net/socket.c:1890 [inline] __se_sys_listen net/socket.c:1888 [inline] __x64_sys_listen+0x2e/0x40 net/socket.c:1888 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x4f/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x46/0x4e
value changed: 0x0000000000000000 -> 0xffff88807b5b1b40
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 13724 Comm: syz-executor.4 Not tainted 6.8.0-12822-gcd51db110a7e #12 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
--- net/unix/af_unix.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/unix/af_unix.c +6 -4
@@ -731,7 +731,7 @@ static int unix_listen(struct socket *sock, int backlog)if (sock->type !=SOCK_STREAM && sock->type !=SOCK_SEQPACKET ) goto out;/* Only stream/seqpacket sockets accept */ err = -EINVAL ; -if (!u->addr) +if (!READ_ONCE (u->addr)) goto out;/* No listens on an unbound socket */ unix_state_lock (sk);if (sk->sk_state !=TCP_CLOSE && sk->sk_state !=TCP_LISTEN )
@@ -1369,7 +1369,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,if ((test_bit (SOCK_PASSCRED , &sock->flags) ||test_bit (SOCK_PASSPIDFD , &sock->flags)) && - !unix_sk (sk)->addr) { + !READ_ONCE (unix_sk (sk)->addr)) { err =unix_autobind (sk);if (err) goto out;
@@ -1481,7 +1481,8 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, goto out;if ((test_bit (SOCK_PASSCRED , &sock->flags) || -test_bit (SOCK_PASSPIDFD , &sock->flags)) && !u->addr) { +test_bit (SOCK_PASSPIDFD , &sock->flags)) && + !READ_ONCE (u->addr)) { err =unix_autobind (sk);if (err) goto out;
@@ -1997,7 +1998,8 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg, }if ((test_bit (SOCK_PASSCRED , &sock->flags) || -test_bit (SOCK_PASSPIDFD , &sock->flags)) && !u->addr) { +test_bit (SOCK_PASSPIDFD , &sock->flags)) && + !READ_ONCE (u->addr)) { err =unix_autobind (sk);if (err) goto out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 311/374 af_unix: Read sk->sk_hash under bindlock during bind().
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit 51d1b25a720982324871338b1a36b197ec9bd6f0 ]
syzkaller reported data-race of sk->sk_hash in unix_autobind() [0], and the same ones exist in unix_bind_bsd() and unix_bind_abstract().
The three bind() functions prefetch sk->sk_hash locklessly and use it later after validating that unix_sk(sk)->addr is NULL under unix_sk(sk)->bindlock.
The prefetched sk->sk_hash is the hash value of unbound socket set in unix_create1() and does not change until bind() completes.
There could be a chance that sk->sk_hash changes after the lockless read. However, in such a case, non-NULL unix_sk(sk)->addr is visible under unix_sk(sk)->bindlock, and bind() returns -EINVAL without using the prefetched value.
The KCSAN splat is false-positive, but let's silence it by reading sk->sk_hash under unix_sk(sk)->bindlock.
[0]:
BUG: KCSAN: data-race in unix_autobind / unix_autobind
write to 0xffff888034a9fb88 of 4 bytes by task 4468 on cpu 0:
__unix_set_addr_hash net/unix/af_unix.c:331 [inline] unix_autobind+0x47a/0x7d0 net/unix/af_unix.c:1185 unix_dgram_connect+0x7e3/0x890 net/unix/af_unix.c:1373 __sys_connect_file+0xd7/0xe0 net/socket.c:2048 __sys_connect+0x114/0x140 net/socket.c:2065 __do_sys_connect net/socket.c:2075 [inline] __se_sys_connect net/socket.c:2072 [inline] __x64_sys_connect+0x40/0x50 net/socket.c:2072 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x4f/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x46/0x4e
read to 0xffff888034a9fb88 of 4 bytes by task 4465 on cpu 1:
unix_autobind+0x28/0x7d0 net/unix/af_unix.c:1134 unix_dgram_connect+0x7e3/0x890 net/unix/af_unix.c:1373 __sys_connect_file+0xd7/0xe0 net/socket.c:2048 __sys_connect+0x114/0x140 net/socket.c:2065 __do_sys_connect net/socket.c:2075 [inline] __se_sys_connect net/socket.c:2072 [inline] __x64_sys_connect+0x40/0x50 net/socket.c:2072 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x4f/0x110 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x46/0x4e
value changed: 0x000000e4 -> 0x000001e3
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 4465 Comm: syz-executor.0 Not tainted 6.8.0-12822-gcd51db110a7e #12 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/01/2014
--- net/unix/af_unix.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/unix/af_unix.c +6 -3
@@ -1131,8 +1131,8 @@ static struct sock *unix_find_other(struct net *net,static int unix_autobind (struct sock *sk) { -unsigned int new_hash, old_hash = sk->sk_hash;struct unix_sock *u =unix_sk (sk); +unsigned int new_hash, old_hash;struct net *net =sock_net (sk);struct unix_address *addr;u32 lastnum, ordernum;
@@ -1155,6 +1155,7 @@ static int unix_autobind(struct sock *sk) addr->name->sun_family =AF_UNIX ;refcount_set (&addr->refcnt,1 ); + old_hash = sk->sk_hash; ordernum =get_random_u32 (); lastnum = ordernum &0xFFFFF ; retry:
@@ -1195,8 +1196,8 @@ static int unix_bind_bsd(struct sock *sk, struct sockaddr_un *sunaddr, {umode_t mode =S_IFSOCK | (SOCK_INODE (sk->sk_socket)->i_mode & ~current_umask ()); -unsigned int new_hash, old_hash = sk->sk_hash;struct unix_sock *u =unix_sk (sk); +unsigned int new_hash, old_hash;struct net *net =sock_net (sk);struct mnt_idmap *idmap;struct unix_address *addr;
@@ -1234,6 +1235,7 @@ static int unix_bind_bsd(struct sock *sk, struct sockaddr_un *sunaddr,if (u->addr) goto out_unlock; + old_hash = sk->sk_hash; new_hash =unix_bsd_hash (d_backing_inode (dentry));unix_table_double_lock (net, old_hash, new_hash); u->path.mnt =mntget (parent.mnt);
@@ -1261,8 +1263,8 @@ static int unix_bind_bsd(struct sock *sk, struct sockaddr_un *sunaddr,static int unix_bind_abstract (struct sock *sk,struct sockaddr_un *sunaddr,int addr_len) { -unsigned int new_hash, old_hash = sk->sk_hash;struct unix_sock *u =unix_sk (sk); +unsigned int new_hash, old_hash;struct net *net =sock_net (sk);struct unix_address *addr;int err;
@@ -1280,6 +1282,7 @@ static int unix_bind_abstract(struct sock *sk, struct sockaddr_un *sunaddr, goto out_mutex; } + old_hash = sk->sk_hash; new_hash =unix_abstract_hash (addr->name, addr->len, sk->sk_type);unix_table_double_lock (net, old_hash, new_hash);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 312/374 Octeontx2-pf: Free send queue buffers incase of leaf to inner
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hariprasad Kelam <[email protected]>
[ Upstream commit 1684842147677a1279bcff95f8adb6de9a656e30 ]
There are two type of classes. "Leaf classes" that are the bottom of the class hierarchy. "Inner classes" that are neither the root class nor leaf classes. QoS rules can only specify leaf classes as targets for traffic.
Root
/ \
/ \
1 2
/\
/ \
4 5
classes 1,4 and 5 are leaf classes.
class 2 is a inner class.When a leaf class made as inner, or vice versa, resources associated with send queue (send queue buffers and transmit schedulers) are not getting freed.
--- drivers/net/ethernet/marvell/octeontx2/nic/qos.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/qos.c +4 -0
@@ -1407,7 +1407,10 @@ static int otx2_qos_leaf_to_inner(struct otx2_nic *pfvf, u16 classid,otx2_qos_read_txschq_cfg (pfvf, node, old_cfg);/* delete the txschq nodes allocated for this node */ +otx2_qos_disable_sq (pfvf, qid); +otx2_qos_free_hw_node_schq (pfvf, node);otx2_qos_free_sw_node_schq (pfvf, node); + pfvf->qos.qid_to_sqmap[qid] =OTX2_QOS_INVALID_SQ ;/* mark this node as htb inner node */ WRITE_ONCE (node->qid,OTX2_QOS_QID_INNER );
@@ -1554,6 +1557,7 @@ static int otx2_qos_leaf_del_last(struct otx2_nic *pfvf, u16 classid, bool force dwrr_del_node = true;/* destroy the leaf node */ +otx2_qos_disable_sq (pfvf, qid);otx2_qos_destroy_node (pfvf, node); pfvf->qos.qid_to_sqmap[qid] =OTX2_QOS_INVALID_SQ ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 313/374 net: usb: smsc95xx: fix changing LED_SEL bit value updated from EEPROM
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Parthiban Veerasooran <[email protected]>
[ Upstream commit 52a2f0608366a629d43dacd3191039c95fef74ba ]
LED Select (LED_SEL) bit in the LED General Purpose IO Configuration register is used to determine the functionality of external LED pins (Speed Indicator, Link and Activity Indicator, Full Duplex Link Indicator). The default value for this bit is 0 when no EEPROM is present. If a EEPROM is present, the default value is the value of the LED Select bit in the Configuration Flags of the EEPROM. A USB Reset or Lite Reset (LRST) will cause this bit to be restored to the image value last loaded from EEPROM, or to be set to 0 if no EEPROM is present.
While configuring the dual purpose GPIO/LED pins to LED outputs in the LED General Purpose IO Configuration register, the LED_SEL bit is changed as 0 and resulting the configured value from the EEPROM is cleared. The issue is fixed by using read-modify-write approach.
--- drivers/net/usb/smsc95xx.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/net/usb/smsc95xx.c +7 -4
@@ -879,7 +879,7 @@ static int smsc95xx_start_rx_path(struct usbnet *dev)static int smsc95xx_reset (struct usbnet *dev) {struct smsc95xx_priv *pdata = dev->driver_priv; -u32 read_buf, write_buf, burst_cap; +u32 read_buf, burst_cap;int ret =0 , timeout;netif_dbg (dev, ifup, dev->net,"entering smsc95xx_reset\n" );
@@ -1003,10 +1003,13 @@ static int smsc95xx_reset(struct usbnet *dev)return ret;netif_dbg (dev, ifup, dev->net,"ID_REV = 0x%08x\n" , read_buf); + ret =smsc95xx_read_reg (dev,LED_GPIO_CFG , &read_buf); +if (ret <0 ) +return ret;/* Configure GPIO pins as LED outputs */ - write_buf =LED_GPIO_CFG_SPD_LED |LED_GPIO_CFG_LNK_LED | -LED_GPIO_CFG_FDX_LED ; - ret =smsc95xx_write_reg (dev,LED_GPIO_CFG , write_buf); + read_buf |=LED_GPIO_CFG_SPD_LED |LED_GPIO_CFG_LNK_LED | +LED_GPIO_CFG_FDX_LED ; + ret =smsc95xx_write_reg (dev,LED_GPIO_CFG , read_buf);if (ret <0 )return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 314/374 ASoC: cs42l43: Only restrict 44.1kHz for the ASP
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
[ Upstream commit 797c525e85d1e44cf0e6f338890e8e0c661f524a ]
The SoundWire interface can always support 44.1kHz using flow controlled mode, and whether the ASP is in master mode should obviously only affect the ASP. Update cs42l43_startup() to only restrict the rates for the ASP DAI.
--- sound/soc/codecs/cs42l43.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/soc/codecs/cs42l43.c +3 -2
@@ -310,8 +310,9 @@ static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_dstruct snd_soc_component *component = dai->component;struct cs42l43_codec *priv =snd_soc_component_get_drvdata (component);struct cs42l43 *cs42l43 = priv->core; -int provider = !!regmap_test_bits (cs42l43->regmap,CS42L43_ASP_CLK_CONFIG2 , -CS42L43_ASP_MASTER_MODE_MASK ); +int provider = !dai->id || !!regmap_test_bits (cs42l43->regmap, +CS42L43_ASP_CLK_CONFIG2 , +CS42L43_ASP_MASTER_MODE_MASK );if (provider) priv->constraint.mask =CS42L43_PROVIDER_RATE_MASK ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 315/374 bpf: Allow delete from sockmap/sockhash only if update is allowed
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Sitnicki <[email protected]>
[ Upstream commit 98e948fb60d41447fd8d2d0c3b8637fc6b6dc26d ]
We have seen an influx of syzkaller reports where a BPF program attached to a tracepoint triggers a locking rule violation by performing a map_delete on a sockmap/sockhash.
We don't intend to support this artificial use scenario. Extend the existing verifier allowed-program-type check for updating sockmap/sockhash to also cover deleting from a map.
Quoted 1 line
From now on only BPF programs which were previously allowed to update
sockmap/sockhash can delete from these map types.
--- kernel/bpf/verifier.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
kernel/bpf/verifier.c +7 -3
@@ -8845,7 +8845,8 @@ static bool may_update_sockmap(struct bpf_verifier_env *env, int func_id)enum bpf_attach_type eatype = env->prog->expected_attach_type;enum bpf_prog_type type =resolve_prog_type (env->prog); -if (func_id != BPF_FUNC_map_update_elem) +if (func_id != BPF_FUNC_map_update_elem && + func_id != BPF_FUNC_map_delete_elem)return false;/* It's not possible to get access to a locked struct sock in these
@@ -8856,6 +8857,11 @@ static bool may_update_sockmap(struct bpf_verifier_env *env, int func_id)if (eatype ==BPF_TRACE_ITER )return true;break ; +case BPF_PROG_TYPE_SOCK_OPS : +/* map_update allowed only via dedicated helpers with event type checks */ +if (func_id == BPF_FUNC_map_delete_elem) +return true; +break ;case BPF_PROG_TYPE_SOCKET_FILTER :case BPF_PROG_TYPE_SCHED_CLS :case BPF_PROG_TYPE_SCHED_ACT :
@@ -8951,7 +8957,6 @@ static int check_map_func_compatibility(struct bpf_verifier_env *env,case BPF_MAP_TYPE_SOCKMAP : if (func_id != BPF_FUNC_sk_redirect_map && func_id != BPF_FUNC_sock_map_update && - func_id != BPF_FUNC_map_delete_elem && func_id != BPF_FUNC_msg_redirect_map && func_id != BPF_FUNC_sk_select_reuseport && func_id != BPF_FUNC_map_lookup_elem &&
@@ -8961,7 +8966,6 @@ static int check_map_func_compatibility(struct bpf_verifier_env *env,case BPF_MAP_TYPE_SOCKHASH : if (func_id != BPF_FUNC_sk_redirect_hash && func_id != BPF_FUNC_sock_hash_update && - func_id != BPF_FUNC_map_delete_elem && func_id != BPF_FUNC_msg_redirect_hash && func_id != BPF_FUNC_sk_select_reuseport && func_id != BPF_FUNC_map_lookup_elem &&
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 316/374 null_blk: Fix return value of nullb_device_power_store()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Le Moal <[email protected]>
[ Upstream commit d9ff882b54f99f96787fa3df7cd938966843c418 ]
When powering on a null_blk device that is not already on, the return value ret that is initialized to be count is reused to check the return value of null_add_dev(), leading to nullb_device_power_store() to return null_add_dev() return value (0 on success) instead of "count". So make sure to set ret to be equal to count when there are no errors.
--- drivers/block/null_blk/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/block/null_blk/main.c +1 -0
@@ -483,6 +483,7 @@ static ssize_t nullb_device_power_store(struct config_item *item,set_bit (NULLB_DEV_FL_CONFIGURED , &dev->flags); dev->power = newp; + ret = count; }else if (dev->power && !newp) {if (test_and_clear_bit (NULLB_DEV_FL_UP , &dev->flags)) { dev->power = newp;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 317/374 ipv4: Fix address dump when IPv4 is disabled on an interface
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 7b05ab85e28f615e70520d24c075249b4512044e ]
Cited commit started returning an error when user space requests to dump the interface's IPv4 addresses and IPv4 is disabled on the interface. Restore the previous behavior and do not return an error.
Before cited commit:
# ip address show dev dummy1
10: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether e2:40:68:98:d0:18 brd ff:ff:ff:ff:ff:ff
inet6 fe80::e040:68ff:fe98:d018/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
# ip link set dev dummy1 mtu 67
# ip address show dev dummy1
10: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 67 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether e2:40:68:98:d0:18 brd ff:ff:ff:ff:ff:ffAfter cited commit:
# ip address show dev dummy1
10: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 32:2d:69:f2:9c:99 brd ff:ff:ff:ff:ff:ff
inet6 fe80::302d:69ff:fef2:9c99/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
# ip link set dev dummy1 mtu 67
# ip address show dev dummy1
RTNETLINK answers: No such device
Dump terminatedWith this patch:
# ip address show dev dummy1
10: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether de:17:56:bb:57:c0 brd ff:ff:ff:ff:ff:ff
inet6 fe80::dc17:56ff:febb:57c0/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
# ip link set dev dummy1 mtu 67
# ip address show dev dummy1
10: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 67 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether de:17:56:bb:57:c0 brd ff:ff:ff:ff:ff:ffI fixed the exact same issue for IPv6 in commit c04f7dfe6ec2 ("ipv6: Fix address dump when IPv6 is disabled on an interface"), but noted [1] that I am not doing the change for IPv4 because I am not aware of a way to disable IPv4 on an interface other than unregistering it. I clearly missed the above case.
[1] https://lore.kernel.org/netdev/[email protected]/
--- net/ipv4/devinet.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/ipv4/devinet.c +3 -2
@@ -1882,10 +1882,11 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) goto done;if (fillargs.ifindex) { - err = -ENODEV ; dev =dev_get_by_index_rcu (tgt_net, fillargs.ifindex); -if (!dev) +if (!dev) { + err = -ENODEV ; goto done; + } in_dev =__in_dev_get_rcu (dev);if (!in_dev) goto done;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 318/374 net:fec: Add fec_enet_deinit()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaolei Wang <[email protected]>
[ Upstream commit bf0497f53c8535f99b72041529d3f7708a6e2c0d ]
When fec_probe() fails or fec_drv_remove() needs to release the fec queue and remove a NAPI context, therefore add a function corresponding to fec_enet_init() and call fec_enet_deinit() which does the opposite to release memory and remove a NAPI context.
--- drivers/net/ethernet/freescale/fec_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/freescale/fec_main.c +10 -0
@@ -4130,6 +4130,14 @@ static int fec_enet_init(struct net_device *ndev)return ret; } +static void fec_enet_deinit (struct net_device *ndev) +{ +struct fec_enet_private *fep =netdev_priv (ndev); + +netif_napi_del (&fep->napi); +fec_enet_free_queue (ndev); +} +#ifdef CONFIG_OF static int fec_reset_phy (struct platform_device *pdev) {
@@ -4524,6 +4532,7 @@ fec_probe(struct platform_device *pdev)fec_enet_mii_remove (fep); failed_mii_init: failed_irq: +fec_enet_deinit (ndev); failed_init:fec_ptp_stop (pdev); failed_reset:
@@ -4587,6 +4596,7 @@ fec_drv_remove(struct platform_device *pdev)pm_runtime_put_noidle (&pdev->dev);pm_runtime_disable (&pdev->dev); +fec_enet_deinit (ndev);free_netdev (ndev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 319/374 net: micrel: Fix lan8841_config_intr after getting out of sleep mode
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Horatiu Vultur <[email protected]>
[ Upstream commit 4fb679040d9f758eeb3b4d01bbde6405bf20e64e ]
When the interrupt is enabled, the function lan8841_config_intr tries to clear any pending interrupts by reading the interrupt status, then checks the return value for errors and then continue to enable the interrupt. It has been seen that once the system gets out of sleep mode, the interrupt status has the value 0x400 meaning that the PHY detected that the link was in low power. That is correct value but the problem is that the check is wrong. We try to check for errors but we return an error also in this case which is not an error. Therefore fix this by returning only when there is an error.
--- drivers/net/phy/micrel.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/phy/micrel.c +9 -1
@@ -3516,7 +3516,7 @@ static int lan8841_config_intr(struct phy_device *phydev)if (phydev->interrupts ==PHY_INTERRUPT_ENABLED ) { err =phy_read (phydev,LAN8814_INTS ); -if (err) +if (err <0 )return err;/* Enable / disable interrupts. It is OK to enable PTP interrupt
@@ -3532,6 +3532,14 @@ static int lan8841_config_intr(struct phy_device *phydev)return err; err =phy_read (phydev,LAN8814_INTS ); +if (err <0 ) +return err; + +/* Getting a positive value doesn't mean that is an error, it +* just indicates what was the status. Therefore make sure to +* clear the value and say that there is no error. +*/ + err =0 ; }return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 320/374 idpf: dont enable NAPI and interrupts prior to allocating Rx buffers
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Lobakin <[email protected]>
[ Upstream commit d514c8b54209de7a95ab37259fe32c7406976bd9 ]
Currently, idpf enables NAPI and interrupts prior to allocating Rx buffers.
This may lead to frame loss (there are no buffers to place incoming frames) and even crashes on quick ifup-ifdown. Interrupts must be enabled only after all the resources are here and available. Split interrupt init into two phases: initialization and enabling, and perform the second only after the queues are fully initialized. Note that we can't just move interrupt initialization down the init process, as the queues must have correct a ::q_vector pointer set and NAPI already added in order to allocate buffers correctly. Also, during the deinit process, disable HW interrupts first and only then disable NAPI. Otherwise, there can be a HW event leading to napi_schedule(), but the NAPI will already be unavailable.
--- drivers/net/ethernet/intel/idpf/idpf_lib.c | 1 + drivers/net/ethernet/intel/idpf/idpf_txrx.c | 12 +++++++----- drivers/net/ethernet/intel/idpf/idpf_txrx.h | 1 + 3 files changed, 9 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/idpf/idpf_lib.c +1 -0
@@ -1394,6 +1394,7 @@ static int idpf_vport_open(struct idpf_vport *vport, bool alloc_res) }idpf_rx_init_buf_tail (vport); +idpf_vport_intr_ena (vport); err =idpf_send_config_queues_msg (vport);if (err) {
drivers/net/ethernet/intel/idpf/idpf_txrx.c +7 -5
@@ -3747,9 +3747,9 @@ static void idpf_vport_intr_ena_irq_all(struct idpf_vport *vport)*/ void idpf_vport_intr_deinit (struct idpf_vport *vport) { +idpf_vport_intr_dis_irq_all (vport);idpf_vport_intr_napi_dis_all (vport);idpf_vport_intr_napi_del_all (vport); -idpf_vport_intr_dis_irq_all (vport);idpf_vport_intr_rel_irq (vport); }
@@ -4180,7 +4180,6 @@ int idpf_vport_intr_init(struct idpf_vport *vport)idpf_vport_intr_map_vector_to_qs (vport);idpf_vport_intr_napi_add_all (vport); -idpf_vport_intr_napi_ena_all (vport); err = vport->adapter->dev_ops.reg_ops.intr_reg_init (vport);if (err)
@@ -4194,17 +4193,20 @@ int idpf_vport_intr_init(struct idpf_vport *vport)if (err) goto unroll_vectors_alloc; -idpf_vport_intr_ena_irq_all (vport); -return 0 ; unroll_vectors_alloc: -idpf_vport_intr_napi_dis_all (vport);idpf_vport_intr_napi_del_all (vport);return err; } +void idpf_vport_intr_ena (struct idpf_vport *vport) +{ +idpf_vport_intr_napi_ena_all (vport); +idpf_vport_intr_ena_irq_all (vport); +} +/** * idpf_config_rss - Send virtchnl messages to configure RSS * @vport: virtual port
drivers/net/ethernet/intel/idpf/idpf_txrx.h +1 -0
@@ -988,6 +988,7 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport);void idpf_vport_intr_update_itr_ena_irq (struct idpf_q_vector *q_vector);void idpf_vport_intr_deinit (struct idpf_vport *vport);int idpf_vport_intr_init (struct idpf_vport *vport); +void idpf_vport_intr_ena (struct idpf_vport *vport);enum pkt_hash_types idpf_ptype_to_htype (const struct idpf_rx_ptype_decoded *decoded);int idpf_config_rss (struct idpf_vport *vport);int idpf_init_rss (struct idpf_vport *vport);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 321/374 ice: fix accounting if a VLAN already exists
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit 82617b9a04649e83ee8731918aeadbb6e6d7cbc7 ]
The ice_vsi_add_vlan() function is used to add a VLAN filter for the target VSI. This function prepares a filter in the switch table for the given VSI. If it succeeds, the vsi->num_vlan counter is incremented.
It is not considered an error to add a VLAN which already exists in the switch table, so the function explicitly checks and ignores -EEXIST. The vsi->num_vlan counter is still incremented.
This seems incorrect, as it means we can double-count in the case where the same VLAN is added twice by the caller. The actual table will have one less filter than the count.
The ice_vsi_del_vlan() function similarly checks and handles the -ENOENT condition for when deleting a filter that doesn't exist. This flow only decrements the vsi->num_vlan if it actually deleted a filter.
The vsi->num_vlan counter is used only in a few places, primarily related to tracking the number of non-zero VLANs. If the vsi->num_vlans gets out of sync, then ice_vsi_num_non_zero_vlans() will incorrectly report more VLANs than are present, and ice_vsi_has_non_zero_vlans() could return true potentially in cases where there are only VLAN 0 filters left.
Fix this by only incrementing the vsi->num_vlan in the case where we actually added an entry, and not in the case where the entry already existed.
--- drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c +6 -5
@@ -45,14 +45,15 @@ int ice_vsi_add_vlan(struct ice_vsi *vsi, struct ice_vlan *vlan)return -EINVAL ; err =ice_fltr_add_vlan (vsi, vlan); -if (err && err != -EEXIST ) { +if (!err) + vsi->num_vlan++; +else if (err == -EEXIST ) + err =0 ; +else dev_err (ice_pf_to_dev (vsi->back),"Failure Adding VLAN %d on VSI %i, status %d\n" , vlan->vid, vsi->vsi_num, err); -return err; - } - vsi->num_vlan++; -return 0 ; +return err; }/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 322/374 selftests: mptcp: simult flows: mark unbalanced tests as flaky
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
[ Upstream commit cc73a6577ae64247898269d138dee6b73ff710cc ]
These tests are flaky since their introduction. This might be less or not visible depending on the CI running the tests, especially if it is also busy doing other tasks in parallel.
A first analysis shown that the transfer can be slowed down when there are some re-injections at the MPTCP level. Such re-injections can of course happen, and disturb the transfer, but it looks strange to have them in this lab. That could be caused by the kernel having access to less CPU cycles -- e.g. when other activities are executed in parallel -- or by a misinterpretation on the MPTCP packet scheduler side.
While this is being investigated, the tests are marked as flaky not to create noises in other CIs.
--- tools/testing/selftests/net/mptcp/simult_flows.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/testing/selftests/net/mptcp/simult_flows.sh +3 -3
@@ -243,7 +243,7 @@ run_test() do_transfer $small $large $time lret=$? mptcp_lib_result_code "${lret}" "${msg}" - if [ $lret -ne 0 ]; then + if [ $lret -ne 0 ] && ! mptcp_lib_subtest_is_flaky; then ret=$lret [ $bail -eq 0 ] || exit $ret fi
@@ -253,7 +253,7 @@ run_test() do_transfer $large $small $time lret=$? mptcp_lib_result_code "${lret}" "${msg}" - if [ $lret -ne 0 ]; then + if [ $lret -ne 0 ] && ! mptcp_lib_subtest_is_flaky; then ret=$lret [ $bail -eq 0 ] || exit $ret fi
@@ -286,7 +286,7 @@ run_test 10 10 0 0 "balanced bwidth" run_test 10 10 1 25 "balanced bwidth with unbalanced delay" # we still need some additional infrastructure to pass the following test-cases -run_test 10 3 0 0 "unbalanced bwidth" +MPTCP_LIB_SUBTEST_FLAKY=1 run_test 10 3 0 0 "unbalanced bwidth" run_test 10 3 1 25 "unbalanced bwidth with unbalanced delay" run_test 10 3 25 1 "unbalanced bwidth with opposed, unbalanced delay"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 323/374 selftests: mptcp: join: mark fastclose tests as flaky
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
[ Upstream commit 8c06ac2178a9dee887929232226e35a5cdda1793 ]
These tests are flaky since their introduction. This might be less or not visible depending on the CI running the tests, especially if it is also busy doing other tasks in parallel, and if a debug kernel config is being used.
It looks like this issue is often present with the NetDev CI. While this is being investigated, the tests are marked as flaky not to create noises on such CIs.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +7 -1
@@ -262,6 +262,8 @@ reset() TEST_NAME="${1}" + MPTCP_LIB_SUBTEST_FLAKY=0 # reset if modified + if skip_test; then MPTCP_LIB_TEST_COUNTER=$((MPTCP_LIB_TEST_COUNTER+1)) last_test_ignored=1
@@ -449,7 +451,9 @@ reset_with_tcp_filter() # $1: err msg fail_test() { - ret=${KSFT_FAIL} + if ! mptcp_lib_subtest_is_flaky; then + ret=${KSFT_FAIL} + fi if [ ${#} -gt 0 ]; then print_fail "${@}"
@@ -3178,6 +3182,7 @@ fullmesh_tests() fastclose_tests() { if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then + MPTCP_LIB_SUBTEST_FLAKY=1 test_linkfail=1024 fastclose=client \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0
@@ -3186,6 +3191,7 @@ fastclose_tests() fi if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then + MPTCP_LIB_SUBTEST_FLAKY=1 test_linkfail=1024 fastclose=server \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 0 0 0 1
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 324/374 selftests: mptcp: add ms units for tc-netem delay
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geliang Tang <[email protected]>
[ Upstream commit 9109853a388b7b2b934f56f4ddb250d72e486555 ]
'delay 1' in tc-netem is confusing, not sure if it's a delay of 1 second or 1 millisecond. This patch explicitly adds millisecond units to make these commands clearer.
Stable-dep-of: 38af56e6668b ("selftests: mptcp: join: mark 'fail' tests as flaky")
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 6 +++--- tools/testing/selftests/net/mptcp/simult_flows.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +3 -3
@@ -125,8 +125,8 @@ init_shapers() { local i for i in $(seq 1 4); do - tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 - tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 + tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1ms + tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1ms done }
@@ -3218,7 +3218,7 @@ fail_tests() # multiple subflows if reset_with_fail "MP_FAIL MP_RST" 2; then - tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5 + tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5ms pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1 pm_nl_add_endpoint $ns2 10.0.2.2 dev ns2eth2 flags subflow
tools/testing/selftests/net/mptcp/simult_flows.sh +2 -2
@@ -216,8 +216,8 @@ run_test() shift 4 local msg=$* - [ $delay1 -gt 0 ] && delay1="delay $delay1" || delay1="" - [ $delay2 -gt 0 ] && delay2="delay $delay2" || delay2="" + [ $delay1 -gt 0 ] && delay1="delay ${delay1}ms" || delay1="" + [ $delay2 -gt 0 ] && delay2="delay ${delay2}ms" || delay2="" for dev in ns1eth1 ns1eth2; do tc -n $ns1 qdisc del dev $dev root >/dev/null 2>&1
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 325/374 selftests: mptcp: join: mark fail tests as flaky
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthieu Baerts (NGI0) <[email protected]>
[ Upstream commit 38af56e6668b455f7dd0a8e2d9afe74100068e17 ]
These tests are rarely unstable. It depends on the CI running the tests, especially if it is also busy doing other tasks in parallel, and if a debug kernel config is being used.
It looks like this issue is sometimes present with the NetDev CI. While this is being investigated, the tests are marked as flaky not to create noises on such CIs.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/net/mptcp/mptcp_join.sh +2 -0
@@ -3210,6 +3210,7 @@ fail_tests() { # single subflow if reset_with_fail "Infinite map" 1; then + MPTCP_LIB_SUBTEST_FLAKY=1 test_linkfail=128 \ run_tests $ns1 $ns2 10.0.1.1 chk_join_nr 0 0 0 +1 +0 1 0 1 "$(pedit_action_pkts)"
@@ -3218,6 +3219,7 @@ fail_tests() # multiple subflows if reset_with_fail "MP_FAIL MP_RST" 2; then + MPTCP_LIB_SUBTEST_FLAKY=1 tc -n $ns2 qdisc add dev ns2eth1 root netem rate 1mbit delay 5ms pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns2 0 1
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 326/374 drm/xe: Add dbg messages on the suspend resume functions.
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rodrigo Vivi <[email protected]>
[ Upstream commit f7f24b7950af4b1548ad5075ddb13eeb333bb782 ]
In case of the suspend/resume flow getting locked up we can get reports with some useful hints on where it might get locked and if that has failed.
Stable-dep-of: 77b79df0268b ("drm/xe: Change pcode timeout to 50msec while polling again")
--- drivers/gpu/drm/xe/xe_pm.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/gpu/drm/xe/xe_pm.c +17 -5
@@ -54,13 +54,15 @@ int xe_pm_suspend(struct xe_device *xe)u8 id;int err; +drm_dbg (&xe->drm,"Suspending device\n" ); +for_each_gt (gt, xe, id)xe_gt_suspend_prepare (gt);/* FIXME: Super racey... */ err =xe_bo_evict_all (xe);if (err) -return err; + goto err;xe_display_pm_suspend (xe);
@@ -68,7 +70,7 @@ int xe_pm_suspend(struct xe_device *xe) err =xe_gt_suspend (gt);if (err) {xe_display_pm_resume (xe); -return err; + goto err; } }
@@ -76,7 +78,11 @@ int xe_pm_suspend(struct xe_device *xe)xe_display_pm_suspend_late (xe); +drm_dbg (&xe->drm,"Device suspended\n" );return 0 ; +err: +drm_dbg (&xe->drm,"Device suspend failed %d\n" , err); +return err; }/**
@@ -92,13 +98,15 @@ int xe_pm_resume(struct xe_device *xe)u8 id;int err; +drm_dbg (&xe->drm,"Resuming device\n" ); +for_each_tile (tile, xe, id)xe_wa_apply_tile_workarounds (tile);for_each_gt (gt, xe, id) { err =xe_pcode_init (gt);if (err) -return err; + goto err; }xe_display_pm_resume_early (xe);
@@ -109,7 +117,7 @@ int xe_pm_resume(struct xe_device *xe)*/ err =xe_bo_restore_kernel (xe);if (err) -return err; + goto err;xe_irq_resume (xe);
@@ -120,9 +128,13 @@ int xe_pm_resume(struct xe_device *xe) err =xe_bo_restore_user (xe);if (err) -return err; + goto err; +drm_dbg (&xe->drm,"Device resumed\n" );return 0 ; +err: +drm_dbg (&xe->drm,"Device resume failed %d\n" , err); +return err; }static bool xe_pm_pci_d3cold_capable (struct xe_device *xe)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 327/374 drm/xe: check pcode init status only on root gt of root tile
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Riana Tauro <[email protected]>
[ Upstream commit 933fd5ffaf87a60a019992d48e3a96b5c3403d9f ]
The root tile indicates the pcode initialization is complete when all tiles have completed their initialization. So the mailbox can be polled only on the root tile. Check pcode init status only on root tile and move it to device probe early as root tile is initialized there. Also make similar changes in resume paths.
v2: add lock/unlocked version of pcode_mailbox_rw
to allow pcode init to be called in device
early probe (Rodrigo)
v3: add code description about using root tile
change function names to xe_pcode_probe_early
and xe_pcode_init (Rodrigo)
Stable-dep-of: 77b79df0268b ("drm/xe: Change pcode timeout to 50msec while polling again")
--- drivers/gpu/drm/xe/xe_device.c | 21 ++++-- drivers/gpu/drm/xe/xe_pcode.c | 115 ++++++++++++++++++++------------- drivers/gpu/drm/xe/xe_pcode.h | 6 +- drivers/gpu/drm/xe/xe_pm.c | 16 ++--- 4 files changed, 94 insertions(+), 64 deletions(-)
drivers/gpu/drm/xe/xe_device.c +14 -7
@@ -389,8 +389,14 @@ static int xe_set_dma_info(struct xe_device *xe)return err; } -/* -* Initialize MMIO resources that don't require any knowledge about tile count. +/** +* xe_device_probe_early: Device early probe +* @xe: xe device instance +* +* Initialize MMIO resources that don't require any +* knowledge about tile count. Also initialize pcode +* +* Return: 0 on success, error code on failure */ int xe_device_probe_early (struct xe_device *xe) {
@@ -404,6 +410,10 @@ int xe_device_probe_early(struct xe_device *xe)if (err)return err; + err =xe_pcode_probe_early (xe); +if (err) +return err; +return 0 ; }
@@ -482,11 +492,8 @@ int xe_device_probe(struct xe_device *xe)if (err)return err; -for_each_gt (gt, xe, id) { - err =xe_pcode_probe (gt); -if (err) -return err; - } +for_each_gt (gt, xe, id) +xe_pcode_init (gt); err =xe_display_init_noirq (xe);if (err)
drivers/gpu/drm/xe/xe_pcode.c +70 -45
197 lines not on this page · raw message
drivers/gpu/drm/xe/xe_pcode.h +4 -2
@@ -8,9 +8,11 @@#include <linux/types.h> struct xe_gt ; +struct xe_device ; -int xe_pcode_probe (struct xe_gt *gt); -int xe_pcode_init (struct xe_gt *gt); +void xe_pcode_init (struct xe_gt *gt); +int xe_pcode_probe_early (struct xe_device *xe); +int xe_pcode_ready (struct xe_device *xe,bool locked);int xe_pcode_init_min_freq_table (struct xe_gt *gt,u32 min_gt_freq,u32 max_gt_freq);int xe_pcode_read (struct xe_gt *gt,u32 mbox,u32 *val,u32 *val1);
drivers/gpu/drm/xe/xe_pm.c +6 -10
@@ -103,11 +103,9 @@ int xe_pm_resume(struct xe_device *xe)for_each_tile (tile, xe, id)xe_wa_apply_tile_workarounds (tile); -for_each_gt (gt, xe, id) { - err =xe_pcode_init (gt); -if (err) - goto err; - } + err =xe_pcode_ready (xe, true); +if (err) +return err;xe_display_pm_resume_early (xe);
@@ -322,11 +320,9 @@ int xe_pm_runtime_resume(struct xe_device *xe) xe->d3cold.power_lost =xe_guc_in_reset (>->uc.guc);if (xe->d3cold.allowed && xe->d3cold.power_lost) { -for_each_gt (gt, xe, id) { - err =xe_pcode_init (gt); -if (err) - goto out; - } + err =xe_pcode_ready (xe, true); +if (err) + goto out;/* * This only restores pinned memory which is the memory
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 328/374 drm/xe: Change pcode timeout to 50msec while polling again
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Himal Prasad Ghimiray <[email protected]>
[ Upstream commit 77b79df0268bee3ef38fd5e76e86a076ce02995d ]
Polling is initially attempted with timeout_base_ms enabled for preemption, and if it exceeds this timeframe, another attempt is made without preemption, allowing an additional 50 ms before timing out.
v2
- Rebase
v3
- Move warnings to separate patch (Lucas)
--- drivers/gpu/drm/xe/xe_pcode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_pcode.c +1 -1
@@ -191,7 +191,7 @@ int xe_pcode_request(struct xe_gt *gt, u32 mbox, u32 request,drm_WARN_ON_ONCE (>_to_xe (gt)->drm, timeout_base_ms >1 );preempt_disable (); ret =pcode_try_request (gt, mbox, request, reply_mask, reply, &status, - true, timeout_base_ms *1000 , true); + true,50 *1000 , true);preempt_enable (); out:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 329/374 drm/xe: Only use reserved BCS instances for usm migrate exec queue
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Brost <[email protected]>
[ Upstream commit c8ea2c31f5ea437199b239d76ad5db27343edb0c ]
The GuC context scheduling queue is 2 entires deep, thus it is possible for a migration job to be stuck behind a fault if migration exec queue shares engines with user jobs. This can deadlock as the migrate exec queue is required to service page faults. Avoid deadlock by only using reserved BCS instances for usm migrate exec queue.
--- drivers/gpu/drm/xe/xe_migrate.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/gpu/drm/xe/xe_migrate.c +5 -7
@@ -33,7 +33,6 @@#include "xe_sync.h" #include "xe_trace.h" #include "xe_vm.h" -#include "xe_wa.h" /** * struct xe_migrate - migrate context.
@@ -299,10 +298,6 @@ static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m, }/* -* Due to workaround 16017236439, odd instance hardware copy engines are -* faster than even instance ones. -* This function returns the mask involving all fast copy engines and the -* reserved copy engine to be used as logical mask for migrate engine. * Including the reserved copy engine is required to avoid deadlocks due to * migrate jobs servicing the faults gets stuck behind the job that faulted. */
@@ -316,8 +311,7 @@ static u32 xe_migrate_usm_logical_mask(struct xe_gt *gt)if (hwe->class !=XE_ENGINE_CLASS_COPY )continue ; -if (!XE_WA (gt,16017236439 ) || -xe_gt_is_usm_hwe (gt, hwe) || hwe->instance &1 ) +if (xe_gt_is_usm_hwe (gt, hwe)) logical_mask |=BIT (hwe->logical_instance); }
@@ -368,6 +362,10 @@ struct xe_migrate *xe_migrate_init(struct xe_tile *tile)if (!hwe || !logical_mask)return ERR_PTR (-EINVAL ); +/* +* XXX: Currently only reserving 1 (likely slow) BCS instance on +* PVC, may want to revisit if performance is needed. +*/ m->q = xe_exec_queue_create(xe, vm, logical_mask, 1, hwe, EXEC_QUEUE_FLAG_KERNEL | EXEC_QUEUE_FLAG_PERMANENT |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 330/374 ALSA: seq: Fix missing bank setup between MIDI1/MIDI2 UMP conversion
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 8a42886cae307663f3f999846926bd6e64392000 ]
When a UMP packet is converted between MIDI1 and MIDI2 protocols, the bank selection may be lost. The conversion from MIDI1 to MIDI2 needs the encoding of the bank into UMP_MSG_STATUS_PROGRAM bits, while the conversion from MIDI2 to MIDI1 needs the extraction from that instead.
This patch implements the missing bank selection mechanism in those conversions.
--- sound/core/seq/seq_ump_convert.c | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
sound/core/seq/seq_ump_convert.c +38 -0
@@ -368,6 +368,7 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest,struct snd_seq_ump_event ev_cvt;const union snd_ump_midi1_msg *midi1 = (const union snd_ump_midi1_msg *)event->ump;union snd_ump_midi2_msg *midi2 = (union snd_ump_midi2_msg *)ev_cvt.ump; +struct snd_seq_ump_midi2_bank *cc; ev_cvt = *event;memset (&ev_cvt.ump,0 ,sizeof (ev_cvt.ump));
@@ -387,11 +388,29 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest, midi2->paf.data =upscale_7_to_32bit (midi1->paf.data);break ;case UMP_MSG_STATUS_CC : + cc = &dest_port->midi2_bank[midi1->note.channel]; +switch (midi1->cc.index) { +case UMP_CC_BANK_SELECT : + cc->bank_set =1 ; + cc->cc_bank_msb = midi1->cc.data; +return 0 ;// skip +case UMP_CC_BANK_SELECT_LSB : + cc->bank_set =1 ; + cc->cc_bank_lsb = midi1->cc.data; +return 0 ;// skip + } midi2->cc.index = midi1->cc.index; midi2->cc.data =upscale_7_to_32bit (midi1->cc.data);break ;case UMP_MSG_STATUS_PROGRAM : midi2->pg.program = midi1->pg.program; + cc = &dest_port->midi2_bank[midi1->note.channel]; +if (cc->bank_set) { + midi2->pg.bank_valid =1 ; + midi2->pg.bank_msb = cc->cc_bank_msb; + midi2->pg.bank_lsb = cc->cc_bank_lsb; + cc->bank_set =0 ; + }break ;case UMP_MSG_STATUS_CHANNEL_PRESSURE : midi2->caf.data =upscale_7_to_32bit (midi1->caf.data);
@@ -419,6 +438,7 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,struct snd_seq_ump_event ev_cvt;union snd_ump_midi1_msg *midi1 = (union snd_ump_midi1_msg *)ev_cvt.ump;const union snd_ump_midi2_msg *midi2 = (const union snd_ump_midi2_msg *)event->ump; +int err;u16 v; ev_cvt = *event;
@@ -443,6 +463,24 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest, midi1->cc.data =downscale_32_to_7bit (midi2->cc.data);break ;case UMP_MSG_STATUS_PROGRAM : +if (midi2->pg.bank_valid) { + midi1->cc.status =UMP_MSG_STATUS_CC ; + midi1->cc.index =UMP_CC_BANK_SELECT ; + midi1->cc.data = midi2->pg.bank_msb; + err =__snd_seq_deliver_single_event (dest, dest_port, + (struct snd_seq_event *)&ev_cvt, + atomic, hop); +if (err <0 ) +return err; + midi1->cc.index =UMP_CC_BANK_SELECT_LSB ; + midi1->cc.data = midi2->pg.bank_lsb; + err =__snd_seq_deliver_single_event (dest, dest_port, + (struct snd_seq_event *)&ev_cvt, + atomic, hop); +if (err <0 ) +return err; + midi1->note.status = midi2->note.status; + } midi1->pg.program = midi2->pg.program;break ;case UMP_MSG_STATUS_CHANNEL_PRESSURE :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 331/374 ALSA: seq: Dont clear bank selection at event -> UMP MIDI2 conversion
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit a200df7deb3186cd7b55abb77ab96dfefb8a4f09 ]
The current code to convert from a legacy sequencer event to UMP MIDI2 clears the bank selection at each time the program change is submitted. This is confusing and may lead to incorrect bank values tranmitted to the destination in the end.
Drop the line to clear the bank info and keep the provided values.
--- sound/core/seq/seq_ump_convert.c | 1 - 1 file changed, 1 deletion(-)
sound/core/seq/seq_ump_convert.c +0 -1
@@ -892,7 +892,6 @@ static int pgm_ev_to_ump_midi2(const struct snd_seq_event *event, data->pg.bank_msb = cc->cc_bank_msb; data->pg.bank_lsb = cc->cc_bank_lsb; cc->bank_set =0 ; - cc->cc_bank_msb = cc->cc_bank_lsb =0 ; }return 1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 332/374 sd: also set max_user_sectors when setting max_sectors
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit bafea1c58b24be594d97841ced1b7ae0347bf6e3 ]
sd can set a max_sectors value that is lower than the max_hw_sectors
limit based on the block limits VPD page. While this is rather unusual,
it used to work until the max_user_sectors field was split out to cleanly deal with conflicting hardware and user limits when the hardware limit changes. Also set max_user_sectors to ensure the limit can properly be stacked.
--- drivers/scsi/sd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/sd.c +3 -1
@@ -3707,8 +3707,10 @@ static int sd_revalidate_disk(struct gendisk *disk)*/ if (sdkp->first_scan || q->limits.max_sectors > q->limits.max_dev_sectors || - q->limits.max_sectors > q->limits.max_hw_sectors) + q->limits.max_sectors > q->limits.max_hw_sectors) { q->limits.max_sectors = rw_max; + q->limits.max_user_sectors = rw_max; + } sdkp->first_scan =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 333/374 block: stack max_user_sectors
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit e528bede6f4e6822afdf0fa80be46ea9199f0911 ]
The max_user_sectors is one of the three factors determining the actual max_sectors limit for READ/WRITE requests. Because of that it needs to be stacked at least for the device mapper multi-path case where requests are directly inserted on the lower device. For SCSI disks this is important because the sd driver actually sets it's own advisory limit that is lower than max_hw_sectors based on the block limits VPD page. While this is a bit odd an unusual, the same effect can happen if a user or udev script tweaks the value manually.
--- block/blk-settings.c | 2 ++ 1 file changed, 2 insertions(+)
block/blk-settings.c +2 -0
@@ -751,6 +751,8 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,unsigned int top, bottom, alignment, ret =0 ; t->max_sectors =min_not_zero (t->max_sectors, b->max_sectors); + t->max_user_sectors =min_not_zero (t->max_user_sectors, + b->max_user_sectors); t->max_hw_sectors =min_not_zero (t->max_hw_sectors, b->max_hw_sectors); t->max_dev_sectors =min_not_zero (t->max_dev_sectors, b->max_dev_sectors); t->max_write_zeroes_sectors = min(t->max_write_zeroes_sectors,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 334/374 net: ti: icssg-prueth: Fix start counter for ft1 filter
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: MD Danish Anwar <[email protected]>
[ Upstream commit 56a5cf538c3f2d935b0d81040a8303b6e7fc5fd8 ]
The start counter for FT1 filter is wrongly set to 0 in the driver. FT1 is used for source address violation (SAV) check and source address starts at Byte 6 not Byte 0. Fix this by changing start counter to ETH_ALEN in icssg_ft1_set_mac_addr().
--- drivers/net/ethernet/ti/icssg/icssg_classifier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/ti/icssg/icssg_classifier.c +1 -1
@@ -360,7 +360,7 @@ void icssg_ft1_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac_addr) {const u8 mask_addr[] = {0 ,0 ,0 ,0 ,0 ,0 , }; -rx_class_ft1_set_start_len (miig_rt, slice,0 ,6 ); +rx_class_ft1_set_start_len (miig_rt, slice,ETH_ALEN ,ETH_ALEN );rx_class_ft1_set_da (miig_rt, slice,0 , mac_addr);rx_class_ft1_set_da_mask (miig_rt, slice,0 , mask_addr);rx_class_ft1_cfg_set_type (miig_rt, slice,0 ,FT1_CFG_TYPE_EQ );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 335/374 netfilter: nft_payload: skbuff vlan metadata mangle support
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 33c563ebf8d3deed7d8addd20d77398ac737ef9a ]
Userspace assumes vlan header is present at a given offset, but vlan offload allows to store this in metadata fields of the skbuff. Hence mangling vlan results in a garbled packet. Handle this transparently by adding a parser to the kernel.
If vlan metadata is present and payload offset is over 12 bytes (source and destination mac address fields), then subtract vlan header present in vlan metadata, otherwise mangle vlan metadata based on offset and length, extracting data from the source register.
This is similar to:
8cfd23e67401 ("netfilter: nft_payload: work around vlan header stripping")
to deal with vlan payload mangling.
--- net/netfilter/nft_payload.c | 72 +++++++++++++++++++++++++++++++++---- 1 file changed, 65 insertions(+), 7 deletions(-)
net/netfilter/nft_payload.c +65 -7
@@ -145,12 +145,12 @@ int nft_payload_inner_offset(const struct nft_pktinfo *pkt)return pkt->inneroff; } -static bool nft_payload_need_vlan_copy (const struct nft_payload *priv) +static bool nft_payload_need_vlan_adjust (u32 offset,u32 len) { -unsigned int len = priv->offset + priv->len; +unsigned int boundary = offset + len;/* data past ether src/dst requested, copy needed */ -if (len > offsetof(struct ethhdr , h_proto)) +if (boundary > offsetof(struct ethhdr , h_proto))return true;return false;
@@ -174,7 +174,7 @@ void nft_payload_eval(const struct nft_expr *expr, goto err;if (skb_vlan_tag_present (skb) && -nft_payload_need_vlan_copy (priv)) { +nft_payload_need_vlan_adjust (priv->offset, priv->len)) {if (!nft_payload_copy_vlan (dest, skb, priv->offset, priv->len)) goto err;
@@ -801,21 +801,79 @@ struct nft_payload_set {u8 csum_flags; }; +/* This is not struct vlan_hdr. */ +struct nft_payload_vlan_hdr { +__be16 h_vlan_proto; +__be16 h_vlan_TCI; +}; + +static bool +nft_payload_set_vlan (const u32 *src,struct sk_buff *skb,u8 offset,u8 len, +int *vlan_hlen) +{ +struct nft_payload_vlan_hdr *vlanh; +__be16 vlan_proto; +u16 vlan_tci; + +if (offset >= offsetof(struct vlan_ethhdr , h_vlan_encapsulated_proto)) { + *vlan_hlen =VLAN_HLEN ; +return true; + } + +switch (offset) { +case offsetof(struct vlan_ethhdr , h_vlan_proto): +if (len ==2 ) { + vlan_proto =nft_reg_load_be16 (src); + skb->vlan_proto = vlan_proto; + }else if (len ==4 ) { + vlanh = (struct nft_payload_vlan_hdr *)src; +__vlan_hwaccel_put_tag (skb, vlanh->h_vlan_proto, +ntohs (vlanh->h_vlan_TCI)); + }else { +return false; + } +break ; +case offsetof(struct vlan_ethhdr , h_vlan_TCI): +if (len !=2 ) +return false; + + vlan_tci =ntohs (nft_reg_load_be16 (src)); + skb->vlan_tci = vlan_tci; +break ; +default : +return false; + } + +return true; +} +static void nft_payload_set_eval (const struct nft_expr *expr,struct nft_regs *regs,const struct nft_pktinfo *pkt) {const struct nft_payload_set *priv =nft_expr_priv (expr); -struct sk_buff *skb = pkt->skb;const u32 *src = ®s->data[priv->sreg]; -int offset, csum_offset; +int offset, csum_offset, vlan_hlen =0 ; +struct sk_buff *skb = pkt->skb;__wsum fsum, tsum;switch (priv->base) {case NFT_PAYLOAD_LL_HEADER :if (!skb_mac_header_was_set (skb)) goto err; - offset =skb_mac_header (skb) - skb->data; + +if (skb_vlan_tag_present (skb) && +nft_payload_need_vlan_adjust (priv->offset, priv->len)) { +if (!nft_payload_set_vlan (src, skb, + priv->offset, priv->len, + &vlan_hlen)) + goto err; + +if (!vlan_hlen) +return ; + } + + offset =skb_mac_header (skb) - skb->data - vlan_hlen;break ;case NFT_PAYLOAD_NETWORK_HEADER : offset =skb_network_offset (skb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 336/374 netfilter: tproxy: bail out if IP has been disabled on the device
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 21a673bddc8fd4873c370caf9ae70ffc6d47e8d3 ]
syzbot reports:
general protection fault, probably for non-canonical address 0xdffffc0000000003: 0000 [#1] PREEMPT SMP KASAN PTI KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f] [..] RIP: 0010:nf_tproxy_laddr4+0xb7/0x340 net/ipv4/netfilter/nf_tproxy_ipv4.c:62 Call Trace: nft_tproxy_eval_v4 net/netfilter/nft_tproxy.c:56 [inline] nft_tproxy_eval+0xa9a/0x1a00 net/netfilter/nft_tproxy.c:168
__in_dev_get_rcu() can return NULL, so check for this.
--- net/ipv4/netfilter/nf_tproxy_ipv4.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/netfilter/nf_tproxy_ipv4.c +2 -0
@@ -58,6 +58,8 @@ __be32 nf_tproxy_laddr4(struct sk_buff *skb, __be32 user_laddr, __be32 daddr) laddr =0 ; indev =__in_dev_get_rcu (skb->dev); +if (!indev) +return daddr;in_dev_for_each_ifa_rcu (ifa, indev) {if (ifa->ifa_flags &IFA_F_SECONDARY )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 337/374 netfilter: nft_fib: allow from forward/input without iif selector
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Garver <[email protected]>
[ Upstream commit e8ded22ef0f4831279c363c264cd41cd9d59ca9e ]
This removes the restriction of needing iif selector in the forward/input hooks for fib lookups when requested result is oif/oifname.
Removing this restriction allows "loose" lookups from the forward hooks.
--- net/netfilter/nft_fib.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
net/netfilter/nft_fib.c +3 -5
@@ -35,11 +35,9 @@ int nft_fib_validate(const struct nft_ctx *ctx, const struct nft_expr *expr,switch (priv->result) {case NFT_FIB_RESULT_OIF :case NFT_FIB_RESULT_OIFNAME : - hooks = (1 <<NF_INET_PRE_ROUTING ); -if (priv->flags &NFTA_FIB_F_IIF ) { - hooks |= (1 <<NF_INET_LOCAL_IN ) | - (1 <<NF_INET_FORWARD ); - } + hooks = (1 <<NF_INET_PRE_ROUTING ) | + (1 <<NF_INET_LOCAL_IN ) | + (1 <<NF_INET_FORWARD );break ;case NFT_FIB_RESULT_ADDRTYPE :if (priv->flags &NFTA_FIB_F_IIF )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 338/374 net/sched: taprio: make q->picos_per_byte available to fill_sched_entry()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit e634134180885574d1fe7aa162777ba41e7fcd5b ]
In commit b5b73b26b3ca ("taprio: Fix allowing too small intervals"), a comparison of user input against length_to_duration(q, ETH_ZLEN) was introduced, to avoid RCU stalls due to frequent hrtimers.
The implementation of length_to_duration() depends on q->picos_per_byte being set for the link speed. The blamed commit in the Fixes: tag has moved this too late, so the checks introduced above are ineffective. The q->picos_per_byte is zero at parse_taprio_schedule() -> parse_sched_list() -> parse_sched_entry() -> fill_sched_entry() time.
Move the taprio_set_picos_per_byte() call as one of the first things in taprio_change(), before the bulk of the netlink attribute parsing is done. That's because it is needed there.
Add a selftest to make sure the issue doesn't get reintroduced.
--- net/sched/sch_taprio.c | 4 +++- .../tc-testing/tc-tests/qdiscs/taprio.json | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-)
net/sched/sch_taprio.c +3 -1
@@ -1851,6 +1851,9 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt, } q->flags = taprio_flags; +/* Needed for length_to_duration() during netlink attribute parsing */ +taprio_set_picos_per_byte (dev, q); + err =taprio_parse_mqprio_opt (dev, mqprio, extack, q->flags);if (err <0 )return err;
@@ -1910,7 +1913,6 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,if (err <0 ) goto free_sched; -taprio_set_picos_per_byte (dev, q);taprio_update_queue_max_sdu (q, new_admin, stab);if (FULL_OFFLOAD_IS_ENABLED (q->flags))
tools/testing/selftests/tc-testing/tc-tests/qdiscs/taprio.json +22 -0
@@ -132,6 +132,28 @@ "echo \"1\" > /sys/bus/netdevsim/del_device" ] }, + { + "id": "6f62", + "name": "Add taprio Qdisc with too short interval", + "category": [ + "qdisc", + "taprio" + ], + "plugins": { + "requires": "nsPlugin" + }, + "setup": [ + "echo \"1 1 8\" > /sys/bus/netdevsim/new_device" + ], + "cmdUnderTest": "$TC qdisc add dev $ETH root handle 1: taprio num_tc 2 queues 1@0 1@1 sched-entry S 01 300 sched-entry S 02 1700 clockid CLOCK_TAI", + "expExitCode": "2", + "verifyCmd": "$TC qdisc show dev $ETH", + "matchPattern": "qdisc taprio 1: root refcnt", + "matchCount": "0", + "teardown": [ + "echo \"1\" > /sys/bus/netdevsim/del_device" + ] + }, { "id": "3e1e", "name": "Add taprio Qdisc with an invalid cycle-time",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 339/374 net/sched: taprio: extend minimum interval restriction to entire cycle too
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit fb66df20a7201e60f2b13d7f95d031b31a8831d3 ]
It is possible for syzbot to side-step the restriction imposed by the blamed commit in the Fixes: tag, because the taprio UAPI permits a cycle-time different from (and potentially shorter than) the sum of entry intervals.
We need one more restriction, which is that the cycle time itself must be larger than N * ETH_ZLEN bit times, where N is the number of schedule entries. This restriction needs to apply regardless of whether the cycle time came from the user or was the implicit, auto-calculated value, so we move the existing "cycle == 0" check outside the "if "(!new->cycle_time)" branch. This way covers both conditions and scenarios.
Add a selftest which illustrates the issue triggered by syzbot.
--- net/sched/sch_taprio.c | 10 ++++----- .../tc-testing/tc-tests/qdiscs/taprio.json | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-)
net/sched/sch_taprio.c +5 -5
@@ -1151,11 +1151,6 @@ static int parse_taprio_schedule(struct taprio_sched *q, struct nlattr **tb,list_for_each_entry (entry, &new->entries, list) cycle =ktime_add_ns (cycle, entry->interval); -if (!cycle) { -NL_SET_ERR_MSG (extack,"'cycle_time' can never be 0" ); -return -EINVAL ; - } -if (cycle <0 || cycle >INT_MAX ) {NL_SET_ERR_MSG (extack,"'cycle_time' is too big" );return -EINVAL ;
@@ -1164,6 +1159,11 @@ static int parse_taprio_schedule(struct taprio_sched *q, struct nlattr **tb, new->cycle_time = cycle; } +if (new->cycle_time < new->num_entries *length_to_duration (q,ETH_ZLEN )) { +NL_SET_ERR_MSG (extack,"'cycle_time' is too small" ); +return -EINVAL ; + } +taprio_calculate_gate_durations (q, new);return 0 ;
tools/testing/selftests/tc-testing/tc-tests/qdiscs/taprio.json +22 -0
@@ -154,6 +154,28 @@ "echo \"1\" > /sys/bus/netdevsim/del_device" ] }, + { + "id": "831f", + "name": "Add taprio Qdisc with too short cycle-time", + "category": [ + "qdisc", + "taprio" + ], + "plugins": { + "requires": "nsPlugin" + }, + "setup": [ + "echo \"1 1 8\" > /sys/bus/netdevsim/new_device" + ], + "cmdUnderTest": "$TC qdisc add dev $ETH root handle 1: taprio num_tc 2 queues 1@0 1@1 sched-entry S 01 200000 sched-entry S 02 200000 cycle-time 100 clockid CLOCK_TAI", + "expExitCode": "2", + "verifyCmd": "$TC qdisc show dev $ETH", + "matchPattern": "qdisc taprio 1: root refcnt", + "matchCount": "0", + "teardown": [ + "echo \"1\" > /sys/bus/netdevsim/del_device" + ] + }, { "id": "3e1e", "name": "Add taprio Qdisc with an invalid cycle-time",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 340/374 kconfig: fix comparison to constant symbols, m, n
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit aabdc960a283ba78086b0bf66ee74326f49e218e ]
Currently, comparisons to 'm' or 'n' result in incorrect output.
[Test Code]
config MODULES
def_bool y
modules
config A
def_tristate m
config B
def_bool A > n
CONFIG_B is unset, while CONFIG_B=y is expected.
The reason for the issue is because Kconfig compares the tristate values as strings.
Currently, the .type fields in the constant symbol definitions, symbol_{yes,mod,no} are unspecified, i.e., S_UNKNOWN.
When expr_calc_value() evaluates 'A > n', it checks the types of 'A' and 'n' to determine how to compare them.
The left-hand side, 'A', is a tristate symbol with a value of 'm', which corresponds to a numeric value of 1. (Internally, 'y', 'm', and 'n' are represented as 2, 1, and 0, respectively.)
The right-hand side, 'n', has an unknown type, so it is treated as the string "n" during the comparison.
expr_calc_value() compares two values numerically only when both can have numeric values. Otherwise, they are compared as strings.
symbol numeric value ASCII code
-------------------------------------
y 2 0x79
m 1 0x6d
n 0 0x6e'm' is greater than 'n' if compared numerically (since 1 is greater than 0), but smaller than 'n' if compared as strings (since the ASCII code 0x6d is smaller than 0x6e).
Specifying .type=S_TRISTATE for symbol_{yes,mod,no} fixes the above test code.
Doing so, however, would cause a regression to the following test code.
[Test Code 2]
config MODULES
def_bool n
modules
config A
def_tristate n
config B
def_bool A = m
You would get CONFIG_B=y, while CONFIG_B should not be set.
The reason is because sym_get_string_value() turns 'm' into 'n' when the module feature is disabled. Consequently, expr_calc_value() evaluates 'A = n' instead of 'A = m'. This oddity has been hidden because the type of 'm' was previously S_UNKNOWN instead of S_TRISTATE.
sym_get_string_value() should not tweak the string because the tristate value has already been correctly calculated. There is no reason to return the string "n" where its tristate value is mod.
--- scripts/kconfig/symbol.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
scripts/kconfig/symbol.c +4 -2
@@ -14,6 +14,7 @@struct symbol symbol_yes = { .name ="y" , + .type =S_TRISTATE , .curr = {"y" , yes }, .menus =LIST_HEAD_INIT (symbol_yes.menus), .flags =SYMBOL_CONST |SYMBOL_VALID ,
@@ -21,6 +22,7 @@ struct symbol symbol_yes = {struct symbol symbol_mod = { .name ="m" , + .type =S_TRISTATE , .curr = {"m" , mod }, .menus =LIST_HEAD_INIT (symbol_mod.menus), .flags =SYMBOL_CONST |SYMBOL_VALID ,
@@ -28,6 +30,7 @@ struct symbol symbol_mod = {struct symbol symbol_no = { .name ="n" , + .type =S_TRISTATE , .curr = {"n" , no }, .menus =LIST_HEAD_INIT (symbol_no.menus), .flags =SYMBOL_CONST |SYMBOL_VALID ,
@@ -788,8 +791,7 @@ const char *sym_get_string_value(struct symbol *sym)case no:return "n" ;case mod: -sym_calc_value (modules_sym); -return (modules_sym->curr.tri == no) ?"n" :"m" ; +return "m" ;case yes:return "y" ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 341/374 drm/i915/guc: avoid FIELD_PREP warning
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit d4f36db62396b73bed383c0b6e48d36278cafa78 ]
With gcc-7 and earlier, there are lots of warnings like
In file included from <command-line>:0:0:
In function '__guc_context_policy_add_priority.isra.66',
inlined from '__guc_context_set_prio.isra.67' at drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:3292:3,
inlined from 'guc_context_set_prio' at drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:3320:2:
include/linux/compiler_types.h:399:38: error: call to '__compiletime_assert_631' declared with attribute error: FIELD_PREP: mask is not constant
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^...drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c:2422:3: note: in expansion of macro 'FIELD_PREP'
FIELD_PREP(GUC_KLV_0_KEY, GUC_CONTEXT_POLICIES_KLV_ID_##id) | \
^~~~~~~~~~
Make sure that GUC_KLV_0_KEY is an unsigned value to avoid the warning.
--- drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h +3 -3
@@ -29,9 +29,9 @@*/ #define GUC_KLV_LEN_MIN 1u -#define GUC_KLV_0_KEY (0xffff << 16) -#define GUC_KLV_0_LEN (0xffff << 0) -#define GUC_KLV_n_VALUE (0xffffffff << 0) +#define GUC_KLV_0_KEY (0xffffu << 16) +#define GUC_KLV_0_LEN (0xffffu << 0) +#define GUC_KLV_n_VALUE (0xffffffffu << 0)/** * DOC: GuC Self Config KLVs
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 342/374 drm/i915/gt: Fix CCS ids calculation for CCS mode setting
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andi Shyti <[email protected]>
[ Upstream commit ee01b6a386eaf9984b58a2476e8f531149679da9 ]
The whole point of the previous fixes has been to change the CCS hardware configuration to generate only one stream available to the compute users. We did this by changing the info.engine_mask that is set during device probe, reset during the detection of the fused engines, and finally reset again when choosing the CCS mode.
We can't use the engine_mask variable anymore, as with the current configuration, it imposes only one CCS no matter what the hardware configuration is.
Before changing the engine_mask for the third time, save it and use it for calculating the CCS mode.
After the previous changes, the user reported a performance drop to around 1/4. We have tested that the compute operations, with the current patch, have improved by the same factor.
--- drivers/gpu/drm/i915/gt/intel_engine_cs.c | 6 ++++++ drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c | 2 +- drivers/gpu/drm/i915/gt/intel_gt_types.h | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/gt/intel_engine_cs.c +6 -0
@@ -919,6 +919,12 @@ static intel_engine_mask_t init_engine_mask(struct intel_gt *gt)if (IS_DG2 (gt->i915)) {u8 first_ccs =__ffs (CCS_MASK (gt)); +/* +* Store the number of active cslices before +* changing the CCS engine configuration +*/ + gt->ccs.cslices =CCS_MASK (gt); +/* Mask off all the CCS engine */ info->engine_mask &= ~GENMASK (CCS3 ,CCS0 );/* Put back in the first CCS engine */
drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c +1 -1
@@ -19,7 +19,7 @@ unsigned int intel_gt_apply_ccs_mode(struct intel_gt *gt)/* Build the value for the fixed CCS load balancing */ for (cslice =0 ; cslice <I915_MAX_CCS ; cslice++) { -if (CCS_MASK (gt) &BIT (cslice)) +if (gt->ccs.cslices &BIT (cslice))/* * If available, assign the cslice * to the first available engine...
drivers/gpu/drm/i915/gt/intel_gt_types.h +8 -0
@@ -207,6 +207,14 @@ struct intel_gt { [MAX_ENGINE_INSTANCE +1 ];enum intel_submission_method submission_method; +struct { +/* +* Mask of the non fused CCS slices +* to be used for the load balancing +*/ +intel_engine_mask_t cslices; + } ccs; +/* * Default address space (either GGTT or ppGTT depending on arch). *
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 343/374 kheaders: use `command -v` to test for existence of `cpio`
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miguel Ojeda <[email protected]>
[ Upstream commit 6e58e0173507e506a5627741358bc770f220e356 ]
Commit 13e1df09284d ("kheaders: explicitly validate existence of cpio command") added an explicit check for cpio using type.
However, type in dash (which is used in some popular distributions and base images as the shell script runner) prints the missing message to standard output, and thus no error is printed:
$ bash -c 'type missing >/dev/null'
bash: line 1: type: missing: not found
$ dash -c 'type missing >/dev/null'
$For instance, this issue may be seen by loongarch builders, given its defconfig enables CONFIG_IKHEADERS since commit 9cc1df421f00 ("LoongArch:
Update Loongson-3 default config file").
Therefore, use command -v instead to have consistent behavior, and take the chance to provide a more explicit error.
--- kernel/gen_kheaders.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/gen_kheaders.sh +6 -1
@@ -14,7 +14,12 @@ include/ arch/$SRCARCH/include/ " -type cpio > /dev/null +if ! command -v cpio >/dev/null; then + echo >&2 "***" + echo >&2 "*** 'cpio' could not be found." + echo >&2 "***" + exit 1 +fi # Support incremental builds by skipping archive generation # if timestamps of files being archived are not changed.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 344/374 spi: stm32: Dont warn about spurious interrupts
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 95d7c452a26564ef0c427f2806761b857106d8c4 ]
The dev_warn to notify about a spurious interrupt was introduced with the reasoning that these are unexpected. However spurious interrupts tend to trigger continously and the error message on the serial console prevents that the core's detection of spurious interrupts kicks in (which disables the irq) and just floods the console.
--- drivers/spi/spi-stm32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-stm32.c +1 -1
@@ -1057,7 +1057,7 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) mask |=STM32H7_SPI_SR_TXP |STM32H7_SPI_SR_RXP ;if (!(sr & mask)) { -dev_warn (spi->dev,"spurious IT (sr=0x%08x, ier=0x%08x)\n" , +dev_vdbg (spi->dev,"spurious IT (sr=0x%08x, ier=0x%08x)\n" , sr, ier);spin_unlock_irqrestore (&spi->lock, flags);return IRQ_NONE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 345/374 drm/amdgpu: Adjust logic in amdgpu_device_partner_bandwidth()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit ba46b3bda296c4f82b061ac40b90f49d2a00a380 ]
Use current speed/width on devices which don't support dynamic PCIe switching.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +12 -7
@@ -5809,13 +5809,18 @@ static void amdgpu_device_partner_bandwidth(struct amdgpu_device *adev, *speed =PCI_SPEED_UNKNOWN ; *width =PCIE_LNK_WIDTH_UNKNOWN ; -while ((parent =pci_upstream_bridge (parent))) { -/* skip upstream/downstream switches internal to dGPU*/ -if (parent->vendor ==PCI_VENDOR_ID_ATI ) -continue ; - *speed =pcie_get_speed_cap (parent); - *width =pcie_get_width_cap (parent); -break ; +if (amdgpu_device_pcie_dynamic_switching_supported (adev)) { +while ((parent =pci_upstream_bridge (parent))) { +/* skip upstream/downstream switches internal to dGPU*/ +if (parent->vendor ==PCI_VENDOR_ID_ATI ) +continue ; + *speed =pcie_get_speed_cap (parent); + *width =pcie_get_width_cap (parent); +break ; + } + }else { +/* use the current speeds rather than max if switching is not supported */ +pcie_bandwidth_available (adev->pdev,NULL , speed, width); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 346/374 ipv6: introduce dst_rt6_info() helper
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit e8dfd42c17faf183415323db1ef0c977be0d6489 ]
Instead of (struct rt6_info *)dst casts, we can use :
#define dst_rt6_info(_ptr) \
container_of_const(_ptr, struct rt6_info, dst)
Some places needed missing const qualifiers :
ip6_confirm_neigh(), ipv6_anycast_destination(),ipv6_unicast_destination(), has_gateway()
v2: added missing parts (David Ahern)
Stable-dep-of: 92f1655aa2b2 ("net: fix __dst_negative_advice() race")
--- drivers/infiniband/core/addr.c | 6 ++-- .../ethernet/mellanox/mlxsw/spectrum_span.c | 2 +- drivers/net/vrf.c | 2 +- drivers/net/vxlan/vxlan_core.c | 2 +- drivers/s390/net/qeth_core.h | 4 +-- include/net/ip6_fib.h | 6 ++-- include/net/ip6_route.h | 11 ++++---- net/bluetooth/6lowpan.c | 2 +- net/core/dst_cache.c | 2 +- net/core/filter.c | 2 +- net/ipv4/ip_tunnel.c | 2 +- net/ipv6/icmp.c | 8 +++--- net/ipv6/ila/ila_lwt.c | 4 +-- net/ipv6/ip6_output.c | 18 ++++++------ net/ipv6/ip6mr.c | 2 +- net/ipv6/ndisc.c | 2 +- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 4 +-- net/ipv6/route.c | 28 +++++++++---------- net/ipv6/tcp_ipv6.c | 4 +-- net/ipv6/udp.c | 11 +++----- net/ipv6/xfrm6_policy.c | 2 +- net/l2tp/l2tp_ip6.c | 2 +- net/mpls/mpls_iptunnel.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 14 +++++----- net/netfilter/nf_flow_table_core.c | 8 ++---- net/netfilter/nf_flow_table_ip.c | 4 +-- net/netfilter/nft_rt.c | 2 +- net/sctp/ipv6.c | 2 +- net/xfrm/xfrm_policy.c | 3 +- 30 files changed, 77 insertions(+), 86 deletions(-)
drivers/infiniband/core/addr.c +3 -3
@@ -348,15 +348,15 @@ static int dst_fetch_ha(const struct dst_entry *dst,static bool has_gateway (const struct dst_entry *dst,sa_family_t family) { -struct rtable *rt; -struct rt6_info *rt6; +const struct rtable *rt; +const struct rt6_info *rt6;if (family ==AF_INET ) { rt = container_of(dst, struct rtable, dst);return rt->rt_uses_gateway; } - rt6 = container_of(dst, struct rt6_info, dst); + rt6 =dst_rt6_info (dst);return rt6->rt6i_flags &RTF_GATEWAY ; }
drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c +1 -1
@@ -539,7 +539,7 @@ mlxsw_sp_span_gretap6_route(const struct net_device *to_dev,if (!dst || dst->error) goto out; - rt6 = container_of(dst, struct rt6_info, dst); + rt6 =dst_rt6_info (dst); dev = dst->dev; *saddrp = fl6.saddr;
drivers/net/vrf.c +1 -1
@@ -653,7 +653,7 @@ static int vrf_finish_output6(struct net *net, struct sock *sk, skb->dev = dev;rcu_read_lock (); - nexthop =rt6_nexthop ((struct rt6_info *)dst, &ipv6_hdr (skb)->daddr); + nexthop =rt6_nexthop (dst_rt6_info (dst), &ipv6_hdr (skb)->daddr); neigh =__ipv6_neigh_lookup_noref (dst->dev, nexthop);if (unlikely (!neigh)) neigh =__neigh_create (&nd_tbl, nexthop, dst->dev, false);
drivers/net/vxlan/vxlan_core.c +1 -1
@@ -2528,7 +2528,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, }if (!info) { -u32 rt6i_flags = ((struct rt6_info *)ndst)->rt6i_flags; +u32 rt6i_flags =dst_rt6_info (ndst)->rt6i_flags; err = encap_bypass_if_local(skb, dev, vxlan, AF_INET6, dst_port, ifindex, vni,
drivers/s390/net/qeth_core.h +2 -2
@@ -956,7 +956,7 @@ static inline struct dst_entry *qeth_dst_check_rcu(struct sk_buff *skb,struct dst_entry *dst =skb_dst (skb);struct rt6_info *rt; - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst);if (dst) {if (proto ==htons (ETH_P_IPV6 )) dst =dst_check (dst,rt6_get_cookie (rt));
@@ -978,7 +978,7 @@ static inline __be32 qeth_next_hop_v4_rcu(struct sk_buff *skb,static inline struct in6_addr *qeth_next_hop_v6_rcu (struct sk_buff *skb,struct dst_entry *dst) { -struct rt6_info *rt = (struct rt6_info *) dst; +struct rt6_info *rt =dst_rt6_info (dst);if (rt && !ipv6_addr_any (&rt->rt6i_gateway))return &rt->rt6i_gateway;
include/net/ip6_fib.h +4 -2
@@ -234,9 +234,11 @@ struct fib6_result {for (rt = (w)->leaf; rt; \ rt = rcu_dereference_protected(rt->fib6_next, 1)) -static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst) +#define dst_rt6_info (_ptr) container_of_const(_ptr, struct rt6_info, dst) + +static inline struct inet6_dev *ip6_dst_idev (const struct dst_entry *dst) { -return ((struct rt6_info *)dst)->rt6i_idev; +return dst_rt6_info (dst)->rt6i_idev; }static inline bool fib6_requires_src (const struct fib6_info *rt)
include/net/ip6_route.h +5 -6
@@ -210,12 +210,11 @@ void rt6_uncached_list_del(struct rt6_info *rt);static inline const struct rt6_info *skb_rt6_info (const struct sk_buff *skb) {const struct dst_entry *dst =skb_dst (skb); -const struct rt6_info *rt6 =NULL ;if (dst) - rt6 = container_of(dst, struct rt6_info, dst); +return dst_rt6_info (dst); -return rt6; +return NULL ; }/*
@@ -227,7 +226,7 @@ static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst, {struct ipv6_pinfo *np =inet6_sk (sk); - np->dst_cookie =rt6_get_cookie ((struct rt6_info *)dst); + np->dst_cookie =rt6_get_cookie (dst_rt6_info (dst));sk_setup_caps (sk, dst); np->daddr_cache = daddr;#ifdef CONFIG_IPV6_SUBTREES
@@ -240,7 +239,7 @@ void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,static inline bool ipv6_unicast_destination (const struct sk_buff *skb) { -struct rt6_info *rt = (struct rt6_info *)skb_dst (skb); +const struct rt6_info *rt =dst_rt6_info (skb_dst (skb));return rt->rt6i_flags &RTF_LOCAL ; }
@@ -248,7 +247,7 @@ static inline bool ipv6_unicast_destination(const struct sk_buff *skb)static inline bool ipv6_anycast_destination (const struct dst_entry *dst,const struct in6_addr *daddr) { -struct rt6_info *rt = (struct rt6_info *)dst; +const struct rt6_info *rt =dst_rt6_info (dst); return rt->rt6i_flags & RTF_ANYCAST || (rt->rt6i_dst.plen < 127 &&
net/bluetooth/6lowpan.c +1 -1
@@ -133,7 +133,7 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,struct in6_addr *daddr, struct sk_buff *skb) { - struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); + struct rt6_info *rt = dst_rt6_info(skb_dst(skb));int count =atomic_read (&dev->peer_count);const struct in6_addr *nexthop;struct lowpan_peer *peer;
net/core/dst_cache.c +1 -1
@@ -112,7 +112,7 @@ void dst_cache_set_ip6(struct dst_cache *dst_cache, struct dst_entry *dst, idst =this_cpu_ptr (dst_cache->cache);dst_cache_per_cpu_dst_set (this_cpu_ptr (dst_cache->cache), dst, -rt6_get_cookie ((struct rt6_info *)dst)); +rt6_get_cookie (dst_rt6_info (dst))); idst->in6_saddr = *saddr; }EXPORT_SYMBOL_GPL (dst_cache_set_ip6);
net/core/filter.c +1 -1
@@ -2215,7 +2215,7 @@ static int bpf_out_neigh_v6(struct net *net, struct sk_buff *skb,rcu_read_lock ();if (!nh) { dst =skb_dst (skb); - nexthop = rt6_nexthop(container_of(dst, struct rt6_info, dst), + nexthop =rt6_nexthop (dst_rt6_info (dst), &ipv6_hdr (skb)->daddr); }else { nexthop = &nh->ipv6_nh;
net/ipv4/ip_tunnel.c +1 -1
@@ -543,7 +543,7 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,struct rt6_info *rt6;__be32 daddr; - rt6 =skb_valid_dst (skb) ? (struct rt6_info *)skb_dst (skb) : + rt6 =skb_valid_dst (skb) ?dst_rt6_info (skb_dst (skb)) :NULL ; daddr = md ? dst : tunnel->parms.iph.daddr;
net/ipv6/icmp.c +4 -4
@@ -212,7 +212,7 @@ static bool icmpv6_xrlim_allow(struct sock *sk, u8 type, }else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK )) { res = true; }else { -struct rt6_info *rt = (struct rt6_info *)dst; +struct rt6_info *rt =dst_rt6_info (dst);int tmo = net->ipv6.sysctl.icmpv6_time;struct inet_peer *peer;
@@ -241,7 +241,7 @@ static bool icmpv6_rt_has_prefsrc(struct sock *sk, u8 type, dst =ip6_route_output (net, sk, fl6);if (!dst->error) { -struct rt6_info *rt = (struct rt6_info *)dst; +struct rt6_info *rt =dst_rt6_info (dst);struct in6_addr prefsrc;rt6_get_prefsrc (rt, &prefsrc);
@@ -616,7 +616,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,if (ip6_append_data (sk, icmpv6_getfrag, &msg, len +sizeof (struct icmp6hdr ),sizeof (struct icmp6hdr ), - &ipc6, &fl6, (struct rt6_info *)dst, + &ipc6, &fl6,dst_rt6_info (dst),MSG_DONTWAIT )) {ICMP6_INC_STATS (net, idev,ICMP6_MIB_OUTERRORS );ip6_flush_pending_frames (sk);
@@ -803,7 +803,7 @@ static enum skb_drop_reason icmpv6_echo_reply(struct sk_buff *skb)if (ip6_append_data (sk, icmpv6_getfrag, &msg, skb->len +sizeof (struct icmp6hdr ),sizeof (struct icmp6hdr ), &ipc6, &fl6, - (struct rt6_info *)dst,MSG_DONTWAIT )) { +dst_rt6_info (dst),MSG_DONTWAIT )) {__ICMP6_INC_STATS (net, idev,ICMP6_MIB_OUTERRORS );ip6_flush_pending_frames (sk); }else {
net/ipv6/ila/ila_lwt.c +2 -2
@@ -38,7 +38,7 @@ static inline struct ila_params *ila_params_lwtunnel(static int ila_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *orig_dst =skb_dst (skb); -struct rt6_info *rt = (struct rt6_info *)orig_dst; +struct rt6_info *rt =dst_rt6_info (orig_dst);struct ila_lwt *ilwt =ila_lwt_lwtunnel (orig_dst->lwtstate);struct dst_entry *dst;int err = -EINVAL ;
@@ -70,7 +70,7 @@ static int ila_output(struct net *net, struct sock *sk, struct sk_buff *skb)memset (&fl6,0 ,sizeof (fl6)); fl6.flowi6_oif = orig_dst->dev->ifindex; fl6.flowi6_iif =LOOPBACK_IFINDEX ; - fl6.daddr = *rt6_nexthop ((struct rt6_info *)orig_dst, + fl6.daddr = *rt6_nexthop (dst_rt6_info (orig_dst), &ip6h->daddr); dst =ip6_route_output (net,NULL , &fl6);
net/ipv6/ip6_output.c +9 -9
@@ -120,7 +120,7 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *IP6_UPD_PO_STATS (net, idev,IPSTATS_MIB_OUT , skb->len);rcu_read_lock (); - nexthop =rt6_nexthop ((struct rt6_info *)dst, daddr); + nexthop =rt6_nexthop (dst_rt6_info (dst), daddr); neigh =__ipv6_neigh_lookup_noref (dev, nexthop);if (unlikely (IS_ERR_OR_NULL (neigh))) {
@@ -599,7 +599,7 @@ int ip6_forward(struct sk_buff *skb)* send a redirect. */ - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst);if (rt->rt6i_flags &RTF_GATEWAY ) target = &rt->rt6i_gateway;else
@@ -856,7 +856,7 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb, int (*output)(struct net *, struct sock *, struct sk_buff *)) {struct sk_buff *frag; -struct rt6_info *rt = (struct rt6_info *)skb_dst (skb); +struct rt6_info *rt =dst_rt6_info (skb_dst (skb));struct ipv6_pinfo *np = skb->sk && !dev_recursion_level () ?inet6_sk (skb->sk) :NULL ;bool mono_delivery_time = skb->mono_delivery_time;
@@ -1063,7 +1063,7 @@ static struct dst_entry *ip6_sk_dst_check(struct sock *sk,return NULL ; } - rt = (struct rt6_info *)dst; + rt =dst_rt6_info (dst);/* Yes, checking route validity in not connected * case is not very simple. Take into account, * that we do not support routing by source, TOS,
@@ -1118,7 +1118,7 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,struct rt6_info *rt; *dst =ip6_route_output (net, sk, fl6); - rt = (*dst)->error ?NULL : (struct rt6_info *)*dst; + rt = (*dst)->error ?NULL :dst_rt6_info (*dst);rcu_read_lock (); from = rt ?rcu_dereference (rt->from) :NULL ;
@@ -1159,7 +1159,7 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,* dst entry and replace it instead with the * dst entry of the nexthop router */ - rt = (struct rt6_info *) *dst; + rt =dst_rt6_info (*dst);rcu_read_lock (); n =__ipv6_neigh_lookup_noref (rt->dst.dev,rt6_nexthop (rt, &fl6->daddr));
@@ -1423,7 +1423,7 @@ static int __ip6_append_data(struct sock *sk,int offset =0 ;bool zc = false;u32 tskey =0 ; -struct rt6_info *rt = (struct rt6_info *)cork->dst; +struct rt6_info *rt =dst_rt6_info (cork->dst);bool paged, hold_tskey, extra_uref = false;struct ipv6_txoptions *opt = v6_cork->opt;int csummode =CHECKSUM_NONE ;
@@ -1877,7 +1877,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,struct net *net =sock_net (sk);struct ipv6hdr *hdr;struct ipv6_txoptions *opt = v6_cork->opt; -struct rt6_info *rt = (struct rt6_info *)cork->base.dst; +struct rt6_info *rt =dst_rt6_info (cork->base.dst);struct flowi6 *fl6 = &cork->fl.u.ip6;unsigned char proto = fl6->flowi6_proto;
@@ -1949,7 +1949,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,int ip6_send_skb (struct sk_buff *skb) {struct net *net =sock_net (skb->sk); -struct rt6_info *rt = (struct rt6_info *)skb_dst (skb); +struct rt6_info *rt =dst_rt6_info (skb_dst (skb));int err; err =ip6_local_out (net, skb->sk, skb);
net/ipv6/ip6mr.c +1 -1
@@ -2273,7 +2273,7 @@ int ip6mr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm,int err;struct mr_table *mrt;struct mfc6_cache *cache; -struct rt6_info *rt = (struct rt6_info *)skb_dst (skb); +struct rt6_info *rt =dst_rt6_info (skb_dst (skb)); mrt =ip6mr_get_table (net,RT6_TABLE_DFLT );if (!mrt)
net/ipv6/ndisc.c +1 -1
@@ -1722,7 +1722,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)if (IS_ERR (dst))return ; - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst);if (rt->rt6i_flags &RTF_GATEWAY ) { ND_PRINTK(2, warn,
net/ipv6/ping.c +1 -1
@@ -154,7 +154,7 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) dst =ip6_sk_dst_lookup_flow (sk, &fl6, daddr, false);if (IS_ERR (dst))return PTR_ERR (dst); - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst);if (!fl6.flowi6_oif &&ipv6_addr_is_multicast (&fl6.daddr)) fl6.flowi6_oif =READ_ONCE (np->mcast_oif);
net/ipv6/raw.c +2 -2
@@ -598,7 +598,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,struct ipv6hdr *iph;struct sk_buff *skb;int err; -struct rt6_info *rt = (struct rt6_info *)*dstp; +struct rt6_info *rt =dst_rt6_info (*dstp);int hlen =LL_RESERVED_SPACE (rt->dst.dev);int tlen = rt->dst.dev->needed_tailroom;
@@ -917,7 +917,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc6.opt = opt;lock_sock (sk); err =ip6_append_data (sk, raw6_getfrag, &rfv, - len,0 , &ipc6, &fl6, (struct rt6_info *)dst, + len,0 , &ipc6, &fl6,dst_rt6_info (dst), msg->msg_flags);if (err)
net/ipv6/route.c +14 -14
@@ -226,7 +226,7 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,struct sk_buff *skb, const void *daddr) { - const struct rt6_info *rt = container_of(dst, struct rt6_info, dst); + const struct rt6_info *rt = dst_rt6_info(dst);return ip6_neigh_lookup (rt6_nexthop (rt, &in6addr_any), dst->dev, skb, daddr);
@@ -234,8 +234,8 @@ static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,static void ip6_confirm_neigh (const struct dst_entry *dst,const void *daddr) { +const struct rt6_info *rt =dst_rt6_info (dst);struct net_device *dev = dst->dev; -struct rt6_info *rt = (struct rt6_info *)dst; daddr =choose_neigh_daddr (rt6_nexthop (rt, &in6addr_any),NULL , daddr);if (!daddr)
@@ -354,7 +354,7 @@ EXPORT_SYMBOL(ip6_dst_alloc);static void ip6_dst_destroy (struct dst_entry *dst) { -struct rt6_info *rt = (struct rt6_info *)dst; +struct rt6_info *rt =dst_rt6_info (dst);struct fib6_info *from;struct inet6_dev *idev;
@@ -373,7 +373,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)static void ip6_dst_ifdown (struct dst_entry *dst,struct net_device *dev) { -struct rt6_info *rt = (struct rt6_info *)dst; +struct rt6_info *rt =dst_rt6_info (dst);struct inet6_dev *idev = rt->rt6i_idev;if (idev && idev->dev != blackhole_netdev) {
@@ -1288,7 +1288,7 @@ struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr, dst =fib6_rule_lookup (net, &fl6, skb, flags, ip6_pol_route_lookup);if (dst->error ==0 ) -return (struct rt6_info *) dst; +return dst_rt6_info (dst);dst_release (dst);
@@ -2647,7 +2647,7 @@ struct dst_entry *ip6_route_output_flags(struct net *net,rcu_read_lock (); dst =ip6_route_output_flags_noref (net, sk, fl6, flags); - rt6 = (struct rt6_info *)dst; + rt6 =dst_rt6_info (dst);/* For dst cached in uncached_list, refcnt is already taken. */ if (list_empty (&rt6->dst.rt_uncached) && !dst_hold_safe (dst)) { dst = &net->ipv6.ip6_null_entry->dst;
@@ -2661,7 +2661,7 @@ EXPORT_SYMBOL_GPL(ip6_route_output_flags);struct dst_entry *ip6_blackhole_route (struct net *net,struct dst_entry *dst_orig) { -struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig; +struct rt6_info *rt, *ort =dst_rt6_info (dst_orig);struct net_device *loopback_dev = net->loopback_dev;struct dst_entry *new =NULL ;
@@ -2744,7 +2744,7 @@ INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst,struct fib6_info *from;struct rt6_info *rt; - rt = container_of(dst, struct rt6_info, dst); + rt =dst_rt6_info (dst);if (rt->sernum)return rt6_is_valid (rt) ? dst :NULL ;
@@ -2772,7 +2772,7 @@ EXPORT_INDIRECT_CALLABLE(ip6_dst_check);static struct dst_entry *ip6_negative_advice (struct dst_entry *dst) { -struct rt6_info *rt = (struct rt6_info *) dst; +struct rt6_info *rt =dst_rt6_info (dst);if (rt) {if (rt->rt6i_flags &RTF_CACHE ) {
@@ -2796,7 +2796,7 @@ static void ip6_link_failure(struct sk_buff *skb)icmpv6_send (skb,ICMPV6_DEST_UNREACH ,ICMPV6_ADDR_UNREACH ,0 ); - rt = (struct rt6_info *)skb_dst (skb); + rt =dst_rt6_info (skb_dst (skb));if (rt) {rcu_read_lock ();if (rt->rt6i_flags &RTF_CACHE ) {
@@ -2852,7 +2852,7 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk, bool confirm_neigh) {const struct in6_addr *daddr, *saddr; -struct rt6_info *rt6 = (struct rt6_info *)dst; +struct rt6_info *rt6 =dst_rt6_info (dst);/* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU) * IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it.
@@ -4174,7 +4174,7 @@ static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bu } } - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst);if (rt->rt6i_flags &RTF_REJECT ) {net_dbg_ratelimited ("rt6_redirect: source isn't a valid nexthop for redirect target\n" );return ;
@@ -5608,7 +5608,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb, int iif, int type, u32 portid, u32 seq, unsigned int flags) { - struct rt6_info *rt6 = (struct rt6_info *)dst; + struct rt6_info *rt6 = dst_rt6_info(dst);struct rt6key *rt6_dst, *rt6_src;u32 *pmetrics, table, rt6_flags;unsigned char nh_flags =0 ;
@@ -6111,7 +6111,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, } - rt = container_of(dst, struct rt6_info, dst); + rt =dst_rt6_info (dst);if (rt->dst.error) { err = rt->dst.error;ip6_rt_put (rt);
net/ipv6/tcp_ipv6.c +1 -3
@@ -95,11 +95,9 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)struct dst_entry *dst =skb_dst (skb);if (dst &&dst_hold_safe (dst)) { -const struct rt6_info *rt = (const struct rt6_info *)dst; -rcu_assign_pointer (sk->sk_rx_dst, dst); sk->sk_rx_dst_ifindex = skb->skb_iif; - sk->sk_rx_dst_cookie =rt6_get_cookie (rt); + sk->sk_rx_dst_cookie =rt6_get_cookie (dst_rt6_info (dst)); } }
net/ipv6/udp.c +4 -7
@@ -910,11 +910,8 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,static void udp6_sk_rx_dst_set (struct sock *sk,struct dst_entry *dst) { -if (udp_sk_rx_dst_set (sk, dst)) { -const struct rt6_info *rt = (const struct rt6_info *)dst; - - sk->sk_rx_dst_cookie =rt6_get_cookie (rt); - } +if (udp_sk_rx_dst_set (sk, dst)) + sk->sk_rx_dst_cookie =rt6_get_cookie (dst_rt6_info (dst)); }/* wrapper for udp_queue_rcv_skb tacking care of csum conversion and
@@ -1585,7 +1582,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) skb =ip6_make_skb (sk, getfrag, msg, ulen,sizeof (struct udphdr ), &ipc6, - (struct rt6_info *)dst, +dst_rt6_info (dst), msg->msg_flags, &cork); err =PTR_ERR (skb);if (!IS_ERR_OR_NULL (skb))
@@ -1612,7 +1609,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc6.dontfrag =inet6_test_bit (DONTFRAG , sk); up->len += ulen; err =ip6_append_data (sk, getfrag, msg, ulen,sizeof (struct udphdr ), - &ipc6, fl6, (struct rt6_info *)dst, + &ipc6, fl6,dst_rt6_info (dst), corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags);if (err)udp_v6_flush_pending_frames (sk);
net/ipv6/xfrm6_policy.c +1 -1
@@ -70,7 +70,7 @@ static int xfrm6_get_saddr(struct net *net, int oif,static int xfrm6_fill_dst (struct xfrm_dst *xdst,struct net_device *dev,const struct flowi *fl) { -struct rt6_info *rt = (struct rt6_info *)xdst->route; +struct rt6_info *rt =dst_rt6_info (xdst->route); xdst->u.dst.dev = dev;netdev_hold (dev, &xdst->u.dst.dev_tracker,GFP_ATOMIC );
net/l2tp/l2tp_ip6.c +1 -1
@@ -630,7 +630,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ulen = len + (skb_queue_empty (&sk->sk_write_queue) ? transhdrlen :0 ); err =ip6_append_data (sk, ip_generic_getfrag, msg, ulen, transhdrlen, &ipc6, - &fl6, (struct rt6_info *)dst, + &fl6,dst_rt6_info (dst), msg->msg_flags);if (err)ip6_flush_pending_frames (sk);
net/mpls/mpls_iptunnel.c +1 -1
@@ -90,7 +90,7 @@ static int mpls_xmit(struct sk_buff *skb) ttl = net->mpls.default_ttl; else ttl =ipv6_hdr (skb)->hop_limit; - rt6 = (struct rt6_info *)dst; + rt6 =dst_rt6_info (dst); }else { goto drop; }
net/netfilter/ipvs/ip_vs_xmit.c +7 -7
@@ -180,7 +180,7 @@ static inline bool crosses_local_route_boundary(int skb_af, struct sk_buff *skb, (!skb->dev || skb->dev->flags &IFF_LOOPBACK ) && (addr_type &IPV6_ADDR_LOOPBACK ); old_rt_is_local =__ip_vs_is_local_route6 ( - (struct rt6_info *)skb_dst (skb)); +dst_rt6_info (skb_dst (skb))); } else#endif {
@@ -481,7 +481,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,if (dest) { dest_dst =__ip_vs_dst_check (dest);if (likely (dest_dst)) - rt = (struct rt6_info *) dest_dst->dst_cache; + rt =dst_rt6_info (dest_dst->dst_cache);else {u32 cookie;
@@ -501,7 +501,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,ip_vs_dest_dst_free (dest_dst); goto err_unreach; } - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst); cookie =rt6_get_cookie (rt);__ip_vs_dst_set (dest, dest_dst, &rt->dst, cookie);spin_unlock_bh (&dest->dst_lock);
@@ -517,7 +517,7 @@ __ip_vs_get_out_rt_v6(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb, rt_mode);if (!dst) goto err_unreach; - rt = (struct rt6_info *) dst; + rt =dst_rt6_info (dst); } local =__ip_vs_is_local_route6 (rt);
@@ -862,7 +862,7 @@ ip_vs_nat_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, IP_VS_RT_MODE_RDR);if (local <0 ) goto tx_error; - rt = (struct rt6_info *)skb_dst (skb); + rt =dst_rt6_info (skb_dst (skb));/* * Avoid duplicate tuple in reply direction for NAT traffic * to local address when connection is sync-ed
@@ -1288,7 +1288,7 @@ ip_vs_tunnel_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp,if (local)return ip_vs_send_or_cont (NFPROTO_IPV6 , skb, cp,1 ); - rt = (struct rt6_info *)skb_dst (skb); + rt =dst_rt6_info (skb_dst (skb)); tdev = rt->dst.dev;/*
@@ -1590,7 +1590,7 @@ ip_vs_icmp_xmit_v6(struct sk_buff *skb, struct ip_vs_conn *cp, &cp->daddr.in6, NULL, ipvsh, 0, rt_mode);if (local <0 ) goto tx_error; - rt = (struct rt6_info *)skb_dst (skb); + rt =dst_rt6_info (skb_dst (skb));/* * Avoid duplicate tuple in reply direction for NAT traffic * to local address when connection is sync-ed
net/netfilter/nf_flow_table_core.c +2 -6
@@ -77,12 +77,8 @@ EXPORT_SYMBOL_GPL(flow_offload_alloc);static u32 flow_offload_dst_cookie (struct flow_offload_tuple *flow_tuple) { -const struct rt6_info *rt; - -if (flow_tuple->l3proto ==NFPROTO_IPV6 ) { - rt = (const struct rt6_info *)flow_tuple->dst_cache; -return rt6_get_cookie (rt); - } +if (flow_tuple->l3proto ==NFPROTO_IPV6 ) +return rt6_get_cookie (dst_rt6_info (flow_tuple->dst_cache));return 0 ; }
net/netfilter/nf_flow_table_ip.c +2 -2
@@ -729,7 +729,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,return NF_ACCEPT ;if (unlikely (tuplehash->tuple.xmit_type ==FLOW_OFFLOAD_XMIT_XFRM )) { - rt = (struct rt6_info *)tuplehash->tuple.dst_cache; + rt =dst_rt6_info (tuplehash->tuple.dst_cache);memset (skb->cb,0 ,sizeof (struct inet6_skb_parm ));IP6CB (skb)->iif = skb->dev->ifindex;IP6CB (skb)->flags =IP6SKB_FORWARDED ;
@@ -741,7 +741,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,switch (tuplehash->tuple.xmit_type) {case FLOW_OFFLOAD_XMIT_NEIGH : - rt = (struct rt6_info *)tuplehash->tuple.dst_cache; + rt =dst_rt6_info (tuplehash->tuple.dst_cache); outdev = rt->dst.dev; skb->dev = outdev; nexthop =rt6_nexthop (rt, &flow->tuplehash[!dir].tuple.src_v6);
net/netfilter/nft_rt.c +1 -1
@@ -80,7 +80,7 @@ void nft_rt_get_eval(const struct nft_expr *expr,if (nft_pf (pkt) !=NFPROTO_IPV6 ) goto err; -memcpy (dest,rt6_nexthop ((struct rt6_info *)dst, +memcpy (dest,rt6_nexthop (dst_rt6_info (dst), &ipv6_hdr (skb)->daddr),sizeof (struct in6_addr ));break ;
net/sctp/ipv6.c +1 -1
@@ -415,7 +415,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,if (!IS_ERR_OR_NULL (dst)) {struct rt6_info *rt; - rt = (struct rt6_info *)dst; + rt =dst_rt6_info (dst); t->dst_cookie =rt6_get_cookie (rt); pr_debug("rt6_dst:%pI6/%d rt6_src:%pI6\n", &rt->rt6i_dst.addr, rt->rt6i_dst.plen,
net/xfrm/xfrm_policy.c +1 -2
@@ -2598,8 +2598,7 @@ static void xfrm_init_path(struct xfrm_dst *path, struct dst_entry *dst, int nfheader_len) {if (dst->ops->family ==AF_INET6 ) { -struct rt6_info *rt = (struct rt6_info *)dst; - path->path_cookie =rt6_get_cookie (rt); + path->path_cookie =rt6_get_cookie (dst_rt6_info (dst)); path->u.rt6.rt6i_nfheader_len = nfheader_len; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 347/374 inet: introduce dst_rtable() helper
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 05d6d492097c55f2d153fc3fd33cbe78e1e28e0a ]
I added dst_rt6_info() in commite8dfd42c17fa ("ipv6: introduce dst_rt6_info() helper")
This patch does a similar change for IPv4.
Instead of (struct rtable *)dst casts, we can use :
#define dst_rtable(_ptr) \
container_of_const(_ptr, struct rtable, dst)
Patch is smaller than IPv6 one, because IPv4 has skb_rtable() helper.
Stable-dep-of: 92f1655aa2b2 ("net: fix __dst_negative_advice() race")
--- drivers/infiniband/core/addr.c | 12 +++--------- drivers/net/vrf.c | 2 +- drivers/s390/net/qeth_core.h | 5 ++--- include/linux/skbuff.h | 9 --------- include/net/ip.h | 4 ++-- include/net/route.h | 11 +++++++++++ net/atm/clip.c | 2 +- net/core/dst_cache.c | 2 +- net/core/filter.c | 3 +-- net/ipv4/af_inet.c | 2 +- net/ipv4/icmp.c | 26 ++++++++++++++------------ net/ipv4/ip_input.c | 2 +- net/ipv4/ip_output.c | 8 ++++---- net/ipv4/route.c | 24 +++++++++++------------- net/ipv4/udp.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- net/l2tp/l2tp_ip.c | 2 +- net/mpls/mpls_iptunnel.c | 2 +- net/netfilter/ipvs/ip_vs_xmit.c | 2 +- net/netfilter/nf_flow_table_ip.c | 4 ++-- net/netfilter/nft_rt.c | 2 +- net/sctp/protocol.c | 4 ++-- net/tipc/udp_media.c | 2 +- 23 files changed, 64 insertions(+), 70 deletions(-)
drivers/infiniband/core/addr.c +3 -9
@@ -348,16 +348,10 @@ static int dst_fetch_ha(const struct dst_entry *dst,static bool has_gateway (const struct dst_entry *dst,sa_family_t family) { -const struct rtable *rt; -const struct rt6_info *rt6; +if (family ==AF_INET ) +return dst_rtable (dst)->rt_uses_gateway; -if (family ==AF_INET ) { - rt = container_of(dst, struct rtable, dst); -return rt->rt_uses_gateway; - } - - rt6 =dst_rt6_info (dst); -return rt6->rt6i_flags &RTF_GATEWAY ; +return dst_rt6_info (dst)->rt6i_flags &RTF_GATEWAY ; } static int fetch_ha(const struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
drivers/net/vrf.c +1 -1
@@ -860,7 +860,7 @@ static int vrf_rt6_create(struct net_device *dev)static int vrf_finish_output (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb); -struct rtable *rt = (struct rtable *)dst; +struct rtable *rt =dst_rtable (dst);struct net_device *dev = dst->dev;unsigned int hh_len =LL_RESERVED_SPACE (dev);struct neighbour *neigh;
drivers/s390/net/qeth_core.h +2 -3
@@ -970,9 +970,8 @@ static inline struct dst_entry *qeth_dst_check_rcu(struct sk_buff *skb,static inline __be32 qeth_next_hop_v4_rcu (struct sk_buff *skb,struct dst_entry *dst) { -struct rtable *rt = (struct rtable *) dst; - -return (rt) ?rt_nexthop (rt,ip_hdr (skb)->daddr) :ip_hdr (skb)->daddr; +return (dst) ?rt_nexthop (dst_rtable (dst),ip_hdr (skb)->daddr) : +ip_hdr (skb)->daddr; } static inline struct in6_addr *qeth_next_hop_v6_rcu(struct sk_buff *skb,
include/linux/skbuff.h +0 -9
@@ -1174,15 +1174,6 @@ static inline bool skb_dst_is_noref(const struct sk_buff *skb)return (skb->_skb_refdst &SKB_DST_NOREF ) &&skb_dst (skb); } -/** -* skb_rtable - Returns the skb &rtable -* @skb: buffer -*/ -static inline struct rtable *skb_rtable (const struct sk_buff *skb) -{ -return (struct rtable *)skb_dst (skb); -} -/* For mangling skb->pkt_type from user space side from applications * such as nft, tc, etc, we only allow a conservative subset of * possible pkt_types to be set.
include/net/ip.h +2 -2
@@ -423,7 +423,7 @@ int ip_decrease_ttl(struct iphdr *iph)static inline int ip_mtu_locked (const struct dst_entry *dst) { -const struct rtable *rt = (const struct rtable *)dst; +const struct rtable *rt =dst_rtable (dst);return rt->rt_mtu_locked ||dst_metric_locked (dst,RTAX_MTU ); }
@@ -461,7 +461,7 @@ static inline bool ip_sk_ignore_df(const struct sock *sk)static inline unsigned int ip_dst_mtu_maybe_forward (const struct dst_entry *dst,bool forwarding) { - const struct rtable *rt = container_of(dst, struct rtable, dst); +const struct rtable *rt =dst_rtable (dst);struct net *net =dev_net (dst->dev);unsigned int mtu;
include/net/route.h +11 -0
@@ -77,6 +77,17 @@ struct rtable { rt_pmtu:31 ; }; +#define dst_rtable (_ptr) container_of_const(_ptr, struct rtable, dst) + +/** +* skb_rtable - Returns the skb &rtable +* @skb: buffer +*/ +static inline struct rtable *skb_rtable (const struct sk_buff *skb) +{ +return dst_rtable (skb_dst (skb)); +} +static inline bool rt_is_input_route (const struct rtable *rt) {return rt->rt_is_input !=0 ;
net/atm/clip.c +1 -1
@@ -345,7 +345,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb, dev->stats.tx_dropped++;return NETDEV_TX_OK ; } - rt = (struct rtable *) dst; + rt =dst_rtable (dst);if (rt->rt_gw_family ==AF_INET ) daddr = &rt->rt_gw4;else
net/core/dst_cache.c +1 -1
@@ -83,7 +83,7 @@ struct rtable *dst_cache_get_ip4(struct dst_cache *dst_cache, __be32 *saddr)return NULL ; *saddr = idst->in_saddr.s_addr; - return container_of(dst, struct rtable, dst); +return dst_rtable (dst); }EXPORT_SYMBOL_GPL (dst_cache_get_ip4);
net/core/filter.c +1 -2
@@ -2314,8 +2314,7 @@ static int bpf_out_neigh_v4(struct net *net, struct sk_buff *skb,rcu_read_lock ();if (!nh) { -struct dst_entry *dst =skb_dst (skb); - struct rtable *rt = container_of(dst, struct rtable, dst); +struct rtable *rt =skb_rtable (skb); neigh =ip_neigh_for_gw (rt, skb, &is_v6gw); }else if (nh->nh_family ==AF_INET6 ) {
net/ipv4/af_inet.c +1 -1
@@ -1308,8 +1308,8 @@ static int inet_sk_reselect_saddr(struct sock *sk)int inet_sk_rebuild_header (struct sock *sk) { +struct rtable *rt =dst_rtable (__sk_dst_check (sk,0 ));struct inet_sock *inet =inet_sk (sk); -struct rtable *rt = (struct rtable *)__sk_dst_check (sk,0 );__be32 daddr;struct ip_options_rcu *inet_opt;struct flowi4 *fl4;
net/ipv4/icmp.c +14 -12
@@ -483,6 +483,7 @@ static struct rtable *icmp_route_lookup(struct net *net, struct icmp_bxm *param) {struct net_device *route_lookup_dev; +struct dst_entry *dst, *dst2;struct rtable *rt, *rt2;struct flowi4 fl4_dec;int err;
@@ -508,16 +509,17 @@ static struct rtable *icmp_route_lookup(struct net *net,/* No need to clone since we're just using its address. */ rt2 = rt; - rt = (struct rtable *)xfrm_lookup (net, &rt->dst, -flowi4_to_flowi (fl4),NULL ,0 ); -if (!IS_ERR (rt)) { + dst =xfrm_lookup (net, &rt->dst, +flowi4_to_flowi (fl4),NULL ,0 ); + rt =dst_rtable (dst); +if (!IS_ERR (dst)) {if (rt != rt2)return rt; - }else if (PTR_ERR (rt) == -EPERM ) { + }else if (PTR_ERR (dst) == -EPERM ) { rt =NULL ; - }else + }else {return rt; - + } err =xfrm_decode_session_reverse (net, skb_in,flowi4_to_flowi (&fl4_dec),AF_INET );if (err) goto relookup_failed;
@@ -551,19 +553,19 @@ static struct rtable *icmp_route_lookup(struct net *net,if (err) goto relookup_failed; - rt2 = (struct rtable *)xfrm_lookup (net, &rt2->dst, -flowi4_to_flowi (&fl4_dec),NULL , -XFRM_LOOKUP_ICMP ); -if (!IS_ERR (rt2)) { + dst2 =xfrm_lookup (net, &rt2->dst,flowi4_to_flowi (&fl4_dec),NULL , +XFRM_LOOKUP_ICMP ); + rt2 =dst_rtable (dst2); +if (!IS_ERR (dst2)) {dst_release (&rt->dst);memcpy (fl4, &fl4_dec,sizeof (*fl4)); rt = rt2; - }else if (PTR_ERR (rt2) == -EPERM ) { + }else if (PTR_ERR (dst2) == -EPERM ) {if (rt)dst_release (&rt->dst);return rt2; }else { - err =PTR_ERR (rt2); + err =PTR_ERR (dst2); goto relookup_failed; }return rt;
net/ipv4/ip_input.c +1 -1
@@ -616,7 +616,7 @@ static void ip_list_rcv_finish(struct net *net, struct sock *sk, dst =skb_dst (skb);if (curr_dst != dst) { hint =ip_extract_route_hint (net, skb, - ((struct rtable *)dst)->rt_type); +dst_rtable (dst)->rt_type);/* dispatch old sublist */ if (!list_empty (&sublist))
net/ipv4/ip_output.c +4 -4
@@ -198,7 +198,7 @@ EXPORT_SYMBOL_GPL(ip_build_and_send_pkt);static int ip_finish_output2 (struct net *net,struct sock *sk,struct sk_buff *skb) {struct dst_entry *dst =skb_dst (skb); -struct rtable *rt = (struct rtable *)dst; +struct rtable *rt =dst_rtable (dst);struct net_device *dev = dst->dev;unsigned int hh_len =LL_RESERVED_SPACE (dev);struct neighbour *neigh;
@@ -475,7 +475,7 @@ int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, goto packet_routed;/* Make sure we can route this packet. */ - rt = (struct rtable *)__sk_dst_check (sk,0 ); + rt =dst_rtable (__sk_dst_check (sk,0 ));if (!rt) {__be32 daddr;
@@ -971,7 +971,7 @@ static int __ip_append_data(struct sock *sk,bool zc = false;unsigned int maxfraglen, fragheaderlen, maxnonfragsize;int csummode =CHECKSUM_NONE ; -struct rtable *rt = (struct rtable *)cork->dst; +struct rtable *rt =dst_rtable (cork->dst);bool paged, hold_tskey, extra_uref = false;unsigned int wmem_alloc_delta =0 ;u32 tskey =0 ;
@@ -1390,7 +1390,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk,struct inet_sock *inet =inet_sk (sk);struct net *net =sock_net (sk);struct ip_options *opt =NULL ; -struct rtable *rt = (struct rtable *)cork->dst; +struct rtable *rt =dst_rtable (cork->dst);struct iphdr *iph;u8 pmtudisc, ttl;__be16 df =0 ;
net/ipv4/route.c +11 -13
@@ -831,7 +831,7 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bufu32 mark = skb->mark;__u8 tos = iph->tos; - rt = (struct rtable *) dst; + rt =dst_rtable (dst);__build_flow_key (net, &fl4, sk, iph, oif, tos, prot, mark,0 );__ip_do_redirect (rt, skb, &fl4, true);
@@ -839,7 +839,7 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_bufstatic struct dst_entry *ipv4_negative_advice (struct dst_entry *dst) { -struct rtable *rt = (struct rtable *)dst; +struct rtable *rt =dst_rtable (dst);struct dst_entry *ret = dst;if (rt) {
@@ -1056,7 +1056,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb, u32 mtu, bool confirm_neigh) { - struct rtable *rt = (struct rtable *) dst; + struct rtable *rt = dst_rtable(dst);struct flowi4 fl4;ip_rt_build_flow_key (&fl4, sk, skb);
@@ -1127,7 +1127,7 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu)__build_flow_key (net, &fl4, sk, iph,0 ,0 ,0 ,0 ,0 ); - rt = (struct rtable *)odst; + rt =dst_rtable (odst);if (odst->obsolete && !odst->ops->check (odst,0 )) { rt =ip_route_output_flow (sock_net (sk), &fl4, sk);if (IS_ERR (rt))
@@ -1136,7 +1136,7 @@ void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) new = true; } -__ip_rt_update_pmtu ((struct rtable *)xfrm_dst_path (&rt->dst), &fl4, mtu); +__ip_rt_update_pmtu (dst_rtable (xfrm_dst_path (&rt->dst)), &fl4, mtu);if (!dst_check (&rt->dst,0 )) {if (new)
@@ -1193,7 +1193,7 @@ EXPORT_SYMBOL_GPL(ipv4_sk_redirect); INDIRECT_CALLABLE_SCOPE struct dst_entry *ipv4_dst_check(struct dst_entry *dst,u32 cookie) { -struct rtable *rt = (struct rtable *) dst; +struct rtable *rt =dst_rtable (dst);/* All IPV4 dsts are created with ->obsolete set to the value * DST_OBSOLETE_FORCE_CHK which forces validation calls down
@@ -1528,10 +1528,8 @@ void rt_del_uncached_list(struct rtable *rt)static void ipv4_dst_destroy (struct dst_entry *dst) { -struct rtable *rt = (struct rtable *)dst; -ip_dst_metrics_put (dst); -rt_del_uncached_list (rt); +rt_del_uncached_list (dst_rtable (dst)); }void rt_flush_dev (struct net_device *dev)
@@ -2832,7 +2830,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {struct dst_entry *ipv4_blackhole_route (struct net *net,struct dst_entry *dst_orig) { -struct rtable *ort = (struct rtable *) dst_orig; +struct rtable *ort =dst_rtable (dst_orig);struct rtable *rt; rt =dst_alloc (&ipv4_dst_blackhole_ops,NULL ,DST_OBSOLETE_DEAD ,0 );
@@ -2877,9 +2875,9 @@ struct rtable *ip_route_output_flow(struct net *net, struct flowi4 *flp4,if (flp4->flowi4_proto) { flp4->flowi4_oif = rt->dst.dev->ifindex; - rt = (struct rtable *)xfrm_lookup_route (net, &rt->dst, -flowi4_to_flowi (flp4), - sk,0 ); + rt =dst_rtable (xfrm_lookup_route (net, &rt->dst, +flowi4_to_flowi (flp4), + sk,0 )); }return rt;
net/ipv4/udp.c +1 -1
@@ -1218,7 +1218,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) }if (connected) - rt = (struct rtable *)sk_dst_check (sk,0 ); + rt =dst_rtable (sk_dst_check (sk,0 ));if (!rt) {struct net *net =sock_net (sk);
net/ipv4/xfrm4_policy.c +1 -1
@@ -69,7 +69,7 @@ static int xfrm4_get_saddr(struct net *net, int oif,static int xfrm4_fill_dst (struct xfrm_dst *xdst,struct net_device *dev,const struct flowi *fl) { -struct rtable *rt = (struct rtable *)xdst->route; +struct rtable *rt =dst_rtable (xdst->route);const struct flowi4 *fl4 = &fl->u.ip4; xdst->u.rt.rt_iif = fl4->flowi4_iif;
net/l2tp/l2tp_ip.c +1 -1
@@ -459,7 +459,7 @@ static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) fl4 = &inet->cork.fl.u.ip4;if (connected) - rt = (struct rtable *)__sk_dst_check (sk,0 ); + rt =dst_rtable (__sk_dst_check (sk,0 ));rcu_read_lock ();if (!rt) {
net/mpls/mpls_iptunnel.c +1 -1
@@ -81,7 +81,7 @@ static int mpls_xmit(struct sk_buff *skb) ttl = net->mpls.default_ttl; else ttl =ip_hdr (skb)->ttl; - rt = (struct rtable *)dst; + rt =dst_rtable (dst); }else if (dst->ops->family ==AF_INET6 ) {if (tun_encap_info->ttl_propagate ==MPLS_TTL_PROP_DISABLED ) ttl = tun_encap_info->default_ttl;
net/netfilter/ipvs/ip_vs_xmit.c +1 -1
@@ -318,7 +318,7 @@ __ip_vs_get_out_rt(struct netns_ipvs *ipvs, int skb_af, struct sk_buff *skb,if (dest) { dest_dst =__ip_vs_dst_check (dest);if (likely (dest_dst)) - rt = (struct rtable *) dest_dst->dst_cache; + rt =dst_rtable (dest_dst->dst_cache);else { dest_dst =ip_vs_dest_dst_alloc ();spin_lock_bh (&dest->dst_lock);
net/netfilter/nf_flow_table_ip.c +2 -2
@@ -434,7 +434,7 @@ nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb,return NF_ACCEPT ;if (unlikely (tuplehash->tuple.xmit_type ==FLOW_OFFLOAD_XMIT_XFRM )) { - rt = (struct rtable *)tuplehash->tuple.dst_cache; + rt =dst_rtable (tuplehash->tuple.dst_cache);memset (skb->cb,0 ,sizeof (struct inet_skb_parm ));IPCB (skb)->iif = skb->dev->ifindex;IPCB (skb)->flags =IPSKB_FORWARDED ;
@@ -446,7 +446,7 @@ nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb,switch (tuplehash->tuple.xmit_type) {case FLOW_OFFLOAD_XMIT_NEIGH : - rt = (struct rtable *)tuplehash->tuple.dst_cache; + rt =dst_rtable (tuplehash->tuple.dst_cache); outdev = rt->dst.dev; skb->dev = outdev; nexthop =rt_nexthop (rt, flow->tuplehash[!dir].tuple.src_v4.s_addr);
net/netfilter/nft_rt.c +1 -1
@@ -73,7 +73,7 @@ void nft_rt_get_eval(const struct nft_expr *expr,if (nft_pf (pkt) !=NFPROTO_IPV4 ) goto err; - *dest = (__force u32 )rt_nexthop ((const struct rtable *)dst, + *dest = (__force u32 )rt_nexthop (dst_rtable (dst),ip_hdr (skb)->daddr);break ;case NFT_RT_NEXTHOP6 :
net/sctp/protocol.c +2 -2
@@ -552,7 +552,7 @@ static void sctp_v4_get_saddr(struct sctp_sock *sk, struct flowi *fl) {union sctp_addr *saddr = &t->saddr; -struct rtable *rt = (struct rtable *)t->dst; +struct rtable *rt =dst_rtable (t->dst);if (rt) { saddr->v4.sin_family =AF_INET ;
@@ -1085,7 +1085,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb, struct sctp_transport *t)skb_reset_inner_mac_header (skb);skb_reset_inner_transport_header (skb);skb_set_inner_ipproto (skb,IPPROTO_SCTP ); -udp_tunnel_xmit_skb ((struct rtable *)dst, sk, skb, fl4->saddr, +udp_tunnel_xmit_skb (dst_rtable (dst), sk, skb, fl4->saddr, fl4->daddr, dscp,ip4_dst_hoplimit (dst), df,sctp_sk (sk)->udp_port, t->encap_port, false, false);return 0 ;
net/tipc/udp_media.c +1 -1
@@ -174,7 +174,7 @@ static int tipc_udp_xmit(struct net *net, struct sk_buff *skb,local_bh_disable (); ndst =dst_cache_get (cache);if (dst->proto ==htons (ETH_P_IP )) { -struct rtable *rt = (struct rtable *)ndst; +struct rtable *rt =dst_rtable (ndst);if (!rt) { struct flowi4 fl = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 348/374 net: fix __dst_negative_advice() race
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 92f1655aa2b2294d0b49925f3b875a634bd3b59e ]
__dst_negative_advice() does not enforce proper RCU rules when sk->dst_cache must be cleared, leading to possible UAF.
RCU rules are that we must first clear sk->sk_dst_cache, then call dst_release(old_dst).
Note that sk_dst_reset(sk) is implementing this protocol correctly, while __dst_negative_advice() uses the wrong order.
Given that ip6_negative_advice() has special logic against RTF_CACHE, this means each of the three ->negative_advice() existing methods must perform the sk_dst_reset() themselves.
Note the check against NULL dst is centralized in __dst_negative_advice(), there is no need to duplicate it in various callbacks.
Many thanks to Clement Lecigne for tracking this issue.
This old bug became visible after the blamed commit, using UDP sockets.
--- include/net/dst_ops.h | 2 +- include/net/sock.h | 13 +++---------- net/ipv4/route.c | 22 ++++++++-------------- net/ipv6/route.c | 29 +++++++++++++++-------------- net/xfrm/xfrm_policy.c | 11 +++-------- 5 files changed, 30 insertions(+), 47 deletions(-)
include/net/dst_ops.h +1 -1
@@ -24,7 +24,7 @@ struct dst_ops {void (*destroy)(struct dst_entry *);void (*ifdown)(struct dst_entry *,struct net_device *dev); -struct dst_entry * (*negative_advice)(struct dst_entry *); +void (*negative_advice)(struct sock *sk,struct dst_entry *);void (*link_failure)(struct sk_buff *); void (*update_pmtu)(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb, u32 mtu,
include/net/sock.h +3 -10
@@ -2134,17 +2134,10 @@ sk_dst_get(const struct sock *sk)static inline void __dst_negative_advice (struct sock *sk) { -struct dst_entry *ndst, *dst =__sk_dst_get (sk); +struct dst_entry *dst =__sk_dst_get (sk); -if (dst && dst->ops->negative_advice) { - ndst = dst->ops->negative_advice (dst); - -if (ndst != dst) { -rcu_assign_pointer (sk->sk_dst_cache, ndst); -sk_tx_queue_clear (sk); -WRITE_ONCE (sk->sk_dst_pending_confirm,0 ); - } - } +if (dst && dst->ops->negative_advice) + dst->ops->negative_advice (sk, dst); }static inline void dst_negative_advice (struct sock *sk)
net/ipv4/route.c +8 -14
@@ -132,7 +132,8 @@ struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie);static unsigned int ipv4_default_advmss (const struct dst_entry *dst);INDIRECT_CALLABLE_SCOPE unsigned int ipv4_mtu(const struct dst_entry *dst); -static struct dst_entry *ipv4_negative_advice (struct dst_entry *dst); +static void ipv4_negative_advice (struct sock *sk, +struct dst_entry *dst);static void ipv4_link_failure (struct sk_buff *skb); static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb, u32 mtu,
@@ -837,22 +838,15 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buf__ip_do_redirect (rt, skb, &fl4, true); } -static struct dst_entry *ipv4_negative_advice (struct dst_entry *dst) +static void ipv4_negative_advice (struct sock *sk, +struct dst_entry *dst) {struct rtable *rt =dst_rtable (dst); -struct dst_entry *ret = dst; -if (rt) { -if (dst->obsolete >0 ) { -ip_rt_put (rt); - ret =NULL ; - }else if ((rt->rt_flags &RTCF_REDIRECTED ) || - rt->dst.expires) { -ip_rt_put (rt); - ret =NULL ; - } - } -return ret; +if ((dst->obsolete >0 ) || + (rt->rt_flags &RTCF_REDIRECTED ) || + rt->dst.expires) +sk_dst_reset (sk); }/*
net/ipv6/route.c +15 -14
@@ -87,7 +87,8 @@ struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie);static unsigned int ip6_default_advmss (const struct dst_entry *dst);INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst); -static struct dst_entry *ip6_negative_advice (struct dst_entry *); +static void ip6_negative_advice (struct sock *sk, +struct dst_entry *dst);static void ip6_dst_destroy (struct dst_entry *);static void ip6_dst_ifdown (struct dst_entry *,struct net_device *dev);
@@ -2770,24 +2771,24 @@ INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst, }EXPORT_INDIRECT_CALLABLE (ip6_dst_check); -static struct dst_entry *ip6_negative_advice (struct dst_entry *dst) +static void ip6_negative_advice (struct sock *sk, +struct dst_entry *dst) {struct rt6_info *rt =dst_rt6_info (dst); -if (rt) { -if (rt->rt6i_flags &RTF_CACHE ) { -rcu_read_lock (); -if (rt6_check_expired (rt)) { -rt6_remove_exception_rt (rt); - dst =NULL ; - } -rcu_read_unlock (); - }else { -dst_release (dst); - dst =NULL ; +if (rt->rt6i_flags &RTF_CACHE ) { +rcu_read_lock (); +if (rt6_check_expired (rt)) { +/* counteract the dst_release() in sk_dst_reset() */ +dst_hold (dst); +sk_dst_reset (sk); + +rt6_remove_exception_rt (rt); } +rcu_read_unlock (); +return ; } -return dst; +sk_dst_reset (sk); }static void ip6_link_failure (struct sk_buff *skb)
net/xfrm/xfrm_policy.c +3 -8
@@ -3904,15 +3904,10 @@ static void xfrm_link_failure(struct sk_buff *skb)/* Impossible. Such dst must be popped before reaches point of failure. */ } -static struct dst_entry *xfrm_negative_advice (struct dst_entry *dst) +static void xfrm_negative_advice (struct sock *sk,struct dst_entry *dst) { -if (dst) { -if (dst->obsolete) { -dst_release (dst); - dst =NULL ; - } - } -return dst; +if (dst->obsolete) +sk_dst_reset (sk); }static void xfrm_init_pmtu (struct xfrm_dst **bundle,int nr)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 349/374 ipv4: correctly iterate over the target netns in inet_dump_ifaddr()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Mikhalitsyn <[email protected]>
[ Upstream commit b8c8abefc07b47f0dc9342530b7618237df96724 ]
A recent change to inet_dump_ifaddr had the function incorrectly iterate over net rather than tgt_net, resulting in the data coming for the incorrect network namespace.
--- net/ipv4/devinet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/devinet.c +1 -1
@@ -1898,7 +1898,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb) cb->seq =inet_base_seq (tgt_net); -for_each_netdev_dump (net, dev, ctx->ifindex) { +for_each_netdev_dump (tgt_net, dev, ctx->ifindex) { in_dev =__in_dev_get_rcu (dev);if (!in_dev)continue ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 350/374 net: dsa: microchip: fix RGMII error in KSZ DSA driver
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tristram Ha <[email protected]>
[ Upstream commit 278d65ccdadb5f0fa0ceaf7b9cc97b305cd72822 ]
The driver should return RMII interface when XMII is running in RMII mode.
--- drivers/net/dsa/microchip/ksz_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/microchip/ksz_common.c +1 -1
@@ -3050,7 +3050,7 @@ phy_interface_t ksz_get_xmii(struct ksz_device *dev, int port, bool gbit)else interface =PHY_INTERFACE_MODE_MII ; }else if (val == bitval[P_RMII_SEL ]) { - interface =PHY_INTERFACE_MODE_RGMII ; + interface =PHY_INTERFACE_MODE_RMII ; }else { interface =PHY_INTERFACE_MODE_RGMII ;if (data8 &P_RGMII_ID_EG_ENABLE )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 351/374 e1000e: move force SMBUS near the end of enable_ulp function
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
[ Upstream commit bfd546a552e140b0a4c8a21527c39d6d21addb28 ]
The commit 861e8086029e ("e1000e: move force SMBUS from enable ulp function to avoid PHY loss issue") introduces a regression on PCH_MTP_I219_LM18 (PCIID: 0x8086550A). Without the referred commit, the ethernet works well after suspend and resume, but after applying the commit, the ethernet couldn't work anymore after the resume and the dmesg shows that the NIC link changes to 10Mbps (1000Mbps originally):
[ 43.305084] e1000e 0000:00:1f.6 enp0s31f6: NIC Link is Up 10 Mbps Full Duplex, Flow Control: Rx/Tx
Without the commit, the force SMBUS code will not be executed if "return 0" or "goto out" is executed in the enable_ulp(), and in my case, the "goto out" is executed since FWSM_FW_VALID is set. But after applying the commit, the force SMBUS code will be ran unconditionally.
Here move the force SMBUS code back to enable_ulp() and put it immediately ahead of hw->phy.ops.release(hw), this could allow the longest settling time as possible for interface in this function and doesn't change the original code logic.
The issue was found on a Lenovo laptop with the ethernet hw as below:
00:1f.6 Ethernet controller [0200]: Intel Corporation Device [8086:550a] (rev 20).
And this patch is verified (cable plug and unplug, system suspend and resume) on Lenovo laptops with ethernet hw: [8086:550a], [8086:550b], [8086:15bb], [8086:15be], [8086:1a1f], [8086:1a1c] and [8086:0dc7].
--- drivers/net/ethernet/intel/e1000e/ich8lan.c | 22 +++++++++++++++++++++ drivers/net/ethernet/intel/e1000e/netdev.c | 18 ----------------- 2 files changed, 22 insertions(+), 18 deletions(-)
drivers/net/ethernet/intel/e1000e/ich8lan.c +22 -0
@@ -1225,6 +1225,28 @@ s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx) } release: +/* Switching PHY interface always returns MDI error +* so disable retry mechanism to avoid wasting time +*/ +e1000e_disable_phy_retry (hw); + +/* Force SMBus mode in PHY */ + ret_val =e1000_read_phy_reg_hv_locked (hw,CV_SMB_CTRL , &phy_reg); +if (ret_val) { +e1000e_enable_phy_retry (hw); + hw->phy.ops.release (hw); + goto out; + } + phy_reg |=CV_SMB_CTRL_FORCE_SMBUS ; +e1000_write_phy_reg_hv_locked (hw,CV_SMB_CTRL , phy_reg); + +e1000e_enable_phy_retry (hw); + +/* Force SMBus mode in MAC */ + mac_reg =er32 (CTRL_EXT ); + mac_reg |=E1000_CTRL_EXT_FORCE_SMBUS ; +ew32 (CTRL_EXT , mac_reg); + hw->phy.ops.release (hw); out:if (ret_val)
drivers/net/ethernet/intel/e1000e/netdev.c +0 -18
@@ -6623,7 +6623,6 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)struct e1000_hw *hw = &adapter->hw;u32 ctrl, ctrl_ext, rctl, status, wufc;int retval =0 ; -u16 smb_ctrl;/* Runtime suspend should only enable wakeup for link changes */ if (runtime)
@@ -6697,23 +6696,6 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)if (retval)return retval; } - -/* Force SMBUS to allow WOL */ -/* Switching PHY interface always returns MDI error -* so disable retry mechanism to avoid wasting time -*/ -e1000e_disable_phy_retry (hw); - -e1e_rphy (hw,CV_SMB_CTRL , &smb_ctrl); - smb_ctrl |=CV_SMB_CTRL_FORCE_SMBUS ; -e1e_wphy (hw,CV_SMB_CTRL , smb_ctrl); - -e1000e_enable_phy_retry (hw); - -/* Force SMBus mode in MAC */ - ctrl_ext =er32 (CTRL_EXT ); - ctrl_ext |=E1000_CTRL_EXT_FORCE_SMBUS ; -ew32 (CTRL_EXT , ctrl_ext); }/* Ensure that the appropriate bits are set in LPI_CTRL
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 352/374 ice: fix 200G PHY types to link speed mapping
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Greenwalt <[email protected]>
[ Upstream commit 2a6d8f2de2224ac46df94dc40f43f8b9701f6703 ]
Commit 24407a01e57c ("ice: Add 200G speed/phy type use") added support for 200G PHY speeds, but did not include the mapping of 200G PHY types to link speed. As a result the driver is returning UNKNOWN link speed when setting 200G ethtool advertised link modes.
To fix this add 200G PHY types to link speed mapping to ice_get_link_speed_based_on_phy_type().
--- drivers/net/ethernet/intel/ice/ice_common.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/intel/ice/ice_common.c +10 -0
@@ -3135,6 +3135,16 @@ ice_get_link_speed_based_on_phy_type(u64 phy_type_low, u64 phy_type_high)case ICE_PHY_TYPE_HIGH_100G_AUI2 : speed_phy_type_high =ICE_AQ_LINK_SPEED_100GB ;break ; +case ICE_PHY_TYPE_HIGH_200G_CR4_PAM4 : +case ICE_PHY_TYPE_HIGH_200G_SR4 : +case ICE_PHY_TYPE_HIGH_200G_FR4 : +case ICE_PHY_TYPE_HIGH_200G_LR4 : +case ICE_PHY_TYPE_HIGH_200G_DR4 : +case ICE_PHY_TYPE_HIGH_200G_KR4_PAM4 : +case ICE_PHY_TYPE_HIGH_200G_AUI4_AOC_ACC : +case ICE_PHY_TYPE_HIGH_200G_AUI4 : + speed_phy_type_high =ICE_AQ_LINK_SPEED_200GB ; +break ;default : speed_phy_type_high =ICE_AQ_LINK_SPEED_UNKNOWN ;break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 353/374 net: ena: Fix redundant device NUMA node override
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shay Agroskin <[email protected]>
[ Upstream commit 2dc8b1e7177d4f49f492ce648440caf2de0c3616 ]
The driver overrides the NUMA node id of the device regardless of whether it knows its correct value (often setting it to -1 even though the node id is advertised in 'struct device'). This can lead to suboptimal configurations.
This patch fixes this behavior and makes the shared memory allocation functions use the NUMA node id advertised by the underlying device.
--- drivers/net/ethernet/amazon/ena/ena_com.c | 11 ----------- 1 file changed, 11 deletions(-)
drivers/net/ethernet/amazon/ena/ena_com.c +0 -11
@@ -312,7 +312,6 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev, struct ena_com_io_sq *io_sq) {size_t size; -int dev_node =0 ;memset (&io_sq->desc_addr,0x0 ,sizeof (io_sq->desc_addr));
@@ -325,12 +324,9 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev, size = io_sq->desc_entry_size * io_sq->q_depth;if (io_sq->mem_queue_type ==ENA_ADMIN_PLACEMENT_POLICY_HOST ) { - dev_node =dev_to_node (ena_dev->dmadev); -set_dev_node (ena_dev->dmadev, ctx->numa_node); io_sq->desc_addr.virt_addr =dma_alloc_coherent (ena_dev->dmadev, size, &io_sq->desc_addr.phys_addr,GFP_KERNEL ); -set_dev_node (ena_dev->dmadev, dev_node);if (!io_sq->desc_addr.virt_addr) { io_sq->desc_addr.virt_addr = dma_alloc_coherent(ena_dev->dmadev, size,
@@ -354,10 +350,7 @@ static int ena_com_init_io_sq(struct ena_com_dev *ena_dev, size = (size_t )io_sq->bounce_buf_ctrl.buffer_size * io_sq->bounce_buf_ctrl.buffers_num; - dev_node =dev_to_node (ena_dev->dmadev); -set_dev_node (ena_dev->dmadev, ctx->numa_node); io_sq->bounce_buf_ctrl.base_buffer =devm_kzalloc (ena_dev->dmadev, size,GFP_KERNEL ); -set_dev_node (ena_dev->dmadev, dev_node);if (!io_sq->bounce_buf_ctrl.base_buffer) io_sq->bounce_buf_ctrl.base_buffer =devm_kzalloc (ena_dev->dmadev, size,GFP_KERNEL );
@@ -397,7 +390,6 @@ static int ena_com_init_io_cq(struct ena_com_dev *ena_dev, struct ena_com_io_cq *io_cq) {size_t size; -int prev_node =0 ;memset (&io_cq->cdesc_addr,0x0 ,sizeof (io_cq->cdesc_addr));
@@ -409,11 +401,8 @@ static int ena_com_init_io_cq(struct ena_com_dev *ena_dev, size = io_cq->cdesc_entry_size_in_bytes * io_cq->q_depth; - prev_node =dev_to_node (ena_dev->dmadev); -set_dev_node (ena_dev->dmadev, ctx->numa_node); io_cq->cdesc_addr.virt_addr =dma_alloc_coherent (ena_dev->dmadev, size, &io_cq->cdesc_addr.phys_addr,GFP_KERNEL ); -set_dev_node (ena_dev->dmadev, prev_node);if (!io_cq->cdesc_addr.virt_addr) { io_cq->cdesc_addr.virt_addr = dma_alloc_coherent(ena_dev->dmadev, size, &io_cq->cdesc_addr.phys_addr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 354/374 ipvlan: Dont Use skb->sk in ipvlan_process_v{4,6}_outbound
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yue Haibing <[email protected]>
[ Upstream commit b3dc6e8003b500861fa307e9a3400c52e78e4d3a ]
Raw packet from PF_PACKET socket ontop of an IPv6-backed ipvlan device will hit WARN_ON_ONCE() in sk_mc_loop() through sch_direct_xmit() path.
WARNING: CPU: 2 PID: 0 at net/core/sock.c:775 sk_mc_loop+0x2d/0x70 Modules linked in: sch_netem ipvlan rfkill cirrus drm_shmem_helper sg drm_kms_helper CPU: 2 PID: 0 Comm: swapper/2 Kdump: loaded Not tainted 6.9.0+ #279 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 RIP: 0010:sk_mc_loop+0x2d/0x70 Code: fa 0f 1f 44 00 00 65 0f b7 15 f7 96 a3 4f 31 c0 66 85 d2 75 26 48 85 ff 74 1c RSP: 0018:ffffa9584015cd78 EFLAGS: 00010212 RAX: 0000000000000011 RBX: ffff91e585793e00 RCX: 0000000002c6a001 RDX: 0000000000000000 RSI: 0000000000000040 RDI: ffff91e589c0f000 RBP: ffff91e5855bd100 R08: 0000000000000000 R09: 3d00545216f43d00 R10: ffff91e584fdcc50 R11: 00000060dd8616f4 R12: ffff91e58132d000 R13: ffff91e584fdcc68 R14: ffff91e5869ce800 R15: ffff91e589c0f000 FS: 0000000000000000(0000) GS:ffff91e898100000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f788f7c44c0 CR3: 0000000008e1a000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <IRQ> ? __warn (kernel/panic.c:693) ? sk_mc_loop (net/core/sock.c:760) ? report_bug (lib/bug.c:201 lib/bug.c:219) ? handle_bug (arch/x86/kernel/traps.c:239) ? exc_invalid_op (arch/x86/kernel/traps.c:260 (discriminator 1)) ? asm_exc_invalid_op (./arch/x86/include/asm/idtentry.h:621) ? sk_mc_loop (net/core/sock.c:760) ip6_finish_output2 (net/ipv6/ip6_output.c:83 (discriminator 1)) ? nf_hook_slow (net/netfilter/core.c:626) ip6_finish_output (net/ipv6/ip6_output.c:222) ? __pfx_ip6_finish_output (net/ipv6/ip6_output.c:215) ipvlan_xmit_mode_l3 (drivers/net/ipvlan/ipvlan_core.c:602) ipvlan ipvlan_start_xmit (drivers/net/ipvlan/ipvlan_main.c:226) ipvlan dev_hard_start_xmit (net/core/dev.c:3594) sch_direct_xmit (net/sched/sch_generic.c:343) __qdisc_run (net/sched/sch_generic.c:416) net_tx_action (net/core/dev.c:5286) handle_softirqs (kernel/softirq.c:555) __irq_exit_rcu (kernel/softirq.c:589) sysvec_apic_timer_interrupt (arch/x86/kernel/apic/apic.c:1043)
The warning triggers as this:packet_sendmsg
packet_snd //skb->sk is packet sk
__dev_queue_xmit
__dev_xmit_skb //q->enqueue is not NULL
__qdisc_run
sch_direct_xmit
dev_hard_start_xmit
ipvlan_start_xmit
ipvlan_xmit_mode_l3 //l3 mode
ipvlan_process_outbound //vepa flag
ipvlan_process_v6_outbound
ip6_local_out
__ip6_finish_output
ip6_finish_output2 //multicast packet
sk_mc_loop //sk->sk_family is AF_PACKETCall ip{6}_local_out() with NULL sk in ipvlan as other tunnels to fix this.
--- drivers/net/ipvlan/ipvlan_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ipvlan/ipvlan_core.c +2 -2
@@ -439,7 +439,7 @@ static noinline_for_stack int ipvlan_process_v4_outbound(struct sk_buff *skb)memset (IPCB (skb),0 ,sizeof (*IPCB (skb))); - err =ip_local_out (net, skb->sk, skb); + err =ip_local_out (net,NULL , skb);if (unlikely (net_xmit_eval (err)))DEV_STATS_INC (dev, tx_errors);else
@@ -494,7 +494,7 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)memset (IP6CB (skb),0 ,sizeof (*IP6CB (skb))); - err =ip6_local_out (dev_net (dev), skb->sk, skb); + err =ip6_local_out (dev_net (dev),NULL , skb);if (unlikely (net_xmit_eval (err)))DEV_STATS_INC (dev, tx_errors);else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 355/374 ALSA: seq: Fix yet another spot for system message conversion
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 700fe6fd093d08c6da2bda8efe00479b0e617327 ]
We fixed the incorrect UMP type for system messages in the recent commit, but it missed one place in system_ev_to_ump_midi1(). Fix it now.
--- sound/core/seq/seq_ump_convert.c | 1 + 1 file changed, 1 insertion(+)
sound/core/seq/seq_ump_convert.c +1 -0
@@ -729,6 +729,7 @@ static int system_ev_to_ump_midi1(const struct snd_seq_event *event, union snd_ump_midi1_msg *data, unsigned char status) { + data->system.type =UMP_MSG_TYPE_SYSTEM ;// override data->system.status = status;return 1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 356/374 powerpc/pseries/lparcfg: drop error message from guest name lookup
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Lynch <[email protected]>
[ Upstream commit 12870ae3818e39ea65bf710f645972277b634f72 ]
It's not an error or exceptional situation when the hosting environment does not expose a name for the LP/guest via RTAS or the device tree. This happens with qemu when run without the '-name' option. The message also lacks a newline. Remove it.
--- arch/powerpc/platforms/pseries/lparcfg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/platforms/pseries/lparcfg.c +2 -2
@@ -361,8 +361,8 @@ static int read_dt_lpar_name(struct seq_file *m)static void read_lpar_name (struct seq_file *m) { -if (read_rtas_lpar_name (m) &&read_dt_lpar_name (m)) -pr_err_once ("Error can't get the LPAR name" ); +if (read_rtas_lpar_name (m)) +read_dt_lpar_name (m); }#define SPLPAR_MAXLENGTH 1026*(sizeof(char))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 357/374 powerpc/uaccess: Use YZ asm constraint for ld
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit 50934945d54238d2d6d8db4b7c1d4c90d2696c57 ]
The 'ld' instruction requires a 4-byte aligned displacement because it is a DS-form instruction. But the "m" asm constraint doesn't enforce that.
Add a special case of __get_user_asm2_goto() so that the "YZ" constraint can be used for "ld".
The "Z" constraint is documented in the GCC manual PowerPC machine constraints, and specifies a "memory operand accessed with indexed or indirect addressing". "Y" is not documented in the manual but specifies a "memory operand for a DS-form instruction". Using both allows the compiler to generate a DS-form "ld" or X-form "ldx" as appropriate.
The change has to be conditional on CONFIG_PPC_KERNEL_PREFIXED because the "Y" constraint does not guarantee 4-byte alignment when prefixed instructions are enabled.
No build errors have been reported due to this, but the possibility is there depending on compiler code generation decisions.
--- arch/powerpc/include/asm/uaccess.h | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/powerpc/include/asm/uaccess.h +11 -0
@@ -165,8 +165,19 @@ do { \#endif #ifdef __powerpc64__ +#ifdef CONFIG_PPC_KERNEL_PREFIXED #define __get_user_asm2_goto (x, addr, label) \ __get_user_asm_goto(x, addr, label, "ld") +#else +#define __get_user_asm2_goto (x, addr, label) \ + asm_goto_output( \ + "1: ld%U1%X1 %0, %1 # get_user\n" \ + EX_TABLE(1b, %l2) \ + : "=r" (x) \ + : DS_FORM_CONSTRAINT (*addr) \ + : \ + : label) +#endif // CONFIG_PPC_KERNEL_PREFIXED #else /* __powerpc64__ */ #define __get_user_asm2_goto (x, addr, label) \ asm_goto_output( \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 358/374 drm/panel: sitronix-st7789v: fix timing for jt240mhqs_hwt_ek_e3 panel
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Loacker <[email protected]>
[ Upstream commit 0e5895ff7fab0fc05ec17daf9a568368828fa6ea ]
Flickering was observed when using partial mode. Moving the vsync to the same position as used by the default sitronix-st7789v timing resolves this issue.
--- drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/panel/panel-sitronix-st7789v.c +3 -3
@@ -286,9 +286,9 @@ static const struct drm_display_mode jt240mhqs_hwt_ek_e3_mode = { .hsync_end = 240 + 28 + 10, .htotal = 240 + 28 + 10 + 10, .vdisplay = 280, - .vsync_start = 280 + 8, - .vsync_end = 280 + 8 + 4, - .vtotal = 280 + 8 + 4 + 4, + .vsync_start = 280 + 48, + .vsync_end = 280 + 48 + 4, + .vtotal = 280 + 48 + 4 + 4, .width_mm = 43, .height_mm = 37, .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 359/374 drm/panel: sitronix-st7789v: tweak timing for jt240mhqs_hwt_ek_e3 panel
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Loacker <[email protected]>
[ Upstream commit 2ba50582634d0bfe3a333ab7575a7f0122a7cde8 ]
Use the default timing parameters to get a refresh rate of about 60 Hz for a clock of 6 MHz.
--- drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/panel/panel-sitronix-st7789v.c +3 -3
@@ -282,9 +282,9 @@ static const struct drm_display_mode et028013dma_mode = {static const struct drm_display_mode jt240mhqs_hwt_ek_e3_mode = { .clock =6000 , .hdisplay =240 , - .hsync_start =240 +28 , - .hsync_end =240 +28 +10 , - .htotal =240 +28 +10 +10 , + .hsync_start =240 +38 , + .hsync_end =240 +38 +10 , + .htotal =240 +38 +10 +10 , .vdisplay =280 , .vsync_start =280 +48 , .vsync_end =280 +48 +4 ,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 360/374 drm/panel: sitronix-st7789v: fix display size for jt240mhqs_hwt_ek_e3 panel
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Loacker <[email protected]>
[ Upstream commit b62c150c3bae72ac1910dcc588f360159eb0744a ]
This is a portrait mode display. Change the dimensions accordingly.
--- drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/panel/panel-sitronix-st7789v.c +2 -2
@@ -289,8 +289,8 @@ static const struct drm_display_mode jt240mhqs_hwt_ek_e3_mode = { .vsync_start = 280 + 48, .vsync_end = 280 + 48 + 4, .vtotal = 280 + 48 + 4 + 4, - .width_mm = 43, - .height_mm = 37, + .width_mm = 37, + .height_mm = 43, .flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 361/374 hwmon: (intel-m10-bmc-hwmon) Fix multiplier for N6000 board power sensor
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Colberg <[email protected]>
[ Upstream commit 027a44fedd55fbdf1d45603894634acd960ad04b ]
The Intel N6000 BMC outputs the board power value in milliwatt, whereas the hwmon sysfs interface must provide power values in microwatt.
--- drivers/hwmon/intel-m10-bmc-hwmon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/intel-m10-bmc-hwmon.c +1 -1
@@ -429,7 +429,7 @@ static const struct m10bmc_sdata n6000bmc_curr_tbl[] = { };static const struct m10bmc_sdata n6000bmc_power_tbl[] = { - {0x724 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,"Board Power" }, + {0x724 ,0x0 ,0x0 ,0x0 ,0x0 ,1000 ,"Board Power" }, };static const struct hwmon_channel_info *const n6000bmc_hinfo[] = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 362/374 hwmon: (shtc1) Fix property misspelling
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
[ Upstream commit 52a2c70c3ec555e670a34dd1ab958986451d2dd2 ]
The property name is "sensirion,low-precision", not "sensicon,low-precision".
--- drivers/hwmon/shtc1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/shtc1.c +1 -1
@@ -238,7 +238,7 @@ static int shtc1_probe(struct i2c_client *client)if (np) { data->setup.blocking_io =of_property_read_bool (np,"sensirion,blocking-io" ); - data->setup.high_precision = !of_property_read_bool (np,"sensicon,low-precision" ); + data->setup.high_precision = !of_property_read_bool (np,"sensirion,low-precision" ); }else {if (client->dev.platform_data) data->setup = *(struct shtc1_platform_data *)dev->platform_data;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 363/374 riscv: prevent pt_regs corruption for secondary idle threads
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Matyukevich <[email protected]>
[ Upstream commit a638b0461b58aa3205cd9d5f14d6f703d795b4af ]
Top of the kernel thread stack should be reserved for pt_regs. However this is not the case for the idle threads of the secondary boot harts. Their stacks overlap with their pt_regs, so both may get corrupted.
Similar issue has been fixed for the primary hart, see c7cdd96eca28 ("riscv: prevent stack corruption by reserving task_pt_regs(p) early"). However that fix was not propagated to the secondary harts. The problem has been noticed in some CPU hotplug tests with V enabled. The function smp_callin stored several registers on stack, corrupting top of pt_regs structure including status field. As a result, kernel attempted to save or restore inexistent V context.
--- arch/riscv/kernel/cpu_ops_sbi.c | 2 +- arch/riscv/kernel/cpu_ops_spinwait.c | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-)
arch/riscv/kernel/cpu_ops_sbi.c +1 -1
@@ -72,7 +72,7 @@ static int sbi_cpu_start(unsigned int cpuid, struct task_struct *tidle)/* Make sure tidle is updated */ smp_mb (); bdata->task_ptr = tidle; - bdata->stack_ptr =task_stack_page (tidle) +THREAD_SIZE ; + bdata->stack_ptr =task_pt_regs (tidle);/* Make sure boot data is updated */ smp_mb (); hsm_data =__pa (bdata);
arch/riscv/kernel/cpu_ops_spinwait.c +1 -2
@@ -34,8 +34,7 @@ static void cpu_update_secondary_bootdata(unsigned int cpuid,/* Make sure tidle is updated */ smp_mb (); -WRITE_ONCE (__cpu_spinwait_stack_pointer[hartid], -task_stack_page (tidle) +THREAD_SIZE ); +WRITE_ONCE (__cpu_spinwait_stack_pointer[hartid],task_pt_regs (tidle));WRITE_ONCE (__cpu_spinwait_task_pointer[hartid], tidle); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 364/374 ALSA: seq: ump: Fix swapped song position pointer data
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 310fa3ec2859f1c094e6e9b5d2e1ca51738c409a ]
At converting between the legacy event and UMP, the parameters for MIDI Song Position Pointer are incorrectly stored. It should have been LSB -> MSB order while it stored in MSB -> LSB order. This patch corrects the ordering.
--- sound/core/seq/seq_ump_convert.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/core/seq/seq_ump_convert.c +3 -3
@@ -157,7 +157,7 @@ static void ump_system_to_one_param_ev(const union snd_ump_midi1_msg *val,static void ump_system_to_songpos_ev (const union snd_ump_midi1_msg *val,struct snd_seq_event *ev) { - ev->data.control.value = (val->system.parm1 <<7 ) | val->system.parm2; + ev->data.control.value = (val->system.parm2 <<7 ) | val->system.parm1; }/* Encoders for 0xf0 - 0xff */
@@ -752,8 +752,8 @@ static int system_2p_ev_to_ump_midi1(const struct snd_seq_event *event, unsigned char status) { data->system.status = status; - data->system.parm1 = (event->data.control.value >>7 ) &0x7f ; - data->system.parm2 = event->data.control.value &0x7f ; + data->system.parm1 = event->data.control.value &0x7f ; + data->system.parm2 = (event->data.control.value >>7 ) &0x7f ;return 1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 365/374 Revert "drm: Make drivers depends on DRM_DW_HDMI"
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 8f7f115596d3dccedc06f5813e0269734f5cc534 upstream.
This reverts commit c0e0f139354c01e0213204e4a96e7076e5a3e396, as helper code should always be selected by the driver that needs it, for the convenience of the final user configuring a kernel.
The user who configures a kernel should not need to know which helpers are needed for the driver he is interested in. Making a driver depend on helper code means that the user needs to know which helpers to enable first, which is very user-unfriendly.
--- drivers/gpu/drm/bridge/imx/Kconfig | 4 ++-- drivers/gpu/drm/imx/ipuv3/Kconfig | 5 ++--- drivers/gpu/drm/ingenic/Kconfig | 2 +- drivers/gpu/drm/meson/Kconfig | 2 +- drivers/gpu/drm/renesas/rcar-du/Kconfig | 2 +- drivers/gpu/drm/rockchip/Kconfig | 2 +- drivers/gpu/drm/sun4i/Kconfig | 2 +- 7 files changed, 9 insertions(+), 10 deletions(-)
drivers/gpu/drm/bridge/imx/Kconfig +2 -2
@@ -5,9 +5,9 @@ config DRM_IMX_LDB_HELPER config DRM_IMX8MP_DW_HDMI_BRIDGE tristate "Freescale i.MX8MP HDMI-TX bridge support" - depends on COMMON_CLK - depends on DRM_DW_HDMI depends on OF + depends on COMMON_CLK + select DRM_DW_HDMI imply DRM_IMX8MP_HDMI_PVI imply PHY_FSL_SAMSUNG_HDMI_PHY help
drivers/gpu/drm/imx/ipuv3/Kconfig +2 -3
@@ -35,8 +35,7 @@ config DRM_IMX_LDB config DRM_IMX_HDMI tristate "Freescale i.MX DRM HDMI" - depends on DRM_DW_HDMI - depends on DRM_IMX - depends on OF + select DRM_DW_HDMI + depends on DRM_IMX && OF help Choose this if you want to use HDMI on i.MX6.
drivers/gpu/drm/ingenic/Kconfig +1 -1
@@ -27,8 +27,8 @@ config DRM_INGENIC_IPU config DRM_INGENIC_DW_HDMI tristate "Ingenic specific support for Synopsys DW HDMI" - depends on DRM_DW_HDMI depends on MACH_JZ4780 + select DRM_DW_HDMI help Choose this option to enable Synopsys DesignWare HDMI based driver. If you want to enable HDMI on Ingenic JZ4780 based SoC, you should
drivers/gpu/drm/meson/Kconfig +1 -1
@@ -13,9 +13,9 @@ config DRM_MESON config DRM_MESON_DW_HDMI tristate "HDMI Synopsys Controller support for Amlogic Meson Display" - depends on DRM_DW_HDMI depends on DRM_MESON default y if DRM_MESON + select DRM_DW_HDMI imply DRM_DW_HDMI_I2S_AUDIO config DRM_MESON_DW_MIPI_DSI
drivers/gpu/drm/renesas/rcar-du/Kconfig +1 -1
@@ -25,8 +25,8 @@ config DRM_RCAR_CMM config DRM_RCAR_DW_HDMI tristate "R-Car Gen3 and RZ/G2 DU HDMI Encoder Support" depends on DRM && OF - depends on DRM_DW_HDMI depends on DRM_RCAR_DU || COMPILE_TEST + select DRM_DW_HDMI help Enable support for R-Car Gen3 or RZ/G2 internal HDMI encoder.
drivers/gpu/drm/rockchip/Kconfig +1 -1
@@ -7,6 +7,7 @@ config DRM_ROCKCHIP select DRM_PANEL select VIDEOMODE_HELPERS select DRM_ANALOGIX_DP if ROCKCHIP_ANALOGIX_DP + select DRM_DW_HDMI if ROCKCHIP_DW_HDMI select DRM_DW_MIPI_DSI if ROCKCHIP_DW_MIPI_DSI select GENERIC_PHY if ROCKCHIP_DW_MIPI_DSI select GENERIC_PHY_MIPI_DPHY if ROCKCHIP_DW_MIPI_DSI
@@ -56,7 +57,6 @@ config ROCKCHIP_CDN_DP config ROCKCHIP_DW_HDMI bool "Rockchip specific extensions for Synopsys DW HDMI" - depends on DRM_DW_HDMI help This selects support for Rockchip SoC specific extensions for the Synopsys DesignWare HDMI driver. If you want to
drivers/gpu/drm/sun4i/Kconfig +1 -1
@@ -57,8 +57,8 @@ config DRM_SUN6I_DSI config DRM_SUN8I_DW_HDMI tristate "Support for Allwinner version of DesignWare HDMI" depends on DRM_SUN4I - depends on DRM_DW_HDMI default DRM_SUN4I + select DRM_DW_HDMI help Choose this option if you have an Allwinner SoC with the DesignWare HDMI controller. SoCs that support HDMI and
Greg Kroah-Hartman
maintainerPATCH 366/374 x86/efistub: Omit physical KASLR when memory reservations exist
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 15aa8fb852f995dd234a57f12dfb989044968bb6 upstream.
The legacy decompressor has elaborate logic to ensure that the randomized physical placement of the decompressed kernel image does not conflict with any memory reservations, including ones specified on the command line using mem=, memmap=, efi_fake_mem= or hugepages=, which are taken into account by the kernel proper at a later stage.
When booting in EFI mode, it is the firmware's job to ensure that the chosen range does not conflict with any memory reservations that it knows about, and this is trivially achieved by using the firmware's memory allocation APIs.
That leaves reservations specified on the command line, though, which the firmware knows nothing about, as these regions have no other special significance to the platform. Since commit
a1b87d54f4e4 ("x86/efistub: Avoid legacy decompressor when doing EFI boot")
these reservations are not taken into account when randomizing the physical placement, which may result in conflicts where the memory cannot be reserved by the kernel proper because its own executable image resides there.
To avoid having to duplicate or reuse the existing complicated logic, disable physical KASLR entirely when such overrides are specified. These are mostly diagnostic tools or niche features, and physical KASLR (as opposed to virtual KASLR, which is much more important as it affects the memory addresses observed by code executing in the kernel) is something we can live without.
--- drivers/firmware/efi/libstub/x86-stub.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
drivers/firmware/efi/libstub/x86-stub.c +26 -2
@@ -776,6 +776,26 @@ static void error(char *str)efi_warn ("Decompression failed: %s\n" , str); } +static const char *cmdline_memmap_override; + +static efi_status_t parse_options (const char *cmdline) +{ +static const char opts[][14 ] = { +"mem=" ,"memmap=" ,"efi_fake_mem=" ,"hugepages=" + }; + +for (int i =0 ; i <ARRAY_SIZE (opts); i++) { +const char *p =strstr (cmdline, opts[i]); + +if (p == cmdline || (p > cmdline &&isspace (p[-1 ]))) { + cmdline_memmap_override = opts[i]; +break ; + } + } + +return efi_parse_options (cmdline); +} +static efi_status_t efi_decompress_kernel (unsigned long *kernel_entry) {unsigned long virt_addr =LOAD_PHYSICAL_ADDR ;
@@ -807,6 +827,10 @@ static efi_status_t efi_decompress_kerne !memcmp(efistub_fw_vendor(), ami, sizeof(ami))) {efi_debug ("AMI firmware v2.0 or older detected - disabling physical KASLR\n" ); seed[0 ] =0 ; + } else if (cmdline_memmap_override) { +efi_info ("%s detected on the kernel command line - disabling physical KASLR\n" , + cmdline_memmap_override); + seed[0 ] =0 ; } boot_params_ptr->hdr.loadflags |=KASLR_FLAG ;
@@ -883,7 +907,7 @@ void __noreturn efi_stub_entry(efi_handl }#ifdef CONFIG_CMDLINE_BOOL - status =efi_parse_options (CONFIG_CMDLINE ); + status =parse_options (CONFIG_CMDLINE );if (status !=EFI_SUCCESS ) {efi_err ("Failed to parse options\n" ); goto fail;
@@ -892,7 +916,7 @@ void __noreturn efi_stub_entry(efi_handlif (!IS_ENABLED (CONFIG_CMDLINE_OVERRIDE )) {unsigned long cmdline_paddr = ((u64 )hdr->cmd_line_ptr | ((u64 )boot_params->ext_cmd_line_ptr <<32 )); - status =efi_parse_options ((char *)cmdline_paddr); + status =parse_options ((char *)cmdline_paddr);if (status !=EFI_SUCCESS ) {efi_err ("Failed to parse options\n" ); goto fail;
Greg Kroah-Hartman
maintainerPATCH 367/374 efi: libstub: only free priv.runtime_map when allocated
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hagar Hemdan <[email protected]>
commit 4b2543f7e1e6b91cfc8dd1696e3cdf01c3ac8974 upstream.
priv.runtime_map is only allocated when efi_novamap is not set. Otherwise, it is an uninitialized value. In the error path, it is freed unconditionally. Avoid passing an uninitialized value to free_pool. Free priv.runtime_map only when it was allocated.
This bug was discovered and resolved using Coverity Static Analysis Security Testing (SAST) by Synopsys, Inc.
--- drivers/firmware/efi/libstub/fdt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/firmware/efi/libstub/fdt.c +2 -2
@@ -335,8 +335,8 @@ fail_free_new_fdt: fail:efi_free (fdt_size, fdt_addr); - -efi_bs_call (free_pool, priv.runtime_map); +if (!efi_novamap) +efi_bs_call (free_pool, priv.runtime_map);return EFI_LOAD_ERROR ; }
Greg Kroah-Hartman
maintainerPATCH 368/374 x86/topology: Handle bogus ACPI tables correctly
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 9d22c96316ac59ed38e80920c698fed38717b91b upstream.
The ACPI specification clearly states how the processors should be enumerated in the MADT:
"To ensure that the boot processor is supported post initialization,
two guidelines should be followed. The first is that OSPM should initialize processors in the order that they appear in the MADT. The second is that platform firmware should list the boot processor as the first processor entry in the MADT.
...
Failure of OSPM implementations and platform firmware to abide by these guidelines can result in both unpredictable and non optimal platform operation."
The kernel relies on that ordering to detect the real BSP on crash kernels which is important to avoid sending a INIT IPI to it as that would cause a full machine reset.
On a Dell XPS 16 9640 the BIOS ignores this rule and enumerates the CPUs in the wrong order. As a consequence the kernel falsely detects a crash kernel and disables the corresponding CPU.
Prevent this by checking the IA32_APICBASE MSR for the BSP bit on the boot CPU. If that bit is set, then the MADT based BSP detection can be safely ignored. If the kernel detects a mismatch between the BSP bit and the first enumerated MADT entry then emit a firmware bug message.
This obviously also has to be taken into account when the boot APIC ID and the first enumerated APIC ID match. If the boot CPU does not have the BSP bit set in the APICBASE MSR then there is no way for the boot CPU to determine which of the CPUs is the real BSP. Sending an INIT to the real BSP would reset the machine so the only sane way to deal with that is to limit the number of CPUs to one and emit a corresponding warning message.
--- arch/x86/kernel/cpu/topology.c | 55 +++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-)
arch/x86/kernel/cpu/topology.c +51 -4
@@ -128,6 +128,9 @@ static void topo_set_cpuids(unsigned int cpu, u32 apic_id, u32 acpi_id)static __init bool check_for_real_bsp (u32 apic_id) { +bool is_bsp = false, has_apic_base = boot_cpu_data.x86 >=6 ; +u64 msr; +/* * There is no real good way to detect whether this a kdump() * kernel, but except on the Voyager SMP monstrosity which is not
@@ -144,17 +147,61 @@ static __init bool check_for_real_bsp(u32 apic_id)if (topo_info.real_bsp_apic_id !=BAD_APICID )return false; -if (apic_id == topo_info.boot_cpu_apic_id) { - topo_info.real_bsp_apic_id = apic_id; -return false; +/* +* Check whether the enumeration order is broken by evaluating the +* BSP bit in the APICBASE MSR. If the CPU does not have the +* APICBASE MSR then the BSP detection is not possible and the +* kernel must rely on the firmware enumeration order. +*/ +if (has_apic_base) { +rdmsrl (MSR_IA32_APICBASE , msr); + is_bsp = !!(msr &MSR_IA32_APICBASE_BSP ); } -pr_warn ("Boot CPU APIC ID not the first enumerated APIC ID: %x > %x\n" , +if (apic_id == topo_info.boot_cpu_apic_id) { +/* +* If the boot CPU has the APIC BSP bit set then the +* firmware enumeration is agreeing. If the CPU does not +* have the APICBASE MSR then the only choice is to trust +* the enumeration order. +*/ +if (is_bsp || !has_apic_base) { + topo_info.real_bsp_apic_id = apic_id; +return false; + } +/* +* If the boot APIC is enumerated first, but the APICBASE +* MSR does not have the BSP bit set, then there is no way +* to discover the real BSP here. Assume a crash kernel and +* limit the number of CPUs to 1 as an INIT to the real BSP +* would reset the machine. +*/ +pr_warn ("Enumerated BSP APIC %x is not marked in APICBASE MSR\n" , apic_id); +pr_warn ("Assuming crash kernel. Limiting to one CPU to prevent machine INIT\n" ); +set_nr_cpu_ids (1 ); + goto fwbug; + } + +pr_warn ("Boot CPU APIC ID not the first enumerated APIC ID: %x != %x\n" , topo_info.boot_cpu_apic_id, apic_id); + +if (is_bsp) { +/* +* The boot CPU has the APIC BSP bit set. Use it and complain +* about the broken firmware enumeration. +*/ + topo_info.real_bsp_apic_id = topo_info.boot_cpu_apic_id; + goto fwbug; + } +pr_warn ("Crash kernel detected. Disabling real BSP to prevent machine INIT\n" ); topo_info.real_bsp_apic_id = apic_id;return true; + +fwbug: +pr_warn (FW_BUG "APIC enumeration order not specification compliant\n" ); +return false; } static unsigned int topo_unit_count(u32 lvlid, enum x86_topology_domains at_level,
Signature · 1 line
2.45.2
Greg Kroah-Hartman
maintainerPATCH 369/374 x86/pci: Skip early E820 check for ECAM region
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
commit 199f968f1484a14024d0d467211ffc2faf193eb4 upstream.
Arul, Mateusz, Imcarneiro91, and Aman reported a regression caused by 07eab0901ede ("efi/x86: Remove EfiMemoryMappedIO from E820 map"). On the Lenovo Legion 9i laptop, that commit removes the ECAM area from E820, which means the early E820 validation fails, which means we don't enable ECAM in the "early MCFG" path.
The static MCFG table describes ECAM without depending on the ACPI interpreter. Many Legion 9i ACPI methods rely on that, so they fail when PCI config access isn't available, resulting in the embedded controller, PS/2, audio, trackpad, and battery devices not being detected. The _OSC method also fails, so Linux can't take control of the PCIe hotplug, PME, and AER features:
# pci_mmcfg_early_init()
PCI: ECAM [mem 0xc0000000-0xce0fffff] (base 0xc0000000) for domain 0000 [bus 00-e0]
PCI: not using ECAM ([mem 0xc0000000-0xce0fffff] not reserved)
ACPI Error: AE_ERROR, Returned by Handler for [PCI_Config] (20230628/evregion-300)
ACPI: Interpreter enabled
ACPI: Ignoring error and continuing table load
ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PC00.RP01._SB.PC00], AE_NOT_FOUND (20230628/dswload2-162) ACPI Error: AE_NOT_FOUND, During name lookup/catalog (20230628/psobject-220)
ACPI: Skipping parse of AML opcode: OpcodeName unavailable (0x0010)
ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PC00.RP01._SB.PC00], AE_NOT_FOUND (20230628/dswload2-162) ACPI Error: AE_NOT_FOUND, During name lookup/catalog (20230628/psobject-220)
...
ACPI Error: Aborting method \_SB.PC00._OSC due to previous error (AE_NOT_FOUND) (20230628/psparse-529) acpi PNP0A08:00: _OSC: platform retains control of PCIe features (AE_NOT_FOUND)
# pci_mmcfg_late_init()
PCI: ECAM [mem 0xc0000000-0xce0fffff] (base 0xc0000000) for domain 0000 [bus 00-e0]
PCI: [Firmware Info]: ECAM [mem 0xc0000000-0xce0fffff] not reserved in ACPI motherboard resources
PCI: ECAM [mem 0xc0000000-0xce0fffff] is EfiMemoryMappedIO; assuming valid
PCI: ECAM [mem 0xc0000000-0xce0fffff] reserved to work around lack of ACPI motherboard _CRS
Per PCI Firmware r3.3, sec 4.1.2, ECAM space must be reserved by a PNP0C02 resource, but there's no requirement to mention it in E820, so we shouldn't look at E820 to validate the ECAM space described by MCFG.
In 2006, 946f2ee5c731 ("[PATCH] i386/x86-64: Check that MCFG points to an e820 reserved area") added a sanity check of E820 to work around buggy MCFG tables, but that over-aggressive validation causes failures like this one.
Keep the E820 validation check for machines older than 2016, an arbitrary ten years after 946f2ee5c731, so machines that depend on it don't break.
Skip the early E820 check for 2016 and newer BIOSes since there's no requirement to describe ECAM in E820.
--- arch/x86/pci/mmconfig-shared.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-)
arch/x86/pci/mmconfig-shared.c +29 -11
@@ -518,7 +518,34 @@ static bool __ref pci_mmcfg_reserved(str {struct resource *conflict; -if (!early && !acpi_disabled) { +if (early) { + +/* +* Don't try to do this check unless configuration type 1 +* is available. How about type 2? +*/ + +/* +* 946f2ee5c731 ("Check that MCFG points to an e820 +* reserved area") added this E820 check in 2006 to work +* around BIOS defects. +* +* Per PCI Firmware r3.3, sec 4.1.2, ECAM space must be +* reserved by a PNP0C02 resource, but it need not be +* mentioned in E820. Before the ACPI interpreter is +* available, we can't check for PNP0C02 resources, so +* there's no reliable way to verify the region in this +* early check. Keep it only for the old machines that +* motivated 946f2ee5c731. +*/ +if (dmi_get_bios_year () <2016 && raw_pci_ops) +return is_mmconf_reserved (e820__mapped_all, cfg, dev, +"E820 entry" ); + +return true; + } + +if (!acpi_disabled) {if (is_mmconf_reserved (is_acpi_reserved, cfg, dev,"ACPI motherboard resource" ))return true;
@@ -551,16 +578,7 @@ static bool __ref pci_mmcfg_reserved(str* For MCFG information constructed from hotpluggable host bridge's * _CBA method, just assume it's reserved. */ -if (pci_mmcfg_running_state) -return true; - -/* Don't try to do this check unless configuration -type 1 is available. how about type 2 ?*/ -if (raw_pci_ops) -return is_mmconf_reserved (e820__mapped_all, cfg, dev, -"E820 entry" ); - -return false; +return pci_mmcfg_running_state; }static void __init pci_mmcfg_reject_broken (int early)
Greg Kroah-Hartman
maintainerPATCH 370/374 KVM: x86: Dont advertise guest.MAXPHYADDR as host.MAXPHYADDR in CPUID
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerd Hoffmann <[email protected]>
commit 6f5c9600621b4efb5c61b482d767432eb1ad3a9c upstream.
Drop KVM's propagation of GuestPhysBits (CPUID leaf 80000008, EAX[23:16]) to HostPhysBits (same leaf, EAX[7:0]) when advertising the address widths to userspace via KVM_GET_SUPPORTED_CPUID.
Per AMD, GuestPhysBits is intended for software use, and physical CPUs do not set that field. I.e. GuestPhysBits will be non-zero if and only if KVM is running as a nested hypervisor, and in that case, GuestPhysBits is NOT guaranteed to capture the CPU's effective MAXPHYADDR when running with TDP enabled.
E.g. KVM will soon use GuestPhysBits to communicate the CPU's maximum *addressable* guest physical address, which would result in KVM under- reporting PhysBits when running as an L1 on a CPU with MAXPHYADDR=52, but without 5-level paging.
--- arch/x86/kvm/cpuid.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
arch/x86/kvm/cpuid.c +10 -11
@@ -1232,9 +1232,8 @@ static inline int __do_cpuid_func(struct entry->eax = entry->ebx = entry->ecx =0 ;break ;case 0x80000008 : { -unsigned g_phys_as = (entry->eax >>16 ) &0xff ; -unsigned virt_as =max ((entry->eax >>8 ) &0xff ,48U ); -unsigned phys_as = entry->eax &0xff ; +unsigned int virt_as =max ((entry->eax >>8 ) &0xff ,48U ); +unsigned int phys_as;/* * If TDP (NPT) is disabled use the adjusted host MAXPHYADDR as
@@ -1242,16 +1241,16 @@ static inline int __do_cpuid_func(struct* reductions in MAXPHYADDR for memory encryption affect shadow * paging, too. * -* If TDP is enabled but an explicit guest MAXPHYADDR is not -* provided, use the raw bare metal MAXPHYADDR as reductions to -* the HPAs do not affect GPAs. +* If TDP is enabled, use the raw bare metal MAXPHYADDR as +* reductions to the HPAs do not affect GPAs. */ -if (!tdp_enabled) - g_phys_as = boot_cpu_data.x86_phys_bits; -else if (!g_phys_as) - g_phys_as = phys_as; +if (!tdp_enabled) { + phys_as = boot_cpu_data.x86_phys_bits; + }else { + phys_as = entry->eax &0xff ; + } - entry->eax = g_phys_as | (virt_as <<8 ); + entry->eax = phys_as | (virt_as <<8 ); entry->ecx &= ~(GENMASK (31 ,16 ) |GENMASK (11 ,8 )); entry->edx =0 ;cpuid_entry_override (entry,CPUID_8000_0008_EBX );
Greg Kroah-Hartman
maintainerPATCH 371/374 x86/topology/intel: Unlock CPUID before evaluating anything
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 0c2f6d04619ec2b53ad4b0b591eafc9389786e86 upstream.
Intel CPUs have a MSR bit to limit CPUID enumeration to leaf two. If this bit is set by the BIOS then CPUID evaluation including topology enumeration does not work correctly as the evaluation code does not try to analyze any leaf greater than two.
This went unnoticed before because the original topology code just repeated evaluation several times and managed to overwrite the initial limited information with the correct one later. The new evaluation code does it once and therefore ends up with the limited and wrong information.
Cure this by unlocking CPUID right before evaluating anything which depends on the maximum CPUID leaf being greater than two instead of rereading stuff after unlock.
--- arch/x86/kernel/cpu/common.c | 3 ++- arch/x86/kernel/cpu/cpu.h | 2 ++ arch/x86/kernel/cpu/intel.c | 25 ++++++++++++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-)
arch/x86/kernel/cpu/common.c +2 -1
@@ -1589,6 +1589,7 @@ static void __init early_identify_cpu(stif (have_cpuid_p ()) {cpu_detect (c);get_cpu_vendor (c); +intel_unlock_cpuid_leafs (c);get_cpu_cap (c);setup_force_cpu_cap (X86_FEATURE_CPUID );get_cpu_address_sizes (c);
@@ -1748,7 +1749,7 @@ static void generic_identify(struct cpuicpu_detect (c);get_cpu_vendor (c); - +intel_unlock_cpuid_leafs (c);get_cpu_cap (c);get_cpu_address_sizes (c);
arch/x86/kernel/cpu/cpu.h +2 -0
@@ -61,9 +61,11 @@ extern __ro_after_init enum tsx_ctrl_staextern void __init tsx_init (void );void tsx_ap_init (void ); +void intel_unlock_cpuid_leafs (struct cpuinfo_x86 *c);#else static inline void tsx_init (void ) { }static inline void tsx_ap_init (void ) { } +static inline void intel_unlock_cpuid_leafs (struct cpuinfo_x86 *c) { }#endif /* CONFIG_CPU_SUP_INTEL */ extern void init_spectral_chicken (struct cpuinfo_x86 *c);
arch/x86/kernel/cpu/intel.c +16 -9
@@ -268,19 +268,26 @@ detect_keyid_bits: c->x86_phys_bits -= keyid_bits; } +void intel_unlock_cpuid_leafs (struct cpuinfo_x86 *c) +{ +if (boot_cpu_data.x86_vendor !=X86_VENDOR_INTEL ) +return ; + +if (c->x86 <6 || (c->x86 ==6 && c->x86_model <0xd )) +return ; + +/* +* The BIOS can have limited CPUID to leaf 2, which breaks feature +* enumeration. Unlock it and update the maximum leaf info. +*/ +if (msr_clear_bit (MSR_IA32_MISC_ENABLE ,MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT ) >0 ) + c->cpuid_level =cpuid_eax (0 ); +} +static void early_init_intel (struct cpuinfo_x86 *c) {u64 misc_enable; -/* Unmask CPUID levels if masked: */ -if (c->x86 >6 || (c->x86 ==6 && c->x86_model >=0xd )) { -if (msr_clear_bit (MSR_IA32_MISC_ENABLE , -MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT ) >0 ) { - c->cpuid_level =cpuid_eax (0 ); -get_cpu_cap (c); - } - } -if ((c->x86 ==0xf && c->x86_model >=0x03 ) || (c->x86 ==0x6 && c->x86_model >=0x0e ))set_cpu_cap (c,X86_FEATURE_CONSTANT_TSC );
Greg Kroah-Hartman
maintainerPATCH 372/374 genirq/cpuhotplug, x86/vector: Prevent vector leak during CPU offline
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dongli Zhang <[email protected]>
commit a6c11c0a5235fb144a65e0cb2ffd360ddc1f6c32 upstream.
The absence of IRQD_MOVE_PCNTXT prevents immediate effectiveness of interrupt affinity reconfiguration via procfs. Instead, the change is deferred until the next instance of the interrupt being triggered on the original CPU.
When the interrupt next triggers on the original CPU, the new affinity is enforced within __irq_move_irq(). A vector is allocated from the new CPU, but the old vector on the original CPU remains and is not immediately reclaimed. Instead, apicd->move_in_progress is flagged, and the reclaiming process is delayed until the next trigger of the interrupt on the new CPU.
Upon the subsequent triggering of the interrupt on the new CPU, irq_complete_move() adds a task to the old CPU's vector_cleanup list if it remains online. Subsequently, the timer on the old CPU iterates over its vector_cleanup list, reclaiming old vectors.
However, a rare scenario arises if the old CPU is outgoing before the interrupt triggers again on the new CPU.
In that case irq_force_complete_move() is not invoked on the outgoing CPU to reclaim the old apicd->prev_vector because the interrupt isn't currently affine to the outgoing CPU, and irq_needs_fixup() returns false. Even though __vector_schedule_cleanup() is later called on the new CPU, it doesn't reclaim apicd->prev_vector; instead, it simply resets both apicd->move_in_progress and apicd->prev_vector to 0.
As a result, the vector remains unreclaimed in vector_matrix, leading to a CPU vector leak.
To address this issue, move the invocation of irq_force_complete_move() before the irq_needs_fixup() call to reclaim apicd->prev_vector, if the interrupt is currently or used to be affine to the outgoing CPU.
Additionally, reclaim the vector in __vector_schedule_cleanup() as well, following a warning message, although theoretically it should never see apicd->move_in_progress with apicd->prev_cpu pointing to an offline CPU.
--- arch/x86/kernel/apic/vector.c | 9 ++++++--- kernel/irq/cpuhotplug.c | 16 ++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-)
arch/x86/kernel/apic/vector.c +6 -3
@@ -1036,7 +1036,8 @@ static void __vector_schedule_cleanup(stadd_timer_on (&cl->timer, cpu); } }else { - apicd->prev_vector =0 ; +pr_warn ("IRQ %u schedule cleanup for offline CPU %u\n" , apicd->irq, cpu); +free_moved_vector (apicd); }raw_spin_unlock (&vector_lock); }
@@ -1073,6 +1074,7 @@ void irq_complete_move(struct irq_cfg *c*/ void irq_force_complete_move (struct irq_desc *desc) { +unsigned int cpu =smp_processor_id ();struct apic_chip_data *apicd;struct irq_data *irqd;unsigned int vector;
@@ -1097,10 +1099,11 @@ void irq_force_complete_move(struct irq_ goto unlock;/* -* If prev_vector is empty, no action required. +* If prev_vector is empty or the descriptor is neither currently +* nor previously on the outgoing CPU no action required. */ vector = apicd->prev_vector; -if (!vector) +if (!vector || (apicd->cpu != cpu && apicd->prev_cpu != cpu)) goto unlock;/*
kernel/irq/cpuhotplug.c +8 -8
@@ -70,6 +70,14 @@ static bool migrate_one_irq(struct irq_d }/* +* Complete an eventually pending irq move cleanup. If this +* interrupt was moved in hard irq context, then the vectors need +* to be cleaned up. It can't wait until this interrupt actually +* happens and this CPU was involved. +*/ +irq_force_complete_move (desc); + +/* * No move required, if: * - Interrupt is per cpu * - Interrupt is not started
@@ -88,14 +96,6 @@ static bool migrate_one_irq(struct irq_d }/* -* Complete an eventually pending irq move cleanup. If this -* interrupt was moved in hard irq context, then the vectors need -* to be cleaned up. It can't wait until this interrupt actually -* happens and this CPU was involved. -*/ -irq_force_complete_move (desc); - -/* * If there is a setaffinity pending, then try to reuse the pending * mask, so the last change of the affinity does not get lost. If * there is no move pending or the pending mask does not contain
Greg Kroah-Hartman
maintainerPATCH 373/374 platform/x86/intel/tpmi: Handle error from tpmi_process_info()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
commit 2920141fc149f71bad22361946417bc43783ed7f upstream.
When tpmi_process_info() returns error, fail to load the driver. This can happen if call to ioremap() returns error.
--- drivers/platform/x86/intel/tpmi.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/platform/x86/intel/tpmi.c +5 -2
@@ -763,8 +763,11 @@ static int intel_vsec_tpmi_init(struct a* when actual device nodes created outside this * loop via tpmi_create_devices(). */ -if (pfs->pfs_header.tpmi_id ==TPMI_INFO_ID ) -tpmi_process_info (tpmi_info, pfs); +if (pfs->pfs_header.tpmi_id ==TPMI_INFO_ID ) { + ret =tpmi_process_info (tpmi_info, pfs); +if (ret) +return ret; + }if (pfs->pfs_header.tpmi_id ==TPMI_CONTROL_ID )tpmi_set_control_base (auxdev, tpmi_info, pfs);
Greg Kroah-Hartman
maintainerPATCH 374/374 platform/x86/intel-uncore-freq: Dont present root domain on error
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Pandruvada <[email protected]>
commit db643cb7ebe524d17b4b13583dda03485d4a1bc0 upstream.
If none of the clusters are added because of some error, fail to load driver without presenting root domain. In this case root domain will present invalid data.
--- drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/platform/x86/intel/uncore-frequency/uncore-frequency-tpmi.c +7 -0
@@ -240,6 +240,7 @@ static int uncore_probe(struct auxiliarybool read_blocked =0 , write_blocked =0 ;struct intel_tpmi_plat_info *plat_info;struct tpmi_uncore_struct *tpmi_uncore; +bool uncore_sysfs_added = false;int ret, i, pkg =0 ;int num_resources;
@@ -384,9 +385,15 @@ static int uncore_probe(struct auxiliary }/* Point to next cluster offset */ cluster_offset >>=UNCORE_MAX_CLUSTER_PER_DOMAIN ; + uncore_sysfs_added = true; } } +if (!uncore_sysfs_added) { + ret = -ENODEV ; + goto remove_clusters; + } +auxiliary_set_drvdata (auxdev, tpmi_uncore); tpmi_uncore->root_cluster.root_domain = true;
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
The Powerpc build failures noticed on stable-rc 6.9, 6.6 and 6.1.
arch/powerpc/include/asm/inst.h: In function '__copy_inst_from_kernel_nofault':arch/powerpc/include/asm/uaccess.h:177:19: error: expected string literal before 'DS_FORM_CONSTRAINT'
177 | : DS_FORM_CONSTRAINT (*addr) \
| ^~~~~~~~~~~~~~~~~~Links:
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.9.y/build/v6.9.2-803-gfcbdac56b0ae/testrun/24217279/suite/build/test/gcc-13-maple_defconfig/log
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.9.y/build/v6.9.2-803-gfcbdac56b0ae/testrun/24217279/suite/build/test/gcc-13-maple_defconfig/history/
--
Linaro LKFT
https://lkft.linaro.org
Quoted 9 lines · Naresh Kamboju
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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.
[...]
The Powerpc build failures noticed on stable-rc 6.9, 6.6 and 6.1.
TWIMC: I ran into the same problem with my Fedora builds on ppc64le:
No problems in arm64 or x86-64.
Ciao, Thorsten
Quoted 11 lines
arch/powerpc/include/asm/inst.h: In function '__copy_inst_from_kernel_nofault':arch/powerpc/include/asm/uaccess.h:177:19: error: expected string literal before 'DS_FORM_CONSTRAINT'177 | : DS_FORM_CONSTRAINT (*addr) \ | ^~~~~~~~~~~~~~~~~~Links:
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.9.y/build/v6.9.2-803-gfcbdac56b0ae/testrun/24217279/suite/build/test/gcc-13-maple_defconfig/log
- https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.9.y/build/v6.9.2-803-gfcbdac56b0ae/testrun/24217279/suite/build/test/gcc-13-maple_defconfig/history/
Hello,
Quoted 5 lines · On Thu, 6 Jun 2024 15:59:39 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 8 lines
Responses should be made by Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] fcbdac56b0ae ("Linux 6.9.4-rc1")
Thanks,
SJ
[...]
---
ok 6 selftests: damon: debugfs_duplicate_context_creation.sh
ok 7 selftests: damon: debugfs_rm_non_contexts.sh
ok 8 selftests: damon: debugfs_target_ids_read_before_terminate_race.sh ok 9 selftests: damon: debugfs_target_ids_pid_leak.sh
ok 10 selftests: damon: sysfs.sh
ok 11 selftests: damon: sysfs_update_removed_scheme_dir.sh
ok 12 selftests: damon: sysfs_update_schemes_tried_regions_hang.py ok 13 selftests: damon: sysfs_update_schemes_tried_regions_wss_estimation.py ok 14 selftests: damon: damos_quota.py
ok 15 selftests: damon: damos_apply_interval.py
ok 16 selftests: damon: reclaim.sh
ok 17 selftests: damon: lru_sort.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_arm64.sh
ok 12 selftests: damon-tests: build_m68k.sh
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
[33m
[92mPASS [39m
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.9.4 release. There are 374 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.9.y
6.6 passes our testing, too:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.6.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.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 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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.
Successfully compiled and installed the kernel on my computer (Acer Aspire E15, Intel Core i3 Haswell). No noticeable regressions.
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v6.9:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 116 pass, 0 failLinux version: 6.9.4-rc1-gfcbdac56b0ae
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
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
Build regressions on Powerpc.
## Build
* kernel: 6.9.4-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-6.9.y
* git commit: fcbdac56b0ae848d2259d6b9825f289688a77e0b
* git describe: v6.9.2-803-gfcbdac56b0ae
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-6.9.y/build/v6.9.2-803-gfcbdac56b0ae
## Test Regressions (compared to v6.9.2)
* powerpc, build
- clang-18-cell_defconfig
- clang-18-defconfig
- clang-18-maple_defconfig
- clang-18-ppc64e_defconfig
- clang-nightly-cell_defconfig
- clang-nightly-defconfig
- clang-nightly-maple_defconfig
- clang-nightly-ppc64e_defconfig
- gcc-13-cell_defconfig
- gcc-13-defconfig
- gcc-13-maple_defconfig
- gcc-13-ppc64e_defconfig
## Metric Regressions (compared to v6.9.2)
## Test Fixes (compared to v6.9.2)
## Metric Fixes (compared to v6.9.2)
## Test result summary
total: 139061, pass: 121356, fail: 1981, skip: 15724, xfail: 0
## Build Summary
* arc: 5 total, 5 passed, 0 failed
* arm: 126 total, 126 passed, 0 failed
* arm64: 38 total, 38 passed, 0 failed
* i386: 28 total, 28 passed, 0 failed
* mips: 24 total, 24 passed, 0 failed
* parisc: 3 total, 3 passed, 0 failed
* powerpc: 34 total, 22 passed, 12 failed
* riscv: 17 total, 17 passed, 0 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 10 total, 10 passed, 0 failed
* sparc: 6 total, 6 passed, 0 failed
* x86_64: 33 total, 33 passed, 0 failed
## Test suites summary
* boot
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-exec
* kselftest-filesystems
* kselftest-filesystems-binderfs
* kselftest-fpu
* kselftest-ftrace
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mm
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-user_events
* kselftest-vDSO
* kselftest-watchdog
* kselftest-x86
* kselftest-zram
* kunit
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-hugetlb
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-pty
* ltp-sched
* ltp-smoke
* ltp-smoketest
* ltp-syscalls
* ltp-tracing
* perf
* rcutorture
--
Linaro LKFT
https://lkft.linaro.org
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my x86_64 and ARM64 test systems. No errors or regressions.
Thanks.
[2024-06-06 15:59] Greg Kroah-Hartman:
Quoted 9 lines
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
Hi, 6.9.4-rc1 is running fine on various x86_64 bare metal and virtual machines of mine (Haswell, Skylake, Kaby Lake, Coffee Lake).
Regard
Pascal
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
Built and booted successfully on RISC-V RV64 (HiFive Unmatched).
Am 06.06.2024 um 15:59 schrieb Greg Kroah-Hartman:
Quoted 9 lines
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.9.y
and the diffstat can be found below.thanks,
greg k-h
Builds, boots and works w/o regressions on my good old 2-socket Ivy Bridge Xeon E5-2697 v2 server machine and runs 15 QEMU/KVM virtual machines for some hours now, no hiccups.
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]