5.4.190-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.4.190-rc1 review
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.190-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.190-rc1
Duoming Zhou <[email protected]>
ax25: Fix UAF bugs in ax25 timers
Duoming Zhou <[email protected]>
ax25: Fix NULL pointer dereferences in ax25 timers
Duoming Zhou <[email protected]>
ax25: fix NPD bug in ax25_disconnect
Duoming Zhou <[email protected]>
ax25: fix UAF bug in ax25_send_control()
Duoming Zhou <[email protected]>
ax25: Fix refcount leaks caused by ax25_cb_del()
Duoming Zhou <[email protected]>
ax25: fix UAF bugs of net_device caused by rebinding operation
Duoming Zhou <[email protected]>
ax25: fix reference count leaks of ax25_dev
Duoming Zhou <[email protected]>
ax25: add refcount in ax25_dev to avoid UAF bugs
Chao Gao <[email protected]>
dma-direct: avoid redundant memory sync for swiotlb
Martin Povišer <[email protected]>
i2c: pasemi: Wait for write xfers to finish
Nadav Amit <[email protected]>
smp: Fix offline cpu check in flush_smp_call_function_queue()
Mikulas Patocka <[email protected]>
dm integrity: fix memory corruption when tag_size is less than digest size
Nathan Chancellor <[email protected]>
ARM: davinci: da850-evm: Avoid NULL pointer dereference
Paul Gortmaker <[email protected]>
tick/nohz: Use WARN_ON_ONCE() to prevent console saturation
Rei Yamamoto <[email protected]>
genirq/affinity: Consider that CPUs on nodes can be unbalanced
Melissa Wen <[email protected]>
drm/amd/display: don't ignore alpha property on pre-multiplied mode
Nicolas Dichtel <[email protected]>
ipv6: fix panic when forwarding a pkt with no in6 dev
Fabio M. De Francesco <[email protected]>
ALSA: pcm: Test for "silence" field in struct "pcm_format_data"
Tim Crawford <[email protected]>
ALSA: hda/realtek: Add quirk for Clevo PD50PNT
Naohiro Aota <[email protected]>
btrfs: mark resumed async balance as writing
Nathan Chancellor <[email protected]>
btrfs: remove unused variable in btrfs_{start,write}_dirty_block_groups()
Toke Høiland-Jørgensen <[email protected]>
ath9k: Fix usage of driver-private space in tx_info
Toke Høiland-Jørgensen <[email protected]>
ath9k: Properly clear TX status area before reporting to mac80211
Jason A. Donenfeld <[email protected]>
gcc-plugins: latent_entropy: use /dev/urandom
Oliver Upton <[email protected]>
KVM: Don't create VM debugfs files outside of the VM directory
Patrick Wang <[email protected]>
mm: kmemleak: take a full lowmem check in kmemleak_*_phys()
Juergen Gross <[email protected]>
mm, page_alloc: fix build_zonerefs_node()
Borislav Petkov <[email protected]>
perf/imx_ddr: Fix undefined behavior due to shift overflowing the constant
Duoming Zhou <[email protected]>
drivers: net: slip: fix NPD bug in sl_tx_timeout()
Chandrakanth patil <[email protected]>
scsi: megaraid_sas: Target with invalid LUN ID is deleted during scan
Alexey Galakhov <[email protected]>
scsi: mvsas: Add PCI ID of RocketRaid 2640
Kefeng Wang <[email protected]>
powerpc: Fix virt_addr_valid() for 64-bit Book3E & 32-bit
Roman Li <[email protected]>
drm/amd/display: Fix allocate_mst_payload assert on resume
Marcin Kozlowski <[email protected]>
net: usb: aqc111: Fix out-of-bounds accesses in RX fixup
Steve Capper <[email protected]>
tlb: hugetlb: Add more sizes to tlb_remove_huge_tlb_entry
Joey Gouly <[email protected]>
arm64: alternatives: mark patch_alternative() as noinstr
Jonathan Bakker <[email protected]>
regulator: wm8994: Add an off-on delay for WM8994 variant
Leo Ruan <[email protected]>
gpu: ipu-v3: Fix dev_dbg frequency output
Christian Lamparter <[email protected]>
ata: libata-core: Disable READ LOG DMA EXT for Samsung 840 EVOs
Randy Dunlap <[email protected]>
net: micrel: fix KS8851_MLL Kconfig
Tyrel Datwyler <[email protected]>
scsi: ibmvscsis: Increase INITIAL_SRP_LIMIT to 1024
Xiaoguang Wang <[email protected]>
scsi: target: tcmu: Fix possible page UAF
Michael Kelley <[email protected]>
Drivers: hv: vmbus: Prevent load re-ordering when reading ring buffer
QintaoShen <[email protected]>
drm/amdkfd: Check for potential null return of kmalloc_array()
Tushar Patel <[email protected]>
drm/amdkfd: Fix Incorrect VMIDs passed to HWS
Leo (Hanghong) Ma <[email protected]>
drm/amd/display: Update VTEM Infopacket definition
Charlene Liu <[email protected]>
drm/amd/display: fix audio format not updated after edid updated
Aurabindo Pillai <[email protected]>
drm/amd: Add USBC connector ID
Harshit Mogalapalli <[email protected]>
cifs: potential buffer overflow in handling symlinks
Lin Ma <[email protected]>
nfc: nci: add flush_workqueue to prevent uaf
Athira Rajeev <[email protected]>
testing/selftests/mqueue: Fix mq_perf_tests to free the allocated cpu set
Petr Malat <[email protected]>
sctp: Initialize daddr on peeled off socket
Karsten Graul <[email protected]>
net/smc: Fix NULL pointer dereference in smc_pnet_find_ib()
Stephen Boyd <[email protected]>
drm/msm/dsi: Use connector directly in msm_dsi_manager_connector_init()
Rameshkumar Sundaram <[email protected]>
cfg80211: hold bss_lock while updating nontrans_list
Benedikt Spranger <[email protected]>
net/sched: taprio: Check if socket flags are valid
Dinh Nguyen <[email protected]>
net: ethernet: stmmac: fix altr_tse_pcs function when using a fixed-link
Marcelo Ricardo Leitner <[email protected]>
net/sched: fix initialization order when updating chain 0 head
Vadim Pasternak <[email protected]>
mlxsw: i2c: Fix initialization error flow
Linus Torvalds <[email protected]>
gpiolib: acpi: use correct format characters
Guillaume Nault <[email protected]>
veth: Ensure eth header is in skb's linear part
Vlad Buslov <[email protected]>
net/sched: flower: fix parsing of ethertype following VLAN header
Miaoqian Lin <[email protected]>
memory: atmel-ebi: Fix missing of_node_put in atmel_ebi_probe
-------------
Diffstat:
Makefile | 4 +- arch/arm/mach-davinci/board-da850-evm.c | 4 +- arch/arm64/kernel/alternative.c | 6 +-- arch/powerpc/include/asm/page.h | 6 ++- drivers/ata/libata-core.c | 3 ++ drivers/gpio/gpiolib-acpi.c | 4 +- drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 ++---- drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 +- .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 14 ++++--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 14 ++++--- .../amd/display/modules/info_packet/info_packet.c | 5 ++- drivers/gpu/drm/msm/dsi/dsi_manager.c | 2 +- drivers/gpu/ipu-v3/ipu-di.c | 5 ++- drivers/hv/ring_buffer.c | 11 +++++- drivers/i2c/busses/i2c-pasemi.c | 6 +++ drivers/md/dm-integrity.c | 7 +++- drivers/memory/atmel-ebi.c | 23 ++++++++--- drivers/net/ethernet/mellanox/mlxsw/i2c.c | 1 + drivers/net/ethernet/micrel/Kconfig | 1 + drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | 8 ---- drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h | 4 ++ .../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 13 +++---- drivers/net/slip/slip.c | 2 +- drivers/net/usb/aqc111.c | 9 ++++- drivers/net/veth.c | 2 +- drivers/net/wireless/ath/ath9k/main.c | 2 +- drivers/net/wireless/ath/ath9k/xmit.c | 33 ++++++++++------ drivers/perf/fsl_imx8_ddr_perf.c | 2 +- drivers/regulator/wm8994-regulator.c | 42 +++++++++++++++++++-- drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 2 +- drivers/scsi/megaraid/megaraid_sas.h | 3 ++ drivers/scsi/megaraid/megaraid_sas_base.c | 7 ++++ drivers/scsi/mvsas/mv_init.c | 1 + drivers/target/target_core_user.c | 3 +- fs/btrfs/block-group.c | 4 -- fs/btrfs/volumes.c | 2 + fs/cifs/link.c | 3 ++ include/asm-generic/tlb.h | 10 +++-- include/net/ax25.h | 12 ++++++ include/net/flow_dissector.h | 2 + kernel/dma/direct.c | 3 +- kernel/irq/affinity.c | 5 ++- kernel/smp.c | 2 +- kernel/time/tick-sched.c | 2 +- mm/kmemleak.c | 8 ++-- mm/page_alloc.c | 2 +- net/ax25/af_ax25.c | 38 +++++++++++++++---- net/ax25/ax25_dev.c | 28 +++++++++++--- net/ax25/ax25_route.c | 13 ++++++- net/ax25/ax25_subr.c | 20 +++++++--- net/core/flow_dissector.c | 1 + net/ipv6/ip6_output.c | 2 +- net/nfc/nci/core.c | 4 ++ net/sched/cls_api.c | 2 +- net/sched/cls_flower.c | 18 ++++++--- net/sched/sch_taprio.c | 3 +- net/sctp/socket.c | 2 +- net/smc/smc_pnet.c | 5 ++- net/wireless/scan.c | 2 + scripts/gcc-plugins/latent_entropy_plugin.c | 44 +++++++++++++--------- sound/core/pcm_misc.c | 2 +- sound/pci/hda/patch_realtek.c | 1 + tools/testing/selftests/mqueue/mq_perf_tests.c | 25 ++++++++---- virt/kvm/kvm_main.c | 10 ++++- 68 files changed, 386 insertions(+), 161 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/63 memory: atmel-ebi: Fix missing of_node_put in atmel_ebi_probe
From: Miaoqian Lin <[email protected]>
[ Upstream commit 6f296a9665ba5ac68937bf11f96214eb9de81baa ]
The device_node pointer is returned by of_parse_phandle() with refcount incremented. We should use of_node_put() on it when done.
--- drivers/memory/atmel-ebi.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)
drivers/memory/atmel-ebi.c +17 -6
@@ -545,20 +545,27 @@ static int atmel_ebi_probe(struct platform_device *pdev) smc_np =of_parse_phandle (dev->of_node,"atmel,smc" ,0 ); ebi->smc.regmap =syscon_node_to_regmap (smc_np); -if (IS_ERR (ebi->smc.regmap)) -return PTR_ERR (ebi->smc.regmap); +if (IS_ERR (ebi->smc.regmap)) { + ret =PTR_ERR (ebi->smc.regmap); + goto put_node; + } ebi->smc.layout =atmel_hsmc_get_reg_layout (smc_np); -if (IS_ERR (ebi->smc.layout)) -return PTR_ERR (ebi->smc.layout); +if (IS_ERR (ebi->smc.layout)) { + ret =PTR_ERR (ebi->smc.layout); + goto put_node; + } ebi->smc.clk =of_clk_get (smc_np,0 );if (IS_ERR (ebi->smc.clk)) { -if (PTR_ERR (ebi->smc.clk) != -ENOENT ) -return PTR_ERR (ebi->smc.clk); +if (PTR_ERR (ebi->smc.clk) != -ENOENT ) { + ret =PTR_ERR (ebi->smc.clk); + goto put_node; + } ebi->smc.clk =NULL ; } +of_node_put (smc_np); ret =clk_prepare_enable (ebi->smc.clk);if (ret)return ret;
@@ -609,6 +616,10 @@ static int atmel_ebi_probe(struct platform_device *pdev) }return of_platform_populate (np,NULL ,NULL , dev); + +put_node: +of_node_put (smc_np); +return ret; }static __maybe_unused int atmel_ebi_resume (struct device *dev)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 2/63 net/sched: flower: fix parsing of ethertype following VLAN header
In reply to Greg Kroah-HartmanFrom: Vlad Buslov <[email protected]>
[ Upstream commit 2105f700b53c24aa48b65c15652acc386044d26a ]
A tc flower filter matching TCA_FLOWER_KEY_VLAN_ETH_TYPE is expected to match the L2 ethertype following the first VLAN header, as confirmed by linked discussion with the maintainer. However, such rule also matches packets that have additional second VLAN header, even though filter has both eth_type and vlan_ethtype set to "ipv4". Looking at the code this seems to be mostly an artifact of the way flower uses flow dissector. First, even though looking at the uAPI eth_type and vlan_ethtype appear like a distinct fields, in flower they are all mapped to the same key->basic.n_proto. Second, flow dissector skips following VLAN header as no keys for FLOW_DISSECTOR_KEY_CVLAN are set and eventually assigns the value of n_proto to last parsed header. With these, such filters ignore any headers present between first VLAN header and first "non magic" header (ipv4 in this case) that doesn't result FLOW_DISSECT_RET_PROTO_AGAIN.
Fix the issue by extending flow dissector VLAN key structure with new 'vlan_eth_type' field that matches first ethertype following previously parsed VLAN header. Modify flower classifier to set the new flow_dissector_key_vlan->vlan_eth_type with value obtained from TCA_FLOWER_KEY_VLAN_ETH_TYPE/TCA_FLOWER_KEY_CVLAN_ETH_TYPE uAPIs.
--- include/net/flow_dissector.h | 2 ++ net/core/flow_dissector.c | 1 + net/sched/cls_flower.c | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 5 deletions(-)
include/net/flow_dissector.h +2 -0
@@ -51,6 +51,8 @@ struct flow_dissector_key_vlan { vlan_dei:1 , vlan_priority:3;__be16 vlan_tpid; +__be16 vlan_eth_type; +u16 padding; };struct flow_dissector_key_mpls {
net/core/flow_dissector.c +1 -0
@@ -1149,6 +1149,7 @@ bool __skb_flow_dissect(const struct net *net, VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; } key_vlan->vlan_tpid = saved_vlan_tpid; + key_vlan->vlan_eth_type = proto; } fdret =FLOW_DISSECT_RET_PROTO_AGAIN ;
net/sched/cls_flower.c +13 -5
@@ -784,6 +784,7 @@ static int fl_set_key_mpls(struct nlattr **tb,static void fl_set_key_vlan (struct nlattr **tb,__be16 ethertype,int vlan_id_key,int vlan_prio_key, +int vlan_next_eth_type_key,struct flow_dissector_key_vlan *key_val,struct flow_dissector_key_vlan *key_mask) {
@@ -802,6 +803,11 @@ static void fl_set_key_vlan(struct nlattr **tb, } key_val->vlan_tpid = ethertype; key_mask->vlan_tpid =cpu_to_be16 (~0 ); +if (tb[vlan_next_eth_type_key]) { + key_val->vlan_eth_type = +nla_get_be16 (tb[vlan_next_eth_type_key]); + key_mask->vlan_eth_type =cpu_to_be16 (~0 ); + } } static void fl_set_key_flag(u32 flower_key, u32 flower_mask,
@@ -1076,8 +1082,9 @@ static int fl_set_key(struct net *net, struct nlattr **tb,if (eth_type_vlan (ethertype)) {fl_set_key_vlan (tb, ethertype,TCA_FLOWER_KEY_VLAN_ID , -TCA_FLOWER_KEY_VLAN_PRIO , &key->vlan, - &mask->vlan); +TCA_FLOWER_KEY_VLAN_PRIO , +TCA_FLOWER_KEY_VLAN_ETH_TYPE , + &key->vlan, &mask->vlan);if (tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE ]) { ethertype =nla_get_be16 (tb[TCA_FLOWER_KEY_VLAN_ETH_TYPE ]);
@@ -1085,6 +1092,7 @@ static int fl_set_key(struct net *net, struct nlattr **tb,fl_set_key_vlan (tb, ethertype,TCA_FLOWER_KEY_CVLAN_ID ,TCA_FLOWER_KEY_CVLAN_PRIO , +TCA_FLOWER_KEY_CVLAN_ETH_TYPE , &key->cvlan, &mask->cvlan); fl_set_key_val(tb, &key->basic.n_proto, TCA_FLOWER_KEY_CVLAN_ETH_TYPE,
@@ -2272,13 +2280,13 @@ static int fl_dump_key(struct sk_buff *skb, struct net *net, goto nla_put_failure;if (mask->basic.n_proto) { -if (mask->cvlan.vlan_tpid) { +if (mask->cvlan.vlan_eth_type) {if (nla_put_be16 (skb,TCA_FLOWER_KEY_CVLAN_ETH_TYPE , key->basic.n_proto)) goto nla_put_failure; - }else if (mask->vlan.vlan_tpid) { + }else if (mask->vlan.vlan_eth_type) {if (nla_put_be16 (skb,TCA_FLOWER_KEY_VLAN_ETH_TYPE , - key->basic.n_proto)) + key->vlan.vlan_eth_type)) goto nla_put_failure; } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 3/63 veth: Ensure eth header is in skbs linear part
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
[ Upstream commit 726e2c5929de841fdcef4e2bf995680688ae1b87 ]
After feeding a decapsulated packet to a veth device with act_mirred, skb_headlen() may be 0. But veth_xmit() calls __dev_forward_skb(), which expects at least ETH_HLEN byte of linear data (as __dev_forward_skb2() calls eth_type_trans(), which pulls ETH_HLEN bytes unconditionally).
Use pskb_may_pull() to ensure veth_xmit() respects this constraint.
kernel BUG at include/linux/skbuff.h:2328!
RIP: 0010:eth_type_trans+0xcf/0x140 Call Trace: <IRQ> __dev_forward_skb2+0xe3/0x160 veth_xmit+0x6e/0x250 [veth] dev_hard_start_xmit+0xc7/0x200 __dev_queue_xmit+0x47f/0x520 ? skb_ensure_writable+0x85/0xa0 ? skb_mpls_pop+0x98/0x1c0 tcf_mirred_act+0x442/0x47e [act_mirred] tcf_action_exec+0x86/0x140 fl_classify+0x1d8/0x1e0 [cls_flower] ? dma_pte_clear_level+0x129/0x1a0 ? dma_pte_clear_level+0x129/0x1a0 ? prb_fill_curr_block+0x2f/0xc0 ? skb_copy_bits+0x11a/0x220 __tcf_classify+0x58/0x110 tcf_classify_ingress+0x6b/0x140 __netif_receive_skb_core.constprop.0+0x47d/0xfd0 ? __iommu_dma_unmap_swiotlb+0x44/0x90 __netif_receive_skb_one_core+0x3d/0xa0 netif_receive_skb+0x116/0x170 be_process_rx+0x22f/0x330 [be2net] be_poll+0x13c/0x370 [be2net] __napi_poll+0x2a/0x170 net_rx_action+0x22f/0x2f0 __do_softirq+0xca/0x2a8 __irq_exit_rcu+0xc1/0xe0 common_interrupt+0x83/0xa0
--- drivers/net/veth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/veth.c +1 -1
@@ -245,7 +245,7 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)rcu_read_lock (); rcv =rcu_dereference (priv->peer); -if (unlikely (!rcv)) { +if (unlikely (!rcv) || !pskb_may_pull (skb,ETH_HLEN )) {kfree_skb (skb); goto drop; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 4/63 gpiolib: acpi: use correct format characters
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
[ Upstream commit 213d266ebfb1621aab79cfe63388facc520a1381 ]
When compiling with -Wformat, clang emits the following warning:
gpiolib-acpi.c:393:4: warning: format specifies type 'unsigned char' but the argument has type 'int' [-Wformat]
pin);
^~~So warning that '%hhX' is paired with an 'int' is all just completely mindless and wrong. Sadly, I can see a different bogus warning reason why people would want to use '%02hhX'.
Again, the *sane* thing from a human perspective is to use '%02X. But if the compiler doesn't do any range analysis at all, it could decide that "Oh, that print format could need up to 8 bytes of space in the result". Using '%02hhX' would cut that down to two.
And since we use
char ev_name[5];
and currently use "_%c%02hhX" as the format string, even a compiler that doesn't notice that "pin <= 255" test that guards this all will go "OK, that's at most 4 bytes and the final NUL termination, so it's fine".
While a compiler - like gcc - that only sees that the original source of the 'pin' value is a 'unsigned short' array, and then doesn't take the "pin <= 255" into account, will warn like this:
gpiolib-acpi.c: In function 'acpi_gpiochip_request_interrupt':
gpiolib-acpi.c:206:24: warning: '%02X' directive writing between 2 and 4 bytes into a region of size 3 [-Wformat-overflow=]
sprintf(ev_name, "_%c%02X",
^~~~gpiolib-acpi.c:206:20: note: directive argument in the range [0, 65535]
because gcc isn't being very good at that argument range analysis either.
In other words, the original use of 'hhx' was bogus to begin with, and due to *another* compiler warning being bad, and we had that bad code being written back in 2016 to work around _that_ compiler warning (commit e40a3ae1f794: "gpio: acpi: work around false-positive -Wstring-overflow warning").
Sadly, two different bad compiler warnings together does not make for one good one.
It just makes for even more pain.
End result: I think the simplest and cleanest option is simply the proposed change which undoes that '%hhX' change for gcc, and replaces it with just using a slightly bigger stack allocation. It's not like a 5-byte allocation is in any way likely to have saved any actual stack, since all the other variables in that function are 'int' or bigger.
False-positive compiler warnings really do make people write worse code, and that's a problem. But on a scale of bad code, I feel that extending the buffer trivially is better than adding a pointless cast that literally makes no sense.
At least in this case the end result isn't unreadable or buggy. We've had several cases of bad compiler warnings that caused changes that were actually horrendously wrong.
--- drivers/gpio/gpiolib-acpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpio/gpiolib-acpi.c +2 -2
@@ -275,8 +275,8 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, pin = agpio->pin_table[0 ];if (pin <=255 ) { -char ev_name[5 ]; -sprintf (ev_name,"_%c%02hhX" , +char ev_name[8 ]; +sprintf (ev_name,"_%c%02X" , agpio->triggering ==ACPI_EDGE_SENSITIVE ?'E' :'L' , pin);if (ACPI_SUCCESS (acpi_get_handle (handle, ev_name, &evt_handle)))
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 5/63 mlxsw: i2c: Fix initialization error flow
In reply to Greg Kroah-HartmanFrom: Vadim Pasternak <[email protected]>
[ Upstream commit d452088cdfd5a4ad9d96d847d2273fe958d6339b ]
Add mutex_destroy() call in driver initialization error flow.
--- drivers/net/ethernet/mellanox/mlxsw/i2c.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlxsw/i2c.c +1 -0
@@ -649,6 +649,7 @@ static int mlxsw_i2c_probe(struct i2c_client *client,return 0 ; errout: +mutex_destroy (&mlxsw_i2c->cmd.lock);i2c_set_clientdata (client,NULL );return err;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 6/63 net/sched: fix initialization order when updating chain 0 head
In reply to Greg Kroah-HartmanFrom: Marcelo Ricardo Leitner <[email protected]>
[ Upstream commit e65812fd22eba32f11abe28cb377cbd64cfb1ba0 ]
Currently, when inserting a new filter that needs to sit at the head of chain 0, it will first update the heads pointer on all devices using the (shared) block, and only then complete the initialization of the new element so that it has a "next" element.
This can lead to a situation that the chain 0 head is propagated to another CPU before the "next" initialization is done. When this race condition is triggered, packets being matched on that CPU will simply miss all other filters, and will flow through the stack as if there were no other filters installed. If the system is using OVS + TC, such packets will get handled by vswitchd via upcall, which results in much higher latency and reordering. For other applications it may result in packet drops.
This is reproducible with a tc only setup, but it varies from system to system. It could be reproduced with a shared block amongst 10 veth tunnels, and an ingress filter mirroring packets to another veth. That's because using the last added veth tunnel to the shared block to do the actual traffic, it makes the race window bigger and easier to trigger.
The fix is rather simple, to just initialize the next pointer of the new filter instance (tp) before propagating the head change.
The fixes tag is pointing to the original code though this issue should only be observed when using it unlocked.
--- net/sched/cls_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/cls_api.c +1 -1
@@ -1639,10 +1639,10 @@ static int tcf_chain_tp_insert(struct tcf_chain *chain,if (chain->flushing)return -EAGAIN ; +RCU_INIT_POINTER (tp->next,tcf_chain_tp_prev (chain, chain_info));if (*chain_info->pprev == chain->filter_chain)tcf_chain0_head_change (chain, tp);tcf_proto_get (tp); -RCU_INIT_POINTER (tp->next,tcf_chain_tp_prev (chain, chain_info));rcu_assign_pointer (*chain_info->pprev, tp);return 0 ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 7/63 net: ethernet: stmmac: fix altr_tse_pcs function when using a fixed-link
In reply to Greg Kroah-HartmanFrom: Dinh Nguyen <[email protected]>
[ Upstream commit a6aaa00324240967272b451bfa772547bd576ee6 ]
When using a fixed-link, the altr_tse_pcs driver crashes due to null-pointer dereference as no phy_device is provided to tse_pcs_fix_mac_speed function. Fix this by adding a check for phy_dev before calling the tse_pcs_fix_mac_speed() function.
Also clean up the tse_pcs_fix_mac_speed function a bit. There is no need to check for splitter_base and sgmii_adapter_base because the driver will fail if these 2 variables are not derived from the device tree.
--- drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c | 8 -------- drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h | 4 ++++ drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 13 +++++-------- 3 files changed, 9 insertions(+), 16 deletions(-)
drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c +0 -8
@@ -57,10 +57,6 @@#define TSE_PCS_USE_SGMII_ENA BIT(0)#define TSE_PCS_IF_USE_SGMII 0x03 -#define SGMII_ADAPTER_CTRL_REG 0x00 -#define SGMII_ADAPTER_DISABLE 0x0001 -#define SGMII_ADAPTER_ENABLE 0x0000 -#define AUTONEGO_LINK_TIMER 20static int tse_pcs_reset (void __iomem *base,struct tse_pcs *pcs)
@@ -202,12 +198,8 @@ void tse_pcs_fix_mac_speed(struct tse_pcs *pcs, struct phy_device *phy_dev, unsigned int speed) {void __iomem *tse_pcs_base = pcs->tse_pcs_base; -void __iomem *sgmii_adapter_base = pcs->sgmii_adapter_base;u32 val; -writew (SGMII_ADAPTER_ENABLE , - sgmii_adapter_base +SGMII_ADAPTER_CTRL_REG ); - pcs->autoneg = phy_dev->autoneg;if (phy_dev->autoneg ==AUTONEG_ENABLE ) {
drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h +4 -0
@@ -10,6 +10,10 @@#include <linux/phy.h> #include <linux/timer.h> +#define SGMII_ADAPTER_CTRL_REG 0x00 +#define SGMII_ADAPTER_ENABLE 0x0000 +#define SGMII_ADAPTER_DISABLE 0x0001 +struct tse_pcs {struct device *dev;void __iomem *tse_pcs_base;
drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +5 -8
@@ -18,9 +18,6 @@#include "altr_tse_pcs.h" -#define SGMII_ADAPTER_CTRL_REG 0x00 -#define SGMII_ADAPTER_DISABLE 0x0001 -#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII 0x2
@@ -62,16 +59,14 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed) {struct socfpga_dwmac *dwmac = (struct socfpga_dwmac *)priv;void __iomem *splitter_base = dwmac->splitter_base; -void __iomem *tse_pcs_base = dwmac->pcs.tse_pcs_base;void __iomem *sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base;struct device *dev = dwmac->dev;struct net_device *ndev =dev_get_drvdata (dev);struct phy_device *phy_dev = ndev->phydev;u32 val; -if ((tse_pcs_base) && (sgmii_adapter_base)) -writew (SGMII_ADAPTER_DISABLE , - sgmii_adapter_base +SGMII_ADAPTER_CTRL_REG ); +writew (SGMII_ADAPTER_DISABLE , + sgmii_adapter_base +SGMII_ADAPTER_CTRL_REG );if (splitter_base) { val =readl (splitter_base +EMAC_SPLITTER_CTRL_REG );
@@ -93,7 +88,9 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned int speed)writel (val, splitter_base +EMAC_SPLITTER_CTRL_REG ); } -if (tse_pcs_base && sgmii_adapter_base) +writew (SGMII_ADAPTER_ENABLE , + sgmii_adapter_base +SGMII_ADAPTER_CTRL_REG ); +if (phy_dev)tse_pcs_fix_mac_speed (&dwmac->pcs, phy_dev, speed); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 8/63 net/sched: taprio: Check if socket flags are valid
In reply to Greg Kroah-HartmanFrom: Benedikt Spranger <[email protected]>
[ Upstream commit e8a64bbaaad1f6548cec5508297bc6d45e8ab69e ]
A user may set the SO_TXTIME socket option to ensure a packet is send at a given time. The taprio scheduler has to confirm, that it is allowed to send a packet at that given time, by a check against the packet time schedule. The scheduler drop the packet, if the gates are closed at the given send time.
The check, if SO_TXTIME is set, may fail since sk_flags are part of an union and the union is used otherwise. This happen, if a socket is not a full socket, like a request socket for example.
Add a check to verify, if the union is used for sk_flags.
--- net/sched/sch_taprio.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sched/sch_taprio.c +2 -1
@@ -427,7 +427,8 @@ static int taprio_enqueue(struct sk_buff *skb, struct Qdisc *sch,if (unlikely (!child))return qdisc_drop (skb, sch, to_free); -if (skb->sk &&sock_flag (skb->sk,SOCK_TXTIME )) { +/* sk_flags are only safe to use on full sockets. */ +if (skb->sk &&sk_fullsock (skb->sk) &&sock_flag (skb->sk,SOCK_TXTIME )) {if (!is_valid_interval (skb, sch))return qdisc_drop (skb, sch, to_free); }else if (TXTIME_ASSIST_IS_ENABLED (q->flags)) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 9/63 cfg80211: hold bss_lock while updating nontrans_list
In reply to Greg Kroah-HartmanFrom: Rameshkumar Sundaram <[email protected]>
[ Upstream commit a5199b5626cd6913cf8776a835bc63d40e0686ad ]
Synchronize additions to nontrans_list of transmitting BSS with bss_lock to avoid races. Also when cfg80211_add_nontrans_list() fails __cfg80211_unlink_bss() needs bss_lock to be held (has lockdep assert on bss_lock). So protect the whole block with bss_lock to avoid races and warnings. Found during code review.
--- net/wireless/scan.c | 2 ++ 1 file changed, 2 insertions(+)
net/wireless/scan.c +2 -0
@@ -1457,11 +1457,13 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy,/* this is a nontransmitting bss, we need to add it to * transmitting bss' list if it is not there */ +spin_lock_bh (&rdev->bss_lock);if (cfg80211_add_nontrans_list (non_tx_data->tx_bss, &res->pub)) {if (__cfg80211_unlink_bss (rdev, res)) rdev->bss_generation++; } +spin_unlock_bh (&rdev->bss_lock); }trace_cfg80211_return_bss (&res->pub);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 10/63 drm/msm/dsi: Use connector directly in msm_dsi_manager_connector_init()
In reply to Greg Kroah-HartmanFrom: Stephen Boyd <[email protected]>
[ Upstream commit 47b7de6b88b962ef339a2427a023d2a23d161654 ]
The member 'msm_dsi->connector' isn't assigned until msm_dsi_manager_connector_init() returns (see msm_dsi_modeset_init() and how it assigns the return value). Therefore this pointer is going to be NULL here. Let's use 'connector' which is what was intended.
Patchwork: https://patchwork.freedesktop.org/patch/478693/
--- drivers/gpu/drm/msm/dsi/dsi_manager.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/dsi/dsi_manager.c +1 -1
@@ -625,7 +625,7 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)return connector; fail: - connector->funcs->destroy (msm_dsi->connector); + connector->funcs->destroy (connector);return ERR_PTR (ret); }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/63 net/smc: Fix NULL pointer dereference in smc_pnet_find_ib()
In reply to Greg Kroah-HartmanFrom: Karsten Graul <[email protected]>
[ Upstream commit d22f4f977236f97e01255a80bca2ea93a8094fc8 ]
dev_name() was called with dev.parent as argument but without to NULL-check it before.
Solve this by checking the pointer before the call to dev_name().
--- net/smc/smc_pnet.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/smc/smc_pnet.c +3 -2
@@ -295,8 +295,9 @@ static struct smc_ib_device *smc_pnet_find_ib(char *ib_name)list_for_each_entry (ibdev, &smc_ib_devices.list, list) {if (!strncmp (ibdev->ibdev->name, ib_name,sizeof (ibdev->ibdev->name)) || - !strncmp (dev_name (ibdev->ibdev->dev.parent), ib_name, -IB_DEVICE_NAME_MAX -1 )) { + (ibdev->ibdev->dev.parent && + !strncmp (dev_name (ibdev->ibdev->dev.parent), ib_name, +IB_DEVICE_NAME_MAX -1 ))) { goto out; } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/63 sctp: Initialize daddr on peeled off socket
In reply to Greg Kroah-HartmanFrom: Petr Malat <[email protected]>
[ Upstream commit 8467dda0c26583547731e7f3ea73fc3856bae3bf ]
Function sctp_do_peeloff() wrongly initializes daddr of the original socket instead of the peeled off socket, which makes getpeername() return zeroes instead of the primary address. Initialize the new socket instead.
--- net/sctp/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sctp/socket.c +1 -1
@@ -5682,7 +5682,7 @@ int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp)* Set the daddr and initialize id to something more random and also * copy over any ip options. */ - sp->pf->to_sk_daddr (&asoc->peer.primary_addr, sk); + sp->pf->to_sk_daddr (&asoc->peer.primary_addr, sock->sk); sp->pf->copy_ip_options (sk, sock->sk);/* Populate the fields of the newsk from the oldsk and migrate the
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 13/63 testing/selftests/mqueue: Fix mq_perf_tests to free the allocated cpu set
In reply to Greg Kroah-HartmanFrom: Athira Rajeev <[email protected]>
[ Upstream commit ce64763c63854b4079f2e036638aa881a1fb3fbc ]
The selftest "mqueue/mq_perf_tests.c" use CPU_ALLOC to allocate CPU set. This cpu set is used further in pthread_attr_setaffinity_np and by pthread_create in the code. But in current code, allocated cpu set is not freed.
Fix this issue by adding CPU_FREE in the "shutdown" function which is called in most of the error/exit path for the cleanup. There are few error paths which exit without using shutdown. Add a common goto error path with CPU_FREE for these cases.
--- .../testing/selftests/mqueue/mq_perf_tests.c | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-)
tools/testing/selftests/mqueue/mq_perf_tests.c +17 -8
@@ -180,6 +180,9 @@ void shutdown(int exit_val, char *err_cause, int line_no)if (in_shutdown++)return ; +/* Free the cpu_set allocated using CPU_ALLOC in main function */ +CPU_FREE (cpu_set); +for (i =0 ; i < num_cpus_to_pin; i++)if (cpu_threads[i]) {pthread_kill (cpu_threads[i],SIGUSR1 );
@@ -551,6 +554,12 @@ int main(int argc, char *argv[])perror ("sysconf(_SC_NPROCESSORS_ONLN)" );exit (1 ); } + +if (getuid () !=0 ) +ksft_exit_skip ("Not running as root, but almost all tests " +"require root in order to modify\nsystem settings. " +"Exiting.\n" ); + cpus_online =min (MAX_CPUS ,sysconf (_SC_NPROCESSORS_ONLN)); cpu_set =CPU_ALLOC (cpus_online);if (cpu_set ==NULL ) {
@@ -589,7 +598,7 @@ int main(int argc, char *argv[]) cpu_set)) {fprintf (stderr,"Any given CPU may " "only be given once.\n" ); -exit (1 ); + goto err_code; } elseCPU_SET_S (cpus_to_pin [cpu],cpu_set_size ,cpu_set );
@@ -607,7 +616,7 @@ int main(int argc, char *argv[]) queue_path =malloc (strlen (option) +2 );if (!queue_path) {perror ("malloc()" ); -exit (1 ); + goto err_code; } queue_path[0 ] ='/' ; queue_path[1 ] =0 ;
@@ -622,17 +631,12 @@ int main(int argc, char *argv[])fprintf (stderr,"Must pass at least one CPU to continuous " "mode.\n" );poptPrintUsage (popt_context, stderr,0 ); -exit (1 ); + goto err_code; }else if (!continuous_mode) { num_cpus_to_pin =1 ; cpus_to_pin[0 ] = cpus_online -1 ; } -if (getuid () !=0 ) -ksft_exit_skip ("Not running as root, but almost all tests " -"require root in order to modify\nsystem settings. " -"Exiting.\n" ); - max_msgs =fopen (MAX_MSGS ,"r+" ); max_msgsize =fopen (MAX_MSGSIZE ,"r+" );if (!max_msgs)
@@ -740,4 +744,9 @@ int main(int argc, char *argv[])sleep (1 ); }shutdown (0 ,"" ,0 ); + +err_code: +CPU_FREE (cpu_set); +exit (1 ); + }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/63 nfc: nci: add flush_workqueue to prevent uaf
In reply to Greg Kroah-HartmanFrom: Lin Ma <[email protected]>
[ Upstream commit ef27324e2cb7bb24542d6cb2571740eefe6b00dc ]
Our detector found a concurrent use-after-free bug when detaching an NCI device. The main reason for this bug is the unexpected scheduling between the used delayed mechanism (timer and workqueue).
The race can be demonstrated below:
Thread-1 Thread-2
| nci_dev_up()
| nci_open_device()
| __nci_request(nci_reset_req)
| nci_send_cmd
| queue_work(cmd_work)
nci_unregister_device() |
nci_close_device() | ...
del_timer_sync(cmd_timer)[1] |
... | Worker
nci_free_device() | nci_cmd_work()
kfree(ndev)[3] | mod_timer(cmd_timer)[2]In short, the cleanup routine thought that the cmd_timer has already been detached by [1] but the mod_timer can re-attach the timer [2], even it is already released [3], resulting in UAF.
This UAF is easy to trigger, crash trace by POC is like below
[ 66.703713] ================================================================== [ 66.703974] BUG: KASAN: use-after-free in enqueue_timer+0x448/0x490 [ 66.703974] Write of size 8 at addr ffff888009fb7058 by task kworker/u4:1/33 [ 66.703974] [ 66.703974] CPU: 1 PID: 33 Comm: kworker/u4:1 Not tainted 5.18.0-rc2 #5 [ 66.703974] Workqueue: nfc2_nci_cmd_wq nci_cmd_work [ 66.703974] Call Trace: [ 66.703974] <TASK> [ 66.703974] dump_stack_lvl+0x57/0x7d [ 66.703974] print_report.cold+0x5e/0x5db [ 66.703974] ? enqueue_timer+0x448/0x490 [ 66.703974] kasan_report+0xbe/0x1c0 [ 66.703974] ? enqueue_timer+0x448/0x490 [ 66.703974] enqueue_timer+0x448/0x490 [ 66.703974] __mod_timer+0x5e6/0xb80 [ 66.703974] ? mark_held_locks+0x9e/0xe0 [ 66.703974] ? try_to_del_timer_sync+0xf0/0xf0 [ 66.703974] ? lockdep_hardirqs_on_prepare+0x17b/0x410 [ 66.703974] ? queue_work_on+0x61/0x80 [ 66.703974] ? lockdep_hardirqs_on+0xbf/0x130 [ 66.703974] process_one_work+0x8bb/0x1510 [ 66.703974] ? lockdep_hardirqs_on_prepare+0x410/0x410 [ 66.703974] ? pwq_dec_nr_in_flight+0x230/0x230 [ 66.703974] ? rwlock_bug.part.0+0x90/0x90 [ 66.703974] ? _raw_spin_lock_irq+0x41/0x50 [ 66.703974] worker_thread+0x575/0x1190 [ 66.703974] ? process_one_work+0x1510/0x1510 [ 66.703974] kthread+0x2a0/0x340 [ 66.703974] ? kthread_complete_and_exit+0x20/0x20 [ 66.703974] ret_from_fork+0x22/0x30 [ 66.703974] </TASK> [ 66.703974] [ 66.703974] Allocated by task 267: [ 66.703974] kasan_save_stack+0x1e/0x40 [ 66.703974] __kasan_kmalloc+0x81/0xa0 [ 66.703974] nci_allocate_device+0xd3/0x390 [ 66.703974] nfcmrvl_nci_register_dev+0x183/0x2c0 [ 66.703974] nfcmrvl_nci_uart_open+0xf2/0x1dd [ 66.703974] nci_uart_tty_ioctl+0x2c3/0x4a0 [ 66.703974] tty_ioctl+0x764/0x1310 [ 66.703974] __x64_sys_ioctl+0x122/0x190 [ 66.703974] do_syscall_64+0x3b/0x90 [ 66.703974] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 66.703974] [ 66.703974] Freed by task 406: [ 66.703974] kasan_save_stack+0x1e/0x40 [ 66.703974] kasan_set_track+0x21/0x30 [ 66.703974] kasan_set_free_info+0x20/0x30 [ 66.703974] __kasan_slab_free+0x108/0x170 [ 66.703974] kfree+0xb0/0x330 [ 66.703974] nfcmrvl_nci_unregister_dev+0x90/0xd0 [ 66.703974] nci_uart_tty_close+0xdf/0x180 [ 66.703974] tty_ldisc_kill+0x73/0x110 [ 66.703974] tty_ldisc_hangup+0x281/0x5b0 [ 66.703974] __tty_hangup.part.0+0x431/0x890 [ 66.703974] tty_release+0x3a8/0xc80 [ 66.703974] __fput+0x1f0/0x8c0 [ 66.703974] task_work_run+0xc9/0x170 [ 66.703974] exit_to_user_mode_prepare+0x194/0x1a0 [ 66.703974] syscall_exit_to_user_mode+0x19/0x50 [ 66.703974] do_syscall_64+0x48/0x90 [ 66.703974] entry_SYSCALL_64_after_hwframe+0x44/0xae
To fix the UAF, this patch adds flush_workqueue() to ensure the nci_cmd_work is finished before the following del_timer_sync. This combination will promise the timer is actually detached.
--- net/nfc/nci/core.c | 4 ++++ 1 file changed, 4 insertions(+)
net/nfc/nci/core.c +4 -0
@@ -548,6 +548,10 @@ static int nci_close_device(struct nci_dev *ndev)mutex_lock (&ndev->req_lock);if (!test_and_clear_bit (NCI_UP , &ndev->flags)) { +/* Need to flush the cmd wq in case +* there is a queued/running cmd_work +*/ +flush_workqueue (ndev->cmd_wq);del_timer_sync (&ndev->cmd_timer);del_timer_sync (&ndev->data_timer);mutex_unlock (&ndev->req_lock);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/63 cifs: potential buffer overflow in handling symlinks
In reply to Greg Kroah-HartmanFrom: Harshit Mogalapalli <[email protected]>
[ Upstream commit 64c4a37ac04eeb43c42d272f6e6c8c12bfcf4304 ]
Smatch printed a warning:
arch/x86/crypto/poly1305_glue.c:198 poly1305_update_arch() error: __memcpy() 'dctx->buf' too small (16 vs u32max)
It's caused because Smatch marks 'link_len' as untrusted since it comes from sscanf(). Add a check to ensure that 'link_len' is not larger than the size of the 'link_str' buffer.
--- fs/cifs/link.c | 3 +++ 1 file changed, 3 insertions(+)
fs/cifs/link.c +3 -0
@@ -97,6 +97,9 @@ parse_mf_symlink(const u8 *buf, unsigned int buf_len, unsigned int *_link_len,if (rc !=1 )return -EINVAL ; +if (link_len >CIFS_MF_SYMLINK_LINK_MAXLEN ) +return -EINVAL ; + rc =symlink_hash (link_len, link_str, md5_hash);if (rc) {cifs_dbg (FYI ,"%s: MD5 hash failure: %d\n" , __func__, rc);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/63 drm/amd: Add USBC connector ID
In reply to Greg Kroah-HartmanFrom: Aurabindo Pillai <[email protected]>
[ Upstream commit c5c948aa894a831f96fccd025e47186b1ee41615 ]
[Why&How] Add a dedicated AMDGPU specific ID for use with newer ASICs that support USB-C output
--- drivers/gpu/drm/amd/amdgpu/ObjectID.h | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/ObjectID.h +1 -0
@@ -119,6 +119,7 @@#define CONNECTOR_OBJECT_ID_eDP 0x14#define CONNECTOR_OBJECT_ID_MXM 0x15#define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16 +#define CONNECTOR_OBJECT_ID_USBC 0x17/* deleted */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/63 drm/amd/display: fix audio format not updated after edid updated
In reply to Greg Kroah-HartmanFrom: Charlene Liu <[email protected]>
[ Upstream commit 5e8a71cf13bc9184fee915b2220be71b4c6cac74 ]
[why]
for the case edid change only changed audio format. driver still need to update stream.
--- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +2 -2
@@ -1546,8 +1546,8 @@ bool dc_is_stream_unchanged(if (old_stream->ignore_msa_timing_param != stream->ignore_msa_timing_param)return false; -// Only Have Audio left to check whether it is same or not. This is a corner case for Tiled sinks -if (old_stream->audio_info.mode_count != stream->audio_info.mode_count) +/*compare audio info*/ +if (memcmp (&old_stream->audio_info, &stream->audio_info,sizeof (stream->audio_info)) !=0 )return false;return true;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/63 drm/amd/display: Update VTEM Infopacket definition
In reply to Greg Kroah-HartmanFrom: Leo (Hanghong) Ma <[email protected]>
[ Upstream commit c9fbf6435162ed5fb7201d1d4adf6585c6a8c327 ]
[Why & How]
The latest HDMI SPEC has updated the VTEM packet structure, so change the VTEM Infopacket defined in the driver side to align with the SPEC.
--- .../gpu/drm/amd/display/modules/info_packet/info_packet.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +3 -2
@@ -85,7 +85,8 @@//PB7 = MD0 #define MASK_VTEM_MD0__VRR_EN 0x01#define MASK_VTEM_MD0__M_CONST 0x02 -#define MASK_VTEM_MD0__RESERVED2 0x0C +#define MASK_VTEM_MD0__QMS_EN 0x04 +#define MASK_VTEM_MD0__RESERVED2 0x08#define MASK_VTEM_MD0__FVA_FACTOR_M1 0xF0//MD1
@@ -94,7 +95,7 @@//MD2 #define MASK_VTEM_MD2__BASE_REFRESH_RATE_98 0x03#define MASK_VTEM_MD2__RB 0x04 -#define MASK_VTEM_MD2__RESERVED3 0xF8 +#define MASK_VTEM_MD2__NEXT_TFR 0xF8//MD3 #define MASK_VTEM_MD3__BASE_REFRESH_RATE_07 0xFF
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/63 drm/amdkfd: Fix Incorrect VMIDs passed to HWS
In reply to Greg Kroah-HartmanFrom: Tushar Patel <[email protected]>
[ Upstream commit b7dfbd2e601f3fee545bc158feceba4f340fe7cf ]
Compute-only GPUs have more than 8 VMIDs allocated to KFD. Fix this by passing correct number of VMIDs to HWS
v2: squash in warning fix (Alex)
--- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 +- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +1 -1
@@ -633,7 +633,7 @@ MODULE_PARM_DESC(sched_policy,* Maximum number of processes that HWS can schedule concurrently. The maximum is the * number of VMIDs assigned to the HWS, which is also the default. */ -int hws_max_conc_proc =8 ; +int hws_max_conc_proc =-1 ;module_param (hws_max_conc_proc, int,0444 );MODULE_PARM_DESC (hws_max_conc_proc,"Max # processes HWS can execute concurrently when sched_policy=0 (0 = no concurrency, #VMIDs for KFD = Maximum(default))" );
drivers/gpu/drm/amd/amdkfd/kfd_device.c +3 -8
@@ -609,15 +609,10 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd, - kfd->vm_info.first_vmid_kfd + 1;/* Verify module parameters regarding mapped process number*/ -if ((hws_max_conc_proc <0 ) - || (hws_max_conc_proc > kfd->vm_info.vmid_num_kfd)) { -dev_err (kfd_device, -"hws_max_conc_proc %d must be between 0 and %d, use %d instead\n" , - hws_max_conc_proc, kfd->vm_info.vmid_num_kfd, - kfd->vm_info.vmid_num_kfd); +if (hws_max_conc_proc >=0 ) + kfd->max_proc_per_quantum =min ((u32 )hws_max_conc_proc, kfd->vm_info.vmid_num_kfd); +else kfd->max_proc_per_quantum = kfd->vm_info.vmid_num_kfd; - }else - kfd->max_proc_per_quantum = hws_max_conc_proc;/* Allocate global GWS that is shared by all KFD processes */ if (hws_gws_support && amdgpu_amdkfd_alloc_gws(kfd->kgd,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/63 drm/amdkfd: Check for potential null return of kmalloc_array()
In reply to Greg Kroah-HartmanFrom: QintaoShen <[email protected]>
[ Upstream commit ebbb7bb9e80305820dc2328a371c1b35679f2667 ]
As the kmalloc_array() may return null, the 'event_waiters[i].wait' would lead to null-pointer dereference. Therefore, it is better to check the return value of kmalloc_array() to avoid this confusion.
--- drivers/gpu/drm/amd/amdkfd/kfd_events.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_events.c +2 -0
@@ -532,6 +532,8 @@ static struct kfd_event_waiter *alloc_event_waiters(uint32_t num_events) event_waiters =kmalloc_array (num_events,sizeof (struct kfd_event_waiter ),GFP_KERNEL ); +if (!event_waiters) +return NULL ;for (i =0 ; (event_waiters) && (i < num_events) ; i++) {init_wait (&event_waiters[i].wait);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/63 Drivers: hv: vmbus: Prevent load re-ordering when reading ring buffer
In reply to Greg Kroah-HartmanFrom: Michael Kelley <[email protected]>
[ Upstream commit b6cae15b5710c8097aad26a2e5e752c323ee5348 ]
When reading a packet from a host-to-guest ring buffer, there is no memory barrier between reading the write index (to see if there is a packet to read) and reading the contents of the packet. The Hyper-V host uses store-release when updating the write index to ensure that writes of the packet data are completed first. On the guest side, the processor can reorder and read the packet data before the write index, and sometimes get stale packet data. Getting such stale packet data has been observed in a reproducible case in a VM on ARM64.
Fix this by using virt_load_acquire() to read the write index, ensuring that reads of the packet data cannot be reordered before it. Preventing such reordering is logically correct, and with this change, getting stale data can no longer be reproduced.
--- drivers/hv/ring_buffer.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/hv/ring_buffer.c +10 -1
@@ -378,7 +378,16 @@ int hv_ringbuffer_read(struct vmbus_channel *channel,static u32 hv_pkt_iter_avail (const struct hv_ring_buffer_info *rbi) {u32 priv_read_loc = rbi->priv_read_index; -u32 write_loc =READ_ONCE (rbi->ring_buffer->write_index); +u32 write_loc; + +/* +* The Hyper-V host writes the packet data, then uses +* store_release() to update the write_index. Use load_acquire() +* here to prevent loads of the packet data from being re-ordered +* before the read of the write_index and potentially getting +* stale data. +*/ + write_loc =virt_load_acquire (&rbi->ring_buffer->write_index);if (write_loc >= priv_read_loc)return write_loc - priv_read_loc;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/63 scsi: target: tcmu: Fix possible page UAF
In reply to Greg Kroah-HartmanFrom: Xiaoguang Wang <[email protected]>
[ Upstream commit a6968f7a367f128d120447360734344d5a3d5336 ]
tcmu_try_get_data_page() looks up pages under cmdr_lock, but it does not take refcount properly and just returns page pointer. When tcmu_try_get_data_page() returns, the returned page may have been freed by tcmu_blocks_release().
We need to get_page() under cmdr_lock to avoid concurrent tcmu_blocks_release().
--- drivers/target/target_core_user.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/target/target_core_user.c +2 -1
@@ -1488,6 +1488,7 @@ static struct page *tcmu_try_get_block_page(struct tcmu_dev *udev, uint32_t dbi)mutex_lock (&udev->cmdr_lock); page =tcmu_get_block_page (udev, dbi);if (likely (page)) { +get_page (page);mutex_unlock (&udev->cmdr_lock);return page; }
@@ -1526,6 +1527,7 @@ static vm_fault_t tcmu_vma_fault(struct vm_fault *vmf)/* For the vmalloc()ed cmd area pages */ addr = (void *)(unsigned long )info->mem[mi].addr + offset; page =vmalloc_to_page (addr); +get_page (page); }else {uint32_t dbi;
@@ -1536,7 +1538,6 @@ static vm_fault_t tcmu_vma_fault(struct vm_fault *vmf)return VM_FAULT_SIGBUS ; } -get_page (page); vmf->page = page;return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 23/63 scsi: ibmvscsis: Increase INITIAL_SRP_LIMIT to 1024
In reply to Greg Kroah-HartmanFrom: Tyrel Datwyler <[email protected]>
[ Upstream commit 0bade8e53279157c7cc9dd95d573b7e82223d78a ]
The adapter request_limit is hardcoded to be INITIAL_SRP_LIMIT which is currently an arbitrary value of 800. Increase this value to 1024 which better matches the characteristics of the typical IBMi Initiator that supports 32 LUNs and a queue depth of 32.
This change also has the secondary benefit of being a power of two as required by the kfifo API. Since, Commit ab9bb6318b09 ("Partially revert "kfifo: fix kfifo_alloc() and kfifo_init()"") the size of IU pool for each target has been rounded down to 512 when attempting to kfifo_init() those pools with the current request_limit size of 800.
--- drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c +1 -1
@@ -35,7 +35,7 @@#define IBMVSCSIS_VERSION "v0.2" -#define INITIAL_SRP_LIMIT 800 +#define INITIAL_SRP_LIMIT 1024#define DEFAULT_MAX_SECTORS 256#define MAX_TXU 1024 * 1024
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 24/63 net: micrel: fix KS8851_MLL Kconfig
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
[ Upstream commit c3efcedd272aa6dd5929e20cf902a52ddaa1197a ]
KS8851_MLL selects MICREL_PHY, which depends on PTP_1588_CLOCK_OPTIONAL, so make KS8851_MLL also depend on PTP_1588_CLOCK_OPTIONAL since 'select' does not follow any dependency chains.
Fixes kconfig warning and build errors:
WARNING: unmet direct dependencies detected for MICREL_PHY
Depends on [m]: NETDEVICES [=y] && PHYLIB [=y] && PTP_1588_CLOCK_OPTIONAL [=m] Selected by [y]:
- KS8851_MLL [=y] && NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_MICREL [=y] && HAS_IOMEM [=y]
ld: drivers/net/phy/micrel.o: in function `lan8814_ts_info':
micrel.c:(.text+0xb35): undefined reference to `ptp_clock_index'
ld: drivers/net/phy/micrel.o: in function `lan8814_probe':
micrel.c:(.text+0x2586): undefined reference to `ptp_clock_register'
--- drivers/net/ethernet/micrel/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/micrel/Kconfig +1 -0
@@ -37,6 +37,7 @@ config KS8851 config KS8851_MLL tristate "Micrel KS8851 MLL" depends on HAS_IOMEM + depends on PTP_1588_CLOCK_OPTIONAL select MII ---help--- This platform driver is for Micrel KS8851 Address/data bus
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 25/63 ata: libata-core: Disable READ LOG DMA EXT for Samsung 840 EVOs
In reply to Greg Kroah-HartmanFrom: Christian Lamparter <[email protected]>
[ Upstream commit 5399752299396a3c9df6617f4b3c907d7aa4ded8 ]
Samsung' 840 EVO with the latest firmware (EXT0DB6Q) locks up with the a message: "READ LOG DMA EXT failed, trying PIO" during boot.
Initially this was discovered because it caused a crash with the sata_dwc_460ex controller on a WD MyBook Live DUO.
The reporter "Tice Rex" which has the unique opportunity that he has two Samsung 840 EVO SSD! One with the older firmware "EXT0BB0Q" which booted fine and didn't expose "READ LOG DMA EXT". But the newer/latest firmware "EXT0DB6Q" caused the headaches.
--- drivers/ata/libata-core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/ata/libata-core.c +3 -0
@@ -4580,6 +4580,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { ATA_HORKAGE_ZERO_AFTER_TRIM, }, {"Crucial_CT*MX100*" ,"MU01" ,ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, + { "Samsung SSD 840 EVO*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | +ATA_HORKAGE_NO_DMA_LOG | + ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung SSD 840*", NULL, ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 26/63 gpu: ipu-v3: Fix dev_dbg frequency output
In reply to Greg Kroah-HartmanFrom: Leo Ruan <[email protected]>
[ Upstream commit 070a88fd4a03f921b73a2059e97d55faaa447dab ]
This commit corrects the printing of the IPU clock error percentage if it is between -0.1% to -0.9%. For example, if the pixel clock requested is 27.2 MHz but only 27.0 MHz can be achieved the deviation is -0.8%. But the fixed point math had a flaw and calculated error of 0.2%.
Before:
Clocks: IPU 270000000Hz DI 24716667Hz Needed 27200000Hz IPU clock can give 27000000 with divider 10, error 0.2% Want 27200000Hz IPU 270000000Hz DI 24716667Hz using IPU, 27000000Hz
After:
Clocks: IPU 270000000Hz DI 24716667Hz Needed 27200000Hz IPU clock can give 27000000 with divider 10, error -0.8% Want 27200000Hz IPU 270000000Hz DI 24716667Hz using IPU, 27000000Hz
--- drivers/gpu/ipu-v3/ipu-di.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/ipu-v3/ipu-di.c +3 -2
@@ -451,8 +451,9 @@ static void ipu_di_config_clock(struct ipu_di *di, error = rate / (sig->mode.pixelclock /1000 ); -dev_dbg (di->ipu->dev," IPU clock can give %lu with divider %u, error %d.%u%%\n" , - rate, div, (signed )(error -1000 ) /10 , error %10 ); +dev_dbg (di->ipu->dev," IPU clock can give %lu with divider %u, error %c%d.%d%%\n" , + rate, div, error <1000 ?'-' :'+' , +abs (error -1000 ) /10 ,abs (error -1000 ) %10 );/* Allow a 1% error */ if (error <1010 && error >=990 ) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 27/63 regulator: wm8994: Add an off-on delay for WM8994 variant
In reply to Greg Kroah-HartmanFrom: Jonathan Bakker <[email protected]>
[ Upstream commit 92d96b603738ec4f35cde7198c303ae264dd47cb ]
As per Table 130 of the wm8994 datasheet at [1], there is an off-on delay for LDO1 and LDO2. In the wm8958 datasheet [2], I could not find any reference to it. I could not find a wm1811 datasheet to double-check there, but as no one has complained presumably it works without it.
This solves the issue on Samsung Aries boards with a wm8994 where register writes fail when the device is powered off and back-on quickly.
[1] https://statics.cirrus.com/pubs/proDatasheet/WM8994_Rev4.6.pdf
[2] https://statics.cirrus.com/pubs/proDatasheet/WM8958_v3.5.pdf
--- drivers/regulator/wm8994-regulator.c | 42 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-)
drivers/regulator/wm8994-regulator.c +39 -3
@@ -71,6 +71,35 @@ static const struct regulator_ops wm8994_ldo2_ops = { };static const struct regulator_desc wm8994_ldo_desc[] = { + { + .name ="LDO1" , + .id =1 , + .type =REGULATOR_VOLTAGE , + .n_voltages =WM8994_LDO1_MAX_SELECTOR +1 , + .vsel_reg =WM8994_LDO_1 , + .vsel_mask =WM8994_LDO1_VSEL_MASK , + .ops = &wm8994_ldo1_ops, + .min_uV =2400000 , + .uV_step =100000 , + .enable_time =3000 , + .off_on_delay =36000 , + .owner =THIS_MODULE , + }, + { + .name ="LDO2" , + .id =2 , + .type =REGULATOR_VOLTAGE , + .n_voltages =WM8994_LDO2_MAX_SELECTOR +1 , + .vsel_reg =WM8994_LDO_2 , + .vsel_mask =WM8994_LDO2_VSEL_MASK , + .ops = &wm8994_ldo2_ops, + .enable_time =3000 , + .off_on_delay =36000 , + .owner =THIS_MODULE , + }, +}; + +static const struct regulator_desc wm8958_ldo_desc[] = { { .name ="LDO1" , .id =1 ,
@@ -172,9 +201,16 @@ static int wm8994_ldo_probe(struct platform_device *pdev)* regulator core and we need not worry about it on the * error path. */ - ldo->regulator =devm_regulator_register (&pdev->dev, - &wm8994_ldo_desc[id], - &config); +if (ldo->wm8994->type ==WM8994 ) { + ldo->regulator =devm_regulator_register (&pdev->dev, + &wm8994_ldo_desc[id], + &config); + }else { + ldo->regulator =devm_regulator_register (&pdev->dev, + &wm8958_ldo_desc[id], + &config); + } +if (IS_ERR (ldo->regulator)) { ret =PTR_ERR (ldo->regulator); dev_err(wm8994->dev, "Failed to register LDO%d: %d\n",
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 28/63 arm64: alternatives: mark patch_alternative() as `noinstr`
In reply to Greg Kroah-HartmanFrom: Joey Gouly <[email protected]>
[ Upstream commit a2c0b0fbe01419f8f5d1c0b9c581631f34ffce8b ]
The alternatives code must be noinstr such that it does not patch itself, as the cache invalidation is only performed after all the alternatives have been applied.
Mark patch_alternative() as noinstr. Mark branch_insn_requires_update() and get_alt_insn() with __always_inline since they are both only called through patch_alternative().
Booting a kernel in QEMU TCG with KCSAN=y and ARM64_USE_LSE_ATOMICS=y caused a boot hang:
[ 0.241121] CPU: All CPU(s) started at EL2
The alternatives code was patching the atomics in __tsan_read4() from LL/SC atomics to LSE atomics.
The following fragment is using LL/SC atomics in the .text section:
| <__tsan_unaligned_read4+304>: ldxr x6, [x2] | <__tsan_unaligned_read4+308>: add x6, x6, x5 | <__tsan_unaligned_read4+312>: stxr w7, x6, [x2] | <__tsan_unaligned_read4+316>: cbnz w7, <__tsan_unaligned_read4+304>
This LL/SC atomic sequence was to be replaced with LSE atomics. However since the alternatives code was instrumentable, __tsan_read4() was being called after only the first instruction was replaced, which led to the following code in memory:
| <__tsan_unaligned_read4+304>: ldadd x5, x6, [x2] | <__tsan_unaligned_read4+308>: add x6, x6, x5 | <__tsan_unaligned_read4+312>: stxr w7, x6, [x2] | <__tsan_unaligned_read4+316>: cbnz w7, <__tsan_unaligned_read4+304>
This caused an infinite loop as the stxr instruction never completed successfully, so w7 was always 0.
--- arch/arm64/kernel/alternative.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/kernel/alternative.c +3 -3
@@ -41,7 +41,7 @@ bool alternative_is_applied(u16 cpufeature)/* * Check if the target PC is within an alternative block. */ -static bool branch_insn_requires_update (struct alt_instr *alt,unsigned long pc) +static __always_inline bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc) {unsigned long replptr = (unsigned long )ALT_REPL_PTR (alt);return !(pc >= replptr && pc <= (replptr + alt->alt_len));
@@ -49,7 +49,7 @@ static bool branch_insn_requires_update(struct alt_instr *alt, unsigned long pc)#define align_down (x, a) ((unsigned long)(x) & ~(((unsigned long)(a)) - 1)) -static u32 get_alt_insn (struct alt_instr *alt,__le32 *insnptr,__le32 *altinsnptr) +static __always_inline u32 get_alt_insn(struct alt_instr *alt, __le32 *insnptr, __le32 *altinsnptr) {u32 insn;
@@ -94,7 +94,7 @@ static u32 get_alt_insn(struct alt_instr *alt, __le32 *insnptr, __le32 *altinsnpreturn insn; } -static void patch_alternative (struct alt_instr *alt, +static noinstr void patch_alternative(struct alt_instr *alt,__le32 *origptr,__le32 *updptr,int nr_inst) {__le32 *replptr;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 29/63 tlb: hugetlb: Add more sizes to tlb_remove_huge_tlb_entry
In reply to Greg Kroah-HartmanFrom: Steve Capper <[email protected]>
[ Upstream commit 697a1d44af8ba0477ee729e632f4ade37999249a ]
tlb_remove_huge_tlb_entry only considers PMD_SIZE and PUD_SIZE when updating the mmu_gather structure.
Unfortunately on arm64 there are two additional huge page sizes that need to be covered: CONT_PTE_SIZE and CONT_PMD_SIZE. Where an end-user attempts to employ contiguous huge pages, a VM_BUG_ON can be experienced due to the fact that the tlb structure hasn't been correctly updated by the relevant tlb_flush_p.._range() call from tlb_remove_huge_tlb_entry.
This patch adds inequality logic to the generic implementation of tlb_remove_huge_tlb_entry s.t. CONT_PTE_SIZE and CONT_PMD_SIZE are effectively covered on arm64. Also, as well as ptes, pmds and puds; p4ds are now considered too.
--- include/asm-generic/tlb.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
include/asm-generic/tlb.h +7 -3
@@ -547,10 +547,14 @@ static inline void tlb_flush_p4d_range(struct mmu_gather *tlb,#define tlb_remove_huge_tlb_entry (h, tlb, ptep, address) \ do { \ unsigned long _sz = huge_page_size(h); \ - if (_sz == PMD_SIZE) \ - tlb_flush_pmd_range(tlb, address, _sz); \ - else if (_sz == PUD_SIZE) \ + if (_sz >= P4D_SIZE) \ + tlb_flush_p4d_range(tlb, address, _sz); \ + else if (_sz >= PUD_SIZE) \ tlb_flush_pud_range(tlb, address, _sz); \ + else if (_sz >= PMD_SIZE) \ + tlb_flush_pmd_range(tlb, address, _sz); \ + else \ + tlb_flush_pte_range(tlb, address, _sz); \ __tlb_remove_tlb_entry(tlb, ptep, address); \ } while (0)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 30/63 net: usb: aqc111: Fix out-of-bounds accesses in RX fixup
In reply to Greg Kroah-HartmanFrom: Marcin Kozlowski <[email protected]>
[ Upstream commit afb8e246527536848b9b4025b40e613edf776a9d ]
aqc111_rx_fixup() contains several out-of-bounds accesses that can be triggered by a malicious (or defective) USB device, in particular:
- The metadata array (desc_offset..desc_offset+2*pkt_count) can be out of bounds, causing OOB reads and (on big-endian systems) OOB endianness flips.
- A packet can overlap the metadata array, causing a later OOB endianness flip to corrupt data used by a cloned SKB that has already been handed off into the network stack.
- A packet SKB can be constructed whose tail is far beyond its end, causing out-of-bounds heap data to be considered part of the SKB's data.
Found doing variant analysis. Tested it with another driver (ax88179_178a), since I don't have a aqc111 device to test it, but the code looks very similar.
--- drivers/net/usb/aqc111.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/usb/aqc111.c +7 -2
@@ -1102,10 +1102,15 @@ static int aqc111_rx_fixup(struct usbnet *dev, struct sk_buff *skb)if (start_of_descs != desc_offset) goto err; -/* self check desc_offset from header*/ -if (desc_offset >= skb_len) +/* self check desc_offset from header and make sure that the +* bounds of the metadata array are inside the SKB +*/ +if (pkt_count *2 + desc_offset >= skb_len) goto err; +/* Packets must not overlap the metadata array */ +skb_trim (skb, desc_offset); +if (pkt_count ==0 ) goto err;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 31/63 drm/amd/display: Fix allocate_mst_payload assert on resume
In reply to Greg Kroah-HartmanFrom: Roman Li <[email protected]>
[ Upstream commit f4346fb3edf7720db3f7f5e1cab1f667cd024280 ]
[Why]
On resume we do link detection for all non-MST connectors. MST is handled separately. However the condition for telling if connector is on mst branch is not enough for mst hub case. Link detection for mst branch link leads to mst topology reset. That causes assert in dc_link_allocate_mst_payload()
[How]
Use link type as indicator for mst link.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +2 -1
@@ -1210,7 +1210,8 @@ static int dm_resume(void *handle)* this is the case when traversing through already created * MST connectors, should be skipped */ -if (aconnector->mst_port) +if (aconnector->dc_link && + aconnector->dc_link->type == dc_connection_mst_branch)continue ;mutex_lock (&aconnector->hpd_lock);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 32/63 powerpc: Fix virt_addr_valid() for 64-bit Book3E & 32-bit
In reply to Greg Kroah-HartmanFrom: Kefeng Wang <[email protected]>
[ Upstream commit ffa0b64e3be58519ae472ea29a1a1ad681e32f48 ]
mpe: On 64-bit Book3E vmalloc space starts at 0x8000000000000000.
Because of the way __pa() works we have:
__pa(0x8000000000000000) == 0, and therefore virt_to_pfn(0x8000000000000000) == 0, and therefore virt_addr_valid(0x8000000000000000) == true
Which is wrong, virt_addr_valid() should be false for vmalloc space. In fact all vmalloc addresses that alias with a valid PFN will return true from virt_addr_valid(). That can cause bugs with hardened usercopy as described below by Kefeng Wang:
When running ethtool eth0 on 64-bit Book3E, a BUG occurred:
usercopy: Kernel memory exposure attempt detected from SLUB object not in SLUB page?! (offset 0, size 1048)!
kernel BUG at mm/usercopy.c:99
...
usercopy_abort+0x64/0xa0 (unreliable)
__check_heap_object+0x168/0x190
__check_object_size+0x1a0/0x200
dev_ethtool+0x2494/0x2b20
dev_ioctl+0x5d0/0x770
sock_do_ioctl+0xf0/0x1d0
sock_ioctl+0x3ec/0x5a0
__se_sys_ioctl+0xf0/0x160
system_call_exception+0xfc/0x1f0
system_call_common+0xf8/0x200The code shows below,
data = vzalloc(array_size(gstrings.len, ETH_GSTRING_LEN)); copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
The data is alloced by vmalloc(), virt_addr_valid(ptr) will return true on 64-bit Book3E, which leads to the panic.
As commit 4dd7554a6456 ("powerpc/64: Add VIRTUAL_BUG_ON checks for __va and __pa addresses") does, make sure the virt addr above PAGE_OFFSET in the virt_addr_valid() for 64-bit, also add upper limit check to make sure the virt is below high_memory.
Meanwhile, for 32-bit PAGE_OFFSET is the virtual address of the start of lowmem, high_memory is the upper low virtual address, the check is suitable for 32-bit, this will fix the issue mentioned in commit 602946ec2f90 ("powerpc: Set max_mapnr correctly") too.
On 32-bit there is a similar problem with high memory, that was fixed in commit 602946ec2f90 ("powerpc: Set max_mapnr correctly"), but that commit breaks highmem and needs to be reverted.
We can't easily fix __pa(), we have code that relies on its current behaviour. So for now add extra checks to virt_addr_valid().
For 64-bit Book3S the extra checks are not necessary, the combination of virt_to_pfn() and pfn_valid() should yield the correct result, but they are harmless.
--- arch/powerpc/include/asm/page.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/page.h +5 -1
@@ -132,7 +132,11 @@ static inline bool pfn_valid(unsigned long pfn)#define virt_to_page (kaddr) pfn_to_page(virt_to_pfn(kaddr))#define pfn_to_kaddr (pfn) __va((pfn) << PAGE_SHIFT) -#define virt_addr_valid (kaddr) pfn_valid(virt_to_pfn(kaddr)) +#define virt_addr_valid (vaddr) ({ \ + unsigned long _addr = (unsigned long)vaddr; \ + _addr >= PAGE_OFFSET && _addr < (unsigned long)high_memory && \ + pfn_valid(virt_to_pfn(_addr)); \ +})/* * On Book-E parts we need __va to parse the device tree and we can't
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 33/63 scsi: mvsas: Add PCI ID of RocketRaid 2640
In reply to Greg Kroah-HartmanFrom: Alexey Galakhov <[email protected]>
[ Upstream commit 5f2bce1e222028dc1c15f130109a17aa654ae6e8 ]
The HighPoint RocketRaid 2640 is a low-cost SAS controller based on Marvell chip. The chip in question was already supported by the kernel, just the PCI ID of this particular board was missing.
--- drivers/scsi/mvsas/mv_init.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/mvsas/mv_init.c +1 -0
@@ -646,6 +646,7 @@ static struct pci_device_id mvs_pci_table[] = { { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1300), chip_1300 }, { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1320), chip_1320 }, { PCI_VDEVICE(ADAPTEC2, 0x0450), chip_6440 }, + { PCI_VDEVICE(TTI, 0x2640), chip_6440 }, { PCI_VDEVICE(TTI, 0x2710), chip_9480 }, { PCI_VDEVICE(TTI, 0x2720), chip_9480 }, { PCI_VDEVICE(TTI, 0x2721), chip_9480 },
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 34/63 scsi: megaraid_sas: Target with invalid LUN ID is deleted during scan
In reply to Greg Kroah-HartmanFrom: Chandrakanth patil <[email protected]>
[ Upstream commit 56495f295d8e021f77d065b890fc0100e3f9f6d8 ]
The megaraid_sas driver supports single LUN for RAID devices. That is LUN
0. All other LUNs are unsupported. When a device scan on a logical target with invalid LUN number is invoked through sysfs, that target ends up getting removed.
Add LUN ID validation in the slave destroy function to avoid the target deletion.
--- drivers/scsi/megaraid/megaraid_sas.h | 3 +++ drivers/scsi/megaraid/megaraid_sas_base.c | 7 +++++++ 2 files changed, 10 insertions(+)
drivers/scsi/megaraid/megaraid_sas.h +3 -0
@@ -2551,6 +2551,9 @@ struct megasas_instance_template {#define MEGASAS_IS_LOGICAL (sdev) \ ((sdev->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1) +#define MEGASAS_IS_LUN_VALID (sdev) \ + (((sdev)->lun == 0) ? 1 : 0) +#define MEGASAS_DEV_INDEX (scp) \ (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ scp->device->id)
drivers/scsi/megaraid/megaraid_sas_base.c +7 -0
@@ -2102,6 +2102,9 @@ static int megasas_slave_alloc(struct scsi_device *sdev) goto scan_target; }return -ENXIO ; + }else if (!MEGASAS_IS_LUN_VALID (sdev)) { +sdev_printk (KERN_INFO , sdev,"%s: invalid LUN\n" , __func__); +return -ENXIO ; } scan_target:
@@ -2132,6 +2135,10 @@ static void megasas_slave_destroy(struct scsi_device *sdev) instance =megasas_lookup_instance (sdev->host->host_no);if (MEGASAS_IS_LOGICAL (sdev)) { +if (!MEGASAS_IS_LUN_VALID (sdev)) { +sdev_printk (KERN_INFO , sdev,"%s: invalid LUN\n" , __func__); +return ; + } ld_tgt_id =MEGASAS_TARGET_ID (sdev); instance->ld_tgtid_status[ld_tgt_id] =LD_TARGET_ID_DELETED ;if (megasas_dbg_lvl &LD_PD_DEBUG )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 35/63 drivers: net: slip: fix NPD bug in sl_tx_timeout()
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit ec4eb8a86ade4d22633e1da2a7d85a846b7d1798 ]
When a slip driver is detaching, the slip_close() will act to cleanup necessary resources and sl->tty is set to NULL in slip_close(). Meanwhile, the packet we transmit is blocked, sl_tx_timeout() will be called. Although slip_close() and sl_tx_timeout() use sl->lock to synchronize, we don`t judge whether sl->tty equals to NULL in sl_tx_timeout() and the null pointer dereference bug will happen.
(Thread 1) | (Thread 2)
| slip_close()
| spin_lock_bh(&sl->lock)
| ...
... | sl->tty = NULL //(1)
sl_tx_timeout() | spin_unlock_bh(&sl->lock)
spin_lock(&sl->lock); |
... | ...
tty_chars_in_buffer(sl->tty)|
if (tty->ops->..) //(2) |
... | synchronize_rcu()We set NULL to sl->tty in position (1) and dereference sl->tty in position (2).
This patch adds check in sl_tx_timeout(). If sl->tty equals to NULL, sl_tx_timeout() will goto out.
--- drivers/net/slip/slip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/slip/slip.c +1 -1
@@ -471,7 +471,7 @@ static void sl_tx_timeout(struct net_device *dev)spin_lock (&sl->lock);if (netif_queue_stopped (dev)) { -if (!netif_running (dev)) +if (!netif_running (dev) || !sl->tty) goto out;/* May be we must check transmitter timeout here ?
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 36/63 perf/imx_ddr: Fix undefined behavior due to shift overflowing the constant
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit d02b4dd84e1a90f7f1444d027c0289bf355b0d5a ]
Fix:
In file included from <command-line>:0:0:
In function ‘ddr_perf_counter_enable’,
inlined from ‘ddr_perf_irq_handler’ at drivers/perf/fsl_imx8_ddr_perf.c:651:2:
././include/linux/compiler_types.h:352:38: error: call to ‘__compiletime_assert_729’ \
declared with attribute error: FIELD_PREP: mask is not constant
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
...
See https://lore.kernel.org/r/YkwQ6%[email protected] for the gory details as to why it triggers with older gccs only.
--- drivers/perf/fsl_imx8_ddr_perf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/perf/fsl_imx8_ddr_perf.c +1 -1
@@ -29,7 +29,7 @@#define CNTL_OVER_MASK 0xFFFFFFFE#define CNTL_CSV_SHIFT 24 -#define CNTL_CSV_MASK (0xFF << CNTL_CSV_SHIFT) +#define CNTL_CSV_MASK (0xFFU << CNTL_CSV_SHIFT)#define EVENT_CYCLES_ID 0#define EVENT_CYCLES_COUNTER 0
Signature · 9 lines
2.35.1 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 37/63 mm, page_alloc: fix build_zonerefs_node()
In reply to Greg Kroah-HartmanFrom: Juergen Gross <[email protected]>
commit e553f62f10d93551eb883eca227ac54d1a4fad84 upstream.
Since commit 6aa303defb74 ("mm, vmscan: only allocate and reclaim from zones with pages managed by the buddy allocator") only zones with free memory are included in a built zonelist. This is problematic when e.g. all memory of a zone has been ballooned out when zonelists are being rebuilt.
The decision whether to rebuild the zonelists when onlining new memory is done based on populated_zone() returning 0 for the zone the memory will be added to. The new zone is added to the zonelists only, if it has free memory pages (managed_zone() returns a non-zero value) after the memory has been onlined. This implies, that onlining memory will always free the added pages to the allocator immediately, but this is not true in all cases: when e.g. running as a Xen guest the onlined new memory will be added only to the ballooned memory list, it will be freed only when the guest is being ballooned up afterwards.
Another problem with using managed_zone() for the decision whether a zone is being added to the zonelists is, that a zone with all memory used will in fact be removed from all zonelists in case the zonelists happen to be rebuilt.
Use populated_zone() when building a zonelist as it has been done before that commit.
There was a report that QubesOS (based on Xen) is hitting this problem. Xen has switched to use the zone device functionality in kernel 5.9 and QubesOS wants to use memory hotplugging for guests in order to be able to start a guest with minimal memory and expand it as needed. This was the report leading to the patch.
--- mm/page_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/page_alloc.c +1 -1
@@ -5481,7 +5481,7 @@ static int build_zonerefs_node(pg_data_t do { zone_type--; zone = pgdat->node_zones + zone_type; - if (managed_zone(zone)) { + if (populated_zone(zone)) { zoneref_set_zone(zone, &zonerefs[nr_zones++]); check_highest_zone(zone_type); }
Greg Kroah-Hartman
maintainerPATCH 38/63 mm: kmemleak: take a full lowmem check in kmemleak_*_phys()
In reply to Greg Kroah-HartmanFrom: Patrick Wang <[email protected]>
commit 23c2d497de21f25898fbea70aeb292ab8acc8c94 upstream.
The kmemleak_*_phys() apis do not check the address for lowmem's min boundary, while the caller may pass an address below lowmem, which will trigger an oops:
# echo scan > /sys/kernel/debug/kmemleak
Unable to handle kernel paging request at virtual address ff5fffffffe00000
Oops [#1]
Modules linked in:
CPU: 2 PID: 134 Comm: bash Not tainted 5.18.0-rc1-next-20220407 #33
Hardware name: riscv-virtio,qemu (DT)
epc : scan_block+0x74/0x15c
ra : scan_block+0x72/0x15c
epc : ffffffff801e5806 ra : ffffffff801e5804 sp : ff200000104abc30
gp : ffffffff815cd4e8 tp : ff60000004cfa340 t0 : 0000000000000200
t1 : 00aaaaaac23954cc t2 : 00000000000003ff s0 : ff200000104abc90
s1 : ffffffff81b0ff28 a0 : 0000000000000000 a1 : ff5fffffffe01000
a2 : ffffffff81b0ff28 a3 : 0000000000000002 a4 : 0000000000000001
a5 : 0000000000000000 a6 : ff200000104abd7c a7 : 0000000000000005
s2 : ff5fffffffe00ff9 s3 : ffffffff815cd998 s4 : ffffffff815d0e90
s5 : ffffffff81b0ff28 s6 : 0000000000000020 s7 : ffffffff815d0eb0
s8 : ffffffffffffffff s9 : ff5fffffffe00000 s10: ff5fffffffe01000
s11: 0000000000000022 t3 : 00ffffffaa17db4c t4 : 000000000000000f
t5 : 0000000000000001 t6 : 0000000000000000
status: 0000000000000100 badaddr: ff5fffffffe00000 cause: 000000000000000d
scan_gray_list+0x12e/0x1a6
kmemleak_scan+0x2aa/0x57e
kmemleak_write+0x32a/0x40c
full_proxy_write+0x56/0x82
vfs_write+0xa6/0x2a6
ksys_write+0x6c/0xe2
sys_write+0x22/0x2a
ret_from_syscall+0x0/0x2The callers may not quite know the actual address they pass(e.g. from devicetree). So the kmemleak_*_phys() apis should guarantee the address they finally use is in lowmem range, so check the address for lowmem's min boundary.
--- mm/kmemleak.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
mm/kmemleak.c +4 -4
@@ -1123,7 +1123,7 @@ EXPORT_SYMBOL(kmemleak_no_scan);void __ref kmemleak_alloc_phys (phys_addr_t phys,size_t size,int min_count,gfp_t gfp) { -if (!IS_ENABLED (CONFIG_HIGHMEM ) ||PHYS_PFN (phys) < max_low_pfn) +if (PHYS_PFN (phys) >= min_low_pfn &&PHYS_PFN (phys) < max_low_pfn)kmemleak_alloc (__va (phys), size, min_count, gfp); }EXPORT_SYMBOL (kmemleak_alloc_phys);
@@ -1137,7 +1137,7 @@ EXPORT_SYMBOL(kmemleak_alloc_phys);*/ void __ref kmemleak_free_part_phys (phys_addr_t phys,size_t size) { -if (!IS_ENABLED (CONFIG_HIGHMEM ) ||PHYS_PFN (phys) < max_low_pfn) +if (PHYS_PFN (phys) >= min_low_pfn &&PHYS_PFN (phys) < max_low_pfn)kmemleak_free_part (__va (phys), size); }EXPORT_SYMBOL (kmemleak_free_part_phys);
@@ -1149,7 +1149,7 @@ EXPORT_SYMBOL(kmemleak_free_part_phys);*/ void __ref kmemleak_not_leak_phys (phys_addr_t phys) { -if (!IS_ENABLED (CONFIG_HIGHMEM ) ||PHYS_PFN (phys) < max_low_pfn) +if (PHYS_PFN (phys) >= min_low_pfn &&PHYS_PFN (phys) < max_low_pfn)kmemleak_not_leak (__va (phys)); }EXPORT_SYMBOL (kmemleak_not_leak_phys);
@@ -1161,7 +1161,7 @@ EXPORT_SYMBOL(kmemleak_not_leak_phys);*/ void __ref kmemleak_ignore_phys (phys_addr_t phys) { -if (!IS_ENABLED (CONFIG_HIGHMEM ) ||PHYS_PFN (phys) < max_low_pfn) +if (PHYS_PFN (phys) >= min_low_pfn &&PHYS_PFN (phys) < max_low_pfn)kmemleak_ignore (__va (phys)); }EXPORT_SYMBOL (kmemleak_ignore_phys);
Greg Kroah-Hartman
maintainerPATCH 39/63 KVM: Dont create VM debugfs files outside of the VM directory
In reply to Greg Kroah-HartmanFrom: Oliver Upton <[email protected]>
commit a44a4cc1c969afec97dbb2aedaf6f38eaa6253bb upstream.
Unfortunately, there is no guarantee that KVM was able to instantiate a debugfs directory for a particular VM. To that end, KVM shouldn't even attempt to create new debugfs files in this case. If the specified parent dentry is NULL, debugfs_create_file() will instantiate files at the root of debugfs.
For arm64, it is possible to create the vgic-state file outside of a VM directory, the file is not cleaned up when a VM is destroyed. Nonetheless, the corresponding struct kvm is freed when the VM is destroyed.
Nip the problem in the bud for all possible errant debugfs file creations by initializing kvm->debugfs_dentry to -ENOENT. In so doing, debugfs_create_file() will fail instead of creating the file in the root directory.
--- virt/kvm/kvm_main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
virt/kvm/kvm_main.c +8 -2
@@ -623,7 +623,7 @@ static void kvm_destroy_vm_debugfs(struc {int i; -if (!kvm->debugfs_dentry) +if (IS_ERR (kvm->debugfs_dentry))return ;debugfs_remove_recursive (kvm->debugfs_dentry);
@@ -643,6 +643,12 @@ static int kvm_create_vm_debugfs(structstruct kvm_stat_data *stat_data;struct kvm_stats_debugfs_item *p; +/* +* Force subsequent debugfs file creations to fail if the VM directory +* is not created. +*/ + kvm->debugfs_dentry =ERR_PTR (-ENOENT ); +if (!debugfs_initialized ())return 0 ;
@@ -4399,7 +4405,7 @@ static void kvm_uevent_notify_change(uns }add_uevent_var (env,"PID=%d" , kvm->userspace_pid); -if (kvm->debugfs_dentry) { +if (!IS_ERR (kvm->debugfs_dentry)) {char *tmp, *p =kmalloc (PATH_MAX ,GFP_KERNEL_ACCOUNT );if (p) {
Greg Kroah-Hartman
maintainerPATCH 40/63 gcc-plugins: latent_entropy: use /dev/urandom
In reply to Greg Kroah-HartmanFrom: Jason A. Donenfeld <[email protected]>
commit c40160f2998c897231f8454bf797558d30a20375 upstream.
While the latent entropy plugin mostly doesn't derive entropy from get_random_const() for measuring the call graph, when __latent_entropy is applied to a constant, then it's initialized statically to output from get_random_const(). In that case, this data is derived from a 64-bit seed, which means a buffer of 512 bits doesn't really have that amount of compile-time entropy.
This patch fixes that shortcoming by just buffering chunks of /dev/urandom output and doling it out as requested.
At the same time, it's important that we don't break the use of -frandom-seed, for people who want the runtime benefits of the latent entropy plugin, while still having compile-time determinism. In that case, we detect whether gcc's set_random_seed() has been called by making a call to get_random_seed(noinit=true) in the plugin init function, which is called after set_random_seed() is called but before anything that calls get_random_seed(noinit=false), and seeing if it's zero or not. If it's not zero, we're in deterministic mode, and so we just generate numbers with a basic xorshift prng.
Note that we don't detect if -frandom-seed is being used using the documented local_tick variable, because it's assigned via:
local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000;
which may well overflow and become -1 on its own, and so isn't
reliable: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105171
[kees: The 256 byte rnd_buf size was chosen based on average (250),
median (64), and std deviation (575) bytes of used entropy for a defconfig x86_64 build]
--- scripts/gcc-plugins/latent_entropy_plugin.c | 44 +++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-)
scripts/gcc-plugins/latent_entropy_plugin.c +27 -17
@@ -86,25 +86,31 @@ static struct plugin_info latent_entropy .help = "disable\tturn off latent entropy instrumentation\n", }; -static unsigned HOST_WIDE_INT seed; -/* -* get_random_seed() (this is a GCC function) generates the seed. -* This is a simple random generator without any cryptographic security because -* the entropy doesn't come from here. -*/ +static unsigned HOST_WIDE_INT deterministic_seed; +static unsigned HOST_WIDE_INT rnd_buf[32 ]; +static size_t rnd_idx =ARRAY_SIZE (rnd_buf); +static int urandom_fd =-1 ; +static unsigned HOST_WIDE_INT get_random_const (void ) { -unsigned int i; -unsigned HOST_WIDE_INT ret =0 ; - -for (i =0 ; i <8 *sizeof (ret); i++) { - ret = (ret <<1 ) | (seed &1 ); - seed >>=1 ; -if (ret &1 ) - seed ^=0xD800000000000000ULL ; +if (deterministic_seed) { +unsigned HOST_WIDE_INT w = deterministic_seed; + w ^= w <<13 ; + w ^= w >>7 ; + w ^= w <<17 ; + deterministic_seed = w; +return deterministic_seed; } -return ret; +if (urandom_fd <0 ) { + urandom_fd =open ("/dev/urandom" ,O_RDONLY ); +gcc_assert (urandom_fd >=0 ); + } +if (rnd_idx >=ARRAY_SIZE (rnd_buf)) { +gcc_assert (read (urandom_fd, rnd_buf,sizeof (rnd_buf)) ==sizeof (rnd_buf)); + rnd_idx =0 ; + } +return rnd_buf[rnd_idx++]; }static tree tree_get_random_const (tree type)
@@ -549,8 +555,6 @@ static void latent_entropy_start_unit(votree type, id;int quals; - seed =get_random_seed (false); -if (in_lto_p)return ;
@@ -585,6 +589,12 @@ __visible int plugin_init(struct plugin_const struct plugin_argument *const argv = plugin_info->argv;int i; +/* +* Call get_random_seed() with noinit=true, so that this returns +* 0 in the case where no seed has been passed via -frandom-seed. +*/ + deterministic_seed =get_random_seed (true); +static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = { { .base = &latent_entropy_decl,
Greg Kroah-Hartman
maintainerPATCH 41/63 ath9k: Properly clear TX status area before reporting to mac80211
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
commit 037250f0a45cf9ecf5b52d4b9ff8eadeb609c800 upstream.
The ath9k driver was not properly clearing the status area in the ieee80211_tx_info struct before reporting TX status to mac80211. Instead, it was manually filling in fields, which meant that fields introduced later were left as-is.
Conveniently, mac80211 actually provides a helper to zero out the status area, so use that to make sure we zero everything.
The last commit touching the driver function writing the status information seems to have actually been fixing an issue that was also caused by the area being uninitialised; but it only added clearing of a single field instead of the whole struct. That is now redundant, though, so revert that commit and use it as a convenient Fixes tag.
--- drivers/net/wireless/ath/ath9k/xmit.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath9k/xmit.c +2 -3
@@ -2509,6 +2509,8 @@ static void ath_tx_rc_status(struct ath_struct ath_hw *ah = sc->sc_ah;u8 i, tx_rateindex; +ieee80211_tx_info_clear_status (tx_info); +if (txok) tx_info->status.ack_signal = ts->ts_rssi;
@@ -2551,9 +2553,6 @@ static void ath_tx_rc_status(struct ath_ } tx_info->status.rates[tx_rateindex].count = ts->ts_longretry +1 ; - -/* we report airtime in ath_tx_count_airtime(), don't report twice */ - tx_info->status.tx_time =0 ; }static void ath_tx_processq (struct ath_softc *sc,struct ath_txq *txq)
Greg Kroah-Hartman
maintainerPATCH 42/63 ath9k: Fix usage of driver-private space in tx_info
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
commit 5a6b06f5927c940fa44026695779c30b7536474c upstream.
The ieee80211_tx_info_clear_status() helper also clears the rate counts and the driver-private part of struct ieee80211_tx_info, so using it breaks quite a few other things. So back out of using it, and instead define a ath-internal helper that only clears the area between the status_driver_data and the rates info. Combined with moving the ath_frame_info struct to status_driver_data, this avoids clearing anything we shouldn't be, and so we can keep the existing code for handling the rate information.
While fixing this I also noticed that the setting of tx_info->status.rates[tx_rateindex].count on hardware underrun errors was always immediately overridden by the normal setting of the same fields, so rearrange the code so that the underrun detection actually takes effect.
The new helper could be generalised to a 'memset_between()' helper, but leave it as a driver-internal helper for now since this needs to go to stable.
--- drivers/net/wireless/ath/ath9k/main.c | 2 +- drivers/net/wireless/ath/ath9k/xmit.c | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-)
drivers/net/wireless/ath/ath9k/main.c +1 -1
@@ -836,7 +836,7 @@ static bool ath9k_txq_list_has_key(struccontinue ; txinfo =IEEE80211_SKB_CB (bf->bf_mpdu); - fi = (struct ath_frame_info *)&txinfo->rate_driver_data[0 ]; + fi = (struct ath_frame_info *)&txinfo->status.status_driver_data[0 ];if (fi->keyix == keyix)return true; }
drivers/net/wireless/ath/ath9k/xmit.c +20 -10
@@ -141,8 +141,8 @@ static struct ath_frame_info *get_frame_ {struct ieee80211_tx_info *tx_info =IEEE80211_SKB_CB (skb);BUILD_BUG_ON (sizeof (struct ath_frame_info ) > -sizeof (tx_info->rate_driver_data)); -return (struct ath_frame_info *) &tx_info->rate_driver_data[0 ]; +sizeof (tx_info->status.status_driver_data)); +return (struct ath_frame_info *) &tx_info->status.status_driver_data[0 ]; }static void ath_send_bar (struct ath_atx_tid *tid,u16 seqno)
@@ -2498,6 +2498,16 @@ skip_tx_complete:spin_unlock_irqrestore (&sc->tx.txbuflock, flags); } +static void ath_clear_tx_status (struct ieee80211_tx_info *tx_info) +{ +void *ptr = &tx_info->status; + +memset (ptr +sizeof (tx_info->status.rates),0 , +sizeof (tx_info->status) - +sizeof (tx_info->status.rates) - +sizeof (tx_info->status.status_driver_data)); +} +static void ath_tx_rc_status (struct ath_softc *sc,struct ath_buf *bf,struct ath_tx_status *ts,int nframes,int nbad,int txok)
@@ -2509,7 +2519,7 @@ static void ath_tx_rc_status(struct ath_struct ath_hw *ah = sc->sc_ah;u8 i, tx_rateindex; -ieee80211_tx_info_clear_status (tx_info); +ath_clear_tx_status (tx_info);if (txok) tx_info->status.ack_signal = ts->ts_rssi;
@@ -2525,6 +2535,13 @@ static void ath_tx_rc_status(struct ath_ tx_info->status.ampdu_len = nframes; tx_info->status.ampdu_ack_len = nframes - nbad; + tx_info->status.rates[tx_rateindex].count = ts->ts_longretry +1 ; + +for (i = tx_rateindex +1 ; i < hw->max_rates; i++) { + tx_info->status.rates[i].count =0 ; + tx_info->status.rates[i].idx =-1 ; + } +if ((ts->ts_status &ATH9K_TXERR_FILT ) ==0 && (tx_info->flags &IEEE80211_TX_CTL_NO_ACK ) ==0 ) {/*
@@ -2546,13 +2563,6 @@ static void ath_tx_rc_status(struct ath_ tx_info->status.rates[tx_rateindex].count = hw->max_rate_tries; } - -for (i = tx_rateindex +1 ; i < hw->max_rates; i++) { - tx_info->status.rates[i].count =0 ; - tx_info->status.rates[i].idx =-1 ; - } - - tx_info->status.rates[tx_rateindex].count = ts->ts_longretry +1 ; }static void ath_tx_processq (struct ath_softc *sc,struct ath_txq *txq)
Greg Kroah-Hartman
maintainerPATCH 43/63 btrfs: remove unused variable in btrfs_{start,write}_dirty_block_groups()
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 6d4a6b515c39f1f8763093e0f828959b2fbc2f45 upstream.
Clang's version of -Wunused-but-set-variable recently gained support for unary operations, which reveals two unused variables:
fs/btrfs/block-group.c:2949:6: error: variable 'num_started' set but not used [-Werror,-Wunused-but-set-variable]
int num_started = 0;
^
fs/btrfs/block-group.c:3116:6: error: variable 'num_started' set but not used [-Werror,-Wunused-but-set-variable]
int num_started = 0;
^2 errors generated.
These variables appear to be unused from their introduction, so just remove them to silence the warnings.
--- fs/btrfs/block-group.c | 4 ---- 1 file changed, 4 deletions(-)
fs/btrfs/block-group.c +0 -4
@@ -2388,7 +2388,6 @@ int btrfs_start_dirty_block_groups(strucstruct btrfs_path *path =NULL ;LIST_HEAD (dirty);struct list_head *io = &cur_trans->io_bgs; -int num_started =0 ;int loops =0 ;spin_lock (&cur_trans->dirty_bgs_lock);
@@ -2455,7 +2454,6 @@ again: cache->io_ctl.inode =NULL ; ret =btrfs_write_out_cache (trans, cache, path);if (ret ==0 && cache->io_ctl.inode) { - num_started++; should_put =0 ;/*
@@ -2556,7 +2554,6 @@ int btrfs_write_dirty_block_groups(strucint should_put;struct btrfs_path *path;struct list_head *io = &cur_trans->io_bgs; -int num_started =0 ; path =btrfs_alloc_path ();if (!path)
@@ -2614,7 +2611,6 @@ int btrfs_write_dirty_block_groups(struc cache->io_ctl.inode =NULL ; ret =btrfs_write_out_cache (trans, cache, path);if (ret ==0 && cache->io_ctl.inode) { - num_started++; should_put =0 ;list_add_tail (&cache->io_list, io); }else {
Greg Kroah-Hartman
maintainerPATCH 44/63 btrfs: mark resumed async balance as writing
In reply to Greg Kroah-HartmanFrom: Naohiro Aota <[email protected]>
commit a690e5f2db4d1dca742ce734aaff9f3112d63764 upstream.
When btrfs balance is interrupted with umount, the background balance resumes on the next mount. There is a potential deadlock with FS freezing here like as described in commit 26559780b953 ("btrfs: zoned: mark relocation as writing"). Mark the process as sb_writing to avoid it.
--- fs/btrfs/volumes.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/volumes.c +2 -0
@@ -4320,10 +4320,12 @@ static int balance_kthread(void *data)struct btrfs_fs_info *fs_info = data;int ret =0 ; +sb_start_write (fs_info->sb);mutex_lock (&fs_info->balance_mutex);if (fs_info->balance_ctl) ret =btrfs_balance (fs_info, fs_info->balance_ctl,NULL );mutex_unlock (&fs_info->balance_mutex); +sb_end_write (fs_info->sb);return ret; }
Greg Kroah-Hartman
maintainerPATCH 45/63 ALSA: hda/realtek: Add quirk for Clevo PD50PNT
In reply to Greg Kroah-HartmanFrom: Tim Crawford <[email protected]>
commit 9eb6f5c388060d8cef3c8b616cc31b765e022359 upstream.
Fixes speaker output and headset detection on Clevo PD50PNT.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -2568,6 +2568,7 @@ static const struct snd_pci_quirk alc882SND_PCI_QUIRK (0x1558 ,0x65e1 ,"Clevo PB51[ED][DF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x65e5 ,"Clevo PC50D[PRS](?:-D|-G)?" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x65f1 ,"Clevo PC50HS" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), +SND_PCI_QUIRK (0x1558 ,0x65f5 ,"Clevo PD50PN[NRT]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x67d1 ,"Clevo PB71[ER][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ),SND_PCI_QUIRK (0x1558 ,0x67e1 ,"Clevo PB71[DE][CDF]" ,ALC1220_FIXUP_CLEVO_PB51ED_PINS ), SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
Greg Kroah-Hartman
maintainerPATCH 46/63 ALSA: pcm: Test for "silence" field in struct "pcm_format_data"
In reply to Greg Kroah-HartmanFrom: Fabio M. De Francesco <[email protected]>
commit 2f7a26abb8241a0208c68d22815aa247c5ddacab upstream.
Syzbot reports "KASAN: null-ptr-deref Write in
snd_pcm_format_set_silence".[1]
It is due to missing validation of the "silence" field of struct "pcm_format_data" in "pcm_formats" array.
Add a test for valid "pat" and, if it is not so, return -EINVAL.
[1] https://lore.kernel.org/lkml/[email protected]/
--- sound/core/pcm_misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/core/pcm_misc.c +1 -1
@@ -423,7 +423,7 @@ int snd_pcm_format_set_silence(snd_pcm_freturn 0 ; width = pcm_formats[(INT )format].phys;/* physical width */ pat = pcm_formats[(INT )format].silence; -if (! width) +if (!width || !pat)return -EINVAL ;/* signed or 1 byte data */ if (pcm_formats[(INT )format].signd ==1 || width <=8 ) {
Greg Kroah-Hartman
maintainerPATCH 47/63 ipv6: fix panic when forwarding a pkt with no in6 dev
In reply to Greg Kroah-HartmanFrom: Nicolas Dichtel <[email protected]>
commit e3fa461d8b0e185b7da8a101fe94dfe6dd500ac0 upstream.
kongweibin reported a kernel panic in ip6_forward() when input interface has no in6 dev associated.
The following tc commands were used to reproduce this panic:
tc qdisc del dev vxlan100 root
tc qdisc add dev vxlan100 root netem corrupt 5%
--- net/ipv6/ip6_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_output.c +1 -1
@@ -506,7 +506,7 @@ int ip6_forward(struct sk_buff *skb) goto drop;if (!net->ipv6.devconf_all->disable_policy && - !idev->cnf.disable_policy && + (!idev || !idev->cnf.disable_policy) && !xfrm6_policy_check (NULL ,XFRM_POLICY_FWD , skb)) {__IP6_INC_STATS (net, idev,IPSTATS_MIB_INDISCARDS ); goto drop;
Greg Kroah-Hartman
maintainerPATCH 48/63 drm/amd/display: dont ignore alpha property on pre-multiplied mode
In reply to Greg Kroah-HartmanFrom: Melissa Wen <[email protected]>
commit e4f1541caf60fcbe5a59e9d25805c0b5865e546a upstream.
"Pre-multiplied" is the default pixel blend mode for KMS/DRM, as documented in supported_modes of drm_plane_create_blend_mode_property():
https://cgit.freedesktop.org/drm/drm-misc/tree/drivers/gpu/drm/drm_blend.c
In this mode, both 'pixel alpha' and 'plane alpha' participate in the calculation, as described by the pixel blend mode formula in KMS/DRM documentation:
out.rgb = plane_alpha * fg.rgb +
(1 - (plane_alpha * fg.alpha)) * bg.rgb
Considering the blend config mechanisms we have in the driver so far, the alpha mode that better fits this blend mode is the _PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN, where the value for global_gain is the plane alpha (global_alpha).
With this change, alpha property stops to be ignored. It also addresses
v2:
* keep the 8-bit value for global_alpha_value (Nicholas)
* correct the logical ordering for combined global gain (Nicholas)
* apply to dcn10 too (Nicholas)
--- drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 14 +++++++++----- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 14 +++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +9 -5
@@ -2202,14 +2202,18 @@ static void dcn10_update_mpcc(struct dc &blnd_cfg.black_color); } -if (per_pixel_alpha) - blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA ; -else - blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA ; - blnd_cfg.overlap_only = false; blnd_cfg.global_gain =0xff ; +if (per_pixel_alpha && pipe_ctx->plane_state->global_alpha) { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN ; + blnd_cfg.global_gain = pipe_ctx->plane_state->global_alpha_value; + }else if (per_pixel_alpha) { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA ; + }else { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA ; + } +if (pipe_ctx->plane_state->global_alpha) blnd_cfg.global_alpha = pipe_ctx->plane_state->global_alpha_value;else
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +9 -5
@@ -1740,14 +1740,18 @@ static void dcn20_update_mpcc(struct dc pipe_ctx, &blnd_cfg.black_color); } -if (per_pixel_alpha) - blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA ; -else - blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA ; - blnd_cfg.overlap_only = false; blnd_cfg.global_gain =0xff ; +if (per_pixel_alpha && pipe_ctx->plane_state->global_alpha) { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN ; + blnd_cfg.global_gain = pipe_ctx->plane_state->global_alpha_value; + }else if (per_pixel_alpha) { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA ; + }else { + blnd_cfg.alpha_mode =MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA ; + } +if (pipe_ctx->plane_state->global_alpha) blnd_cfg.global_alpha = pipe_ctx->plane_state->global_alpha_value;else
Greg Kroah-Hartman
maintainerPATCH 49/63 genirq/affinity: Consider that CPUs on nodes can be unbalanced
In reply to Greg Kroah-HartmanFrom: Rei Yamamoto <[email protected]>
commit 08d835dff916bfe8f45acc7b92c7af6c4081c8a7 upstream.
If CPUs on a node are offline at boot time, the number of nodes is different when building affinity masks for present cpus and when building affinity masks for possible cpus. This causes the following problem:
In the case that the number of vectors is less than the number of nodes there are cases where bits of masks for present cpus are overwritten when building masks for possible cpus.
Fix this by excluding CPUs, which are not part of the current build mask (present/possible).
[ tglx: Massaged changelog and added comment ]
--- kernel/irq/affinity.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/irq/affinity.c +3 -2
@@ -269,8 +269,9 @@ static int __irq_build_affinity_masks(un*/ if (numvecs <= nodes) {for_each_node_mask (n, nodemsk) { -cpumask_or (&masks[curvec].mask, &masks[curvec].mask, - node_to_cpumask[n]); +/* Ensure that only CPUs which are in both masks are set */ +cpumask_and (nmsk, cpu_mask, node_to_cpumask[n]); +cpumask_or (&masks[curvec].mask, &masks[curvec].mask, nmsk);if (++curvec == last_affv) curvec = firstvec; }
Greg Kroah-Hartman
maintainerPATCH 50/63 tick/nohz: Use WARN_ON_ONCE() to prevent console saturation
In reply to Greg Kroah-HartmanFrom: Paul Gortmaker <[email protected]>
commit 40e97e42961f8c6cc7bd5fe67cc18417e02d78f1 upstream.
While running some testing on code that happened to allow the variable tick_nohz_full_running to get set but with no "possible" NOHZ cores to back up that setting, this warning triggered:
if (unlikely(tick_do_timer_cpu == TICK_DO_TIMER_NONE))
WARN_ON(tick_nohz_full_running);The console was overwhemled with an endless stream of one WARN per tick per core and there was no way to even see what was going on w/o using a serial console to capture it and then trace it back to this.
Change it to WARN_ON_ONCE().
--- kernel/time/tick-sched.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/tick-sched.c +1 -1
@@ -131,7 +131,7 @@ static void tick_sched_do_timer(struct t*/ if (unlikely (tick_do_timer_cpu ==TICK_DO_TIMER_NONE )) {#ifdef CONFIG_NO_HZ_FULL -WARN_ON (tick_nohz_full_running); +WARN_ON_ONCE (tick_nohz_full_running);#endif tick_do_timer_cpu = cpu; }
Greg Kroah-Hartman
maintainerPATCH 51/63 ARM: davinci: da850-evm: Avoid NULL pointer dereference
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 83a1cde5c74bfb44b49cb2a940d044bb2380f4ea upstream.
With newer versions of GCC, there is a panic in da850_evm_config_emac() when booting multi_v5_defconfig in QEMU under the palmetto-bmc machine:
Unable to handle kernel NULL pointer dereference at virtual address 00000020 pgd = (ptrval) [00000020] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT ARM Modules linked in: CPU: 0 PID: 1 Comm: swapper Not tainted 5.15.0 #1 Hardware name: Generic DT based system PC is at da850_evm_config_emac+0x1c/0x120 LR is at do_one_initcall+0x50/0x1e0
The emac_pdata pointer in soc_info is NULL because davinci_soc_info only gets populated on davinci machines but da850_evm_config_emac() is called on all machines via device_initcall().
Move the rmii_en assignment below the machine check so that it is only dereferenced when running on a supported SoC.
--- arch/arm/mach-davinci/board-da850-evm.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/mach-davinci/board-da850-evm.c +3 -1
@@ -1101,11 +1101,13 @@ static int __init da850_evm_config_emac(int ret;u32 val;struct davinci_soc_info *soc_info = &davinci_soc_info; -u8 rmii_en = soc_info->emac_pdata->rmii_en; +u8 rmii_en;if (!machine_is_davinci_da850_evm ())return 0 ; + rmii_en = soc_info->emac_pdata->rmii_en; + cfg_chip3_base =DA8XX_SYSCFG0_VIRT (DA8XX_CFGCHIP3_REG ); val =__raw_readl (cfg_chip3_base);
Greg Kroah-Hartman
maintainerPATCH 52/63 dm integrity: fix memory corruption when tag_size is less than digest size
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 08c1af8f1c13bbf210f1760132f4df24d0ed46d6 upstream.
It is possible to set up dm-integrity in such a way that the "tag_size" parameter is less than the actual digest size. In this situation, a part of the digest beyond tag_size is ignored.
In this case, dm-integrity would write beyond the end of the ic->recalc_tags array and corrupt memory. The corruption happened in integrity_recalc->integrity_sector_checksum->crypto_shash_final.
Fix this corruption by increasing the tags array so that it has enough padding at the end to accomodate the loop in integrity_recalc() being able to write a full digest size for the last member of the tags array.
--- drivers/md/dm-integrity.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/md/dm-integrity.c +5 -2
@@ -4054,6 +4054,7 @@ try_smaller_buffer: }if (ic->internal_hash) { +size_t recalc_tags_size; ic->recalc_wq =alloc_workqueue ("dm-integrity-recalc" ,WQ_MEM_RECLAIM ,1 );if (!ic->recalc_wq ) { ti->error ="Cannot allocate workqueue" ;
@@ -4067,8 +4068,10 @@ try_smaller_buffer: r = -ENOMEM ; goto bad; } - ic->recalc_tags =kvmalloc_array (RECALC_SECTORS >> ic->sb->log2_sectors_per_block, - ic->tag_size,GFP_KERNEL ); + recalc_tags_size = (RECALC_SECTORS >> ic->sb->log2_sectors_per_block) * ic->tag_size; +if (crypto_shash_digestsize (ic->internal_hash) > ic->tag_size) + recalc_tags_size +=crypto_shash_digestsize (ic->internal_hash) - ic->tag_size; + ic->recalc_tags =kvmalloc (recalc_tags_size,GFP_KERNEL );if (!ic->recalc_tags) { ti->error ="Cannot allocate tags for recalculating" ; r = -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 53/63 smp: Fix offline cpu check in flush_smp_call_function_queue()
In reply to Greg Kroah-HartmanFrom: Nadav Amit <[email protected]>
commit 9e949a3886356fe9112c6f6f34a6e23d1d35407f upstream.
The check in flush_smp_call_function_queue() for callbacks that are sent to offline CPUs currently checks whether the queue is empty.
However, flush_smp_call_function_queue() has just deleted all the callbacks from the queue and moved all the entries into a local list. This checks would only be positive if some callbacks were added in the short time after llist_del_all() was called. This does not seem to be the intention of this check.
Change the check to look at the local list to which the entries were moved instead of the queue from which all the callbacks were just removed.
--- kernel/smp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/smp.c +1 -1
@@ -222,7 +222,7 @@ static void flush_smp_call_function_queu/* There shouldn't be any pending callbacks on an offline CPU. */ if (unlikely (warn_cpu_offline && !cpu_online (smp_processor_id ()) && - !warned && !llist_empty (head))) { + !warned && entry !=NULL )) { warned = true;WARN (1 ,"IPI on offline CPU %d\n" ,smp_processor_id ());
Greg Kroah-Hartman
maintainerPATCH 54/63 i2c: pasemi: Wait for write xfers to finish
In reply to Greg Kroah-HartmanFrom: Martin Povišer <[email protected]>
commit bd8963e602c77adc76dbbbfc3417c3cf14fed76b upstream.
Wait for completion of write transfers before returning from the driver. At first sight it may seem advantageous to leave write transfers queued for the controller to carry out on its own time, but there's a couple of issues with it:
* Driver doesn't check for FIFO space.
* The queued writes can complete while the driver is in its I2C read transfer path which means it will get confused by the raising of XEN (the 'transaction ended' signal). This can cause a spurious ENODATA error due to premature reading of the MRXFIFO register.
Adding the wait fixes some unreliability issues with the driver. There's some efficiency cost to it (especially with pasemi_smb_waitready doing its polling), but that will be alleviated once the driver receives interrupt support.
--- drivers/i2c/busses/i2c-pasemi.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/i2c/busses/i2c-pasemi.c +6 -0
@@ -137,6 +137,12 @@ static int pasemi_i2c_xfer_msg(struct i2TXFIFO_WR (smbus, msg->buf[msg->len-1 ] | (stop ?MTXFIFO_STOP :0 )); + +if (stop) { + err =pasemi_smb_waitready (smbus); +if (err) + goto reset_out; + } }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 55/63 dma-direct: avoid redundant memory sync for swiotlb
In reply to Greg Kroah-HartmanFrom: Chao Gao <[email protected]>
commit 9e02977bfad006af328add9434c8bffa40e053bb upstream.
When we looked into FIO performance with swiotlb enabled in VM, we found swiotlb_bounce() is always called one more time than expected for each DMA read request.
It turns out that the bounce buffer is copied to original DMA buffer twice after the completion of a DMA request (one is done by in dma_direct_sync_single_for_cpu(), the other by swiotlb_tbl_unmap_single()). But the content in bounce buffer actually doesn't change between the two rounds of copy. So, one round of copy is redundant.
Pass DMA_ATTR_SKIP_CPU_SYNC flag to swiotlb_tbl_unmap_single() to skip the memory copy in it.
This fix increases FIO 64KB sequential read throughput in a guest with swiotlb=force by 5.6%.
--- kernel/dma/direct.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/dma/direct.c +2 -1
@@ -306,7 +306,8 @@ void dma_direct_unmap_page(struct devicedma_direct_sync_single_for_cpu (dev, addr, size, dir);if (unlikely (is_swiotlb_buffer (phys))) -swiotlb_tbl_unmap_single (dev, phys, size, size, dir, attrs); +swiotlb_tbl_unmap_single (dev, phys, size, size, dir, + attrs |DMA_ATTR_SKIP_CPU_SYNC ); }EXPORT_SYMBOL (dma_direct_unmap_page);
Greg Kroah-Hartman
maintainerPATCH 56/63 ax25: add refcount in ax25_dev to avoid UAF bugs
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit d01ffb9eee4af165d83b08dd73ebdf9fe94a519b upstream.
If we dereference ax25_dev after we call kfree(ax25_dev) in ax25_dev_device_down(), it will lead to concurrency UAF bugs. There are eight syscall functions suffer from UAF bugs, include ax25_bind(), ax25_release(), ax25_connect(), ax25_ioctl(), ax25_getname(), ax25_sendmsg(), ax25_getsockopt() and ax25_info_show().
One of the concurrency UAF can be shown as below:
(USE) | (FREE)
| ax25_device_event
| ax25_dev_device_down
ax25_bind | ...
... | kfree(ax25_dev)
ax25_fillin_cb() | ...
ax25_fillin_cb_from_dev() |
... |The root cause of UAF bugs is that kfree(ax25_dev) in ax25_dev_device_down() is not protected by any locks. When ax25_dev, which there are still pointers point to, is released, the concurrency UAF bug will happen.
This patch introduces refcount into ax25_dev in order to guarantee that there are no pointers point to it when ax25_dev is released.
--- include/net/ax25.h | 10 ++++++++++ net/ax25/af_ax25.c | 2 ++ net/ax25/ax25_dev.c | 12 ++++++++++-- net/ax25/ax25_route.c | 3 +++ 4 files changed, 25 insertions(+), 2 deletions(-)
include/net/ax25.h +10 -0
@@ -236,6 +236,7 @@ typedef struct ax25_dev {#if defined(CONFIG_AX25_DAMA_SLAVE ) || defined(CONFIG_AX25_DAMA_MASTER )ax25_dama_info dama;#endif +refcount_t refcount; } ax25_dev; typedef struct ax25_cb {
@@ -290,6 +291,15 @@ static __inline__ void ax25_cb_put(ax25_ } } +#define ax25_dev_hold (__ax25_dev) \ + refcount_inc(&((__ax25_dev)->refcount)) + +static __inline__void ax25_dev_put (ax25_dev *ax25_dev) +{ +if (refcount_dec_and_test (&ax25_dev->refcount)) { +kfree (ax25_dev); + } +}static inline __be16 ax25_type_trans (struct sk_buff *skb,struct net_device *dev) { skb->dev = dev;
net/ax25/af_ax25.c +2 -0
@@ -98,6 +98,7 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; +ax25_dev_put (ax25_dev);release_sock (sk);ax25_disconnect (s,ENETUNREACH );spin_lock_bh (&ax25_list_lock);
@@ -446,6 +447,7 @@ static int ax25_ctl_ioctl(const unsigned } out_put: +ax25_dev_put (ax25_dev);ax25_cb_put (ax25);return ret;
net/ax25/ax25_dev.c +10 -2
@@ -37,6 +37,7 @@ ax25_dev *ax25_addr_ax25dev(ax25_addressfor (ax25_dev = ax25_dev_list; ax25_dev !=NULL ; ax25_dev = ax25_dev->next)if (ax25cmp (addr, (ax25_address *)ax25_dev->dev->dev_addr) ==0 ) { res = ax25_dev; +ax25_dev_hold (ax25_dev); }spin_unlock_bh (&ax25_dev_lock);
@@ -56,6 +57,7 @@ void ax25_dev_device_up(struct net_devicreturn ; } +refcount_set (&ax25_dev->refcount,1 ); dev->ax25_ptr = ax25_dev; ax25_dev->dev = dev;dev_hold (dev);
@@ -83,6 +85,7 @@ void ax25_dev_device_up(struct net_devicspin_lock_bh (&ax25_dev_lock); ax25_dev->next = ax25_dev_list; ax25_dev_list = ax25_dev; +ax25_dev_hold (ax25_dev);spin_unlock_bh (&ax25_dev_lock);ax25_register_dev_sysctl (ax25_dev);
@@ -112,20 +115,22 @@ void ax25_dev_device_down(struct net_devif ((s = ax25_dev_list) == ax25_dev) { ax25_dev_list = s->next; +ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ;dev_put (dev); -kfree (ax25_dev); +ax25_dev_put (ax25_dev);return ; }while (s !=NULL && s->next !=NULL ) {if (s->next == ax25_dev) { s->next = ax25_dev->next; +ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ;dev_put (dev); -kfree (ax25_dev); +ax25_dev_put (ax25_dev);return ; }
@@ -133,6 +138,7 @@ void ax25_dev_device_down(struct net_dev }spin_unlock_bh (&ax25_dev_lock); dev->ax25_ptr =NULL ; +ax25_dev_put (ax25_dev); }int ax25_fwd_ioctl (unsigned int cmd,struct ax25_fwd_struct *fwd)
@@ -149,6 +155,7 @@ int ax25_fwd_ioctl(unsigned int cmd, strif (ax25_dev->forward !=NULL )return -EINVAL ; ax25_dev->forward = fwd_dev->dev; +ax25_dev_put (fwd_dev);break ;case SIOCAX25DELFWD :
@@ -161,6 +168,7 @@ int ax25_fwd_ioctl(unsigned int cmd, strreturn -EINVAL ; } +ax25_dev_put (ax25_dev);return 0 ; }
net/ax25/ax25_route.c +3 -0
@@ -116,6 +116,7 @@ static int __must_check ax25_rt_add(stru ax25_rt->dev = ax25_dev->dev; ax25_rt->digipeat =NULL ; ax25_rt->ip_mode =' ' ; +ax25_dev_put (ax25_dev);if (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock);
@@ -172,6 +173,7 @@ static int ax25_rt_del(struct ax25_route } } } +ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock);return 0 ;
@@ -214,6 +216,7 @@ static int ax25_rt_opt(struct ax25_route } out: +ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock);return err; }
Greg Kroah-Hartman
maintainerPATCH 57/63 ax25: fix reference count leaks of ax25_dev
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 87563a043cef044fed5db7967a75741cc16ad2b1 upstream.
The previous commit d01ffb9eee4a ("ax25: add refcount in ax25_dev to avoid UAF bugs") introduces refcount into ax25_dev, but there are reference leak paths in ax25_ctl_ioctl(), ax25_fwd_ioctl(), ax25_rt_add(), ax25_rt_del() and ax25_rt_opt().
This patch uses ax25_dev_put() and adjusts the position of ax25_addr_ax25dev() to fix reference cout leaks of ax25_dev.
--- include/net/ax25.h | 8 +++++--- net/ax25/af_ax25.c | 12 ++++++++---- net/ax25/ax25_dev.c | 24 +++++++++++++++++------- net/ax25/ax25_route.c | 16 +++++++++++----- 4 files changed, 41 insertions(+), 19 deletions(-)
include/net/ax25.h +5 -3
@@ -291,10 +291,12 @@ static __inline__ void ax25_cb_put(ax25_ } } -#define ax25_dev_hold (__ax25_dev) \ - refcount_inc(&((__ax25_dev)->refcount)) +static inline void ax25_dev_hold (ax25_dev *ax25_dev) +{ +refcount_inc (&ax25_dev->refcount); +} -static __inline__void ax25_dev_put (ax25_dev *ax25_dev) +static inline void ax25_dev_put (ax25_dev *ax25_dev) {if (refcount_dec_and_test (&ax25_dev->refcount)) {kfree (ax25_dev);
net/ax25/af_ax25.c +8 -4
@@ -366,21 +366,25 @@ static int ax25_ctl_ioctl(const unsignedif (copy_from_user (&ax25_ctl, arg,sizeof (ax25_ctl)))return -EFAULT ; -if ((ax25_dev =ax25_addr_ax25dev (&ax25_ctl.port_addr)) ==NULL ) -return -ENODEV ; -if (ax25_ctl.digi_count >AX25_MAX_DIGIS )return -EINVAL ;if (ax25_ctl.arg >ULONG_MAX /HZ && ax25_ctl.cmd !=AX25_KILL )return -EINVAL ; + ax25_dev =ax25_addr_ax25dev (&ax25_ctl.port_addr); +if (!ax25_dev) +return -ENODEV ; + digi.ndigi = ax25_ctl.digi_count;for (k =0 ; k < digi.ndigi; k++) digi.calls[k] = ax25_ctl.digi_addr[k]; -if ((ax25 =ax25_find_cb (&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev)) ==NULL ) + ax25 =ax25_find_cb (&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev); +if (!ax25) { +ax25_dev_put (ax25_dev);return -ENOTCONN ; + }switch (ax25_ctl.cmd) {case AX25_KILL :
net/ax25/ax25_dev.c +17 -7
@@ -85,8 +85,8 @@ void ax25_dev_device_up(struct net_devicspin_lock_bh (&ax25_dev_lock); ax25_dev->next = ax25_dev_list; ax25_dev_list = ax25_dev; -ax25_dev_hold (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_hold (ax25_dev);ax25_register_dev_sysctl (ax25_dev); }
@@ -115,8 +115,8 @@ void ax25_dev_device_down(struct net_devif ((s = ax25_dev_list) == ax25_dev) { ax25_dev_list = s->next; -ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_put (ax25_dev); dev->ax25_ptr =NULL ;dev_put (dev);ax25_dev_put (ax25_dev);
@@ -126,8 +126,8 @@ void ax25_dev_device_down(struct net_devwhile (s !=NULL && s->next !=NULL ) {if (s->next == ax25_dev) { s->next = ax25_dev->next; -ax25_dev_put (ax25_dev);spin_unlock_bh (&ax25_dev_lock); +ax25_dev_put (ax25_dev); dev->ax25_ptr =NULL ;dev_put (dev);ax25_dev_put (ax25_dev);
@@ -150,25 +150,35 @@ int ax25_fwd_ioctl(unsigned int cmd, strswitch (cmd) {case SIOCAX25ADDFWD : -if ((fwd_dev =ax25_addr_ax25dev (&fwd->port_to)) ==NULL ) + fwd_dev =ax25_addr_ax25dev (&fwd->port_to); +if (!fwd_dev) { +ax25_dev_put (ax25_dev);return -EINVAL ; -if (ax25_dev->forward !=NULL ) + } +if (ax25_dev->forward) { +ax25_dev_put (fwd_dev); +ax25_dev_put (ax25_dev);return -EINVAL ; + } ax25_dev->forward = fwd_dev->dev;ax25_dev_put (fwd_dev); +ax25_dev_put (ax25_dev);break ;case SIOCAX25DELFWD : -if (ax25_dev->forward ==NULL ) +if (!ax25_dev->forward) { +ax25_dev_put (ax25_dev);return -EINVAL ; + } ax25_dev->forward =NULL ; +ax25_dev_put (ax25_dev);break ;default : +ax25_dev_put (ax25_dev);return -EINVAL ; } -ax25_dev_put (ax25_dev);return 0 ; }
net/ax25/ax25_route.c +11 -5
@@ -75,11 +75,13 @@ static int __must_check ax25_rt_add(struax25_dev *ax25_dev;int i; -if ((ax25_dev =ax25_addr_ax25dev (&route->port_addr)) ==NULL ) -return -EINVAL ;if (route->digi_count >AX25_MAX_DIGIS )return -EINVAL ; + ax25_dev =ax25_addr_ax25dev (&route->port_addr); +if (!ax25_dev) +return -EINVAL ; +write_lock_bh (&ax25_route_lock); ax25_rt = ax25_route_list;
@@ -91,6 +93,7 @@ static int __must_check ax25_rt_add(struif (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return -ENOMEM ; } ax25_rt->digipeat->lastrepeat =-1 ;
@@ -101,6 +104,7 @@ static int __must_check ax25_rt_add(stru } }write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; } ax25_rt = ax25_rt->next;
@@ -108,6 +112,7 @@ static int __must_check ax25_rt_add(struif ((ax25_rt =kmalloc (sizeof (ax25_route),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return -ENOMEM ; }
@@ -116,11 +121,11 @@ static int __must_check ax25_rt_add(stru ax25_rt->dev = ax25_dev->dev; ax25_rt->digipeat =NULL ; ax25_rt->ip_mode =' ' ; -ax25_dev_put (ax25_dev);if (route->digi_count !=0 ) {if ((ax25_rt->digipeat =kmalloc (sizeof (ax25_digi),GFP_ATOMIC )) ==NULL ) {write_unlock_bh (&ax25_route_lock);kfree (ax25_rt); +ax25_dev_put (ax25_dev);return -ENOMEM ; } ax25_rt->digipeat->lastrepeat =-1 ;
@@ -133,6 +138,7 @@ static int __must_check ax25_rt_add(stru ax25_rt->next = ax25_route_list; ax25_route_list = ax25_rt;write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; }
@@ -173,8 +179,8 @@ static int ax25_rt_del(struct ax25_route } } } -ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return 0 ; }
@@ -216,8 +222,8 @@ static int ax25_rt_opt(struct ax25_route } out: -ax25_dev_put (ax25_dev);write_unlock_bh (&ax25_route_lock); +ax25_dev_put (ax25_dev);return err; }
Greg Kroah-Hartman
maintainerPATCH 58/63 ax25: fix UAF bugs of net_device caused by rebinding operation
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit feef318c855a361a1eccd880f33e88c460eb63b4 upstream.
The ax25_kill_by_device() will set s->ax25_dev = NULL and call ax25_disconnect() to change states of ax25_cb and sock, if we call ax25_bind() before ax25_kill_by_device().
However, if we call ax25_bind() again between the window of ax25_kill_by_device() and ax25_dev_device_down(), the values and states changed by ax25_kill_by_device() will be reassigned.
Finally, ax25_dev_device_down() will deallocate net_device. If we dereference net_device in syscall functions such as ax25_release(), ax25_sendmsg(), ax25_getsockopt(), ax25_getname() and ax25_info_show(), a UAF bug will occur.
One of the possible race conditions is shown below:
(USE) | (FREE)
ax25_bind() |
| ax25_kill_by_device()
ax25_bind() |
ax25_connect() | ...
| ax25_dev_device_down()
| ...
| dev_put_track(dev, ...) //FREE
ax25_release() | ...
ax25_send_control() |
alloc_skb() //USE |the corresponding fail log is shown below:
===============================================================
BUG: KASAN: use-after-free in ax25_send_control+0x43/0x210 ... Call Trace: ... ax25_send_control+0x43/0x210 ax25_release+0x2db/0x3b0 __sock_release+0x6d/0x120 sock_close+0xf/0x20 __fput+0x11f/0x420 ... Allocated by task 1283: ... __kasan_kmalloc+0x81/0xa0 alloc_netdev_mqs+0x5a/0x680 mkiss_open+0x6c/0x380 tty_ldisc_open+0x55/0x90 ... Freed by task 1969: ... kfree+0xa3/0x2c0 device_release+0x54/0xe0 kobject_put+0xa5/0x120 tty_ldisc_kill+0x3e/0x80 ...
In order to fix these UAF bugs caused by rebinding operation, this patch adds dev_hold_track() into ax25_bind() and corresponding dev_put_track() into ax25_kill_by_device().
[OP: backport to 5.4: adjust dev_put_track()->dev_put() and dev_hold_track()->dev_hold()]
--- net/ax25/af_ax25.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ax25/af_ax25.c +4 -1
@@ -98,6 +98,7 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; +dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev);release_sock (sk);ax25_disconnect (s,ENETUNREACH );
@@ -1122,8 +1123,10 @@ static int ax25_bind(struct socket *sock } } -if (ax25_dev !=NULL ) +if (ax25_dev) {ax25_fillin_cb (ax25, ax25_dev); +dev_hold (ax25_dev->dev); + } done:ax25_cb_add (ax25);
Greg Kroah-Hartman
maintainerPATCH 59/63 ax25: Fix refcount leaks caused by ax25_cb_del()
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 9fd75b66b8f68498454d685dc4ba13192ae069b0 upstream.
The previous commit d01ffb9eee4a ("ax25: add refcount in ax25_dev to avoid UAF bugs") and commit feef318c855a ("ax25: fix UAF bugs of net_device caused by rebinding operation") increase the refcounts of ax25_dev and net_device in ax25_bind() and decrease the matching refcounts in ax25_kill_by_device() in order to prevent UAF bugs, but there are reference count leaks.
The root cause of refcount leaks is shown below:
(Thread 1) | (Thread 2)
ax25_bind() |
... |
ax25_addr_ax25dev() |
ax25_dev_hold() //(1) |
... |
dev_hold_track() //(2) |
... | ax25_destroy_socket()
| ax25_cb_del()
| ...
| hlist_del_init() //(3)
|
|
(Thread 3) |
ax25_kill_by_device() |
... |
ax25_for_each(s, &ax25_list) { |
if (s->ax25_dev == ax25_dev) //(4) |
... |Firstly, we use ax25_bind() to increase the refcount of ax25_dev in position (1) and increase the refcount of net_device in position (2). Then, we use ax25_cb_del() invoked by ax25_destroy_socket() to delete ax25_cb in hlist in position (3) before calling ax25_kill_by_device(). Finally, the decrements of refcounts in ax25_kill_by_device() will not be executed, because no s->ax25_dev equals to ax25_dev in position (4).
This patch adds decrements of refcounts in ax25_release() and use lock_sock() to do synchronization. If refcounts decrease in ax25_release(), the decrements of refcounts in ax25_kill_by_device() will not be executed and vice versa.
--- net/ax25/af_ax25.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
net/ax25/af_ax25.c +11 -3
@@ -98,8 +98,10 @@ again:spin_unlock_bh (&ax25_list_lock);lock_sock (sk); s->ax25_dev =NULL ; -dev_put (ax25_dev->dev); -ax25_dev_put (ax25_dev); +if (sk->sk_socket) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + }release_sock (sk);ax25_disconnect (s,ENETUNREACH );spin_lock_bh (&ax25_list_lock);
@@ -978,14 +980,20 @@ static int ax25_release(struct socket *s {struct sock *sk = sock->sk;ax25_cb *ax25; +ax25_dev *ax25_dev;if (sk ==NULL )return 0 ;sock_hold (sk); -sock_orphan (sk);lock_sock (sk); +sock_orphan (sk); ax25 =sk_to_ax25 (sk); + ax25_dev = ax25->ax25_dev; +if (ax25_dev) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + }if (sk->sk_type ==SOCK_SEQPACKET ) {switch (ax25->state) {
Greg Kroah-Hartman
maintainerPATCH 60/63 ax25: fix UAF bug in ax25_send_control()
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 5352a761308397a0e6250fdc629bb3f615b94747 upstream.
There are UAF bugs in ax25_send_control(), when we call ax25_release() to deallocate ax25_dev. The possible race condition is shown below:
(Thread 1) | (Thread 2)
ax25_dev_device_up() //(1) |
| ax25_kill_by_device()
ax25_bind() //(2) |
ax25_connect() | ...
ax25->state = AX25_STATE_1 |
... | ax25_dev_device_down() //(3)(Thread 3) ax25_release() | ax25_dev_put() //(4) FREE | case AX25_STATE_1: | ax25_send_control() | alloc_skb() //USE |
The refcount of ax25_dev increases in position (1) and (2), and decreases in position (3) and (4). The ax25_dev will be freed before dereference sites in ax25_send_control().
The following is part of the report:
[ 102.297448] BUG: KASAN: use-after-free in ax25_send_control+0x33/0x210 [ 102.297448] Read of size 8 at addr ffff888009e6e408 by task ax25_close/602 [ 102.297448] Call Trace: [ 102.303751] ax25_send_control+0x33/0x210 [ 102.303751] ax25_release+0x356/0x450 [ 102.305431] __sock_release+0x6d/0x120 [ 102.305431] sock_close+0xf/0x20 [ 102.305431] __fput+0x11f/0x420 [ 102.305431] task_work_run+0x86/0xd0 [ 102.307130] get_signal+0x1075/0x1220 [ 102.308253] arch_do_signal_or_restart+0x1df/0xc00 [ 102.308253] exit_to_user_mode_prepare+0x150/0x1e0 [ 102.308253] syscall_exit_to_user_mode+0x19/0x50 [ 102.308253] do_syscall_64+0x48/0x90 [ 102.308253] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 102.308253] RIP: 0033:0x405ae7
This patch defers the free operation of ax25_dev and net_device after all corresponding dereference sites in ax25_release() to avoid UAF.
--- net/ax25/af_ax25.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ax25/af_ax25.c +4 -4
@@ -990,10 +990,6 @@ static int ax25_release(struct socket *ssock_orphan (sk); ax25 =sk_to_ax25 (sk); ax25_dev = ax25->ax25_dev; -if (ax25_dev) { -dev_put (ax25_dev->dev); -ax25_dev_put (ax25_dev); - }if (sk->sk_type ==SOCK_SEQPACKET ) {switch (ax25->state) {
@@ -1055,6 +1051,10 @@ static int ax25_release(struct socket *s sk->sk_state_change (sk);ax25_destroy_socket (ax25); } +if (ax25_dev) { +dev_put (ax25_dev->dev); +ax25_dev_put (ax25_dev); + } sock->sk =NULL ;release_sock (sk);
Greg Kroah-Hartman
maintainerPATCH 61/63 ax25: fix NPD bug in ax25_disconnect
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 7ec02f5ac8a5be5a3f20611731243dc5e1d9ba10 upstream.
The ax25_disconnect() in ax25_kill_by_device() is not protected by any locks, thus there is a race condition between ax25_disconnect() and ax25_destroy_socket(). when ax25->sk is assigned as NULL by ax25_destroy_socket(), a NULL pointer dereference bug will occur if site (1) or (2) dereferences ax25->sk.
ax25_kill_by_device() | ax25_release()
ax25_disconnect() | ax25_destroy_socket()
... |
if(ax25->sk != NULL) | ...
... | ax25->sk = NULL;
bh_lock_sock(ax25->sk); //(1) | ...
... |
bh_unlock_sock(ax25->sk); //(2)|This patch moves ax25_disconnect() into lock_sock(), which can synchronize with ax25_destroy_socket() in ax25_release().
Fail log:
===============================================================
BUG: kernel NULL pointer dereference, address: 0000000000000088 ... RIP: 0010:_raw_spin_lock+0x7e/0xd0 ... Call Trace: ax25_disconnect+0xf6/0x220 ax25_device_event+0x187/0x250 raw_notifier_call_chain+0x5e/0x70 dev_close_many+0x17d/0x230 rollback_registered_many+0x1f1/0x950 unregister_netdevice_queue+0x133/0x200 unregister_netdev+0x13/0x20
...
--- net/ax25/af_ax25.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ax25/af_ax25.c +1 -1
@@ -102,8 +102,8 @@ again:dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); } -release_sock (sk);ax25_disconnect (s,ENETUNREACH ); +release_sock (sk);spin_lock_bh (&ax25_list_lock);sock_put (sk);/* The entry could have been deleted from the
Greg Kroah-Hartman
maintainerPATCH 62/63 ax25: Fix NULL pointer dereferences in ax25 timers
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit fc6d01ff9ef03b66d4a3a23b46fc3c3d8cf92009 upstream.
The previous commit 7ec02f5ac8a5 ("ax25: fix NPD bug in ax25_disconnect") move ax25_disconnect into lock_sock() in order to prevent NPD bugs. But there are race conditions that may lead to null pointer dereferences in ax25_heartbeat_expiry(), ax25_t1timer_expiry(), ax25_t2timer_expiry(), ax25_t3timer_expiry() and ax25_idletimer_expiry(), when we use ax25_kill_by_device() to detach the ax25 device.
One of the race conditions that cause null pointer dereferences can be shown as below:
(Thread 1) | (Thread 2)
ax25_connect() |
ax25_std_establish_data_link() |
ax25_start_t1timer() |
mod_timer(&ax25->t1timer,..) |
| ax25_kill_by_device()
(wait a time) | ...
| s->ax25_dev = NULL; //(1)
ax25_t1timer_expiry() |
ax25->ax25_dev->values[..] //(2)| ...
... |We set null to ax25_cb->ax25_dev in position (1) and dereference the null pointer in position (2).
The corresponding fail log is shown below:
===============================================================
BUG: kernel NULL pointer dereference, address: 0000000000000050 CPU: 1 PID: 0 Comm: swapper/1 Not tainted 5.17.0-rc6-00794-g45690b7d0 RIP: 0010:ax25_t1timer_expiry+0x12/0x40 ... Call Trace: call_timer_fn+0x21/0x120 __run_timers.part.0+0x1ca/0x250 run_timer_softirq+0x2c/0x60 __do_softirq+0xef/0x2f3 irq_exit_rcu+0xb6/0x100 sysvec_apic_timer_interrupt+0xa2/0xd0
...
This patch moves ax25_disconnect() before s->ax25_dev = NULL and uses del_timer_sync() to delete timers in ax25_disconnect(). If ax25_disconnect() is called by ax25_kill_by_device() or ax25->ax25_dev is NULL, the reason in ax25_disconnect() will be equal to ENETUNREACH, it will wait all timers to stop before we set null to s->ax25_dev in ax25_kill_by_device().
--- net/ax25/af_ax25.c | 4 ++-- net/ax25/ax25_subr.c | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-)
net/ax25/af_ax25.c +2 -2
@@ -89,20 +89,20 @@ again: sk = s->sk;if (!sk) {spin_unlock_bh (&ax25_list_lock); - s->ax25_dev =NULL ;ax25_disconnect (s,ENETUNREACH ); + s->ax25_dev =NULL ;spin_lock_bh (&ax25_list_lock); goto again; }sock_hold (sk);spin_unlock_bh (&ax25_list_lock);lock_sock (sk); +ax25_disconnect (s,ENETUNREACH ); s->ax25_dev =NULL ;if (sk->sk_socket) {dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); } -ax25_disconnect (s,ENETUNREACH );release_sock (sk);spin_lock_bh (&ax25_list_lock);sock_put (sk);
net/ax25/ax25_subr.c +14 -6
@@ -261,12 +261,20 @@ void ax25_disconnect(ax25_cb *ax25, int {ax25_clear_queues (ax25); -if (!ax25->sk || !sock_flag (ax25->sk,SOCK_DESTROY )) -ax25_stop_heartbeat (ax25); -ax25_stop_t1timer (ax25); -ax25_stop_t2timer (ax25); -ax25_stop_t3timer (ax25); -ax25_stop_idletimer (ax25); +if (reason ==ENETUNREACH ) { +del_timer_sync (&ax25->timer); +del_timer_sync (&ax25->t1timer); +del_timer_sync (&ax25->t2timer); +del_timer_sync (&ax25->t3timer); +del_timer_sync (&ax25->idletimer); + }else { +if (!ax25->sk || !sock_flag (ax25->sk,SOCK_DESTROY )) +ax25_stop_heartbeat (ax25); +ax25_stop_t1timer (ax25); +ax25_stop_t2timer (ax25); +ax25_stop_t3timer (ax25); +ax25_stop_idletimer (ax25); + } ax25->state =AX25_STATE_0 ;
Greg Kroah-Hartman
maintainerPATCH 63/63 ax25: Fix UAF bugs in ax25 timers
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 82e31755e55fbcea6a9dfaae5fe4860ade17cbc0 upstream.
There are race conditions that may lead to UAF bugs in ax25_heartbeat_expiry(), ax25_t1timer_expiry(), ax25_t2timer_expiry(), ax25_t3timer_expiry() and ax25_idletimer_expiry(), when we call ax25_release() to deallocate ax25_dev.
One of the UAF bugs caused by ax25_release() is shown below:
(Thread 1) | (Thread 2)
ax25_dev_device_up() //(1) |
... | ax25_kill_by_device()
ax25_bind() //(2) |
ax25_connect() | ...
ax25_std_establish_data_link() |
ax25_start_t1timer() | ax25_dev_device_down() //(3)
mod_timer(&ax25->t1timer,..) |
| ax25_release()
(wait a time) | ...
| ax25_dev_put(ax25_dev) //(4)FREE
ax25_t1timer_expiry() |
ax25->ax25_dev->values[..] //USE| ...
... |We increase the refcount of ax25_dev in position (1) and (2), and decrease the refcount of ax25_dev in position (3) and (4). The ax25_dev will be freed in position (4) and be used in ax25_t1timer_expiry().
The fail log is shown below:
==============================================================
[ 106.116942] BUG: KASAN: use-after-free in ax25_t1timer_expiry+0x1c/0x60 [ 106.116942] Read of size 8 at addr ffff88800bda9028 by task swapper/0/0 [ 106.116942] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.17.0-06123-g0905eec574 [ 106.116942] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-14 [ 106.116942] Call Trace: ... [ 106.116942] ax25_t1timer_expiry+0x1c/0x60 [ 106.116942] call_timer_fn+0x122/0x3d0 [ 106.116942] __run_timers.part.0+0x3f6/0x520 [ 106.116942] run_timer_softirq+0x4f/0xb0 [ 106.116942] __do_softirq+0x1c2/0x651
...
This patch adds del_timer_sync() in ax25_release(), which could ensure that all timers stop before we deallocate ax25_dev.
--- net/ax25/af_ax25.c | 5 +++++ 1 file changed, 5 insertions(+)
net/ax25/af_ax25.c +5 -0
@@ -1052,6 +1052,11 @@ static int ax25_release(struct socket *sax25_destroy_socket (ax25); }if (ax25_dev) { +del_timer_sync (&ax25->timer); +del_timer_sync (&ax25->t1timer); +del_timer_sync (&ax25->t2timer); +del_timer_sync (&ax25->t3timer); +del_timer_sync (&ax25->idletimer);dev_put (ax25_dev->dev);ax25_dev_put (ax25_dev); }
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +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/v5.x/stable-review/patch-5.4.190-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels:
Signature · 1 line
Florian
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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.
I see that AUTOSEL patches from Apr 11 are in this series, but patches from Apr 6 are not. Is there story behind that?
Best regards,
Pavel
Apr 6:
4.9 1/7] gfs2: assign rgrp glock before compute_bitstructs
4.9 2/7] um: Cleanup syscall_handler_t definition/cast, fix warning
4.9 3/7] um: port_user: Improve error handling when port-helper is not found 4.9 4/7] Input: add bounds checking to input_set_capability()
4.9 5/7] MIPS: lantiq: check the return value of kzalloc()
4.9 6/7] drbd: remove usage of list iterator variable after loop
4.9 7/7] ARM: 9191/1: arm/stacktrace, kasan: Silence KASAN warnings in unwind_frame()
4.19 05/11] Input: stmfts - fix reference leak in stmfts_input_open 4.19 06/11] crypto: stm32 - fix reference leak in stm32_crc_remove 4.19 10/11] nilfs2: fix lockdep warnings in page operations for btree nodes 4.19 11/11] nilfs2: fix lockdep warnings during disk space reclamation
5.10 02/25] rtc: fix use-after-free on device removal
5.10 03/25] rtc: pcf2127: fix bug when reading alarm registers 5.10 08/25] nvme-pci: add quirks for Samsung X5 SSDs
5.10 09/25] gfs2: Disable page faults during lockless buffered reads 5.10 10/25] rtc: sun6i: Fix time overflow handling
5.10 12/25] crypto: x86/chacha20 - Avoid spurious jumps to other functions 5.10 13/25] ALSA: hda/realtek: Enable headset mic on Lenovo P360 5.10 14/25] s390/pci: improve zpci_dev reference counting
5.10 15/25] vhost_vdpa: don't setup irq offloading when irq_num < 0 5.10 16/25] tools/virtio: compile with -pthread
5.10 17/25] nvme-multipath: fix hang when disk goes live over reconnect 5.10 18/25] rtc: mc146818-lib: Fix the AltCentury for AMD platforms 5.10 19/25] fs: fix an infinite loop in iomap_fiemap
5.10 22/25] platform/chrome: cros_ec_debugfs: detach log reader wq from devm
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +0000. Anything received after that time might be too late.
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 449 pass: 449 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +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/v5.x/stable-review/patch-5.4.190-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +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/v5.x/stable-review/patch-5.4.190-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 5.4.190-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-5.4.y
* git commit: ab55553793398bae2b33694dbbf1b3529c5ac2db
* git describe: v5.4.189-64-gab5555379339
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.4.y/build/v5.4.189-64-gab5555379339
## Test Regressions (compared to v5.4.188-468-g60d6fdc40ea0) No test regressions found.
## Metric Regressions (compared to v5.4.188-468-g60d6fdc40ea0) No metric regressions found.
## Test Fixes (compared to v5.4.188-468-g60d6fdc40ea0) No test fixes found.
## Metric Fixes (compared to v5.4.188-468-g60d6fdc40ea0) No metric fixes found.
## Test result summary
total: 88726, pass: 73874, fail: 888, skip: 12818, xfail: 1146
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 290 total, 290 passed, 0 failed
* arm64: 40 total, 34 passed, 6 failed
* i386: 19 total, 19 passed, 0 failed
* mips: 37 total, 37 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 60 total, 54 passed, 6 failed
* riscv: 27 total, 27 passed, 0 failed
* s390: 12 total, 12 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x86_64: 40 total, 40 passed, 0 failed
## Test suites summary
* fwts
* igt-gpu-tools
* kselftest-android
* kselftest-arm64
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kvm-unit-tests
* libgpiod
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* perf/Zstd-perf.data-compression
* rcutorture
* ssuite
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.2.1 20220314): 65 configs -> no failure arm (gcc version 11.2.1 20220314): 107 configs -> no new failure arm64 (gcc version 11.2.1 20220314): 2 configs -> no failure x86_64 (gcc version 11.2.1 20220314): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/1033
--
Regards
Sudip
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.190 release. There are 63 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 Wed, 20 Apr 2022 12:11:14 +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/v5.x/stable-review/patch-5.4.190-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.4:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
59 tests: 59 pass, 0 failLinux version: 5.4.190-rc1-gab5555379339
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon