6.6.16-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 279/322 ipmr: fix kernel panic when forwarding mcast packets
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit e622502c310f1069fd9f41cd38210553115f610a ]
The stacktrace was:
[ 86.305548] BUG: kernel NULL pointer dereference, address: 0000000000000092 [ 86.306815] #PF: supervisor read access in kernel mode [ 86.307717] #PF: error_code(0x0000) - not-present page [ 86.308624] PGD 0 P4D 0 [ 86.309091] Oops: 0000 [#1] PREEMPT SMP NOPTI [ 86.309883] CPU: 2 PID: 3139 Comm: pimd Tainted: G U 6.8.0-6wind-knet #1 [ 86.311027] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.11.1-0-g0551a4be2c-prebuilt.qemu-project.org 04/01/2014 [ 86.312728] RIP: 0010:ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985) [ 86.313399] Code: f9 1f 0f 87 85 03 00 00 48 8d 04 5b 48 8d 04 83 49 8d 44 c5 00 48 8b 40 70 48 39 c2 0f 84 d9 00 00 00 49 8b 46 58 48 83 e0 fe <80> b8 92 00 00 00 00 0f 84 55 ff ff ff 49 83 47 38 01 45 85 e4 0f [ 86.316565] RSP: 0018:ffffad21c0583ae0 EFLAGS: 00010246 [ 86.317497] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 [ 86.318596] RDX: ffff9559cb46c000 RSI: 0000000000000000 RDI: 0000000000000000 [ 86.319627] RBP: ffffad21c0583b30 R08: 0000000000000000 R09: 0000000000000000 [ 86.320650] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 [ 86.321672] R13: ffff9559c093a000 R14: ffff9559cc00b800 R15: ffff9559c09c1d80 [ 86.322873] FS: 00007f85db661980(0000) GS:ffff955a79d00000(0000) knlGS:0000000000000000 [ 86.324291] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 86.325314] CR2: 0000000000000092 CR3: 000000002f13a000 CR4: 0000000000350ef0 [ 86.326589] Call Trace: [ 86.327036] <TASK> [ 86.327434] ? show_regs (/build/work/knet/arch/x86/kernel/dumpstack.c:479) [ 86.328049] ? __die (/build/work/knet/arch/x86/kernel/dumpstack.c:421 /build/work/knet/arch/x86/kernel/dumpstack.c:434) [ 86.328508] ? page_fault_oops (/build/work/knet/arch/x86/mm/fault.c:707) [ 86.329107] ? do_user_addr_fault (/build/work/knet/arch/x86/mm/fault.c:1264) [ 86.329756] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.330350] ? __irq_work_queue_local (/build/work/knet/kernel/irq_work.c:111 (discriminator 1)) [ 86.331013] ? exc_page_fault (/build/work/knet/./arch/x86/include/asm/paravirt.h:693 /build/work/knet/arch/x86/mm/fault.c:1515 /build/work/knet/arch/x86/mm/fault.c:1563) [ 86.331702] ? asm_exc_page_fault (/build/work/knet/./arch/x86/include/asm/idtentry.h:570) [ 86.332468] ? ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985) [ 86.333183] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.333920] ipmr_mfc_add (/build/work/knet/./include/linux/rcupdate.h:782 /build/work/knet/net/ipv4/ipmr.c:1009 /build/work/knet/net/ipv4/ipmr.c:1273) [ 86.334583] ? __pfx_ipmr_hash_cmp (/build/work/knet/net/ipv4/ipmr.c:363) [ 86.335357] ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470) [ 86.336135] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.336854] ? ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470) [ 86.337679] do_ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:944) [ 86.338408] ? __pfx_unix_stream_read_actor (/build/work/knet/net/unix/af_unix.c:2862) [ 86.339232] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.339809] ? aa_sk_perm (/build/work/knet/security/apparmor/include/cred.h:153 /build/work/knet/security/apparmor/net.c:181) [ 86.340342] ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:1415) [ 86.340859] raw_setsockopt (/build/work/knet/net/ipv4/raw.c:836) [ 86.341408] ? security_socket_setsockopt (/build/work/knet/security/security.c:4561 (discriminator 13)) [ 86.342116] sock_common_setsockopt (/build/work/knet/net/core/sock.c:3716) [ 86.342747] do_sock_setsockopt (/build/work/knet/net/socket.c:2313) [ 86.343363] __sys_setsockopt (/build/work/knet/./include/linux/file.h:32 /build/work/knet/net/socket.c:2336) [ 86.344020] __x64_sys_setsockopt (/build/work/knet/net/socket.c:2340) [ 86.344766] do_syscall_64 (/build/work/knet/arch/x86/entry/common.c:52 /build/work/knet/arch/x86/entry/common.c:83) [ 86.345433] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.346161] ? syscall_exit_work (/build/work/knet/./include/linux/audit.h:357 /build/work/knet/kernel/entry/common.c:160) [ 86.346938] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.347657] ? syscall_exit_to_user_mode (/build/work/knet/kernel/entry/common.c:215) [ 86.348538] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.349262] ? do_syscall_64 (/build/work/knet/./arch/x86/include/asm/cpufeature.h:171 /build/work/knet/arch/x86/entry/common.c:98) [ 86.349971] entry_SYSCALL_64_after_hwframe (/build/work/knet/arch/x86/entry/entry_64.S:129)
The original packet in ipmr_cache_report() may be queued and then forwarded with ip_mr_forward(). This last function has the assumption that the skb dst is set.
After the below commit, the skb dst is dropped by ipv4_pktinfo_prepare(), which causes the oops.
--- include/net/ip.h | 2 +- net/ipv4/ip_sockglue.c | 6 ++++-- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/udp.c | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-)
include/net/ip.h +1 -1
@@ -758,7 +758,7 @@ int ip_options_rcv_srr(struct sk_buff *skb, struct net_device *dev);* Functions provided by ip_sockglue.c */ -void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb); +void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb,bool drop_dst);void ip_cmsg_recv_offset (struct msghdr *msg,struct sock *sk,struct sk_buff *skb,int tlen,int offset); int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
net/ipv4/ip_sockglue.c +4 -2
@@ -1369,12 +1369,13 @@ int do_ip_setsockopt(struct sock *sk, int level, int optname,* ipv4_pktinfo_prepare - transfer some info from rtable to skb * @sk: socket * @skb: buffer +* @drop_dst: if true, drops skb dst * * To support IP_CMSG_PKTINFO option, we store rt_iif and specific * destination in skb->cb[] before dst drop. * This way, receiver doesn't make cache line misses to read rtable. */ -void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb) +void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb,bool drop_dst) {struct in_pktinfo *pktinfo =PKTINFO_SKB_CB (skb); bool prepare = inet_test_bit(PKTINFO, sk) ||
@@ -1403,7 +1404,8 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb) pktinfo->ipi_ifindex =0 ; pktinfo->ipi_spec_dst.s_addr =0 ; } -skb_dst_drop (skb); +if (drop_dst) +skb_dst_drop (skb); } int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
net/ipv4/ipmr.c +1 -1
@@ -1073,7 +1073,7 @@ static int ipmr_cache_report(const struct mr_table *mrt, msg = (struct igmpmsg *)skb_network_header (skb); msg->im_vif = vifi; msg->im_vif_hi = vifi >>8 ; -ipv4_pktinfo_prepare (mroute_sk, pkt); +ipv4_pktinfo_prepare (mroute_sk, pkt, false);memcpy (skb->cb, pkt->cb,sizeof (skb->cb));/* Add our header */ igmp =skb_put (skb,sizeof (struct igmphdr ));
net/ipv4/raw.c +1 -1
@@ -292,7 +292,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)/* Charge it to the socket. */ -ipv4_pktinfo_prepare (sk, skb); +ipv4_pktinfo_prepare (sk, skb, true);if (sock_queue_rcv_skb_reason (sk, skb, &reason) <0 ) {kfree_skb_reason (skb, reason);return NET_RX_DROP ;
net/ipv4/udp.c +1 -1
@@ -2167,7 +2167,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)udp_csum_pull_header (skb); -ipv4_pktinfo_prepare (sk, skb); +ipv4_pktinfo_prepare (sk, skb, true);return __udp_queue_rcv_skb (sk, skb); csum_error:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 280/322 net: lan966x: Fix port configuration when using SGMII interface
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Horatiu Vultur <[email protected]>
[ Upstream commit 62b4248105353e7d1debd30ca5c57ec5e5f28e35 ]
In case the interface between the MAC and the PHY is SGMII, then the bit GIGA_MODE on the MAC side needs to be set regardless of the speed at which it is running.
--- drivers/net/ethernet/microchip/lan966x/lan966x_port.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/microchip/lan966x/lan966x_port.c +3 -2
@@ -168,9 +168,10 @@ static void lan966x_port_link_up(struct lan966x_port *port)lan966x_taprio_speed_set (port, config->speed);/* Also the GIGA_MODE_ENA(1) needs to be set regardless of the -* port speed for QSGMII ports. +* port speed for QSGMII or SGMII ports. */ -if (phy_interface_num_ports (config->portmode) ==4 ) +if (phy_interface_num_ports (config->portmode) ==4 || + config->portmode ==PHY_INTERFACE_MODE_SGMII ) mode =DEV_MAC_MODE_CFG_GIGA_MODE_ENA_SET (1 ); lan_wr(config->duplex | mode,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 281/322 tcp: add sanity checks to rx zerocopy
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 577e4432f3ac810049cb7e6b71f4d96ec7c6e894 ]
TCP rx zerocopy intent is to map pages initially allocated from NIC drivers, not pages owned by a fs.
This patch adds to can_map_frag() these additional checks:
- Page must not be a compound one.
- page->mapping must be NULL.
This fixes the panic reported by ZhangPeng.
syzbot was able to loopback packets built with sendfile(), mapping pages owned by an ext4 file to TCP rx zerocopy.
r3 = socket$inet_tcp(0x2, 0x1, 0x0) mmap(&(0x7f0000ff9000/0x4000)=nil, 0x4000, 0x0, 0x12, r3, 0x0) r4 = socket$inet_tcp(0x2, 0x1, 0x0)
bind$inet(r4, &(0x7f0000000000)={0x2, 0x4e24, @multicast1}, 0x10) connect$inet(r4, &(0x7f00000006c0)={0x2, 0x4e24, @empty}, 0x10) r5 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)
fallocate(r5, 0x0, 0x0, 0x85b8)
sendfile(r4, r5, 0x0, 0x8ba0)
getsockopt$inet_tcp_TCP_ZEROCOPY_RECEIVE(r4, 0x6, 0x23,
&(0x7f00000001c0)={&(0x7f0000ffb000/0x3000)=nil, 0x3000, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, &(0x7f0000000440)=0x40)
r6 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)--- net/ipv4/tcp.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
net/ipv4/tcp.c +11 -1
@@ -1786,7 +1786,17 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,static bool can_map_frag (const skb_frag_t *frag) { -return skb_frag_size (frag) ==PAGE_SIZE && !skb_frag_off (frag); +struct page *page; + +if (skb_frag_size (frag) !=PAGE_SIZE ||skb_frag_off (frag)) +return false; + + page =skb_frag_page (frag); + +if (PageCompound (page) || page->mapping) +return false; + +return true; } static int find_next_mappable_frag(const skb_frag_t *frag,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 282/322 e1000e: correct maximum frequency adjustment values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacob Keller <[email protected]>
[ Upstream commit f1f6a6b1830a8f1dc92ee26fae76333f446b0663 ]
The e1000e driver supports hardware with a variety of different clock speeds, and thus a variety of different increment values used for programming its PTP hardware clock.
The values currently programmed in e1000e_ptp_init are incorrect. In particular, only two maximum adjustments are used: 24000000 - 1, and 600000000 - 1. These were originally intended to be used with the 96 MHz clock and the 25 MHz clock.
Both of these values are actually slightly too high. For the 96 MHz clock, the actual maximum value that can safely be programmed is 23,999,938. For the 25 MHz clock, the maximum value is 599,999,904.
Worse, several devices use a 24 MHz clock or a 38.4 MHz clock. These parts are incorrectly assigned one of either the 24million or 600million values. For the 24 MHz clock, this is not a significant issue: its current increment value can support an adjustment up to 7billion in the positive direction. However, the 38.4 KHz clock uses an increment value which can only support up to 230,769,157 before it starts overflowing.
To understand where these values come from, consider that frequency adjustments have the form of:
new_incval = base_incval + (base_incval * adjustment) / (unit of adjustment)
The maximum adjustment is reported in terms of parts per billion:new_incval = base_incval + (base_incval * adjustment) / 1 billion
The largest possible adjustment is thus given by the following:max_incval = base_incval + (base_incval * max_adj) / 1 billion
Re-arranging to solve for max_adj:max_adj = (max_incval - base_incval) * 1 billion / base_incval
We also need to ensure that negative adjustments cannot underflow. This can be achieved simply by ensuring max_adj is always less than 1 billion.
Introduce new macros in e1000.h codifying the maximum adjustment in PPB for each frequency given its associated increment values. Also clarify where these values come from by commenting about the above equations.
Replace the switch statement in e1000e_ptp_init with one which mirrors the increment value switch statement from e1000e_get_base_timinica. For each device, assign the appropriate maximum adjustment based on its frequency. Some parts can have one of two frequency modes as determined by E1000_TSYNCRXCTL_SYSCFI.
Since the new flow directly matches the assignments in e1000e_get_base_timinca, and uses well defined macro names, it is much easier to verify that the resulting maximum adjustments are correct. It also avoids difficult to parse construction such as the "hw->mac.type < e1000_phc_lpt", and the use of fallthrough which was especially confusing when combined with a conditional block.
Note that I believe the current increment value configuration used for 24MHz clocks is sub-par, as it leaves at least 3 extra bits available in the INCVALUE register. However, fixing that requires more careful review of the clock rate and associated values.
--- drivers/net/ethernet/intel/e1000e/e1000.h | 20 ++++++++++++++++++++ drivers/net/ethernet/intel/e1000e/ptp.c | 22 +++++++++++++++------- 2 files changed, 35 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/e1000e/e1000.h +20 -0
@@ -360,23 +360,43 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca);* As a result, a shift of INCVALUE_SHIFT_n is used to fit a value of * INCVALUE_n into the TIMINCA register allowing 32+8+(24-INCVALUE_SHIFT_n) * bits to count nanoseconds leaving the rest for fractional nonseconds. +* +* Any given INCVALUE also has an associated maximum adjustment value. This +* maximum adjustment value is the largest increase (or decrease) which can be +* safely applied without overflowing the INCVALUE. Since INCVALUE has +* a maximum range of 24 bits, its largest value is 0xFFFFFF. +* +* To understand where the maximum value comes from, consider the following +* equation: +* +* new_incval = base_incval + (base_incval * adjustment) / 1billion +* +* To avoid overflow that means: +* max_incval = base_incval + (base_incval * max_adj) / billion +* +* Re-arranging: +* max_adj = floor(((max_incval - base_incval) * 1billion) / 1billion) */ #define INCVALUE_96MHZ 125#define INCVALUE_SHIFT_96MHZ 17#define INCPERIOD_SHIFT_96MHZ 2#define INCPERIOD_96MHZ (12 >> INCPERIOD_SHIFT_96MHZ) +#define MAX_PPB_96MHZ 23999900/* 23,999,900 ppb */ #define INCVALUE_25MHZ 40#define INCVALUE_SHIFT_25MHZ 18#define INCPERIOD_25MHZ 1 +#define MAX_PPB_25MHZ 599999900/* 599,999,900 ppb */ #define INCVALUE_24MHZ 125#define INCVALUE_SHIFT_24MHZ 14#define INCPERIOD_24MHZ 3 +#define MAX_PPB_24MHZ 999999999/* 999,999,999 ppb */ #define INCVALUE_38400KHZ 26#define INCVALUE_SHIFT_38400KHZ 19#define INCPERIOD_38400KHZ 1 +#define MAX_PPB_38400KHZ 230769100/* 230,769,100 ppb */ /* Another drawback of scaling the incvalue by a large factor is the * 64-bit SYSTIM register overflows more quickly. This is dealt with
drivers/net/ethernet/intel/e1000e/ptp.c +15 -7
@@ -280,8 +280,17 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)switch (hw->mac.type) {case e1000_pch2lan: + adapter->ptp_clock_info.max_adj =MAX_PPB_96MHZ ; +break ;case e1000_pch_lpt: +if (er32 (TSYNCRXCTL ) &E1000_TSYNCRXCTL_SYSCFI ) + adapter->ptp_clock_info.max_adj =MAX_PPB_96MHZ ; +else + adapter->ptp_clock_info.max_adj =MAX_PPB_25MHZ ; +break ;case e1000_pch_spt: + adapter->ptp_clock_info.max_adj =MAX_PPB_24MHZ ; +break ;case e1000_pch_cnp:case e1000_pch_tgp:case e1000_pch_adp:
@@ -289,15 +298,14 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)case e1000_pch_lnp:case e1000_pch_ptp:case e1000_pch_nvp: -if ((hw->mac.type < e1000_pch_lpt) || - (er32 (TSYNCRXCTL ) &E1000_TSYNCRXCTL_SYSCFI )) { - adapter->ptp_clock_info.max_adj =24000000 -1 ; -break ; - } - fallthrough; +if (er32 (TSYNCRXCTL ) &E1000_TSYNCRXCTL_SYSCFI ) + adapter->ptp_clock_info.max_adj =MAX_PPB_24MHZ ; +else + adapter->ptp_clock_info.max_adj =MAX_PPB_38400KHZ ; +break ;case e1000_82574:case e1000_82583: - adapter->ptp_clock_info.max_adj =600000000 -1 ; + adapter->ptp_clock_info.max_adj =MAX_PPB_25MHZ ;break ;default :break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 283/322 ixgbe: Refactor returning internal error codes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jedrzej Jagielski <[email protected]>
[ Upstream commit 5795f533f30a80aa0473652876296ebc9129e33a ]
Change returning codes to the kernel ones instead of the internal ones for the entire ixgbe driver.
Stable-dep-of: bbc404d20d1b ("ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()")
--- .../net/ethernet/intel/ixgbe/ixgbe_82598.c | 36 ++--- .../net/ethernet/intel/ixgbe/ixgbe_82599.c | 61 ++++---- .../net/ethernet/intel/ixgbe/ixgbe_common.c | 145 ++++++++---------- .../net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 26 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c | 34 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 1 - drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 84 +++++----- .../net/ethernet/intel/ixgbe/ixgbe_sriov.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 39 ----- drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c | 44 +++--- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 107 +++++++------ 12 files changed, 264 insertions(+), 317 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +18 -18
@@ -123,14 +123,14 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)if (ret_val)return ret_val;if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) -return IXGBE_ERR_SFP_NOT_SUPPORTED ; +return -EOPNOTSUPP ;/* Check to see if SFP+ module is supported */ ret_val =ixgbe_get_sfp_init_sequence_offsets (hw, &list_offset, &data_offset);if (ret_val) -return IXGBE_ERR_SFP_NOT_SUPPORTED ; +return -EOPNOTSUPP ;break ;default :break ;
@@ -213,7 +213,7 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,break ;default : -return IXGBE_ERR_LINK_SETUP ; +return -EIO ; }return 0 ;
@@ -283,7 +283,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)/* Validate the water mark configuration */ if (!hw->fc.pause_time) -return IXGBE_ERR_INVALID_LINK_SETTINGS ; +return -EINVAL ;/* Low water mark of zero causes XOFF floods */ for (i =0 ; i <MAX_TRAFFIC_CLASS ; i++) {
@@ -292,7 +292,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)if (!hw->fc.low_water[i] || hw->fc.low_water[i] >= hw->fc.high_water[i]) {hw_dbg (hw,"Invalid water mark configuration\n" ); -return IXGBE_ERR_INVALID_LINK_SETTINGS ; +return -EINVAL ; } } }
@@ -369,7 +369,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)break ;default :hw_dbg (hw,"Flow control param set incorrectly\n" ); -return IXGBE_ERR_CONFIG ; +return -EIO ; }/* Set 802.3x based flow control settings. */
@@ -438,7 +438,7 @@ static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,msleep (100 ); }if (!(links_reg &IXGBE_LINKS_KX_AN_COMP )) { - status =IXGBE_ERR_AUTONEG_NOT_COMPLETE ; + status = -EIO ;hw_dbg (hw,"Autonegotiation did not complete.\n" ); } }
@@ -478,7 +478,7 @@ static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)if (timeout ==IXGBE_VALIDATE_LINK_READY_TIMEOUT ) {hw_dbg (hw,"Link was indicated but link is down\n" ); -return IXGBE_ERR_LINK_SETUP ; +return -EIO ; }return 0 ;
@@ -594,7 +594,7 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, speed &= link_capabilities;if (speed ==IXGBE_LINK_SPEED_UNKNOWN ) -return IXGBE_ERR_LINK_SETUP ; +return -EINVAL ;/* Set KX4/KX support according to speed requested */ else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
@@ -701,9 +701,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)/* Init PHY and function pointers, perform SFP setup */ phy_status = hw->phy.ops.init (hw); -if (phy_status ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (phy_status == -EOPNOTSUPP )return phy_status; -if (phy_status ==IXGBE_ERR_SFP_NOT_PRESENT ) +if (phy_status == -ENOENT ) goto mac_reset_top; hw->phy.ops.reset (hw);
@@ -727,7 +727,7 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)udelay (1 ); }if (ctrl &IXGBE_CTRL_RST ) { - status =IXGBE_ERR_RESET_FAILED ; + status = -EIO ;hw_dbg (hw,"Reset polling failed to complete.\n" ); }
@@ -789,7 +789,7 @@ static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)/* Make sure we are using a valid rar index range */ if (rar >= rar_entries) {hw_dbg (hw,"RAR index %d is out of range.\n" , rar); -return IXGBE_ERR_INVALID_ARGUMENT ; +return -EINVAL ; } rar_high =IXGBE_READ_REG (hw,IXGBE_RAH (rar));
@@ -814,7 +814,7 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)/* Make sure we are using a valid rar index range */ if (rar >= rar_entries) {hw_dbg (hw,"RAR index %d is out of range.\n" , rar); -return IXGBE_ERR_INVALID_ARGUMENT ; +return -EINVAL ; } rar_high =IXGBE_READ_REG (hw,IXGBE_RAH (rar));
@@ -845,7 +845,7 @@ static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,u32 vftabyte;if (vlan >4095 ) -return IXGBE_ERR_PARAM ; +return -EINVAL ;/* Determine 32-bit word position in array */ regindex = (vlan >>5 ) &0x7F ;/* upper seven bits */
@@ -964,7 +964,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, gssr =IXGBE_GSSR_PHY0_SM ;if (hw->mac.ops.acquire_swfw_sync (hw, gssr) !=0 ) -return IXGBE_ERR_SWFW_SYNC ; +return -EBUSY ;if (hw->phy.type == ixgbe_phy_nl) {/*
@@ -993,7 +993,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,if (sfp_stat !=IXGBE_I2C_EEPROM_STATUS_PASS ) {hw_dbg (hw,"EEPROM read did not pass.\n" ); - status =IXGBE_ERR_SFP_NOT_PRESENT ; + status = -ENOENT ; goto out; }
@@ -1003,7 +1003,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, *eeprom_data = (u8)(sfp_data >>8 ); }else { - status =IXGBE_ERR_PHY ; + status = -EIO ; } out:
drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +30 -31
233 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +67 -78
508 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +1 -1
@@ -3370,7 +3370,7 @@ static int ixgbe_get_module_eeprom(struct net_device *dev, {struct ixgbe_adapter *adapter =netdev_priv (dev);struct ixgbe_hw *hw = &adapter->hw; -s32 status =IXGBE_ERR_PHY_ADDR_INVALID ; +s32 status = -EFAULT ;u8 databyte =0xFF ;int i =0 ;
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +13 -13
@@ -5512,7 +5512,7 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw) {u32 speed;bool autoneg, link_up = false; -int ret =IXGBE_ERR_LINK_SETUP ; +int ret = -EIO ;if (hw->mac.ops.check_link) ret = hw->mac.ops.check_link (hw, &speed, &link_up, false);
@@ -5983,13 +5983,13 @@ void ixgbe_reset(struct ixgbe_adapter *adapter) err = hw->mac.ops.init_hw (hw);switch (err) {case 0 : -case IXGBE_ERR_SFP_NOT_PRESENT : -case IXGBE_ERR_SFP_NOT_SUPPORTED : +case -ENOENT : +case -EOPNOTSUPP :break ; -case IXGBE_ERR_PRIMARY_REQUESTS_PENDING : +case -EALREADY :e_dev_err ("primary disable timed out\n" );break ; -case IXGBE_ERR_EEPROM_VERSION : +case -EACCES :/* We are running on a pre-production device, log a warning */ e_dev_warn ("This device is a pre-production adapter/LOM. " "Please be aware there may be issues associated with "
@@ -7829,10 +7829,10 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter) adapter->sfp_poll_time = jiffies +IXGBE_SFP_POLL_JIFFIES -1 ; err = hw->phy.ops.identify_sfp (hw); -if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (err == -EOPNOTSUPP ) goto sfp_out; -if (err ==IXGBE_ERR_SFP_NOT_PRESENT ) { +if (err == -ENOENT ) {/* If no cable is present, then we need to reset * the next time we find a good cable. */ adapter->flags2 |=IXGBE_FLAG2_SFP_NEEDS_RESET ;
@@ -7858,7 +7858,7 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)else err = hw->mac.ops.setup_sfp (hw); -if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (err == -EOPNOTSUPP ) goto sfp_out; adapter->flags |=IXGBE_FLAG_NEED_LINK_CONFIG ;
@@ -7867,8 +7867,8 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter) sfp_out:clear_bit (__IXGBE_IN_SFP_INIT, &adapter->state); -if ((err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) && - (adapter->netdev->reg_state ==NETREG_REGISTERED )) { +if (err == -EOPNOTSUPP && + adapter->netdev->reg_state ==NETREG_REGISTERED ) {e_dev_err ("failed to initialize because an unsupported " "SFP+ module type was detected.\n" ); e_dev_err("Reload the driver after installing a "
@@ -10922,9 +10922,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err = hw->mac.ops.reset_hw (hw); hw->phy.reset_if_overtemp = false;ixgbe_set_eee_capable (adapter); -if (err ==IXGBE_ERR_SFP_NOT_PRESENT ) { +if (err == -ENOENT ) { err =0 ; - }else if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) { + }else if (err == -EOPNOTSUPP ) {e_dev_err ("failed to load because an unsupported SFP+ or QSFP module type was detected.\n" );e_dev_err ("Reload the driver after installing a supported module.\n" ); goto err_sw_init;
@@ -11143,7 +11143,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)/* reset the hardware with the new settings */ err = hw->mac.ops.start_hw (hw); -if (err ==IXGBE_ERR_EEPROM_VERSION ) { +if (err == -EACCES ) {/* We are running on a pre-production device, log a warning */ e_dev_warn ("This device is a pre-production adapter/LOM. " "Please be aware there may be issues associated "
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c +17 -17
@@ -24,7 +24,7 @@ s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id) size = mbx->size;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->read (hw, msg, size, mbx_id); }
@@ -43,10 +43,10 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (size > mbx->size) -return IXGBE_ERR_MBX ; +return -EINVAL ;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->write (hw, msg, size, mbx_id); }
@@ -63,7 +63,7 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_msg (hw, mbx_id); }
@@ -80,7 +80,7 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_ack (hw, mbx_id); }
@@ -97,7 +97,7 @@ s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_rst (hw, mbx_id); }
@@ -115,12 +115,12 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)int countdown = mbx->timeout;if (!countdown || !mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;while (mbx->ops->check_for_msg (hw, mbx_id)) { countdown--;if (!countdown) -return IXGBE_ERR_MBX ; +return -EIO ;udelay (mbx->usec_delay); }
@@ -140,12 +140,12 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)int countdown = mbx->timeout;if (!countdown || !mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;while (mbx->ops->check_for_ack (hw, mbx_id)) { countdown--;if (!countdown) -return IXGBE_ERR_MBX ; +return -EIO ;udelay (mbx->usec_delay); }
@@ -169,7 +169,7 @@ static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,s32 ret_val;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ; ret_val =ixgbe_poll_for_msg (hw, mbx_id);if (ret_val)
@@ -197,7 +197,7 @@ static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,/* exit if either we can't write or there isn't a defined timeout */ if (!mbx->ops || !mbx->timeout) -return IXGBE_ERR_MBX ; +return -EIO ;/* send msg */ ret_val = mbx->ops->write (hw, msg, size, mbx_id);
@@ -217,7 +217,7 @@ static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -238,7 +238,7 @@ static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -259,7 +259,7 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -295,7 +295,7 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -317,7 +317,7 @@ static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)if (p2v_mailbox &IXGBE_PFMAILBOX_PFU )return 0 ; -return IXGBE_ERR_MBX ; +return -EIO ; }/**
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h +0 -1
@@ -7,7 +7,6 @@#include "ixgbe_type.h" #define IXGBE_VFMAILBOX_SIZE 16/* 16 32 bit words - 64 bytes */ -#define IXGBE_ERR_MBX -100#define IXGBE_VFMAILBOX 0x002FC#define IXGBE_VFMBMEM 0x00200
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +42 -42
321 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +1 -1
@@ -1329,7 +1329,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)break ;default :e_err (drv,"Unhandled Msg %8.8x\n" , msgbuf[0 ]); - retval =IXGBE_ERR_MBX ; + retval = -EIO ;break ; }
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +0 -39
@@ -3665,45 +3665,6 @@ struct ixgbe_info {const u32 *mvals; }; - -/* Error Codes */ -#define IXGBE_ERR_EEPROM -1 -#define IXGBE_ERR_EEPROM_CHECKSUM -2 -#define IXGBE_ERR_PHY -3 -#define IXGBE_ERR_CONFIG -4 -#define IXGBE_ERR_PARAM -5 -#define IXGBE_ERR_MAC_TYPE -6 -#define IXGBE_ERR_UNKNOWN_PHY -7 -#define IXGBE_ERR_LINK_SETUP -8 -#define IXGBE_ERR_ADAPTER_STOPPED -9 -#define IXGBE_ERR_INVALID_MAC_ADDR -10 -#define IXGBE_ERR_DEVICE_NOT_SUPPORTED -11 -#define IXGBE_ERR_PRIMARY_REQUESTS_PENDING -12 -#define IXGBE_ERR_INVALID_LINK_SETTINGS -13 -#define IXGBE_ERR_AUTONEG_NOT_COMPLETE -14 -#define IXGBE_ERR_RESET_FAILED -15 -#define IXGBE_ERR_SWFW_SYNC -16 -#define IXGBE_ERR_PHY_ADDR_INVALID -17 -#define IXGBE_ERR_I2C -18 -#define IXGBE_ERR_SFP_NOT_SUPPORTED -19 -#define IXGBE_ERR_SFP_NOT_PRESENT -20 -#define IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT -21 -#define IXGBE_ERR_NO_SAN_ADDR_PTR -22 -#define IXGBE_ERR_FDIR_REINIT_FAILED -23 -#define IXGBE_ERR_EEPROM_VERSION -24 -#define IXGBE_ERR_NO_SPACE -25 -#define IXGBE_ERR_OVERTEMP -26 -#define IXGBE_ERR_FC_NOT_NEGOTIATED -27 -#define IXGBE_ERR_FC_NOT_SUPPORTED -28 -#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30 -#define IXGBE_ERR_PBA_SECTION -31 -#define IXGBE_ERR_INVALID_ARGUMENT -32 -#define IXGBE_ERR_HOST_INTERFACE_COMMAND -33 -#define IXGBE_ERR_FDIR_CMD_INCOMPLETE -38 -#define IXGBE_ERR_FW_RESP_INVALID -39 -#define IXGBE_ERR_TOKEN_RETRY -40 -#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF -#define IXGBE_FUSES0_GROUP (_i) (0x11158 + ((_i) * 4))#define IXGBE_FUSES0_300MHZ BIT(5)#define IXGBE_FUSES0_REV_MASK (3u << 6)
drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c +22 -22
173 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +53 -54
409 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 284/322 ixgbe: Refactor overtemp event handling
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jedrzej Jagielski <[email protected]>
[ Upstream commit 6c1b4af8c1b20c70dde01e58381685d6a4a1d2c8 ]
Currently ixgbe driver is notified of overheating events via internal IXGBE_ERR_OVERTEMP error code.
Change the approach for handle_lasi() to use freshly introduced is_overtemp function parameter which set when such event occurs. Change check_overtemp() to bool and return true if overtemp event occurs.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 16 +++----- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 21 +++++----- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 4 +- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 41 +++++++++++-------- 5 files changed, 43 insertions(+), 41 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +6 -10
@@ -2756,7 +2756,6 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;u32 eicr = adapter->interrupt_event; -s32 rc;if (test_bit (__IXGBE_DOWN, &adapter->state))return ;
@@ -2790,14 +2789,13 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter) }/* Check if this is not due to overtemp */ -if (hw->phy.ops.check_overtemp (hw) !=IXGBE_ERR_OVERTEMP ) +if (!hw->phy.ops.check_overtemp (hw))return ;break ;case IXGBE_DEV_ID_X550EM_A_1G_T :case IXGBE_DEV_ID_X550EM_A_1G_T_L : - rc = hw->phy.ops.check_overtemp (hw); -if (rc !=IXGBE_ERR_OVERTEMP ) +if (!hw->phy.ops.check_overtemp (hw))return ;break ;default :
@@ -7938,7 +7936,7 @@ static void ixgbe_service_timer(struct timer_list *t)static void ixgbe_phy_interrupt_subtask (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -u32 status; +bool overtemp;if (!(adapter->flags2 &IXGBE_FLAG2_PHY_INTERRUPT ))return ;
@@ -7948,11 +7946,9 @@ static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)if (!hw->phy.ops.handle_lasi)return ; - status = hw->phy.ops.handle_lasi (&adapter->hw); -if (status !=IXGBE_ERR_OVERTEMP ) -return ; - -e_crit (drv,"%s\n" , ixgbe_overheat_msg); + hw->phy.ops.handle_lasi (&adapter->hw, &overtemp); +if (overtemp) +e_crit (drv,"%s\n" , ixgbe_overheat_msg); }static void ixgbe_reset_subtask (struct ixgbe_adapter *adapter)
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +11 -10
@@ -408,8 +408,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)return status;/* Don't reset PHY if it's shut down due to overtemp. */ -if (!hw->phy.reset_if_overtemp && - (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp (hw))) +if (!hw->phy.reset_if_overtemp && hw->phy.ops.check_overtemp (hw))return 0 ;/* Blocked by MNG FW so bail */
@@ -2748,22 +2747,24 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)* @hw: pointer to hardware structure * * Checks if the LASI temp alarm status was triggered due to overtemp +* +* Return true when an overtemp event detected, otherwise false. **/ -s32 ixgbe_tn_check_overtemp (struct ixgbe_hw *hw) +bool ixgbe_tn_check_overtemp (struct ixgbe_hw *hw) {u16 phy_data =0 ; +u32 status;if (hw->device_id !=IXGBE_DEV_ID_82599_T3_LOM ) -return 0 ; +return false;/* Check that the LASI temp alarm status was triggered */ - hw->phy.ops.read_reg (hw,IXGBE_TN_LASI_STATUS_REG , -MDIO_MMD_PMAPMD , &phy_data); - -if (!(phy_data &IXGBE_TN_LASI_STATUS_TEMP_ALARM )) -return 0 ; + status = hw->phy.ops.read_reg (hw,IXGBE_TN_LASI_STATUS_REG , +MDIO_MMD_PMAPMD , &phy_data); +if (status) +return false; -return IXGBE_ERR_OVERTEMP ; +return !!(phy_data &IXGBE_TN_LASI_STATUS_TEMP_ALARM ); }/** ixgbe_set_copper_phy_power - Control power for copper phy
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +1 -1
@@ -155,7 +155,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);s32 ixgbe_get_sfp_init_sequence_offsets (struct ixgbe_hw *hw,u16 *list_offset,u16 *data_offset); -s32 ixgbe_tn_check_overtemp (struct ixgbe_hw *hw); +bool ixgbe_tn_check_overtemp (struct ixgbe_hw *hw);s32 ixgbe_read_i2c_byte_generic (struct ixgbe_hw *hw,u8 byte_offset,u8 dev_addr,u8 *data); s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +2 -2
@@ -3509,10 +3509,10 @@ struct ixgbe_phy_operations {s32 (*read_i2c_sff8472)(struct ixgbe_hw *,u8 ,u8 *);s32 (*read_i2c_eeprom)(struct ixgbe_hw *,u8 ,u8 *);s32 (*write_i2c_eeprom)(struct ixgbe_hw *,u8 ,u8 ); -s32 (*check_overtemp)(struct ixgbe_hw *); +bool (*check_overtemp)(struct ixgbe_hw *);s32 (*set_phy_power)(struct ixgbe_hw *,bool on);s32 (*enter_lplu)(struct ixgbe_hw *); -s32 (*handle_lasi)(struct ixgbe_hw *hw); +s32 (*handle_lasi)(struct ixgbe_hw *hw,bool *);s32 (*read_i2c_byte_unlocked)(struct ixgbe_hw *,u8 offset,u8 addr,u8 *value); s32 (*write_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +23 -18
117 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 285/322 ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit bbc404d20d1b46d89b461918bc44587620eda200 ]
All error handling paths, except this one, go to 'out' where release_swfw_sync() is called.
This call balances the acquire_swfw_sync() call done at the beginning of the function.
Branch to the error handling path in order to correctly release some resources in case of error.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +2 -1
@@ -717,7 +717,8 @@ static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr, error = (command &IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK ) >>IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT ;hw_dbg (hw,"Failed to read, error %x\n" , error); -return -EIO ; + ret = -EIO ; + goto out; }if (!ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 286/322 net: dsa: qca8k: fix illegal usage of GPIO
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Vokáč <[email protected]>
[ Upstream commit c44fc98f0a8ffd94fa0bd291928e7e312ffc7ca4 ]
When working with GPIO, its direction must be set either when the GPIO is requested by gpiod_get*() or later on by one of the gpiod_direction_*() functions. Neither of this is done here which results in undefined behavior on some systems.
As the reset GPIO is used right after it is requested here, it makes sense to configure it as GPIOD_OUT_HIGH right away. With that, the following gpiod_set_value_cansleep(1) becomes redundant and can be safely removed.
--- drivers/net/dsa/qca/qca8k-8xxx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/dsa/qca/qca8k-8xxx.c +1 -2
@@ -2049,12 +2049,11 @@ qca8k_sw_probe(struct mdio_device *mdiodev) priv->info =of_device_get_match_data (priv->dev); priv->reset_gpio =devm_gpiod_get_optional (priv->dev,"reset" , -GPIOD_ASIS ); +GPIOD_OUT_HIGH );if (IS_ERR (priv->reset_gpio))return PTR_ERR (priv->reset_gpio);if (priv->reset_gpio) { -gpiod_set_value_cansleep (priv->reset_gpio,1 );/* The active low duration must be greater than 10 ms * and checkpatch.pl wants 20 ms. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 287/322 ipv6: Ensure natural alignment of const ipv6 loopback and router addresses
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit 60365049ccbacd101654a66ddcb299abfabd4fc5 ]
On a parisc64 kernel I sometimes notice this kernel warning:
Kernel unaligned access to 0x40ff8814 at ndisc_send_skb+0xc0/0x4d8
The address 0x40ff8814 points to the in6addr_linklocal_allrouters variable and the warning simply means that some ipv6 function tries to read a 64-bit word directly from the not-64-bit aligned in6addr_linklocal_allrouters variable.
Unaligned accesses are non-critical as the architecture or exception handlers usually will fix it up at runtime. Nevertheless it may trigger a performance penality for some architectures. For details read the "unaligned-memory-access" kernel documentation.
The patch below ensures that the ipv6 loopback and router addresses will always be naturally aligned. This prevents the unaligned accesses for all architectures.
--- net/ipv6/addrconf_core.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
net/ipv6/addrconf_core.c +14 -7
@@ -220,19 +220,26 @@ const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {EXPORT_SYMBOL_GPL (ipv6_stub);/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ -const struct in6_addr in6addr_loopback =IN6ADDR_LOOPBACK_INIT ; +const struct in6_addr in6addr_loopback__aligned(BITS_PER_LONG/8) + =IN6ADDR_LOOPBACK_INIT ;EXPORT_SYMBOL (in6addr_loopback); -const struct in6_addr in6addr_any =IN6ADDR_ANY_INIT ; +const struct in6_addr in6addr_any__aligned(BITS_PER_LONG/8) + =IN6ADDR_ANY_INIT ;EXPORT_SYMBOL (in6addr_any); -const struct in6_addr in6addr_linklocal_allnodes =IN6ADDR_LINKLOCAL_ALLNODES_INIT ; +const struct in6_addr in6addr_linklocal_allnodes__aligned(BITS_PER_LONG/8) + =IN6ADDR_LINKLOCAL_ALLNODES_INIT ;EXPORT_SYMBOL (in6addr_linklocal_allnodes); -const struct in6_addr in6addr_linklocal_allrouters =IN6ADDR_LINKLOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_linklocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_LINKLOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_linklocal_allrouters); -const struct in6_addr in6addr_interfacelocal_allnodes =IN6ADDR_INTERFACELOCAL_ALLNODES_INIT ; +const struct in6_addr in6addr_interfacelocal_allnodes__aligned(BITS_PER_LONG/8) + =IN6ADDR_INTERFACELOCAL_ALLNODES_INIT ;EXPORT_SYMBOL (in6addr_interfacelocal_allnodes); -const struct in6_addr in6addr_interfacelocal_allrouters =IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_interfacelocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_interfacelocal_allrouters); -const struct in6_addr in6addr_sitelocal_allrouters =IN6ADDR_SITELOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_sitelocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_SITELOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_sitelocal_allrouters);static void snmp6_free_dev (struct inet6_dev *idev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 288/322 llc: call sock_orphan() at release time
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit aa2b2eb3934859904c287bf5434647ba72e14c1c ]
syzbot reported an interesting trace [1] caused by a stale sk->sk_wq pointer in a closed llc socket.
In commit ff7b11aa481f ("net: socket: set sock->sk to NULL after calling proto_ops::release()") Eric Biggers hinted that some protocols are missing a sock_orphan(), we need to perform a full audit.
In net-next, I plan to clear sock->sk from sock_orphan() and amend Eric patch to add a warning.
[1]
BUG: KASAN: slab-use-after-free in list_empty include/linux/list.h:373 [inline] BUG: KASAN: slab-use-after-free in waitqueue_active include/linux/wait.h:127 [inline] BUG: KASAN: slab-use-after-free in sock_def_write_space_wfree net/core/sock.c:3384 [inline] BUG: KASAN: slab-use-after-free in sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468 Read of size 8 at addr ffff88802f4fc880 by task ksoftirqd/1/27 CPU: 1 PID: 27 Comm: ksoftirqd/1 Not tainted 6.8.0-rc1-syzkaller-00049-g6098d87eaf31 #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:377 [inline] print_report+0xc4/0x620 mm/kasan/report.c:488 kasan_report+0xda/0x110 mm/kasan/report.c:601 list_empty include/linux/list.h:373 [inline] waitqueue_active include/linux/wait.h:127 [inline] sock_def_write_space_wfree net/core/sock.c:3384 [inline] sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468 skb_release_head_state+0xa3/0x2b0 net/core/skbuff.c:1080 skb_release_all net/core/skbuff.c:1092 [inline] napi_consume_skb+0x119/0x2b0 net/core/skbuff.c:1404 e1000_unmap_and_free_tx_resource+0x144/0x200 drivers/net/ethernet/intel/e1000/e1000_main.c:1970 e1000_clean_tx_irq drivers/net/ethernet/intel/e1000/e1000_main.c:3860 [inline] e1000_clean+0x4a1/0x26e0 drivers/net/ethernet/intel/e1000/e1000_main.c:3801 __napi_poll.constprop.0+0xb4/0x540 net/core/dev.c:6576 napi_poll net/core/dev.c:6645 [inline] net_rx_action+0x956/0xe90 net/core/dev.c:6778 __do_softirq+0x21a/0x8de kernel/softirq.c:553 run_ksoftirqd kernel/softirq.c:921 [inline] run_ksoftirqd+0x31/0x60 kernel/softirq.c:913 smpboot_thread_fn+0x660/0xa10 kernel/smpboot.c:164 kthread+0x2c6/0x3a0 kernel/kthread.c:388 ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x11/0x20 arch/x86/entry/entry_64.S:242 </TASK> Allocated by task 5167: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 unpoison_slab_object mm/kasan/common.c:314 [inline] __kasan_slab_alloc+0x81/0x90 mm/kasan/common.c:340 kasan_slab_alloc include/linux/kasan.h:201 [inline] slab_post_alloc_hook mm/slub.c:3813 [inline] slab_alloc_node mm/slub.c:3860 [inline] kmem_cache_alloc_lru+0x142/0x6f0 mm/slub.c:3879 alloc_inode_sb include/linux/fs.h:3019 [inline] sock_alloc_inode+0x25/0x1c0 net/socket.c:308 alloc_inode+0x5d/0x220 fs/inode.c:260 new_inode_pseudo+0x16/0x80 fs/inode.c:1005 sock_alloc+0x40/0x270 net/socket.c:634 __sock_create+0xbc/0x800 net/socket.c:1535 sock_create net/socket.c:1622 [inline] __sys_socket_create net/socket.c:1659 [inline] __sys_socket+0x14c/0x260 net/socket.c:1706 __do_sys_socket net/socket.c:1720 [inline] __se_sys_socket net/socket.c:1718 [inline] __x64_sys_socket+0x72/0xb0 net/socket.c:1718 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b Freed by task 0: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 kasan_save_free_info+0x3f/0x60 mm/kasan/generic.c:640 poison_slab_object mm/kasan/common.c:241 [inline] __kasan_slab_free+0x121/0x1b0 mm/kasan/common.c:257 kasan_slab_free include/linux/kasan.h:184 [inline] slab_free_hook mm/slub.c:2121 [inline] slab_free mm/slub.c:4299 [inline] kmem_cache_free+0x129/0x350 mm/slub.c:4363 i_callback+0x43/0x70 fs/inode.c:249 rcu_do_batch kernel/rcu/tree.c:2158 [inline] rcu_core+0x819/0x1680 kernel/rcu/tree.c:2433 __do_softirq+0x21a/0x8de kernel/softirq.c:553 Last potentially related work creation: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 __kasan_record_aux_stack+0xba/0x100 mm/kasan/generic.c:586 __call_rcu_common.constprop.0+0x9a/0x7b0 kernel/rcu/tree.c:2683 destroy_inode+0x129/0x1b0 fs/inode.c:315 iput_final fs/inode.c:1739 [inline] iput.part.0+0x560/0x7b0 fs/inode.c:1765 iput+0x5c/0x80 fs/inode.c:1755 dentry_unlink_inode+0x292/0x430 fs/dcache.c:400 __dentry_kill+0x1ca/0x5f0 fs/dcache.c:603 dput.part.0+0x4ac/0x9a0 fs/dcache.c:845 dput+0x1f/0x30 fs/dcache.c:835 __fput+0x3b9/0xb70 fs/file_table.c:384 task_work_run+0x14d/0x240 kernel/task_work.c:180 exit_task_work include/linux/task_work.h:38 [inline] do_exit+0xa8a/0x2ad0 kernel/exit.c:871 do_group_exit+0xd4/0x2a0 kernel/exit.c:1020 __do_sys_exit_group kernel/exit.c:1031 [inline] __se_sys_exit_group kernel/exit.c:1029 [inline] __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1029 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b The buggy address belongs to the object at ffff88802f4fc800 which belongs to the cache sock_inode_cache of size 1408
The buggy address is located 128 bytes inside of
freed 1408-byte region [ffff88802f4fc800, ffff88802f4fcd80)
The buggy address belongs to the physical page:
page:ffffea0000bd3e00 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x2f4f8 head:ffffea0000bd3e00 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 anon flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff)page_type: 0xffffffff()
raw: 00fff00000000840 ffff888013b06b40 0000000000000000 0000000000000001 raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 3, migratetype Reclaimable, gfp_mask 0xd20d0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_RECLAIMABLE), pid 4956, tgid 4956 (sshd), ts 31423924727, free_ts 0 set_page_owner include/linux/page_owner.h:31 [inline] post_alloc_hook+0x2d0/0x350 mm/page_alloc.c:1533 prep_new_page mm/page_alloc.c:1540 [inline] get_page_from_freelist+0xa28/0x3780 mm/page_alloc.c:3311 __alloc_pages+0x22f/0x2440 mm/page_alloc.c:4567 __alloc_pages_node include/linux/gfp.h:238 [inline] alloc_pages_node include/linux/gfp.h:261 [inline] alloc_slab_page mm/slub.c:2190 [inline] allocate_slab mm/slub.c:2354 [inline] new_slab+0xcc/0x3a0 mm/slub.c:2407 ___slab_alloc+0x4af/0x19a0 mm/slub.c:3540 __slab_alloc.constprop.0+0x56/0xa0 mm/slub.c:3625 __slab_alloc_node mm/slub.c:3678 [inline] slab_alloc_node mm/slub.c:3850 [inline] kmem_cache_alloc_lru+0x379/0x6f0 mm/slub.c:3879 alloc_inode_sb include/linux/fs.h:3019 [inline] sock_alloc_inode+0x25/0x1c0 net/socket.c:308 alloc_inode+0x5d/0x220 fs/inode.c:260 new_inode_pseudo+0x16/0x80 fs/inode.c:1005 sock_alloc+0x40/0x270 net/socket.c:634 __sock_create+0xbc/0x800 net/socket.c:1535 sock_create net/socket.c:1622 [inline] __sys_socket_create net/socket.c:1659 [inline] __sys_socket+0x14c/0x260 net/socket.c:1706 __do_sys_socket net/socket.c:1720 [inline] __se_sys_socket net/socket.c:1718 [inline] __x64_sys_socket+0x72/0xb0 net/socket.c:1718 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
page_owner free stack trace missing
Memory state around the buggy address:
ffff88802f4fc780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88802f4fc800: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff88802f4fc880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88802f4fc900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88802f4fc980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb--- net/llc/af_llc.c | 2 ++ 1 file changed, 2 insertions(+)
net/llc/af_llc.c +2 -0
@@ -226,6 +226,8 @@ static int llc_ui_release(struct socket *sock) }netdev_put (llc->dev, &llc->dev_tracker);sock_put (sk); +sock_orphan (sk); + sock->sk =NULL ;llc_sk_free (sk); out:return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 289/322 selftests: net: Add missing matchall classifier
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit b40f873a7c80dbafbb6f4a7a569f2dcaf969d283 ]
One of the test cases in the test_bridge_backup_port.sh selftest relies on a matchall classifier to drop unrelated traffic so that the Tx drop counter on the VXLAN device will only be incremented as a result of traffic generated by the test.
However, the configuration option for the matchall classifier is missing from the configuration file which might explain the failures we see in the netdev CI [1].
Fix by adding CONFIG_NET_CLS_MATCHALL to the configuration file.
[1]
# Backup nexthop ID - invalid IDs
# -------------------------------
[...]
# TEST: Forwarding out of vx0 [ OK ] # TEST: No forwarding using backup nexthop ID [ OK ] # TEST: Tx drop increased [FAIL] # TEST: IPv6 address family nexthop as backup nexthop [ OK ] # TEST: No forwarding out of swp1 [ OK ] # TEST: Forwarding out of vx0 [ OK ] # TEST: No forwarding using backup nexthop ID [ OK ] # TEST: Tx drop increased [FAIL]
[...]
--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -52,6 +52,7 @@ CONFIG_NET_ACT_CT=m CONFIG_NET_ACT_GACT=m CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_MATCHALL=m CONFIG_NET_CLS_U32=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IPGRE=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 290/322 bridge: mcast: fix disabled snooping after long uptime
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Lüssing <[email protected]>
[ Upstream commit f5c3eb4b7251baba5cd72c9e93920e710ac8194a ]
The original idea of the delay_time check was to not apply multicast snooping too early when an MLD querier appears. And to instead wait at least for MLD reports to arrive before switching from flooding to group based, MLD snooped forwarding, to avoid temporary packet loss.
However in a batman-adv mesh network it was noticed that after 248 days of uptime 32bit MIPS based devices would start to signal that they had stopped applying multicast snooping due to missing queriers - even though they were the elected querier and still sending MLD queries themselves.
While time_is_before_jiffies() generally is safe against jiffies wrap-arounds, like the code comments in jiffies.h explain, it won't be able to track a difference larger than ULONG_MAX/2. With a 32bit large jiffies and one jiffies tick every 10ms (CONFIG_HZ=100) on these MIPS devices running OpenWrt this would result in a difference larger than ULONG_MAX/2 after 248 (= 2^32/100/60/60/24/2) days and time_is_before_jiffies() would then start to return false instead of true. Leading to multicast snooping not being applied to multicast packets anymore.
Fix this issue by using a proper timer_list object which won't have this ULONG_MAX/2 difference limitation.
--- net/bridge/br_multicast.c | 20 +++++++++++++++----- net/bridge/br_private.h | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-)
net/bridge/br_multicast.c +15 -5
@@ -1761,6 +1761,10 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t) }#endif +static void br_multicast_query_delay_expired (struct timer_list *t) +{ +} +static void br_multicast_select_own_querier (struct net_bridge_mcast *brmctx,struct br_ip *ip,struct sk_buff *skb)
@@ -3197,7 +3201,7 @@ br_multicast_update_query_timer(struct net_bridge_mcast *brmctx, unsigned long max_delay) {if (!timer_pending (&query->timer)) - query->delay_time = jiffies + max_delay; +mod_timer (&query->delay_timer, jiffies + max_delay);mod_timer (&query->timer, jiffies + brmctx->multicast_querier_interval); }
@@ -4040,13 +4044,11 @@ void br_multicast_ctx_init(struct net_bridge *br, brmctx->multicast_querier_interval =255 *HZ ; brmctx->multicast_membership_interval =260 *HZ ; - brmctx->ip4_other_query.delay_time =0 ; brmctx->ip4_querier.port_ifidx =0 ;seqcount_spinlock_init (&brmctx->ip4_querier.seq, &br->multicast_lock); brmctx->multicast_igmp_version =2 ;#if IS_ENABLED (CONFIG_IPV6 ) brmctx->multicast_mld_version =1 ; - brmctx->ip6_other_query.delay_time =0 ; brmctx->ip6_querier.port_ifidx =0 ;seqcount_spinlock_init (&brmctx->ip6_querier.seq, &br->multicast_lock);#endif
@@ -4055,6 +4057,8 @@ void br_multicast_ctx_init(struct net_bridge *br, br_ip4_multicast_local_router_expired, 0);timer_setup (&brmctx->ip4_other_query.timer, br_ip4_multicast_querier_expired,0 ); +timer_setup (&brmctx->ip4_other_query.delay_timer, + br_multicast_query_delay_expired,0 );timer_setup (&brmctx->ip4_own_query.timer, br_ip4_multicast_query_expired,0 );#if IS_ENABLED (CONFIG_IPV6 )
@@ -4062,6 +4066,8 @@ void br_multicast_ctx_init(struct net_bridge *br, br_ip6_multicast_local_router_expired, 0);timer_setup (&brmctx->ip6_other_query.timer, br_ip6_multicast_querier_expired,0 ); +timer_setup (&brmctx->ip6_other_query.delay_timer, + br_multicast_query_delay_expired,0 );timer_setup (&brmctx->ip6_own_query.timer, br_ip6_multicast_query_expired,0 );#endif
@@ -4196,10 +4202,12 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx) {del_timer_sync (&brmctx->ip4_mc_router_timer);del_timer_sync (&brmctx->ip4_other_query.timer); +del_timer_sync (&brmctx->ip4_other_query.delay_timer);del_timer_sync (&brmctx->ip4_own_query.timer);#if IS_ENABLED (CONFIG_IPV6 )del_timer_sync (&brmctx->ip6_mc_router_timer);del_timer_sync (&brmctx->ip6_other_query.timer); +del_timer_sync (&brmctx->ip6_other_query.delay_timer);del_timer_sync (&brmctx->ip6_own_query.timer);#endif }
@@ -4642,13 +4650,15 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val) max_delay = brmctx->multicast_query_response_interval;if (!timer_pending (&brmctx->ip4_other_query.timer)) - brmctx->ip4_other_query.delay_time = jiffies + max_delay; +mod_timer (&brmctx->ip4_other_query.delay_timer, + jiffies + max_delay);br_multicast_start_querier (brmctx, &brmctx->ip4_own_query);#if IS_ENABLED (CONFIG_IPV6 )if (!timer_pending (&brmctx->ip6_other_query.timer)) - brmctx->ip6_other_query.delay_time = jiffies + max_delay; +mod_timer (&brmctx->ip6_other_query.delay_timer, + jiffies + max_delay);br_multicast_start_querier (brmctx, &brmctx->ip6_own_query);#endif
net/bridge/br_private.h +2 -2
@@ -78,7 +78,7 @@ struct bridge_mcast_own_query {/* other querier */ struct bridge_mcast_other_query {struct timer_list timer; -unsigned long delay_time; +struct timer_list delay_timer; };/* selected querier */
@@ -1149,7 +1149,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx, own_querier_enabled = false; } -return time_is_before_jiffies (querier->delay_time) && +return !timer_pending (&querier->delay_timer) && (own_querier_enabled ||timer_pending (&querier->timer)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 291/322 devlink: Fix referring to hw_addr attribute during state validation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Parav Pandit <[email protected]>
[ Upstream commit 1a89e24f8bfd3e3562d69709c9d9cd185ded869b ]
When port function state change is requested, and when the driver does not support it, it refers to the hw address attribute instead of state attribute. Seems like a copy paste error.
Fix it by referring to the port function state attribute.
--- net/devlink/port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/devlink/port.c +1 -1
@@ -665,7 +665,7 @@ static int devlink_port_function_validate(struct devlink_port *devlink_port,return -EOPNOTSUPP ; }if (tb[DEVLINK_PORT_FN_ATTR_STATE ] && !ops->port_fn_state_set) { -NL_SET_ERR_MSG_ATTR (extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR ], +NL_SET_ERR_MSG_ATTR (extack, tb[DEVLINK_PORT_FN_ATTR_STATE ],"Function does not support state setting" );return -EOPNOTSUPP ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 292/322 selftests: net: add missing config for GENEVE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias May <[email protected]>
[ Upstream commit c9ec85153fea6873c52ed4f5055c87263f1b54f9 ]
l2_tos_ttl_inherit.sh verifies the inheritance of tos and ttl for GRETAP, VXLAN and GENEVE.
Before testing it checks if the required module is available and if not skips the tests accordingly.
Currently only GRETAP and VXLAN are tested because the GENEVE module is missing.
--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -19,6 +19,7 @@ CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_BRIDGE=y CONFIG_CRYPTO_CHACHA20POLY1305=m CONFIG_VLAN_8021Q=y +CONFIG_GENEVE=m CONFIG_IFB=y CONFIG_INET_DIAG=y CONFIG_IP_GRE=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 293/322 netfilter: conntrack: correct window scaling with retransmitted SYN
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryan Schaefer <[email protected]>
[ Upstream commit fb366fc7541a1de521ab3df58471746aa793b833 ]
commit c7aab4f17021 ("netfilter: nf_conntrack_tcp: re-init for syn packets only") introduces a bug where SYNs in ORIGINAL direction on reused 5-tuple result in incorrect window scale negotiation. This commit merged the SYN re-initialization and simultaneous open or SYN retransmits cases. Merging this block added the logic in tcp_init_sender() that performed window scale negotiation to the retransmitted syn case. Previously. this would only result in updating the sender's scale and flags. After the merge the additional logic results in improperly clearing the scale in ORIGINAL direction before any packets in the REPLY direction are received. This results in packets incorrectly being marked invalid for being out-of-window.
This can be reproduced with the following trace:
Packet Sequence:
Quoted 2 lines
Flags [S], seq 1687765604, win 62727, options [.. wscale 7], length 0 Flags [S], seq 1944817196, win 62727, options [.. wscale 7], length 0
In order to fix the issue, only evaluate window negotiation for packets in the REPLY direction. This was tested with simultaneous open, fast open, and the above reproduction.
--- net/netfilter/nf_conntrack_proto_tcp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/netfilter/nf_conntrack_proto_tcp.c +6 -4
@@ -457,7 +457,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,const struct sk_buff *skb, unsigned int dataoff, const struct tcphdr *tcph, - u32 end, u32 win) + u32 end, u32 win, + enum ip_conntrack_dir dir) {/* SYN-ACK in reply to a SYN * or SYN from reply direction in simultaneous open.
@@ -471,7 +472,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,* Both sides must send the Window Scale option * to enable window scaling in either direction. */ -if (!(sender->flags &IP_CT_TCP_FLAG_WINDOW_SCALE && +if (dir ==IP_CT_DIR_REPLY && + !(sender->flags &IP_CT_TCP_FLAG_WINDOW_SCALE && receiver->flags &IP_CT_TCP_FLAG_WINDOW_SCALE )) { sender->td_scale =0 ; receiver->td_scale =0 ;
@@ -542,7 +544,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,if (tcph->syn) {tcp_init_sender (sender, receiver, skb, dataoff, tcph, - end, win); + end, win, dir);if (!tcph->ack)/* Simultaneous open */ return NFCT_TCP_ACCEPT ;
@@ -585,7 +587,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,*/ tcp_init_sender (sender, receiver, skb, dataoff, tcph, - end, win); + end, win, dir);if (dir ==IP_CT_DIR_REPLY && !tcph->ack)return NFCT_TCP_ACCEPT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 294/322 netfilter: nf_tables: restrict tunnel object to NFPROTO_NETDEV
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 776d451648443f9884be4a1b4e38e8faf1c621f9 ]
Bail out on using the tunnel dst template from other than netdev family. Add the infrastructure to check for the family in objects.
--- include/net/netfilter/nf_tables.h | 2 ++ net/netfilter/nf_tables_api.c | 14 +++++++++----- net/netfilter/nft_tunnel.c | 1 + 3 files changed, 12 insertions(+), 5 deletions(-)
include/net/netfilter/nf_tables.h +2 -0
@@ -1307,6 +1307,7 @@ void nft_obj_notify(struct net *net, const struct nft_table *table,* @type: stateful object numeric type * @owner: module owner * @maxattr: maximum netlink attribute +* @family: address family for AF-specific object types * @policy: netlink attribute policy */ struct nft_object_type {
@@ -1316,6 +1317,7 @@ struct nft_object_type {struct list_head list;u32 type;unsigned int maxattr; +u8 family;struct module *owner;const struct nla_policy *policy; };
net/netfilter/nf_tables_api.c +9 -5
@@ -7415,11 +7415,15 @@ static int nft_object_dump(struct sk_buff *skb, unsigned int attr,return -1 ; } -static const struct nft_object_type *__nft_obj_type_get (u32 objtype) +static const struct nft_object_type *__nft_obj_type_get (u32 objtype,u8 family) {const struct nft_object_type *type;list_for_each_entry (type, &nf_tables_objects, list) { +if (type->family !=NFPROTO_UNSPEC && + type->family != family) +continue ; +if (objtype == type->type)return type; }
@@ -7427,11 +7431,11 @@ static const struct nft_object_type *__nft_obj_type_get(u32 objtype) }static const struct nft_object_type * -nft_obj_type_get (struct net *net,u32 objtype) +nft_obj_type_get (struct net *net,u32 objtype,u8 family) {const struct nft_object_type *type; - type =__nft_obj_type_get (objtype); + type =__nft_obj_type_get (objtype, family);if (type !=NULL &&try_module_get (type->owner))return type;
@@ -7524,7 +7528,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (info->nlh->nlmsg_flags &NLM_F_REPLACE )return -EOPNOTSUPP ; - type =__nft_obj_type_get (objtype); + type =__nft_obj_type_get (objtype, family);if (WARN_ON_ONCE (!type))return -ENOENT ;
@@ -7538,7 +7542,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (!nft_use_inc (&table->use))return -EMFILE ; - type =nft_obj_type_get (net, objtype); + type =nft_obj_type_get (net, objtype, family);if (IS_ERR (type)) { err =PTR_ERR (type); goto err_type;
net/netfilter/nft_tunnel.c +1 -0
@@ -713,6 +713,7 @@ static const struct nft_object_ops nft_tunnel_obj_ops = {static struct nft_object_type nft_tunnel_obj_type__read_mostly = { .type =NFT_OBJECT_TUNNEL , + .family =NFPROTO_NETDEV , .ops = &nft_tunnel_obj_ops, .maxattr =NFTA_TUNNEL_KEY_MAX , .policy = nft_tunnel_key_policy,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 295/322 netfilter: ipset: fix performance regression in swap operation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
[ Upstream commit 97f7cf1cd80eeed3b7c808b7c12463295c751001 ]
The patch "netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test", commit 28628fa9 fixes a race condition. But the synchronize_rcu() added to the swap function unnecessarily slows it down: it can safely be moved to destroy and use call_rcu() instead.
Eric Dumazet pointed out that simply calling the destroy functions as rcu callback does not work: sets with timeout use garbage collectors which need cancelling at destroy which can wait. Therefore the destroy functions are split into two: cancelling garbage collectors safely at executing the command received by netlink and moving the remaining part only into the rcu callback.
--- include/linux/netfilter/ipset/ip_set.h | 4 +++ net/netfilter/ipset/ip_set_bitmap_gen.h | 14 ++++++++-- net/netfilter/ipset/ip_set_core.c | 37 +++++++++++++++++++------ net/netfilter/ipset/ip_set_hash_gen.h | 15 ++++++++-- net/netfilter/ipset/ip_set_list_set.c | 13 +++++++-- 5 files changed, 65 insertions(+), 18 deletions(-)
include/linux/netfilter/ipset/ip_set.h +4 -0
@@ -186,6 +186,8 @@ struct ip_set_type_variant {/* Return true if "b" set is the same as "a" * according to the create set parameters */ bool (*same_set)(const struct ip_set *a,const struct ip_set *b); +/* Cancel ongoing garbage collectors before destroying the set*/ +void (*cancel_gc)(struct ip_set *set);/* Region-locking is used */ bool region_lock; };
@@ -242,6 +244,8 @@ extern void ip_set_type_unregister(struct ip_set_type *set_type);/* A generic IP set */ struct ip_set { +/* For call_cru in destroy */ +struct rcu_head rcu;/* The name of the set */ char name[IPSET_MAXNAMELEN ];/* Lock protecting the set data */
net/netfilter/ipset/ip_set_bitmap_gen.h +11 -3
@@ -28,6 +28,7 @@#define mtype_del IPSET_TOKEN(MTYPE, _del)#define mtype_list IPSET_TOKEN(MTYPE, _list)#define mtype_gc IPSET_TOKEN(MTYPE, _gc) +#define mtype_cancel_gc IPSET_TOKEN(MTYPE, _cancel_gc)#define mtype MTYPE#define get_ext (set, map, id) ((map)->extensions + ((set)->dsize * (id)))
@@ -57,9 +58,6 @@ mtype_destroy(struct ip_set *set) {struct mtype *map = set->data; -if (SET_WITH_TIMEOUT (set)) -del_timer_sync (&map->gc); -if (set->dsize && set->extensions &IPSET_EXT_DESTROY )mtype_ext_cleanup (set);ip_set_free (map->members);
@@ -288,6 +286,15 @@ mtype_gc(struct timer_list *t)add_timer (&map->gc); } +static void +mtype_cancel_gc (struct ip_set *set) +{ +struct mtype *map = set->data; + +if (SET_WITH_TIMEOUT (set)) +del_timer_sync (&map->gc); +} +static const struct ip_set_type_variant mtype = { .kadt = mtype_kadt, .uadt = mtype_uadt,
@@ -301,6 +308,7 @@ static const struct ip_set_type_variant mtype = { .head = mtype_head, .list = mtype_list, .same_set = mtype_same_set, + .cancel_gc = mtype_cancel_gc, };#endif /* __IP_SET_BITMAP_IP_GEN_H */
net/netfilter/ipset/ip_set_core.c +28 -9
@@ -1182,6 +1182,14 @@ ip_set_destroy_set(struct ip_set *set)kfree (set); } +static void +ip_set_destroy_set_rcu (struct rcu_head *head) +{ + struct ip_set *set = container_of(head, struct ip_set, rcu); + +ip_set_destroy_set (set); +} +static int ip_set_destroy (struct sk_buff *skb,const struct nfnl_info *info,const struct nlattr *const attr[]) {
@@ -1193,8 +1201,6 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,if (unlikely (protocol_min_failed (attr)))return -IPSET_ERR_PROTOCOL ; -/* Must wait for flush to be really finished in list:set */ -rcu_barrier ();/* Commands are serialized and references are * protected by the ip_set_ref_lock.
@@ -1206,8 +1212,10 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info,* counter, so if it's already zero, we can proceed * without holding the lock. */ -read_lock_bh (&ip_set_ref_lock);if (!attr[IPSET_ATTR_SETNAME ]) { +/* Must wait for flush to be really finished in list:set */ +rcu_barrier (); +read_lock_bh (&ip_set_ref_lock);for (i =0 ; i < inst->ip_set_max; i++) { s =ip_set (inst, i);if (s && (s->ref || s->ref_netlink)) {
@@ -1221,6 +1229,8 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info, s =ip_set (inst, i);if (s) {ip_set (inst, i) =NULL ; +/* Must cancel garbage collectors */ + s->variant->cancel_gc (s);ip_set_destroy_set (s); } }
@@ -1228,6 +1238,9 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info, inst->is_destroyed = false; }else {u32 flags =flag_exist (info->nlh); +u16 features =0 ; + +read_lock_bh (&ip_set_ref_lock); s =find_set_and_id (inst,nla_data (attr[IPSET_ATTR_SETNAME ]), &i);if (!s) {
@@ -1238,10 +1251,16 @@ static int ip_set_destroy(struct sk_buff *skb, const struct nfnl_info *info, ret = -IPSET_ERR_BUSY ; goto out; } + features = s->type->features;ip_set (inst, i) =NULL ;read_unlock_bh (&ip_set_ref_lock); - -ip_set_destroy_set (s); +if (features &IPSET_TYPE_NAME ) { +/* Must wait for flush to be really finished */ +rcu_barrier (); + } +/* Must cancel garbage collectors */ + s->variant->cancel_gc (s); +call_rcu (&s->rcu, ip_set_destroy_set_rcu); }return 0 ; out:
@@ -1394,9 +1413,6 @@ static int ip_set_swap(struct sk_buff *skb, const struct nfnl_info *info,ip_set (inst, to_id) = from;write_unlock_bh (&ip_set_ref_lock); -/* Make sure all readers of the old set pointers are completed. */ -synchronize_rcu (); -return 0 ; }
@@ -2409,8 +2425,11 @@ ip_set_fini(void) {nf_unregister_sockopt (&so_set);nfnetlink_subsys_unregister (&ip_set_netlink_subsys); -unregister_pernet_subsys (&ip_set_net_ops); + +/* Wait for call_rcu() in destroy */ +rcu_barrier (); +pr_debug ("these are the famous last words\n" ); }
net/netfilter/ipset/ip_set_hash_gen.h +12 -3
@@ -221,6 +221,7 @@ static const union nf_inet_addr zeromask = {};#undef mtype_gc_do#undef mtype_gc#undef mtype_gc_init +#undef mtype_cancel_gc#undef mtype_variant#undef mtype_data_match
@@ -265,6 +266,7 @@ static const union nf_inet_addr zeromask = {};#define mtype_gc_do IPSET_TOKEN(MTYPE, _gc_do)#define mtype_gc IPSET_TOKEN(MTYPE, _gc)#define mtype_gc_init IPSET_TOKEN(MTYPE, _gc_init) +#define mtype_cancel_gc IPSET_TOKEN(MTYPE, _cancel_gc)#define mtype_variant IPSET_TOKEN(MTYPE, _variant)#define mtype_data_match IPSET_TOKEN(MTYPE, _data_match)
@@ -449,9 +451,6 @@ mtype_destroy(struct ip_set *set)struct htype *h = set->data;struct list_head *l, *lt; -if (SET_WITH_TIMEOUT (set)) -cancel_delayed_work_sync (&h->gc.dwork); -mtype_ahash_destroy (set,ipset_dereference_nfnl (h->table), true);list_for_each_safe (l, lt, &h->ad) {list_del (l);
@@ -598,6 +597,15 @@ mtype_gc_init(struct htable_gc *gc)queue_delayed_work (system_power_efficient_wq, &gc->dwork,HZ ); } +static void +mtype_cancel_gc (struct ip_set *set) +{ +struct htype *h = set->data; + +if (SET_WITH_TIMEOUT (set)) +cancel_delayed_work_sync (&h->gc.dwork); +} +static int mtype_add (struct ip_set *set,void *value,const struct ip_set_ext *ext,struct ip_set_ext *mext,u32 flags);
@@ -1440,6 +1448,7 @@ static const struct ip_set_type_variant mtype_variant = { .uref = mtype_uref, .resize = mtype_resize, .same_set = mtype_same_set, + .cancel_gc = mtype_cancel_gc, .region_lock = true, };
net/netfilter/ipset/ip_set_list_set.c +10 -3
@@ -426,9 +426,6 @@ list_set_destroy(struct ip_set *set)struct list_set *map = set->data;struct set_elem *e, *n; -if (SET_WITH_TIMEOUT (set)) -timer_shutdown_sync (&map->gc); -list_for_each_entry_safe (e, n, &map->members, list) {list_del (&e->list);ip_set_put_byindex (map->net, e->id);
@@ -545,6 +542,15 @@ list_set_same_set(const struct ip_set *a, const struct ip_set *b) a->extensions == b->extensions; } +static void +list_set_cancel_gc (struct ip_set *set) +{ +struct list_set *map = set->data; + +if (SET_WITH_TIMEOUT (set)) +timer_shutdown_sync (&map->gc); +} +static const struct ip_set_type_variant set_variant = { .kadt = list_set_kadt, .uadt = list_set_uadt,
@@ -558,6 +564,7 @@ static const struct ip_set_type_variant set_variant = { .head = list_set_head, .list = list_set_list, .same_set = list_set_same_set, + .cancel_gc = list_set_cancel_gc, }; static void
Signature · 1 line
2.43.0
Re: [PATCH 6.6 295/322] netfilter: ipset: fix performance regression in swap operation
Quoted 13 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
[ Upstream commit
97f7cf1cd80eeed3b7c808b7c12463295c751001]The patch "netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test", commit
28628fa9fixes a race condition. But thesynchronize_rcu()added to the swap function unnecessarily slows it down: it can safely be moved to destroy and usecall_rcu()instead.
Quoted 6 lines
Eric Dumazet pointed out that simply calling the destroy functions as rcu callback does not work: sets with timeout use garbage collectors which need cancelling at destroy which can wait. Therefore the destroy functions are split into two: cancelling garbage collectors safely at executing the command received by netlink and moving the remaining part only into the rcu callback.
Hi,
Стас Ничипорович <[email protected]> reported ipset kernel panic with this patch [1]. He noted that reverting it fixed the regression.
Thanks.
[1]: https://lore.kernel.org/stable/CAH37n11s_8qjBaDrao3PKct4FriCWNXHWBBHe-ddMYHSw4wK0Q@mail.gmail.com/
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Greg Kroah-Hartman
maintainerRe: [PATCH 6.6 295/322] netfilter: ipset: fix performance regression in swap operation
Quoted 21 lines · Bagas Sanjaya
Quoted 13 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
[ Upstream commit
97f7cf1cd80eeed3b7c808b7c12463295c751001]The patch "netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test", commit
28628fa9fixes a race condition. But thesynchronize_rcu()added to the swap function unnecessarily slows it down: it can safely be moved to destroy and usecall_rcu()instead.Quoted 6 lines
Eric Dumazet pointed out that simply calling the destroy functions as rcu callback does not work: sets with timeout use garbage collectors which need cancelling at destroy which can wait. Therefore the destroy functions are split into two: cancelling garbage collectors safely at executing the command received by netlink and moving the remaining part only into the rcu callback.
Quoted 8 lines
Hi,
Стас Ничипорович <[email protected]> reported ipset kernel panic with this patch [1]. He noted that reverting it fixed the regression.
Thanks.
[1]: https://lore.kernel.org/stable/CAH37n11s_8qjBaDrao3PKct4FriCWNXHWBBHe-ddMYHSw4wK0Q@mail.gmail.com/
Is this also an issue in Linus's tree?
thanks,
greg k-h
Re: [PATCH 6.6 295/322] netfilter: ipset: fix performance regression in swap operation
Quoted 12 lines · Greg Kroah-Hartman
Quoted 8 lines · Bagas Sanjaya
Hi,
Стас Ничипорович <[email protected]> reported ipset kernel panic with this patch [1]. He noted that reverting it fixed the regression.
Thanks.
[1]: https://lore.kernel.org/stable/CAH37n11s_8qjBaDrao3PKct4FriCWNXHWBBHe-ddMYHSw4wK0Q@mail.gmail.com/
Is this also an issue in Linus's tree?
Hi Greg,
The reporter had confirmed [1] the issue on mainline.
Thanks.
[1]: https://lore.kernel.org/stable/CAH37n11rbpaxzmt03FXQpC0Ue=_J4W4eG12PxvF3ung+uLv8Qg@mail.gmail.com/
Signature · 1 line
An old man doll... just what I always wanted! - Clara
Re: [PATCH 6.6 295/322] netfilter: ipset: fix performance regression in swap operation
In reply to Greg Kroah-HartmanQuoted 24 lines · Greg Kroah-Hartman
Quoted 23 lines · Bagas Sanjaya
Quoted 13 lines · Greg Kroah-Hartman
6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jozsef Kadlecsik <[email protected]>
[ Upstream commit
97f7cf1cd80eeed3b7c808b7c12463295c751001]The patch "netfilter: ipset: fix race condition between swap/destroy and kernel side add/del/test", commit
28628fa9fixes a race condition. But thesynchronize_rcu()added to the swap function unnecessarily slows it down: it can safely be moved to destroy and usecall_rcu()instead.Quoted 6 lines
Eric Dumazet pointed out that simply calling the destroy functions as rcu callback does not work: sets with timeout use garbage collectors which need cancelling at destroy which can wait. Therefore the destroy functions are split into two: cancelling garbage collectors safely at executing the command received by netlink and moving the remaining part only into the rcu callback.
Hi,
Quoted 8 lines
Quoted 6 lines
Стас Ничипорович <[email protected]> reported ipset kernel panic with this patch [1]. He noted that reverting it fixed the regression.
Thanks.
[1]: https://lore.kernel.org/stable/CAH37n11s_8qjBaDrao3PKct4FriCWNXHWBBHe-ddMYHSw4wK0Q@mail.gmail.com/
Is this also an issue in Linus's tree?
I'm going to send a patch in my next email which fixes the issue. Sorry, splitting the destroy operation into two halves was not taken into account at every location.
Best regards,
Jozsef
Signature · 4 lines
E-mail : [email protected], [email protected] PGP key : https://wigner.hu/~kadlec/pgp_public_key.txt Address : Wigner Research Centre for Physics H-1525 Budapest 114, POB. 49, Hungary
Greg Kroah-Hartman
maintainerPATCH 296/322 netfilter: nf_log: replace BUG_ON by WARN_ON_ONCE when putting logger
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 259eb32971e9eb24d1777a28d82730659f50fdcb ]
Module reference is bumped for each user, this should not ever happen.
But BUG_ON check should use rcu_access_pointer() instead.
If this ever happens, do WARN_ON_ONCE() instead of BUG_ON() and consolidate pointer check under the rcu read side lock section.
--- net/netfilter/nf_log.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/netfilter/nf_log.c +4 -3
@@ -193,11 +193,12 @@ void nf_logger_put(int pf, enum nf_log_type type)return ; } -BUG_ON (loggers[pf][type] ==NULL ); -rcu_read_lock (); logger =rcu_dereference (loggers[pf][type]); -module_put (logger->me); +if (!logger) +WARN_ON_ONCE (1 ); +else +module_put (logger->me);rcu_read_unlock (); }EXPORT_SYMBOL_GPL (nf_logger_put);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 297/322 netfilter: nft_ct: sanitize layer 3 and 4 protocol number in custom expectations
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 8059918a1377f2f1fff06af4f5a4ed3d5acd6bc4 ]
- Disallow families other than NFPROTO_{IPV4,IPV6,INET}.
- Disallow layer 4 protocol with no ports, since destination port is a mandatory attribute for this object.
--- net/netfilter/nft_ct.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
net/netfilter/nft_ct.c +24 -0
@@ -1250,7 +1250,31 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,if (tb[NFTA_CT_EXPECT_L3PROTO ]) priv->l3num =ntohs (nla_get_be16 (tb[NFTA_CT_EXPECT_L3PROTO ])); +switch (priv->l3num) { +case NFPROTO_IPV4 : +case NFPROTO_IPV6 : +if (priv->l3num != ctx->family) +return -EINVAL ; + + fallthrough; +case NFPROTO_INET : +break ; +default : +return -EOPNOTSUPP ; + } + priv->l4proto =nla_get_u8 (tb[NFTA_CT_EXPECT_L4PROTO ]); +switch (priv->l4proto) { +case IPPROTO_TCP : +case IPPROTO_UDP : +case IPPROTO_UDPLITE : +case IPPROTO_DCCP : +case IPPROTO_SCTP : +break ; +default : +return -EOPNOTSUPP ; + } + priv->dport =nla_get_be16 (tb[NFTA_CT_EXPECT_DPORT ]); priv->timeout =nla_get_u32 (tb[NFTA_CT_EXPECT_TIMEOUT ]); priv->size =nla_get_u8 (tb[NFTA_CT_EXPECT_SIZE ]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 298/322 net: ipv4: fix a memleak in ip_setup_cork
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 5dee6d6923458e26966717f2a3eae7d09fc10bf6 ]
When inetdev_valid_mtu fails, cork->opt should be freed if it is allocated in ip_setup_cork. Otherwise there could be a memleak.
--- net/ipv4/ip_output.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/ipv4/ip_output.c +6 -6
@@ -1285,6 +1285,12 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,if (unlikely (!rt))return -EFAULT ; + cork->fragsize =ip_sk_use_pmtu (sk) ? +dst_mtu (&rt->dst) :READ_ONCE (rt->dst.dev->mtu); + +if (!inetdev_valid_mtu (cork->fragsize)) +return -ENETUNREACH ; +/* * setup for corking. */
@@ -1301,12 +1307,6 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, cork->addr = ipc->addr; } - cork->fragsize =ip_sk_use_pmtu (sk) ? -dst_mtu (&rt->dst) :READ_ONCE (rt->dst.dev->mtu); - -if (!inetdev_valid_mtu (cork->fragsize)) -return -ENETUNREACH ; - cork->gso_size = ipc->gso_size; cork->dst = &rt->dst;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 299/322 af_unix: fix lockdep positive in sk_diag_dump_icons()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4d322dce82a1d44f8c83f0f54f95dd1b8dcf46c9 ]
syzbot reported a lockdep splat [1].
Blamed commit hinted about the possible lockdep
violation, and code used unix_state_lock_nested()
in an attempt to silence lockdep.
It is not sufficient, because unix_state_lock_nested() is already used from unix_state_double_lock().
We need to use a separate subclass.
This patch adds a distinct enumeration to make things more explicit.
Also use swap() in unix_state_double_lock() as a clean up.
v2: add a missing inline keyword to unix_state_lock_nested()
[1]
WARNING: possible circular locking dependency detected 6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0 Not tainted
syz-executor.1/2542 is trying to acquire lock:
ffff88808b5df9e8 (rlock-AF_UNIX){+.+.}-{2:2}, at: skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
but task is already holding lock:
ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&u->lock/1){+.+.}-{2:2}:
lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
_raw_spin_lock_nested+0x31/0x40 kernel/locking/spinlock.c:378
sk_diag_dump_icons net/unix/diag.c:87 [inline]
sk_diag_fill+0x6ea/0xfe0 net/unix/diag.c:157
sk_diag_dump net/unix/diag.c:196 [inline]
unix_diag_dump+0x3e9/0x630 net/unix/diag.c:220
netlink_dump+0x5c1/0xcd0 net/netlink/af_netlink.c:2264
__netlink_dump_start+0x5d7/0x780 net/netlink/af_netlink.c:2370
netlink_dump_start include/linux/netlink.h:338 [inline]
unix_diag_handler_dump+0x1c3/0x8f0 net/unix/diag.c:319
sock_diag_rcv_msg+0xe3/0x400
netlink_rcv_skb+0x1df/0x430 net/netlink/af_netlink.c:2543
sock_diag_rcv+0x2a/0x40 net/core/sock_diag.c:280
netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
netlink_unicast+0x7e6/0x980 net/netlink/af_netlink.c:1367
netlink_sendmsg+0xa37/0xd70 net/netlink/af_netlink.c:1908
sock_sendmsg_nosec net/socket.c:730 [inline]
__sock_sendmsg net/socket.c:745 [inline]
sock_write_iter+0x39a/0x520 net/socket.c:1160
call_write_iter include/linux/fs.h:2085 [inline]
new_sync_write fs/read_write.c:497 [inline]
vfs_write+0xa74/0xca0 fs/read_write.c:590
ksys_write+0x1a0/0x2c0 fs/read_write.c:643
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x63/0x6b-> #0 (rlock-AF_UNIX){+.+.}-{2:2}:
check_prev_add kernel/locking/lockdep.c:3134 [inline]
check_prevs_add kernel/locking/lockdep.c:3253 [inline]
validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869
__lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137
lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112
sock_sendmsg_nosec net/socket.c:730 [inline]
__sock_sendmsg net/socket.c:745 [inline]
____sys_sendmsg+0x592/0x890 net/socket.c:2584
___sys_sendmsg net/socket.c:2638 [inline]
__sys_sendmmsg+0x3b2/0x730 net/socket.c:2724
__do_sys_sendmmsg net/socket.c:2753 [inline]
__se_sys_sendmmsg net/socket.c:2750 [inline]
__x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x63/0x6bother info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&u->lock/1);
lock(rlock-AF_UNIX);
lock(&u->lock/1); lock(rlock-AF_UNIX);
*** DEADLOCK ***
1 lock held by syz-executor.1/2542:
#0: ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
stack backtrace: CPU: 1 PID: 2542 Comm: syz-executor.1 Not tainted 6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x1e7/0x2d0 lib/dump_stack.c:106 check_noncircular+0x366/0x490 kernel/locking/lockdep.c:2187 check_prev_add kernel/locking/lockdep.c:3134 [inline] check_prevs_add kernel/locking/lockdep.c:3253 [inline] validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869 __lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137 lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754 __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline] _raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162 skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863 unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x592/0x890 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmmsg+0x3b2/0x730 net/socket.c:2724 __do_sys_sendmmsg net/socket.c:2753 [inline] __se_sys_sendmmsg net/socket.c:2750 [inline] __x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b RIP: 0033:0x7f26d887cda9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 e1 20 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f26d95a60c8 EFLAGS: 00000246 ORIG_RAX: 0000000000000133 RAX: ffffffffffffffda RBX: 00007f26d89abf80 RCX: 00007f26d887cda9 RDX: 000000000000003e RSI: 00000000200bd000 RDI: 0000000000000004 RBP: 00007f26d88c947a R08: 0000000000000000 R09: 0000000000000000 R10: 00000000000008c0 R11: 0000000000000246 R12: 0000000000000000 R13: 000000000000000b R14: 00007f26d89abf80 R15: 00007ffcfe081a68
--- include/net/af_unix.h | 20 ++++++++++++++------ net/unix/af_unix.c | 14 ++++++-------- net/unix/diag.c | 2 +- 3 files changed, 21 insertions(+), 15 deletions(-)
include/net/af_unix.h +14 -6
@@ -46,12 +46,6 @@ struct scm_stat {#define UNIXCB (skb) (*(struct unix_skb_parms *)&((skb)->cb)) -#define unix_state_lock (s) spin_lock(&unix_sk(s)->lock) -#define unix_state_unlock (s) spin_unlock(&unix_sk(s)->lock) -#define unix_state_lock_nested (s) \ - spin_lock_nested(&unix_sk(s)->lock, \ - SINGLE_DEPTH_NESTING) -/* The AF_UNIX socket */ struct unix_sock {/* WARNING: sk has to be the first member */
@@ -77,6 +71,20 @@ struct unix_sock {#define unix_sk (ptr) container_of_const(ptr, struct unix_sock, sk)#define unix_peer (sk) (unix_sk(sk)->peer) +#define unix_state_lock (s) spin_lock(&unix_sk(s)->lock) +#define unix_state_unlock (s) spin_unlock(&unix_sk(s)->lock) +enum unix_socket_lock_class { +U_LOCK_NORMAL , +U_LOCK_SECOND ,/* for double locking, see unix_state_double_lock(). */ +U_LOCK_DIAG ,/* used while dumping icons, see sk_diag_dump_icons(). */ +}; + +static inline void unix_state_lock_nested (struct sock *sk, +enum unix_socket_lock_class subclass) +{ +spin_lock_nested (&unix_sk (sk)->lock, subclass); +} +#define peer_wait peer_wq.waitlong unix_inq_len (struct sock *sk);
net/unix/af_unix.c +6 -8
@@ -1343,13 +1343,11 @@ static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)unix_state_lock (sk1);return ; } -if (sk1 < sk2) { -unix_state_lock (sk1); -unix_state_lock_nested (sk2); - }else { -unix_state_lock (sk2); -unix_state_lock_nested (sk1); - } +if (sk1 > sk2) +swap (sk1, sk2); + +unix_state_lock (sk1); +unix_state_lock_nested (sk2,U_LOCK_SECOND ); }static void unix_state_double_unlock (struct sock *sk1,struct sock *sk2)
@@ -1582,7 +1580,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, goto out_unlock; } -unix_state_lock_nested (sk); +unix_state_lock_nested (sk,U_LOCK_SECOND );if (sk->sk_state != st) {unix_state_unlock (sk);
net/unix/diag.c +1 -1
@@ -84,7 +84,7 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)* queue lock. With the other's queue locked it's * OK to lock the state. */ -unix_state_lock_nested (req); +unix_state_lock_nested (req,U_LOCK_DIAG ); peer =unix_sk (req)->peer; buf[i++] = (peer ?sock_i_ino (peer) :0 );unix_state_unlock (req);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 300/322 pds_core: Cancel AQ work on teardown
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit d321067e2cfa4d5e45401a00912ca9da8d1af631 ]
There is a small window where pdsc_work_thread() calls pdsc_process_adminq() and pdsc_process_adminq() passes the PDSC_S_STOPPING_DRIVER check and starts to process adminq/notifyq work and then the driver starts a fw_down cycle. This could cause some undefined behavior if the notifyqcq/adminqcq are free'd while pdsc_process_adminq() is running. Use cancel_work_sync() on the adminqcq's work struct to make sure any pending work items are cancelled and any in progress work items are completed.
Also, make sure to not call cancel_work_sync() if the work item has not be initialized. Without this, traces will happen in cases where a reset fails and teardown is called again or if reset fails and the driver is removed.
--- drivers/net/ethernet/amd/pds_core/core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/amd/pds_core/core.c +2 -0
@@ -466,6 +466,8 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)if (!pdsc->pdev->is_virtfn)pdsc_devcmd_reset (pdsc); +if (pdsc->adminqcq.work.func) +cancel_work_sync (&pdsc->adminqcq.work);pdsc_qcq_free (pdsc, &pdsc->notifyqcq);pdsc_qcq_free (pdsc, &pdsc->adminqcq);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 301/322 pds_core: Use struct pdsc for the pdsc_adminq_isr private data
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit 951705151e50f9022bc96ec8b3fd5697380b1df6 ]
The initial design for the adminq interrupt was done based on client drivers having their own adminq and adminq interrupt. So, each client driver's adminq isr would use their specific adminqcq for the private data struct. For the time being the design has changed to only use a single adminq for all clients. So, instead use the struct pdsc for the private data to simplify things a bit.
This also has the benefit of not dereferencing the adminqcq to access the pdsc struct when the PDSC_S_STOPPING_DRIVER bit is set and the adminqcq has actually been cleared/freed.
--- drivers/net/ethernet/amd/pds_core/adminq.c | 5 +++-- drivers/net/ethernet/amd/pds_core/core.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/net/ethernet/amd/pds_core/adminq.c +3 -2
@@ -135,8 +135,8 @@ void pdsc_work_thread(struct work_struct *work)irqreturn_t pdsc_adminq_isr (int irq,void *data) { -struct pdsc_qcq *qcq = data; -struct pdsc *pdsc = qcq->pdsc; +struct pdsc *pdsc = data; +struct pdsc_qcq *qcq;/* Don't process AdminQ when shutting down */ if (pdsc->state &BIT_ULL (PDSC_S_STOPPING_DRIVER )) {
@@ -145,6 +145,7 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)return IRQ_HANDLED ; } + qcq = &pdsc->adminqcq;queue_work (pdsc->wq, &qcq->work);pds_core_intr_mask (&pdsc->intr_ctrl[qcq->intx],PDS_CORE_INTR_MASK_CLEAR );
drivers/net/ethernet/amd/pds_core/core.c +1 -1
@@ -125,7 +125,7 @@ static int pdsc_qcq_intr_alloc(struct pdsc *pdsc, struct pdsc_qcq *qcq)snprintf (name,sizeof (name),"%s-%d-%s" ,PDS_CORE_DRV_NAME , pdsc->pdev->bus->number, qcq->q.name); - index =pdsc_intr_alloc (pdsc, name, pdsc_adminq_isr, qcq); + index =pdsc_intr_alloc (pdsc, name, pdsc_adminq_isr, pdsc);if (index <0 )return index; qcq->intx = index;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 302/322 pds_core: implement pci reset handlers
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shannon Nelson <[email protected]>
[ Upstream commit ffa55858330f267beec995fc4f68098c91311c64 ]
Implement the callbacks for a nice PCI reset. These get called when a user is nice enough to use the sysfs PCI reset entry, e.g.
echo 1 > /sys/bus/pci/devices/0000:2b:00.0/reset
Stable-dep-of: 7e82a8745b95 ("pds_core: Prevent race issues involving the adminq")
--- drivers/net/ethernet/amd/pds_core/core.c | 14 +++++-- drivers/net/ethernet/amd/pds_core/core.h | 4 ++ drivers/net/ethernet/amd/pds_core/main.c | 50 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-)
drivers/net/ethernet/amd/pds_core/core.c +11 -3
@@ -514,7 +514,7 @@ void pdsc_stop(struct pdsc *pdsc) PDS_CORE_INTR_MASK_SET); } -static void pdsc_fw_down (struct pdsc *pdsc) +void pdsc_fw_down (struct pdsc *pdsc) {union pds_core_notifyq_comp reset_event = { .reset.ecode =cpu_to_le16 (PDS_EVENT_RESET ),
@@ -522,10 +522,13 @@ static void pdsc_fw_down(struct pdsc *pdsc) };if (test_and_set_bit (PDSC_S_FW_DEAD , &pdsc->state)) { -dev_err (pdsc->dev,"%s: already happening\n" , __func__); +dev_warn (pdsc->dev,"%s: already happening\n" , __func__);return ; } +if (pdsc->pdev->is_virtfn) +return ; +/* Notify clients of fw_down */ if (pdsc->fw_reporter)devlink_health_report (pdsc->fw_reporter,"FW down reported" , pdsc);
@@ -535,7 +538,7 @@ static void pdsc_fw_down(struct pdsc *pdsc)pdsc_teardown (pdsc,PDSC_TEARDOWN_RECOVERY ); } -static void pdsc_fw_up (struct pdsc *pdsc) +void pdsc_fw_up (struct pdsc *pdsc) {union pds_core_notifyq_comp reset_event = { .reset.ecode =cpu_to_le16 (PDS_EVENT_RESET ),
@@ -548,6 +551,11 @@ static void pdsc_fw_up(struct pdsc *pdsc)return ; } +if (pdsc->pdev->is_virtfn) { +clear_bit (PDSC_S_FW_DEAD , &pdsc->state); +return ; + } + err =pdsc_setup (pdsc,PDSC_SETUP_RECOVERY );if (err) goto err_out;
drivers/net/ethernet/amd/pds_core/core.h +4 -0
@@ -309,4 +309,8 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data);int pdsc_firmware_update (struct pdsc *pdsc,const struct firmware *fw,struct netlink_ext_ack *extack); + +void pdsc_fw_down (struct pdsc *pdsc); +void pdsc_fw_up (struct pdsc *pdsc); +#endif /* _PDSC_H_ */
drivers/net/ethernet/amd/pds_core/main.c +50 -0
62 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 303/322 pds_core: Prevent race issues involving the adminq
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit 7e82a8745b951b1e794cc780d46f3fbee5e93447 ]
There are multiple paths that can result in using the pdsc's adminq.
[1] pdsc_adminq_isr and the resulting work from queue_work(),
i.e. pdsc_work_thread()->pdsc_process_adminq()
[2] pdsc_adminq_post()
When the device goes through reset via PCIe reset and/or a fw_down/fw_up cycle due to bad PCIe state or bad device state the adminq is destroyed and recreated.
A NULL pointer dereference can happen if [1] or [2] happens after the adminq is already destroyed.
In order to fix this, add some further state checks and implement reference counting for adminq uses. Reference counting was used because multiple threads can attempt to access the adminq at the same time via [1] or [2]. Additionally, multiple clients (i.e. pds-vfio-pci) can be using [2] at the same time.
The adminq_refcnt is initialized to 1 when the adminq has been allocated and is ready to use. Users/clients of the adminq (i.e. [1] and [2]) will increment the refcnt when they are using the adminq. When the driver goes into a fw_down cycle it will set the PDSC_S_FW_DEAD bit and then wait for the adminq_refcnt to hit 1. Setting the PDSC_S_FW_DEAD before waiting will prevent any further adminq_refcnt increments. Waiting for the adminq_refcnt to hit 1 allows for any current users of the adminq to finish before the driver frees the adminq. Once the adminq_refcnt hits 1 the driver clears the refcnt to signify that the adminq is deleted and cannot be used. On the fw_up cycle the driver will once again initialize the adminq_refcnt to 1 allowing the adminq to be used again.
--- drivers/net/ethernet/amd/pds_core/adminq.c | 31 +++++++++++++++++----- drivers/net/ethernet/amd/pds_core/core.c | 21 +++++++++++++++ drivers/net/ethernet/amd/pds_core/core.h | 1 + 3 files changed, 47 insertions(+), 6 deletions(-)
drivers/net/ethernet/amd/pds_core/adminq.c +25 -6
@@ -63,6 +63,15 @@ static int pdsc_process_notifyq(struct pdsc_qcq *qcq)return nq_work; } +static bool pdsc_adminq_inc_if_up (struct pdsc *pdsc) +{ +if (pdsc->state &BIT_ULL (PDSC_S_STOPPING_DRIVER ) || + pdsc->state &BIT_ULL (PDSC_S_FW_DEAD )) +return false; + +return refcount_inc_not_zero (&pdsc->adminq_refcnt); +} +void pdsc_process_adminq (struct pdsc_qcq *qcq) {union pds_core_adminq_comp *comp;
@@ -75,9 +84,9 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq)int aq_work =0 ;int credits; -/* Don't process AdminQ when shutting down */ -if (pdsc->state &BIT_ULL (PDSC_S_STOPPING_DRIVER )) { -dev_err (pdsc->dev,"%s: called while PDSC_S_STOPPING_DRIVER\n" , +/* Don't process AdminQ when it's not up */ +if (!pdsc_adminq_inc_if_up (pdsc)) { +dev_err (pdsc->dev,"%s: called while adminq is unavailable\n" , __func__);return ; }
@@ -124,6 +133,7 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq)pds_core_intr_credits (&pdsc->intr_ctrl[qcq->intx], credits,PDS_CORE_INTR_CRED_REARM ); +refcount_dec (&pdsc->adminq_refcnt); }void pdsc_work_thread (struct work_struct *work)
@@ -138,9 +148,9 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data)struct pdsc *pdsc = data;struct pdsc_qcq *qcq; -/* Don't process AdminQ when shutting down */ -if (pdsc->state &BIT_ULL (PDSC_S_STOPPING_DRIVER )) { -dev_err (pdsc->dev,"%s: called while PDSC_S_STOPPING_DRIVER\n" , +/* Don't process AdminQ when it's not up */ +if (!pdsc_adminq_inc_if_up (pdsc)) { +dev_err (pdsc->dev,"%s: called while adminq is unavailable\n" , __func__);return IRQ_HANDLED ; }
@@ -148,6 +158,7 @@ irqreturn_t pdsc_adminq_isr(int irq, void *data) qcq = &pdsc->adminqcq;queue_work (pdsc->wq, &qcq->work);pds_core_intr_mask (&pdsc->intr_ctrl[qcq->intx],PDS_CORE_INTR_MASK_CLEAR ); +refcount_dec (&pdsc->adminq_refcnt);return IRQ_HANDLED ; }
@@ -231,6 +242,12 @@ int pdsc_adminq_post(struct pdsc *pdsc,int err =0 ;int index; +if (!pdsc_adminq_inc_if_up (pdsc)) { +dev_dbg (pdsc->dev,"%s: preventing adminq cmd %u\n" , + __func__, cmd->opcode); +return -ENXIO ; + } + wc.qcq = &pdsc->adminqcq; index =__pdsc_adminq_post (pdsc, &pdsc->adminqcq, cmd, comp, &wc);if (index <0 ) {
@@ -286,6 +303,8 @@ int pdsc_adminq_post(struct pdsc *pdsc,queue_work (pdsc->wq, &pdsc->health_work); } +refcount_dec (&pdsc->adminq_refcnt); +return err; }EXPORT_SYMBOL_GPL (pdsc_adminq_post);
drivers/net/ethernet/amd/pds_core/core.c +21 -0
@@ -452,6 +452,7 @@ int pdsc_setup(struct pdsc *pdsc, bool init)if (init)pdsc_debugfs_add_viftype (pdsc); +refcount_set (&pdsc->adminq_refcnt,1 );clear_bit (PDSC_S_FW_DEAD , &pdsc->state);return 0 ;
@@ -514,6 +515,24 @@ void pdsc_stop(struct pdsc *pdsc) PDS_CORE_INTR_MASK_SET); } +static void pdsc_adminq_wait_and_dec_once_unused (struct pdsc *pdsc) +{ +/* The driver initializes the adminq_refcnt to 1 when the adminq is +* allocated and ready for use. Other users/requesters will increment +* the refcnt while in use. If the refcnt is down to 1 then the adminq +* is not in use and the refcnt can be cleared and adminq freed. Before +* calling this function the driver will set PDSC_S_FW_DEAD, which +* prevent subsequent attempts to use the adminq and increment the +* refcnt to fail. This guarantees that this function will eventually +* exit. +*/ +while (!refcount_dec_if_one (&pdsc->adminq_refcnt)) { +dev_dbg_ratelimited (pdsc->dev,"%s: adminq in use\n" , + __func__); +cpu_relax (); + } +} +void pdsc_fw_down (struct pdsc *pdsc) {union pds_core_notifyq_comp reset_event = {
@@ -529,6 +548,8 @@ void pdsc_fw_down(struct pdsc *pdsc)if (pdsc->pdev->is_virtfn)return ; +pdsc_adminq_wait_and_dec_once_unused (pdsc); +/* Notify clients of fw_down */ if (pdsc->fw_reporter)devlink_health_report (pdsc->fw_reporter,"FW down reported" , pdsc);
drivers/net/ethernet/amd/pds_core/core.h +1 -0
@@ -184,6 +184,7 @@ struct pdsc {struct mutex devcmd_lock;/* lock for dev_cmd operations */ struct mutex config_lock;/* lock for configuration operations */ spinlock_t adminq_lock;/* lock for adminq operations */ +refcount_t adminq_refcnt;struct pds_core_dev_info_regs __iomem *info_regs;struct pds_core_dev_cmd_regs __iomem *cmd_regs;struct pds_core_intr __iomem *intr_ctrl;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 304/322 pds_core: Clear BARs on reset
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit e96094c1d11cce4deb5da3c0500d49041ab845b8 ]
During reset the BARs might be accessed when they are unmapped. This can cause unexpected issues, so fix it by clearing the cached BAR values so they are not accessed until they are re-mapped.
Also, make sure any places that can access the BARs when they are NULL are prevented.
--- drivers/net/ethernet/amd/pds_core/adminq.c | 28 +++++++++++++++------ drivers/net/ethernet/amd/pds_core/dev.c | 9 ++++++- drivers/net/ethernet/amd/pds_core/devlink.c | 3 ++- drivers/net/ethernet/amd/pds_core/fw.c | 3 +++ drivers/net/ethernet/amd/pds_core/main.c | 5 ++++ 5 files changed, 38 insertions(+), 10 deletions(-)
drivers/net/ethernet/amd/pds_core/adminq.c +20 -8
@@ -191,10 +191,16 @@ static int __pdsc_adminq_post(struct pdsc *pdsc,/* Check that the FW is running */ if (!pdsc_is_fw_running (pdsc)) { -u8 fw_status =ioread8 (&pdsc->info_regs->fw_status); - -dev_info (pdsc->dev,"%s: post failed - fw not running %#02x:\n" , - __func__, fw_status); +if (pdsc->info_regs) { +u8 fw_status = +ioread8 (&pdsc->info_regs->fw_status); + +dev_info (pdsc->dev,"%s: post failed - fw not running %#02x:\n" , + __func__, fw_status); + }else { +dev_info (pdsc->dev,"%s: post failed - BARs not setup\n" , + __func__); + } ret = -ENXIO ; goto err_out_unlock;
@@ -266,10 +272,16 @@ int pdsc_adminq_post(struct pdsc *pdsc,break ;if (!pdsc_is_fw_running (pdsc)) { -u8 fw_status =ioread8 (&pdsc->info_regs->fw_status); - -dev_dbg (pdsc->dev,"%s: post wait failed - fw not running %#02x:\n" , - __func__, fw_status); +if (pdsc->info_regs) { +u8 fw_status = +ioread8 (&pdsc->info_regs->fw_status); + +dev_dbg (pdsc->dev,"%s: post wait failed - fw not running %#02x:\n" , + __func__, fw_status); + }else { +dev_dbg (pdsc->dev,"%s: post wait failed - BARs not setup\n" , + __func__); + } err = -ENXIO ;break ; }
drivers/net/ethernet/amd/pds_core/dev.c +8 -1
@@ -55,6 +55,9 @@ int pdsc_err_to_errno(enum pds_core_status_code code)bool pdsc_is_fw_running (struct pdsc *pdsc) { +if (!pdsc->info_regs) +return false; + pdsc->fw_status =ioread8 (&pdsc->info_regs->fw_status); pdsc->last_fw_time = jiffies; pdsc->last_hb =ioread32 (&pdsc->info_regs->fw_heartbeat);
@@ -175,13 +178,17 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, {int err; +if (!pdsc->cmd_regs) +return -ENXIO ; +memcpy_toio (&pdsc->cmd_regs->cmd, cmd,sizeof (*cmd));pdsc_devcmd_dbell (pdsc); err =pdsc_devcmd_wait (pdsc, cmd->opcode, max_seconds); -memcpy_fromio (comp, &pdsc->cmd_regs->comp,sizeof (*comp));if ((err == -ENXIO || err == -ETIMEDOUT ) && pdsc->wq)queue_work (pdsc->wq, &pdsc->health_work); +else +memcpy_fromio (comp, &pdsc->cmd_regs->comp,sizeof (*comp));return err; }
drivers/net/ethernet/amd/pds_core/devlink.c +2 -1
@@ -111,7 +111,8 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req,mutex_lock (&pdsc->devcmd_lock); err =pdsc_devcmd_locked (pdsc, &cmd, &comp, pdsc->devcmd_timeout *2 ); -memcpy_fromio (&fw_list, pdsc->cmd_regs->data,sizeof (fw_list)); +if (!err) +memcpy_fromio (&fw_list, pdsc->cmd_regs->data,sizeof (fw_list));mutex_unlock (&pdsc->devcmd_lock);if (err && err != -EIO )return err;
drivers/net/ethernet/amd/pds_core/fw.c +3 -0
@@ -107,6 +107,9 @@ int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw,dev_info (pdsc->dev,"Installing firmware\n" ); +if (!pdsc->cmd_regs) +return -ENXIO ; + dl =priv_to_devlink (pdsc);devlink_flash_update_status_notify (dl,"Preparing to flash" ,NULL ,0 ,0 );
drivers/net/ethernet/amd/pds_core/main.c +5 -0
@@ -37,6 +37,11 @@ static void pdsc_unmap_bars(struct pdsc *pdsc)struct pdsc_dev_bar *bars = pdsc->bars;unsigned int i; + pdsc->info_regs =NULL ; + pdsc->cmd_regs =NULL ; + pdsc->intr_status =NULL ; + pdsc->intr_ctrl =NULL ; +for (i =0 ; i <PDS_CORE_BARS_MAX ; i++) {if (bars[i].vaddr)pci_iounmap (pdsc->pdev, bars[i].vaddr);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 305/322 pds_core: Rework teardown/setup flow to be more common
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brett Creeley <[email protected]>
[ Upstream commit bc90fbe0c3182157d2be100a2f6c2edbb1820677 ]
Currently the teardown/setup flow for driver probe/remove is quite a bit different from the reset flows in pdsc_fw_down()/pdsc_fw_up(). One key piece that's missing are the calls to pci_alloc_irq_vectors() and pci_free_irq_vectors(). The pcie reset case is calling pci_free_irq_vectors() on reset_prepare, but not calling the corresponding pci_alloc_irq_vectors() on reset_done. This is causing unexpected/unwanted interrupt behavior due to the adminq interrupt being accidentally put into legacy interrupt mode. Also, the pci_alloc_irq_vectors()/pci_free_irq_vectors() functions are being called directly in probe/remove respectively.
Fix this inconsistency by making the following changes:
1. Always call pdsc_dev_init() in pdsc_setup(), which calls pci_alloc_irq_vectors() and get rid of the now unused pds_dev_reinit().
2. Always free/clear the pdsc->intr_info in pdsc_teardown() since this structure will get re-alloced in pdsc_setup().
3. Move the calls of pci_free_irq_vectors() to pdsc_teardown() since pci_alloc_irq_vectors() will always be called in pdsc_setup()->pdsc_dev_init() for both the probe/remove and reset flows.
4. Make sure to only create the debugfs "identity" entry when it doesn't already exist, which it will in the reset case because it's already been created in the initial call to pdsc_dev_init().
--- drivers/net/ethernet/amd/pds_core/core.c | 13 +++++-------- drivers/net/ethernet/amd/pds_core/core.h | 1 - drivers/net/ethernet/amd/pds_core/debugfs.c | 4 ++++ drivers/net/ethernet/amd/pds_core/dev.c | 7 ------- drivers/net/ethernet/amd/pds_core/main.c | 2 -- 5 files changed, 9 insertions(+), 18 deletions(-)
drivers/net/ethernet/amd/pds_core/core.c +5 -8
@@ -407,10 +407,7 @@ int pdsc_setup(struct pdsc *pdsc, bool init)int numdescs;int err; -if (init) - err =pdsc_dev_init (pdsc); -else - err =pdsc_dev_reinit (pdsc); + err =pdsc_dev_init (pdsc);if (err)return err;
@@ -479,10 +476,9 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing)for (i =0 ; i < pdsc->nintrs; i++)pdsc_intr_free (pdsc, i); -if (removing) { -kfree (pdsc->intr_info); - pdsc->intr_info =NULL ; - } +kfree (pdsc->intr_info); + pdsc->intr_info =NULL ; + pdsc->nintrs =0 ; }if (pdsc->kern_dbpage) {
@@ -490,6 +486,7 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing) pdsc->kern_dbpage =NULL ; } +pci_free_irq_vectors (pdsc->pdev);set_bit (PDSC_S_FW_DEAD , &pdsc->state); }
drivers/net/ethernet/amd/pds_core/core.h +0 -1
@@ -281,7 +281,6 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, union pds_core_dev_comp *comp, int max_seconds);int pdsc_devcmd_init (struct pdsc *pdsc);int pdsc_devcmd_reset (struct pdsc *pdsc); -int pdsc_dev_reinit (struct pdsc *pdsc);int pdsc_dev_init (struct pdsc *pdsc); int pdsc_intr_alloc(struct pdsc *pdsc, char *name,
drivers/net/ethernet/amd/pds_core/debugfs.c +4 -0
@@ -64,6 +64,10 @@ DEFINE_SHOW_ATTRIBUTE(identity);void pdsc_debugfs_add_ident (struct pdsc *pdsc) { +/* This file will already exist in the reset flow */ +if (debugfs_lookup ("identity" , pdsc->dentry)) +return ; +debugfs_create_file ("identity" ,0400 , pdsc->dentry, pdsc, &identity_fops); }
drivers/net/ethernet/amd/pds_core/dev.c +0 -7
@@ -309,13 +309,6 @@ static int pdsc_identify(struct pdsc *pdsc)return 0 ; } -int pdsc_dev_reinit (struct pdsc *pdsc) -{ -pdsc_init_devinfo (pdsc); - -return pdsc_identify (pdsc); -} -int pdsc_dev_init (struct pdsc *pdsc) {unsigned int nintrs;
drivers/net/ethernet/amd/pds_core/main.c +0 -2
@@ -438,7 +438,6 @@ static void pdsc_remove(struct pci_dev *pdev)mutex_destroy (&pdsc->config_lock);mutex_destroy (&pdsc->devcmd_lock); -pci_free_irq_vectors (pdev);pdsc_unmap_bars (pdsc);pci_release_regions (pdev); }
@@ -456,7 +455,6 @@ static void pdsc_reset_prepare(struct pci_dev *pdev)pdsc_fw_down (pdsc); -pci_free_irq_vectors (pdev);pdsc_unmap_bars (pdsc);pci_release_regions (pdev);pci_disable_device (pdev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 306/322 selftests: net: add missing config for nftables-backed iptables
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 59c93583491ab15db109f9902524d241c4fa4c0b ]
Modern OSes use iptables implementation with nf_tables as a backend, e.g.:
$ iptables -V iptables v1.8.8 (nf_tables)
Pablo points out that we need CONFIG_NFT_COMPAT to make that work, otherwise we see a lot of:
Warning: Extension DNAT revision 0 not supported, missing kernel module?
with DNAT being just an example here, other modules we need include udp, TTL, length etc.
Stable-dep-of: f7c25d8e17dd ("selftests: net: add missing config for pmtu.sh tests")
--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -62,6 +62,7 @@ CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_FQ=m CONFIG_NET_SCH_ETF=m CONFIG_NET_SCH_NETEM=y +CONFIG_NFT_COMPAT=m CONFIG_NF_FLOW_TABLE=m CONFIG_PSAMPLE=m CONFIG_TCP_MD5SIG=y
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 307/322 selftests: net: add missing config for pmtu.sh tests
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit f7c25d8e17dd759d97ca093faf92eeb7da7b3890 ]
The mentioned test uses a few Kconfig still missing the net config, add them.
Before:
# Error: Specified qdisc kind is unknown.
# Error: Specified qdisc kind is unknown.
# Error: Qdisc not classful.
# We have an error talking to the kernel
# Error: Qdisc not classful.
# We have an error talking to the kernel
# policy_routing not supported
# TEST: ICMPv4 with DSCP and ECN: PMTU exceptions [SKIP]
After:
# TEST: ICMPv4 with DSCP and ECN: PMTU exceptions [ OK ]
--- tools/testing/selftests/net/config | 3 +++ 1 file changed, 3 insertions(+)
tools/testing/selftests/net/config +3 -0
@@ -49,8 +49,10 @@ CONFIG_NF_TABLES_IPV6=y CONFIG_NF_TABLES_IPV4=y CONFIG_NFT_NAT=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NET_ACT_CSUM=m CONFIG_NET_ACT_CT=m CONFIG_NET_ACT_GACT=m +CONFIG_NET_ACT_PEDIT=m CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_MATCHALL=m
@@ -62,6 +64,7 @@ CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_FQ=m CONFIG_NET_SCH_ETF=m CONFIG_NET_SCH_NETEM=y +CONFIG_NET_SCH_PRIO=m CONFIG_NFT_COMPAT=m CONFIG_NF_FLOW_TABLE=m CONFIG_PSAMPLE=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 308/322 selftests: net: fix available tunnels detection
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit e4e4b6d568d2549583cbda3f8ce567e586cb05da ]
The pmtu.sh test tries to detect the tunnel protocols available in the running kernel and properly skip the unsupported cases.
In a few more complex setup, such detection is unsuccessful, as the script currently ignores some intermediate error code at setup time.
Before:
# which: no nettest in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin)
# TEST: vti6: PMTU exceptions (ESP-in-UDP) [FAIL]
# PMTU exception wasn't created after creating tunnel exceeding link layer MTU
# ./pmtu.sh: line 931: kill: (7543) - No such process
# ./pmtu.sh: line 931: kill: (7544) - No such process
After:
# xfrm4 not supported
# TEST: vti4: PMTU exceptions [SKIP]
--- tools/testing/selftests/net/pmtu.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/testing/selftests/net/pmtu.sh +8 -8
@@ -714,23 +714,23 @@ setup_xfrm6() { } setup_xfrm4udp() { - setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 4 4500 + setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 4 4500 } setup_xfrm6udp() { - setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 6 4500 + setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 6 4500 } setup_xfrm4udprouted() { - setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 4 4500 + setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 4 4500 } setup_xfrm6udprouted() { - setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 6 4500 + setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 6 4500 } setup_routing_old() {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 309/322 selftests: net: dont access /dev/stdout in pmtu.sh
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit bc0970d5ac1d1317e212bdf55533935ecb6ae95c ]
When running the pmtu.sh via the kselftest infra, accessing /dev/stdout gives unexpected results:
# dd: failed to open '/dev/stdout': Device or resource busy
# TEST: IPv4, bridged vxlan4: PMTU exceptions [FAIL]
Let dd use directly the standard output to fix the above:
# TEST: IPv4, bridged vxlan4: PMTU exceptions - nexthop objects [ OK ]
--- tools/testing/selftests/net/pmtu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/pmtu.sh +1 -1
@@ -1348,7 +1348,7 @@ test_pmtu_ipvX_over_bridged_vxlanY_or_geneveY_exception() { sleep 1 - dd if=/dev/zero of=/dev/stdout status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3 + dd if=/dev/zero status=none bs=1M count=1 | ${target} socat -T 3 -u STDIN $TCPDST,connect-timeout=3 size=$(du -sb $tmpoutfile) size=${size%%/tmp/*}
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 310/322 octeontx2-pf: Remove xdp queues on program detach
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geetha sowjanya <[email protected]>
[ Upstream commit 04f647c8e456fcfabe9c252a4dcaee03b586fa4f ]
XDP queues are created/destroyed when a XDP program is attached/detached. In current driver xdp_queues are not getting destroyed on program exit due to incorrect xdp_queue and tot_tx_queue count values.
This patch fixes the issue by setting tot_tx_queue and xdp_queue count to correct values. It also fixes xdp.data_hard_start address.
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 1 - drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c | 3 +-- drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c | 7 +++---- 3 files changed, 4 insertions(+), 7 deletions(-)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +0 -1
@@ -314,7 +314,6 @@ static int otx2_set_channels(struct net_device *dev, pfvf->hw.tx_queues = channel->tx_count;if (pfvf->xdp_prog) pfvf->hw.xdp_queues = channel->rx_count; - pfvf->hw.non_qos_queues = pfvf->hw.tx_queues + pfvf->hw.xdp_queues;if (if_up) err = dev->netdev_ops->ndo_open (dev);
drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c +1 -2
@@ -1744,6 +1744,7 @@ int otx2_open(struct net_device *netdev)/* RQ and SQs are mapped to different CQs, * so find out max CQ IRQs (i.e CINTs) needed. */ + pf->hw.non_qos_queues = pf->hw.tx_queues + pf->hw.xdp_queues; pf->hw.cint_cnt =max3 (pf->hw.rx_queues, pf->hw.tx_queues, pf->hw.tc_tx_queues);
@@ -2643,8 +2644,6 @@ static int otx2_xdp_setup(struct otx2_nic *pf, struct bpf_prog *prog)xdp_features_clear_redirect_target (dev); } - pf->hw.non_qos_queues += pf->hw.xdp_queues; -if (if_up)otx2_open (pf->netdev);
drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c +3 -4
@@ -1403,7 +1403,7 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,struct otx2_cq_queue *cq, bool *need_xdp_flush) { - unsigned char *hard_start, *data; + unsigned char *hard_start;int qidx = cq->cq_idx;struct xdp_buff xdp;struct page *page;
@@ -1417,9 +1417,8 @@ static bool otx2_xdp_rcv_pkt_handler(struct otx2_nic *pfvf,xdp_init_buff (&xdp, pfvf->rbsize, &cq->xdp_rxq); - data = (unsigned char *)phys_to_virt (pa); - hard_start =page_address (page); -xdp_prepare_buff (&xdp, hard_start, data - hard_start, + hard_start = (unsigned char *)phys_to_virt (pa); +xdp_prepare_buff (&xdp, hard_start,OTX2_HEAD_ROOM , cqe->sg.seg_size, false); act =bpf_prog_run_xdp (prog, &xdp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 311/322 net: sysfs: Fix /sys/class/net/<iface> path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit ae3f4b44641dfff969604735a0dcbf931f383285 ]
The documentation is pointing to the wrong path for the interface. Documentation is pointing to /sys/class/<iface>, instead of /sys/class/net/<iface>.
Fix it by adding the net/ directory before the interface.
--- .../ABI/testing/sysfs-class-net-queues | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-)
Documentation/ABI/testing/sysfs-class-net-queues +11 -11
@@ -1,4 +1,4 @@ -What: /sys/class/<iface>/queues/rx-<queue>/rps_cpus +What: /sys/class/net/<iface>/queues/rx-<queue>/rps_cpus Date: March 2010 KernelVersion: 2.6.35 Contact: [email protected]
@@ -8,7 +8,7 @@ Description: network device queue. Possible values depend on the number of available CPU(s) in the system. -What: /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt +What: /sys/class/net/<iface>/queues/rx-<queue>/rps_flow_cnt Date: April 2010 KernelVersion: 2.6.35 Contact: [email protected]
@@ -16,7 +16,7 @@ Description: Number of Receive Packet Steering flows being currently processed by this particular network device receive queue. -What: /sys/class/<iface>/queues/tx-<queue>/tx_timeout +What: /sys/class/net/<iface>/queues/tx-<queue>/tx_timeout Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -24,7 +24,7 @@ Description: Indicates the number of transmit timeout events seen by this network interface transmit queue. -What: /sys/class/<iface>/queues/tx-<queue>/tx_maxrate +What: /sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate Date: March 2015 KernelVersion: 4.1 Contact: [email protected]
@@ -32,7 +32,7 @@ Description: A Mbps max-rate set for the queue, a value of zero means disabled, default is disabled. -What: /sys/class/<iface>/queues/tx-<queue>/xps_cpus +What: /sys/class/net/<iface>/queues/tx-<queue>/xps_cpus Date: November 2010 KernelVersion: 2.6.38 Contact: [email protected]
@@ -42,7 +42,7 @@ Description: network device transmit queue. Possible values depend on the number of available CPU(s) in the system. -What: /sys/class/<iface>/queues/tx-<queue>/xps_rxqs +What: /sys/class/net/<iface>/queues/tx-<queue>/xps_rxqs Date: June 2018 KernelVersion: 4.18.0 Contact: [email protected]
@@ -53,7 +53,7 @@ Description: number of available receive queue(s) in the network device. Default is disabled. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -62,7 +62,7 @@ Description: of this particular network device transmit queue. Default value is 1000. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/inflight Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -70,7 +70,7 @@ Description: Indicates the number of bytes (objects) in flight on this network device transmit queue. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -79,7 +79,7 @@ Description: on this network device transmit queue. This value is clamped to be within the bounds defined by limit_max and limit_min. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -88,7 +88,7 @@ Description: queued on this network device transmit queue. See include/linux/dynamic_queue_limits.h for the default value. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 312/322 selftests: team: Add missing config options
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Poirier <[email protected]>
[ Upstream commit 7b6fb3050d8f5e2b6858eef344e47ac1f5442827 ]
Similar to commit dd2d40acdbb2 ("selftests: bonding: Add more missing config options"), add more networking-specific config options which are needed for team device tests.
For testing, I used the minimal config generated by virtme-ng and I added the options in the config file. Afterwards, the team device test passed.
--- tools/testing/selftests/drivers/net/team/config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/testing/selftests/drivers/net/team/config +3 -1
@@ -1,3 +1,5 @@ +CONFIG_DUMMY=y +CONFIG_IPV6=y +CONFIG_MACVLAN=y CONFIG_NET_TEAM=y CONFIG_NET_TEAM_MODE_LOADBALANCE=y -CONFIG_MACVLAN=y
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 313/322 selftests: bonding: Check initial state
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Poirier <[email protected]>
[ Upstream commit 8cc063ae1b3dbe416ce62a15d49af4c2314b45fe ]
The purpose of the test_LAG_cleanup() function is to check that some hardware addresses are removed from underlying devices after they have been unenslaved. The test function simply checks that those addresses are not present at the end. However, if the addresses were never added to begin with due to some error in device setup, the test function currently passes. This is a false positive since in that situation the test did not actually exercise the intended functionality.
Add a check that the expected addresses are indeed present after device setup. This makes the test function more robust.
I noticed this problem when running the team/dev_addr_lists.sh test on a system without support for dummy and ipv6:
tools/testing/selftests/drivers/net/team# ./dev_addr_lists.sh
Error: Unknown device type.
Error: Unknown device type.
This program is not intended to be run as root. RTNETLINK answers: Operation not supported
TEST: team cleanup mode lacp [ OK ]
--- .../testing/selftests/drivers/net/bonding/lag_lib.sh | 11 +++++++++++ 1 file changed, 11 insertions(+)
tools/testing/selftests/drivers/net/bonding/lag_lib.sh +11 -0
@@ -48,6 +48,17 @@ test_LAG_cleanup() ip link add mv0 link "$name" up address "$ucaddr" type macvlan # Used to test dev->mc handling ip address add "$addr6" dev "$name" + + # Check that addresses were added as expected + (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 || + grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null + check_err $? "macvlan unicast address not found on a slave" + + # mcaddr is added asynchronously by addrconf_dad_work(), use busywait + (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 || + grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null + check_err $? "IPv6 solicited-node multicast mac address not found on a slave" + ip link set dev "$name" down ip link del "$name"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 314/322 selftests: net: add missing config for NF_TARGET_TTL
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 1939f738c73dfdb8389839bdc9624c765e3326e6 ]
amt test uses the TTL iptables module:
ip netns exec "${RELAY}" iptables -t mangle -I PREROUTING \
-d 239.0.0.1 -j TTL --ttl-set 2--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -33,6 +33,7 @@ CONFIG_IP6_NF_NAT=m CONFIG_IP6_NF_RAW=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_TARGET_TTL=m CONFIG_IPV6_GRE=m CONFIG_IPV6_SEG6_LWTUNNEL=y CONFIG_L2TP_ETH=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 315/322 selftests: net: enable some more knobs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit c15a729c9d45aa142fb01a3afee822ab1f0e62a8 ]
The rtnetlink tests require additional options currently off by default.
--- tools/testing/selftests/net/config | 3 +++ 1 file changed, 3 insertions(+)
tools/testing/selftests/net/config +3 -0
@@ -22,6 +22,8 @@ CONFIG_VLAN_8021Q=y CONFIG_GENEVE=m CONFIG_IFB=y CONFIG_INET_DIAG=y +CONFIG_INET_ESP=y +CONFIG_INET_ESP_OFFLOAD=y CONFIG_IP_GRE=m CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y
@@ -93,3 +95,4 @@ CONFIG_IP_SCTP=m CONFIG_NETFILTER_XT_MATCH_POLICY=m CONFIG_CRYPTO_ARIA=y CONFIG_XFRM_INTERFACE=m +CONFIG_XFRM_USER=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 316/322 arm64: irq: set the correct node for shadow call stack
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huang Shijie <[email protected]>
commit 7b1a09e44dc64f4f5930659b6d14a27183c00705 upstream.
The init_irq_stacks() has been changed to use the correct node:
https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/commit/?id=75b5e0bf90bf
The init_irq_scs() has the same issue with init_irq_stacks():
cpu_to_node() is not initialized yet, it does not work.
This patch uses early_cpu_to_node() to set the init_irq_scs() with the correct node.
--- arch/arm64/kernel/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/irq.c +1 -1
@@ -48,7 +48,7 @@ static void init_irq_scs(void)for_each_possible_cpu (cpu)per_cpu (irq_shadow_call_stack_ptr, cpu) = -scs_alloc (cpu_to_node (cpu)); +scs_alloc (early_cpu_to_node (cpu)); }#ifdef CONFIG_VMAP_STACK
Greg Kroah-Hartman
maintainerPATCH 317/322 mm, kmsan: fix infinite recursion due to RCU critical section
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Elver <[email protected]>
commit f6564fce256a3944aa1bc76cb3c40e792d97c1eb upstream.
Alexander Potapenko writes in [1]: "For every memory access in the code instrumented by KMSAN we call kmsan_get_metadata() to obtain the metadata for the memory being accessed. For virtual memory the metadata pointers are stored in the corresponding struct page, therefore we need to call virt_to_page() to get them.
According to the comment in arch/x86/include/asm/page.h, virt_to_page(kaddr) returns a valid pointer iff virt_addr_valid(kaddr) is true, so KMSAN needs to call virt_addr_valid() as well.
To avoid recursion, kmsan_get_metadata() must not call instrumented code, therefore ./arch/x86/include/asm/kmsan.h forks parts of arch/x86/mm/physaddr.c to check whether a virtual address is valid or not.
But the introduction of rcu_read_lock() to pfn_valid() added instrumented RCU API calls to virt_to_page_or_null(), which is called by kmsan_get_metadata(), so there is an infinite recursion now. I do not think it is correct to stop that recursion by doing kmsan_enter_runtime()/kmsan_exit_runtime() in kmsan_get_metadata(): that would prevent instrumented functions called from within the runtime from tracking the shadow values, which might introduce false positives."
Fix the issue by switching pfn_valid() to the _sched() variant of rcu_read_lock/unlock(), which does not require calling into RCU. Given the critical section in pfn_valid() is very small, this is a reasonable trade-off (with preemptible RCU).
KMSAN further needs to be careful to suppress calls into the scheduler, which would be another source of recursion. This can be done by wrapping the call to pfn_valid() into preempt_disable/enable_no_resched(). The downside is that this sacrifices breaking scheduling guarantees; however, a kernel compiled with KMSAN has already given up any performance guarantees due to being heavily instrumented.
Note, KMSAN code already disables tracing via Makefile, and since mmzone.h is included, it is not necessary to use the notrace variant, which is generally preferred in all other cases.
--- arch/x86/include/asm/kmsan.h | 17 ++++++++++++++++- include/linux/mmzone.h | 6 +++--- 2 files changed, 19 insertions(+), 4 deletions(-)
arch/x86/include/asm/kmsan.h +16 -1
@@ -64,6 +64,7 @@ static inline bool kmsan_virt_addr_valid {unsigned long x = (unsigned long )addr;unsigned long y = x - __START_KERNEL_map; +bool ret;/* use the carry flag to determine if x was < __START_KERNEL_map */ if (unlikely (x > y)) {
@@ -79,7 +80,21 @@ static inline bool kmsan_virt_addr_valid return false; } -return pfn_valid (x >>PAGE_SHIFT ); +/* +* pfn_valid() relies on RCU, and may call into the scheduler on exiting +* the critical section. However, this would result in recursion with +* KMSAN. Therefore, disable preemption here, and re-enable preemption +* below while suppressing reschedules to avoid recursion. +* +* Note, this sacrifices occasionally breaking scheduling guarantees. +* Although, a kernel compiled with KMSAN has already given up on any +* performance guarantees due to being heavily instrumented. +*/ +preempt_disable (); + ret =pfn_valid (x >>PAGE_SHIFT ); +preempt_enable_no_resched (); + +return ret; }#endif /* !MODULE */
include/linux/mmzone.h +3 -3
@@ -2006,9 +2006,9 @@ static inline int pfn_valid(unsigned lonif (pfn_to_section_nr (pfn) >=NR_MEM_SECTIONS )return 0 ; ms =__pfn_to_section (pfn); -rcu_read_lock (); +rcu_read_lock_sched ();if (!valid_section (ms)) { -rcu_read_unlock (); +rcu_read_unlock_sched ();return 0 ; }/*
@@ -2016,7 +2016,7 @@ static inline int pfn_valid(unsigned lon* the entire section-sized span. */ ret =early_section (ms) ||pfn_section_valid (ms, pfn); -rcu_read_unlock (); +rcu_read_unlock_sched ();return ret; }
Greg Kroah-Hartman
maintainerPATCH 318/322 Revert "drm/amd/display: Disable PSR-SU on Parade 0803 TCON again"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Gray <[email protected]>
This reverts commit 107a11637f43e7cdcca96c09525481e38b004455.
duplicated a change made in 6.6.8a8f922ad2f76a53383982132ee44d123b72533c5
--- drivers/gpu/drm/amd/display/modules/power/power_helpers.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/amd/display/modules/power/power_helpers.c +0 -2
@@ -841,8 +841,6 @@ bool is_psr_su_specific_panel(struct dc_ isPSRSUSupported = false; else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) isPSRSUSupported = false; - else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) - isPSRSUSupported = false; else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1) isPSRSUSupported = true; }
Greg Kroah-Hartman
maintainerPATCH 319/322 drm/msm/dsi: Enable runtime PM
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
commit 6ab502bc1cf3147ea1d8540d04b83a7a4cb6d1f1 upstream.
Some devices power the DSI PHY/PLL through a power rail that we model as a GENPD. Enable runtime PM to make it suspendable.
Patchwork: https://patchwork.freedesktop.org/patch/543352/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +4 -0
@@ -691,6 +691,10 @@ static int dsi_phy_driver_probe(struct preturn dev_err_probe (dev,PTR_ERR (phy->ahb_clk),"Unable to get ahb clk\n" ); + ret =devm_pm_runtime_enable (&pdev->dev); +if (ret) +return ret; +/* PLL init will call into clk_register which requires * register access, so we need to enable power and ahb clock. */
Greg Kroah-Hartman
maintainerPATCH 320/322 LoongArch/smp: Call rcutree_report_cpu_starting() at tlb_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 5056c596c3d1848021a4eaa76ee42f4c05c50346 upstream.
Machines which have more than 8 nodes fail to boot SMP after commit a2ccf46333d7b2cf96 ("LoongArch/smp: Call rcutree_report_cpu_starting() earlier"). Because such machines use tlb-based per-cpu base address rather than dmw-based per-cpu base address, resulting per-cpu variables can only be accessed after tlb_init(). But rcutree_report_cpu_starting() is now called before tlb_init() and accesses per-cpu variables indeed.
Since the original patch want to avoid the lockdep warning caused by page allocation in tlb_init(), we can move rcutree_report_cpu_starting() to tlb_init() where after tlb exception configuration but before page allocation.
--- arch/loongarch/kernel/smp.c | 1 - arch/loongarch/mm/tlb.c | 16 ++++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-)
arch/loongarch/kernel/smp.c +0 -1
@@ -506,7 +506,6 @@ asmlinkage void start_secondary(void)sync_counter (); cpu =raw_smp_processor_id ();set_my_cpu_offset (per_cpu_offset (cpu)); -rcu_cpu_starting (cpu);cpu_probe ();constant_clockevent_init ();
arch/loongarch/mm/tlb.c +10 -6
@@ -284,12 +284,16 @@ static void setup_tlb_handler(int cpu)set_handler (EXCCODE_TLBNR *VECSIZE , handle_tlb_protect,VECSIZE );set_handler (EXCCODE_TLBNX *VECSIZE , handle_tlb_protect,VECSIZE );set_handler (EXCCODE_TLBPE *VECSIZE , handle_tlb_protect,VECSIZE ); - } + }else { +int vec_sz__maybe_unused ; +void *addr__maybe_unused ; +struct page *page__maybe_unused ; + +/* Avoid lockdep warning */ +rcu_cpu_starting (cpu); +#ifdef CONFIG_NUMA - else { -void *addr; -struct page *page; -const int vec_sz =sizeof (exception_handlers); + vec_sz =sizeof (exception_handlers);if (pcpu_handlers[cpu])return ;
@@ -305,8 +309,8 @@ static void setup_tlb_handler(int cpu)csr_write64 (pcpu_handlers[cpu],LOONGARCH_CSR_EENTRY );csr_write64 (pcpu_handlers[cpu],LOONGARCH_CSR_MERRENTRY );csr_write64 (pcpu_handlers[cpu] +80 *VECSIZE ,LOONGARCH_CSR_TLBRENTRY ); - }#endif + } }void tlb_init (int cpu)
Greg Kroah-Hartman
maintainerPATCH 321/322 selftests/bpf: Remove flaky test_btf_id test
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonghong Song <[email protected]>
commit 56925f389e152dcb8d093435d43b78a310539c23 upstream.
With previous patch, one of subtests in test_btf_id becomes flaky and may fail. The following is a failing example:
Error: #26 btf
Error: #26/174 btf/BTF ID
Error: #26/174 btf/BTF ID
btf_raw_create:PASS:check 0 nsec
btf_raw_create:PASS:check 0 nsec
test_btf_id:PASS:check 0 nsec
...
test_btf_id:PASS:check 0 nsec
test_btf_id:FAIL:check BTF lingersdo_test_get_info:FAIL:check failed: -1
The test tries to prove a btf_id not available after the map is closed. But btf_id is freed only after workqueue and a rcu grace period, compared to previous case just after a rcu grade period.
Depending on system workload, workqueue could take quite some time to execute function bpf_map_free_deferred() which may cause the test failure. Instead of adding arbitrary delays, let us remove the logic to check btf_id availability after map is closed.
--- tools/testing/selftests/bpf/prog_tests/btf.c | 5 ----- 1 file changed, 5 deletions(-)
tools/testing/selftests/bpf/prog_tests/btf.c +0 -5
@@ -4630,11 +4630,6 @@ static int test_btf_id(unsigned int test/* The map holds the last ref to BTF and its btf_id */ close (map_fd); map_fd =-1 ; - btf_fd[0 ] =bpf_btf_get_fd_by_id (map_info.btf_id); -if (CHECK (btf_fd[0 ] >=0 ,"BTF lingers" )) { - err =-1 ; - goto done; - }fprintf (stderr,"OK" );
Greg Kroah-Hartman
maintainerPATCH 322/322 bonding: remove print in bond_verify_device_path
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhengchao Shao <[email protected]>
commit 486058f42a4728053ae69ebbf78e9731d8ce6f8b upstream.
As suggested by Paolo in link[1], if the memory allocation fails, the mm layer will emit a lot warning comprising the backtrace, so remove the print.
[1] https://lore.kernel.org/all/[email protected]/
--- drivers/net/bonding/bond_main.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/bonding/bond_main.c +1 -4
@@ -2973,11 +2973,8 @@ struct bond_vlan_tag *bond_verify_deviceif (start_dev == end_dev) { tags =kcalloc (level +1 ,sizeof (*tags),GFP_ATOMIC ); -if (!tags) { -net_err_ratelimited ("%s: %s: Failed to allocate tags\n" , - __func__, start_dev->name); +if (!tags)return ERR_PTR (-ENOMEM ); - } tags[level].vlan_proto =BOND_VLAN_PROTO_NONE ;return tags; }
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Same problems as reported on 6.7 and 6.1.
Build error/warning ("variable 'slot_id' is uninitialized", as seen on 6.7 and 6.1) can be found on this branch too, with Clang 17 and Clang nightly on Arm64, Arm32, i386, x86, MIPS, RISC-V.
Build error due to pmicintc is present on this branch too.
Greetings!
Daniel Díaz
[email protected]
Greg Kroah-Hartman
maintainerQuoted 21 lines · Daniel Díaz
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
Quoted 7 lines
Same problems as reported on 6.7 and 6.1.
Build error/warning ("variable '
slot_id' is uninitialized", as seen on 6.7 and 6.1) can be found on this branch too, with Clang 17 and Clang nightly on Arm64, Arm32, i386, x86, MIPS, RISC-V.Build error due to pmicintc is present on this branch too.
Yeah, looks like the xhci changes here are not for stable as the fix it makes is not correct here (it depends on other changes.) I'll go drop them and push out new stable trees, hopefully that should resolve the issues people are having.
thanks,
greg k-h
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.6.16 release. There are 322 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.
6.6/6.7 seem to have build problems, likely same ones others are reporting.
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/pipelines/1163145567
BR,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
6.6.16-rc1 tested.
Build successfully completed.
Boot error.
After selecting the rc kernel in grub I can't proceed further
Lenovo ThinkPad X1 Carbon Gen10(Intel i7-1260P(x86_64) arch linux)
Thanks
Greg Kroah-Hartman
maintainerQuoted 29 lines · Takeshi Ogasawara
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
6.6.16-rc1 tested.
Build successfully completed.
Boot error.
Quoted 7 lines
After selecting the rc kernel in grub I can't proceed further
Lenovo ThinkPad X1 Carbon
Gen10(Intel i7-1260P(x86_64) arch linux)Thanks
Tested-by Takeshi Ogasawara <[email protected]>
Any traceback report from the boot error?
Quoted 33 lines · Greg Kroah-Hartman
Quoted 31 lines · Takeshi Ogasawara
Hi Greg
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
6.6.16-rc1 tested.
Build successfully completed.
Boot error.After selecting the rc kernel in grub I can't proceed further
Quoted 7 lines
Quoted 5 lines
Lenovo ThinkPad X1 Carbon
Gen10(Intel i7-1260P(x86_64) arch linux)Thanks
Tested-by Takeshi Ogasawara <[email protected]>Any traceback report from the boot error?
I checked the log when the rc1 kernel started from the kernel that started normally, but there was no log of the boot of the rc1 kernel.
Symptoms include grub starting, the screen blacking out, and returning to the grub screen, but no keyboard input was accepted.
The problem was resolved with 6.6.16-rc2 and it worked normally.
Thanks
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.6.16 release. There are 322 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +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.6.16-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.6.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian