4.19.231-rc1 review
Greg Kroah-Hartman
maintainercover 4.19.231-rc1 review
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-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-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.231-rc1
Marc St-Amand <[email protected]>
net: macb: Align the dma and coherent dma masks
Slark Xiao <[email protected]>
net: usb: qmi_wwan: Add support for Dell DW5829e
JaeSang Yoo <[email protected]>
tracing: Fix tp_printk option related with tp_printk_stop_on_boot
Zoltán Böszörményi <[email protected]>
ata: libata-core: Disable TRIM on M88V29
Brenda Streiff <[email protected]>
kconfig: let 'shell' return enough output for deep path names
Christian Hewitt <[email protected]>
arm64: dts: meson-gx: add ATF BL32 reserved-memory region
Florian Westphal <[email protected]>
netfilter: conntrack: don't refresh sctp entries in closed state
Guo Ren <[email protected]>
irqchip/sifive-plic: Add missing thead,c900-plic match string
Wan Jiabing <[email protected]>
ARM: OMAP2+: hwmod: Add of_node_put() before break
Jim Mattson <[email protected]>
KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW
Miaoqian Lin <[email protected]>
Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj
Kimberly Brown <[email protected]>
Drivers: hv: vmbus: Expose monitor data only when monitor pages are used
david regan <[email protected]>
mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status
Kamal Dasu <[email protected]>
mtd: rawnand: brcmnand: Refactored code to introduce helper functions
Rafał Miłecki <[email protected]>
i2c: brcmstb: fix support for DSL and CM variants
Jiasheng Jiang <[email protected]>
dmaengine: sh: rcar-dmac: Check for error num after setting mask
Eric Dumazet <[email protected]>
net: sched: limit TC_ACT_REPEAT loops
Eliav Farber <[email protected]>
EDAC: Fix calculation of returned address and next offset in edac_align_ptr()
Bryan O'Donoghue <[email protected]>
mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe()
Trond Myklebust <[email protected]>
NFS: Do not report writeback errors in nfs_getattr()
Trond Myklebust <[email protected]>
NFS: LOOKUP_DIRECTORY is also ok with symlinks
Laibin Qiu <[email protected]>
block/wbt: fix negative inflight counter when remove scsi device
Zhang Yi <[email protected]>
ext4: check for out-of-order index extents in ext4_valid_extent_entries()
Anders Roxell <[email protected]>
powerpc/lib/sstep: fix 'ptesync' build error
Mark Brown <[email protected]>
ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_range()
Mark Brown <[email protected]>
ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw()
Takashi Iwai <[email protected]>
ALSA: hda: Fix missing codec probe on Shenker Dock 15
Takashi Iwai <[email protected]>
ALSA: hda: Fix regression on forced probe mask option
Kees Cook <[email protected]>
libsubcmd: Fix use-after-free for realloc(..., 0)
Eric Dumazet <[email protected]>
bonding: fix data-races around agg_select_timer
Eric Dumazet <[email protected]>
drop_monitor: fix data-race in dropmon_net_event / trace_napi_poll_hit
Xin Long <[email protected]>
ping: fix the dif and sdif check in ping_lookup
Miquel Raynal <[email protected]>
net: ieee802154: ca8210: Fix lifs/sifs periods
Mans Rullgard <[email protected]>
net: dsa: lan9303: fix reset on probe
Johannes Berg <[email protected]>
iwlwifi: pcie: gen2: fix locking when "HW not ready"
Johannes Berg <[email protected]>
iwlwifi: pcie: fix locking when "HW not ready"
Seth Forshee <[email protected]>
vsock: remove vsock from connected table when connect is interrupted by a signal
Christian Löhle <[email protected]>
mmc: block: fix read single on recovery logic
Eric W. Biederman <[email protected]>
taskstats: Cleanup the use of task->exit_code
Guillaume Nault <[email protected]>
xfrm: Don't accidentally set RTO_ONLINK in decode_session4()
Nicholas Bishop <[email protected]>
drm/radeon: Fix backlight control on iMac 12,1
Johannes Berg <[email protected]>
iwlwifi: fix use-after-free
Igor Pylypiv <[email protected]>
Revert "module, async: async_synchronize_full() on module init iff async is used"
Sagi Grimberg <[email protected]>
nvme-rdma: fix possible use-after-free in transport error_recovery work
Sagi Grimberg <[email protected]>
nvme: fix a possible use-after-free in controller reset during load
Darrick J. Wong <[email protected]>
quota: make dquot_quota_sync return errors from ->sync_fs
Darrick J. Wong <[email protected]>
vfs: make freeze_super abort when sync_filesystem returns error
Duoming Zhou <[email protected]>
ax25: improve the incomplete fix to avoid UAF and NPD bugs
Yang Xu <[email protected]>
selftests/zram: Adapt the situation that /dev/zram0 is being used
Yang Xu <[email protected]>
selftests/zram01.sh: Fix compression ratio calculation
Yang Xu <[email protected]>
selftests/zram: Skip max_comp_streams interface on newer kernel
Miquel Raynal <[email protected]>
net: ieee802154: at86rf230: Stop leaking skb's
Dāvis Mosāns <[email protected]>
btrfs: send: in case of IO error log it
John David Anglin <[email protected]>
parisc: Fix sglist access in ccio-dma.c
John David Anglin <[email protected]>
parisc: Fix data TLB miss in sba_unmap_sg
Randy Dunlap <[email protected]>
serial: parisc: GSC: fix build when IOSAPIC is not set
Jann Horn <[email protected]>
net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
Nathan Chancellor <[email protected]>
Makefile.extrawarn: Move -Wunaligned-access to W=1
-------------
Diffstat:
Documentation/ABI/stable/sysfs-bus-vmbus | 12 +- Makefile | 4 +- arch/arm/mach-omap2/omap_hwmod.c | 4 +- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 + arch/powerpc/lib/sstep.c | 2 + arch/x86/kvm/pmu.c | 2 +- block/bfq-iosched.c | 2 + block/elevator.c | 2 - drivers/ata/libata-core.c | 1 + drivers/dma/sh/rcar-dmac.c | 4 +- drivers/edac/edac_mc.c | 2 +- drivers/gpu/drm/radeon/atombios_encoders.c | 3 +- drivers/hv/channel_mgmt.c | 1 + drivers/hv/hyperv_vmbus.h | 2 + drivers/hv/vmbus_drv.c | 82 ++++++++++++- drivers/i2c/busses/i2c-brcmstb.c | 2 +- drivers/irqchip/irq-sifive-plic.c | 1 + drivers/mmc/core/block.c | 28 ++--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 102 ++++++++++------ drivers/mtd/nand/raw/qcom_nandc.c | 14 +-- drivers/net/bonding/bond_3ad.c | 30 ++++- drivers/net/dsa/lan9303-core.c | 2 +- drivers/net/ethernet/cadence/macb_main.c | 2 +- drivers/net/ieee802154/at86rf230.c | 13 +- drivers/net/ieee802154/ca8210.c | 4 +- drivers/net/usb/ax88179_178a.c | 68 ++++++----- drivers/net/usb/qmi_wwan.c | 2 + drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 2 + .../net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 3 +- drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 3 +- drivers/nvme/host/core.c | 9 +- drivers/nvme/host/rdma.c | 1 + drivers/parisc/ccio-dma.c | 3 +- drivers/parisc/sba_iommu.c | 3 +- drivers/tty/serial/8250/8250_gsc.c | 2 +- fs/btrfs/send.c | 4 + fs/ext4/extents.c | 21 ++-- fs/nfs/dir.c | 4 +- fs/nfs/inode.c | 9 +- fs/quota/dquot.c | 11 +- fs/super.c | 19 +-- include/linux/sched.h | 1 - include/net/bond_3ad.h | 2 +- kernel/async.c | 3 - kernel/module.c | 25 +--- kernel/trace/trace.c | 4 + kernel/tsacct.c | 7 +- net/ax25/af_ax25.c | 9 +- net/core/drop_monitor.c | 11 +- net/ipv4/ping.c | 11 +- net/ipv4/xfrm4_policy.c | 3 +- net/netfilter/nf_conntrack_proto_sctp.c | 9 ++ net/sched/act_api.c | 13 +- net/vmw_vsock/af_vsock.c | 1 + scripts/Makefile.extrawarn | 1 + scripts/kconfig/preprocess.c | 2 +- sound/pci/hda/hda_intel.c | 5 +- sound/soc/soc-ops.c | 29 +++-- tools/lib/subcmd/subcmd-util.h | 11 +- tools/testing/selftests/zram/zram.sh | 15 +-- tools/testing/selftests/zram/zram01.sh | 33 ++--- tools/testing/selftests/zram/zram02.sh | 1 - tools/testing/selftests/zram/zram_lib.sh | 134 ++++++++++++++------- 63 files changed, 526 insertions(+), 295 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/58 Makefile.extrawarn: Move -Wunaligned-access to W=1
From: Nathan Chancellor <[email protected]>
commit 1cf5f151d25fcca94689efd91afa0253621fb33a upstream.
-Wunaligned-access is a new warning in clang that is default enabled for arm and arm64 under certain circumstances within the clang frontend (see LLVM commit below). On v5.17-rc2, an ARCH=arm allmodconfig build shows 1284 total/70 unique instances of this warning (most of the instances are in header files), which is quite noisy.
To keep a normal build green through CONFIG_WERROR, only show this warning with W=1, which will allow automated build systems to catch new instances of the warning so that the total number can be driven down to zero eventually since catching unaligned accesses at compile time would be generally useful.
--- scripts/Makefile.extrawarn | 1 + 1 file changed, 1 insertion(+)
scripts/Makefile.extrawarn +1 -0
@@ -73,5 +73,6 @@ KBUILD_CFLAGS += $(call cc-disable-warni KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) +KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) endif endif
Greg Kroah-Hartman
maintainerPATCH 2/58 net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
commit 57bc3d3ae8c14df3ceb4e17d26ddf9eeab304581 upstream.
ax88179_rx_fixup() contains several out-of-bounds accesses that can be triggered by a malicious (or defective) USB device, in particular:
- The metadata array (hdr_off..hdr_off+2*pkt_cnt) 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.
I have tested that this can be used by a malicious USB device to send a bogus ICMPv6 Echo Request and receive an ICMPv6 Echo Reply in response that contains random kernel heap data.
It's probably also possible to get OOB writes from this on a little-endian system somehow - maybe by triggering skb_cow() via IP options processing -, but I haven't tested that.
--- drivers/net/usb/ax88179_178a.c | 68 +++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 29 deletions(-)
drivers/net/usb/ax88179_178a.c +39 -29
@@ -1373,59 +1373,69 @@ static int ax88179_rx_fixup(struct usbneu16 hdr_off;u32 *pkt_hdr; -/* This check is no longer done by usbnet */ -if (skb->len < dev->net->hard_header_len) +/* At the end of the SKB, there's a header telling us how many packets +* are bundled into this buffer and where we can find an array of +* per-packet metadata (which contains elements encoded into u16). +*/ +if (skb->len <4 )return 0 ; -skb_trim (skb, skb->len -4 );memcpy (&rx_hdr,skb_tail_pointer (skb),4 );le32_to_cpus (&rx_hdr); - pkt_cnt = (u16 )rx_hdr; hdr_off = (u16)(rx_hdr >>16 ); + +if (pkt_cnt ==0 ) +return 0 ; + +/* Make sure that the bounds of the metadata array are inside the SKB +* (and in front of the counter at the end). +*/ +if (pkt_cnt *2 + hdr_off > skb->len) +return 0 ; pkt_hdr = (u32 *)(skb->data + hdr_off); -while (pkt_cnt--) { +/* Packets must not overlap the metadata array */ +skb_trim (skb, hdr_off); + +for (; ; pkt_cnt--, pkt_hdr++) {u16 pkt_len;le32_to_cpus (pkt_hdr); pkt_len = (*pkt_hdr >>16 ) &0x1fff ; -/* Check CRC or runt packet */ -if ((*pkt_hdr &AX_RXHDR_CRC_ERR ) || - (*pkt_hdr &AX_RXHDR_DROP_ERR )) { -skb_pull (skb, (pkt_len +7 ) &0xFFF8 ); - pkt_hdr++; -continue ; - } - -if (pkt_cnt ==0 ) { - skb->len = pkt_len; -/* Skip IP alignment pseudo header */ -skb_pull (skb,2 ); -skb_set_tail_pointer (skb, skb->len); - skb->truesize = pkt_len +sizeof (struct sk_buff ); -ax88179_rx_checksum (skb, pkt_hdr); -return 1 ; - } +if (pkt_len > skb->len) +return 0 ; - ax_skb =skb_clone (skb,GFP_ATOMIC ); -if (ax_skb) { +/* Check CRC or runt packet */ +if (((*pkt_hdr & (AX_RXHDR_CRC_ERR |AX_RXHDR_DROP_ERR )) ==0 ) && + pkt_len >=2 +ETH_HLEN ) { +bool last = (pkt_cnt ==0 ); + +if (last) { + ax_skb = skb; + }else { + ax_skb =skb_clone (skb,GFP_ATOMIC ); +if (!ax_skb) +return 0 ; + } ax_skb->len = pkt_len;/* Skip IP alignment pseudo header */ skb_pull (ax_skb,2 );skb_set_tail_pointer (ax_skb, ax_skb->len); ax_skb->truesize = pkt_len +sizeof (struct sk_buff );ax88179_rx_checksum (ax_skb, pkt_hdr); + +if (last) +return 1 ; +usbnet_skb_return (dev, ax_skb); - }else { -return 0 ; } -skb_pull (skb, (pkt_len +7 ) &0xFFF8 ); - pkt_hdr++; +/* Trim this packet away from the SKB */ +if (!skb_pull (skb, (pkt_len +7 ) &0xFFF8 )) +return 0 ; } -return 1 ; } static struct sk_buff *
Greg Kroah-Hartman
maintainerPATCH 3/58 serial: parisc: GSC: fix build when IOSAPIC is not set
In reply to Greg Kroah-HartmanFrom: Randy Dunlap <[email protected]>
commit 6e8793674bb0d1135ca0e5c9f7e16fecbf815926 upstream.
There is a build error when using a kernel .config file from 'kernel test robot' for a different build problem:
hppa64-linux-ld: drivers/tty/serial/8250/8250_gsc.o: in function `.LC3':
(.data.rel.ro+0x18): undefined reference to `iosapic_serial_irq'
when:
CONFIG_GSC=y
CONFIG_SERIO_GSCPS2=y
CONFIG_SERIAL_8250_GSC=y
CONFIG_PCI is not set
and hence PCI_LBA is not set.
IOSAPIC depends on PCI_LBA, so IOSAPIC is not set/enabled.
Make the use of iosapic_serial_irq() conditional to fix the build error.
--- drivers/tty/serial/8250/8250_gsc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/8250/8250_gsc.c +1 -1
@@ -26,7 +26,7 @@ static int __init serial_init_chip(strucunsigned long address;int err; -#ifdef CONFIG_64BIT +#if defined(CONFIG_64BIT ) && defined(CONFIG_IOSAPIC )if (!dev->irq && (dev->id.sversion ==0xad )) dev->irq =iosapic_serial_irq (dev);#endif
Greg Kroah-Hartman
maintainerPATCH 4/58 parisc: Fix data TLB miss in sba_unmap_sg
In reply to Greg Kroah-HartmanFrom: John David Anglin <[email protected]>
commit b7d6f44a0fa716a82969725516dc0b16bc7cd514 upstream.
Rolf Eike Beer reported the following bug:
[1274934.746891] Bad Address (null pointer deref?): Code=15 (Data TLB miss fault) at addr 0000004140000018 [1274934.746891] CPU: 3 PID: 5549 Comm: cmake Not tainted 5.15.4-gentoo-parisc64 #4 [1274934.746891] Hardware name: 9000/785/C8000 [1274934.746891] [1274934.746891] YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI [1274934.746891] PSW: 00001000000001001111111000001110 Not tainted [1274934.746891] r00-03 000000ff0804fe0e 0000000040bc9bc0 00000000406760e4 0000004140000000 [1274934.746891] r04-07 0000000040b693c0 0000004140000000 000000004a2b08b0 0000000000000001 [1274934.746891] r08-11 0000000041f98810 0000000000000000 000000004a0a7000 0000000000000001 [1274934.746891] r12-15 0000000040bddbc0 0000000040c0cbc0 0000000040bddbc0 0000000040bddbc0 [1274934.746891] r16-19 0000000040bde3c0 0000000040bddbc0 0000000040bde3c0 0000000000000007 [1274934.746891] r20-23 0000000000000006 000000004a368950 0000000000000000 0000000000000001 [1274934.746891] r24-27 0000000000001fff 000000000800000e 000000004a1710f0 0000000040b693c0 [1274934.746891] r28-31 0000000000000001 0000000041f988b0 0000000041f98840 000000004a171118 [1274934.746891] sr00-03 00000000066e5800 0000000000000000 0000000000000000 00000000066e5800 [1274934.746891] sr04-07 0000000000000000 0000000000000000 0000000000000000 0000000000000000 [1274934.746891] [1274934.746891] IASQ: 0000000000000000 0000000000000000 IAOQ: 00000000406760e8 00000000406760ec [1274934.746891] IIR: 48780030 ISR: 0000000000000000 IOR: 0000004140000018 [1274934.746891] CPU: 3 CR30: 00000040e3a9c000 CR31: ffffffffffffffff [1274934.746891] ORIG_R28: 0000000040acdd58 [1274934.746891] IAOQ[0]: sba_unmap_sg+0xb0/0x118 [1274934.746891] IAOQ[1]: sba_unmap_sg+0xb4/0x118 [1274934.746891] RP(r2): sba_unmap_sg+0xac/0x118 [1274934.746891] Backtrace: [1274934.746891] [<00000000402740cc>] dma_unmap_sg_attrs+0x6c/0x70 [1274934.746891] [<000000004074d6bc>] scsi_dma_unmap+0x54/0x60 [1274934.746891] [<00000000407a3488>] mptscsih_io_done+0x150/0xd70 [1274934.746891] [<0000000040798600>] mpt_interrupt+0x168/0xa68 [1274934.746891] [<0000000040255a48>] __handle_irq_event_percpu+0xc8/0x278 [1274934.746891] [<0000000040255c34>] handle_irq_event_percpu+0x3c/0xd8 [1274934.746891] [<000000004025ecb4>] handle_percpu_irq+0xb4/0xf0 [1274934.746891] [<00000000402548e0>] generic_handle_irq+0x50/0x70 [1274934.746891] [<000000004019a254>] call_on_stack+0x18/0x24 [1274934.746891] [1274934.746891] Kernel panic - not syncing: Bad Address (null pointer deref?)
The bug is caused by overrunning the sglist and incorrectly testing sg_dma_len(sglist) before nents. Normally this doesn't cause a crash, but in this case sglist crossed a page boundary. This occurs in the following code:
while (sg_dma_len(sglist) && nents--) {The fix is simply to test nents first and move the decrement of nents into the loop.
--- drivers/parisc/sba_iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/parisc/sba_iommu.c +2 -1
@@ -1063,7 +1063,7 @@ sba_unmap_sg(struct device *dev, structspin_unlock_irqrestore (&ioc->res_lock, flags);#endif -while (sg_dma_len (sglist) && nents--) { +while (nents &&sg_dma_len (sglist)) {sba_unmap_page (dev,sg_dma_address (sglist),sg_dma_len (sglist), direction,0 );
@@ -1072,6 +1072,7 @@ sba_unmap_sg(struct device *dev, struct ioc->usingle_calls--;/* kluge since call is unmap_sg() */ #endif ++sglist; + nents--; }DBG_RUN_SG ("%s() DONE (nents %d)\n" , __func__, nents);
Greg Kroah-Hartman
maintainerPATCH 5/58 parisc: Fix sglist access in ccio-dma.c
In reply to Greg Kroah-HartmanFrom: John David Anglin <[email protected]>
commit d7da660cab47183cded65e11b64497d0f56c6edf upstream.
This patch implements the same bug fix to ccio-dma.c as to sba_iommu.c. It ensures that only the allocated entries of the sglist are accessed.
--- drivers/parisc/ccio-dma.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/parisc/ccio-dma.c +2 -1
@@ -1010,7 +1010,7 @@ ccio_unmap_sg(struct device *dev, struct ioc->usg_calls++;#endif -while (sg_dma_len (sglist) && nents--) { +while (nents &&sg_dma_len (sglist)) {#ifdef CCIO_COLLECT_STATS ioc->usg_pages +=sg_dma_len (sglist) >>PAGE_SHIFT ;
@@ -1018,6 +1018,7 @@ ccio_unmap_sg(struct device *dev, structccio_unmap_page (dev,sg_dma_address (sglist),sg_dma_len (sglist), direction,0 ); ++sglist; + nents--; }DBG_RUN_SG ("%s() DONE (nents %d)\n" , __func__, nents);
Greg Kroah-Hartman
maintainerPATCH 6/58 btrfs: send: in case of IO error log it
In reply to Greg Kroah-HartmanFrom: Dāvis Mosāns <[email protected]>
commit 2e7be9db125a0bf940c5d65eb5c40d8700f738b5 upstream.
Currently if we get IO error while doing send then we abort without logging information about which file caused issue. So log it to help with debugging.
--- fs/btrfs/send.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/btrfs/send.c +4 -0
@@ -4956,6 +4956,10 @@ static ssize_t fill_read_buf(struct sendlock_page (page);if (!PageUptodate (page)) {unlock_page (page); +btrfs_err (fs_info, +"send: IO error at offset %llu for inode %llu root %llu" , +page_offset (page), sctx->cur_ino, + sctx->send_root->root_key.objectid);put_page (page); ret = -EIO ;break ;
Greg Kroah-Hartman
maintainerPATCH 7/58 net: ieee802154: at86rf230: Stop leaking skbs
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit e5ce576d45bf72fd0e3dc37eff897bfcc488f6a9 ]
Upon error the ieee802154_xmit_complete() helper is not called. Only ieee802154_wake_queue() is called manually. In the Tx case we then leak the skb structure.
Free the skb structure upon error before returning when appropriate.
As the 'is_tx = 0' cannot be moved in the complete handler because of a possible race between the delay in switching to STATE_RX_AACK_ON and a new interrupt, we introduce an intermediate 'was_tx' boolean just for this purpose.
There is no Fixes tag applying here, many changes have been made on this area and the issue kind of always existed.
--- drivers/net/ieee802154/at86rf230.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/net/ieee802154/at86rf230.c +11 -2
@@ -108,6 +108,7 @@ struct at86rf230_local {unsigned long cal_timeout;bool is_tx;bool is_tx_from_off; +bool was_tx;u8 tx_retry;struct sk_buff *tx_skb;struct at86rf230_state_change tx;
@@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context)if (ctx->free)kfree (ctx); -ieee802154_wake_queue (lp->hw); +if (lp->was_tx) { + lp->was_tx =0 ; +dev_kfree_skb_any (lp->tx_skb); +ieee802154_wake_queue (lp->hw); + } } static void
@@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context)struct at86rf230_state_change *ctx = context;struct at86rf230_local *lp = ctx->lp; - lp->is_tx =0 ; +if (lp->is_tx) { + lp->was_tx =1 ; + lp->is_tx =0 ; + } +at86rf230_async_state_change (lp, ctx,STATE_RX_AACK_ON , at86rf230_async_error_recover_complete); }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 8/58 selftests/zram: Skip max_comp_streams interface on newer kernel
In reply to Greg Kroah-HartmanFrom: Yang Xu <[email protected]>
[ Upstream commit fc4eb486a59d70bd35cf1209f0e68c2d8b979193 ]
Since commit 43209ea2d17a ("zram: remove max_comp_streams internals"), zram has switched to per-cpu streams. Even kernel still keep this interface for some reasons, but writing to max_comp_stream doesn't take any effect. So skip it on newer kernel ie 4.7.
The code that comparing kernel version is from xfstests testsuite ext4/053.
--- tools/testing/selftests/zram/zram_lib.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
tools/testing/selftests/zram/zram_lib.sh +24 -0
@@ -20,6 +20,9 @@ dev_mounted=-1 # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 +kernel_version=`uname -r | cut -d'.' -f1,2` +kernel_major=${kernel_version%.*} +kernel_minor=${kernel_version#*.} trap INT
@@ -34,6 +37,20 @@ check_prereqs() fi } +kernel_gte() +{ + major=${1%.*} + minor=${1#*.} + + if [ $kernel_major -gt $major ]; then + return 0 + elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then + return 0 + fi + + return 1 +} + zram_cleanup() { echo "zram cleanup"
@@ -95,6 +112,13 @@ zram_max_streams() { echo "set max_comp_streams to zram device(s)" + kernel_gte 4.7 + if [ $? -eq 0 ]; then + echo "The device attribute max_comp_streams was"\ + "deprecated in 4.7" + return 0 + fi + local i=0 for max_s in $zram_max_streams; do local sys_path="/sys/block/zram${i}/max_comp_streams"
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 9/58 selftests/zram01.sh: Fix compression ratio calculation
In reply to Greg Kroah-HartmanFrom: Yang Xu <[email protected]>
[ Upstream commit d18da7ec3719559d6e74937266d0416e6c7e0b31 ]
zram01 uses free -m to measure zram memory usage. The results are no sense because they are polluted by all running processes on the system.
We Should only calculate the free memory delta for the current process. So use the third field of /sys/block/zram<id>/mm_stat to measure memory usage instead. The file is available since kernel 4.1.
orig_data_size(first): uncompressed size of data stored in this disk. compr_data_size(second): compressed size of data stored in this disk mem_used_total(third): the amount of memory allocated for this disk
Also remove useless zram cleanup call in zram_fill_fs and so we don't need to cleanup zram twice if fails.
--- tools/testing/selftests/zram/zram01.sh | 30 +++++++------------------- 1 file changed, 8 insertions(+), 22 deletions(-)
tools/testing/selftests/zram/zram01.sh +8 -22
@@ -42,8 +42,6 @@ zram_algs="lzo" zram_fill_fs() { - local mem_free0=$(free -m | awk 'NR==2 {print $4}') - for i in $(seq 0 $(($dev_num - 1))); do echo "fill zram$i..." local b=0
@@ -54,29 +52,17 @@ zram_fill_fs() b=$(($b + 1)) done echo "zram$i can be filled with '$b' KB" - done - local mem_free1=$(free -m | awk 'NR==2 {print $4}') - local used_mem=$(($mem_free0 - $mem_free1)) + local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` + local v=$((100 * 1024 * $b / $mem_used_total)) + if [ "$v" -lt 100 ]; then + echo "FAIL compression ratio: 0.$v:1" + ERR_CODE=-1 + return + fi - local total_size=0 - for sm in $zram_sizes; do - local s=$(echo $sm | sed 's/M//') - total_size=$(($total_size + $s)) + echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" done - - echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" - - local v=$((100 * $total_size / $used_mem)) - - if [ "$v" -lt 100 ]; then - echo "FAIL compression ratio: 0.$v:1" - ERR_CODE=-1 - zram_cleanup - return - fi - - echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" } check_prereqs
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 10/58 selftests/zram: Adapt the situation that /dev/zram0 is being used
In reply to Greg Kroah-HartmanFrom: Yang Xu <[email protected]>
[ Upstream commit 01dabed20573804750af5c7bf8d1598a6bf7bf6e ]
If zram-generator package is installed and works, then we can not remove zram module because zram swap is being used. This case needs a clean zram environment, change this test by using hot_add/hot_remove interface. So even zram device is being used, we still can add zram device and remove them in cleanup.
The two interface was introduced since kernel commit 6566d1a32bf7("zram:
add dynamic device add/remove functionality") in v4.2-rc1. If kernel supports these two interface, we use hot_add/hot_remove to slove this problem, if not, just check whether zram is being used or built in, then skip it on old kernel.
--- tools/testing/selftests/zram/zram.sh | 15 +--- tools/testing/selftests/zram/zram01.sh | 3 +- tools/testing/selftests/zram/zram02.sh | 1 - tools/testing/selftests/zram/zram_lib.sh | 110 +++++++++++++---------- 4 files changed, 66 insertions(+), 63 deletions(-)
tools/testing/selftests/zram/zram.sh +1 -14
@@ -2,9 +2,6 @@ # SPDX-License-Identifier: GPL-2.0 TCID="zram.sh" -# Kselftest framework requirement - SKIP code is 4. -ksft_skip=4 - . ./zram_lib.sh run_zram () {
@@ -18,14 +15,4 @@ echo "" check_prereqs -# check zram module exists -MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko -if [ -f $MODULE_PATH ]; then - run_zram -elif [ -b /dev/zram0 ]; then - run_zram -else - echo "$TCID : No zram.ko module or /dev/zram0 device file not found" - echo "$TCID : CONFIG_ZRAM is not set" - exit $ksft_skip -fi +run_zram
tools/testing/selftests/zram/zram01.sh +1 -2
@@ -42,7 +42,7 @@ zram_algs="lzo" zram_fill_fs() { - for i in $(seq 0 $(($dev_num - 1))); do + for i in $(seq $dev_start $dev_end); do echo "fill zram$i..." local b=0 while [ true ]; do
@@ -76,7 +76,6 @@ zram_mount zram_fill_fs zram_cleanup -zram_unload if [ $ERR_CODE -ne 0 ]; then echo "$TCID : [FAIL]"
tools/testing/selftests/zram/zram02.sh +0 -1
@@ -45,7 +45,6 @@ zram_set_memlimit zram_makeswap zram_swapoff zram_cleanup -zram_unload if [ $ERR_CODE -ne 0 ]; then echo "$TCID : [FAIL]"
tools/testing/selftests/zram/zram_lib.sh +64 -46
217 lines not on this page · raw message
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 11/58 ax25: improve the incomplete fix to avoid UAF and NPD bugs
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit 4e0f718daf97d47cf7dec122da1be970f145c809 ]
The previous commit 1ade48d0c27d ("ax25: NPD bug when detaching AX25 device") introduce lock_sock() into ax25_kill_by_device to prevent NPD bug. But the concurrency NPD or UAF bug will occur, when lock_sock() or release_sock() dereferences the ax25_cb->sock.
The NULL pointer dereference bug can be shown as below:
ax25_kill_by_device() | ax25_release()
| ax25_destroy_socket()
| ax25_cb_del()
... | ...
| ax25->sk=NULL;
lock_sock(s->sk); //(1) |
s->ax25_dev = NULL; | ...
release_sock(s->sk); //(2) |
... |The root cause is that the sock is set to null before dereference site (1) or (2). Therefore, this patch extracts the ax25_cb->sock in advance, and uses ax25_list_lock to protect it, which can synchronize with ax25_cb_del() and ensure the value of sock is not null before dereference sites.
The concurrency UAF bug can be shown as below:
ax25_kill_by_device() | ax25_release()
| ax25_destroy_socket()
... | ...
| sock_put(sk); //FREE
lock_sock(s->sk); //(1) |
s->ax25_dev = NULL; | ...
release_sock(s->sk); //(2) |
... |The root cause is that the sock is released before dereference site (1) or (2). Therefore, this patch uses sock_hold() to increase the refcount of sock and uses ax25_list_lock to protect it, which can synchronize with ax25_cb_del() in ax25_destroy_socket() and ensure the sock wil not be released before dereference sites.
--- net/ax25/af_ax25.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/ax25/af_ax25.c +6 -3
@@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev) {ax25_dev *ax25_dev;ax25_cb *s; +struct sock *sk;if ((ax25_dev =ax25_dev_ax25dev (dev)) ==NULL )return ;
@@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev) again:ax25_for_each (s, &ax25_list) {if (s->ax25_dev == ax25_dev) { + sk = s->sk; +sock_hold (sk);spin_unlock_bh (&ax25_list_lock); -lock_sock (s->sk); +lock_sock (sk); s->ax25_dev =NULL ; -release_sock (s->sk); +release_sock (sk);ax25_disconnect (s,ENETUNREACH );spin_lock_bh (&ax25_list_lock); - +sock_put (sk);/* The entry could have been deleted from the * list meanwhile and thus the next pointer is * no longer valid. Play it safe and restart
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 12/58 vfs: make freeze_super abort when sync_filesystem returns error
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit 2719c7160dcfaae1f73a1c0c210ad3281c19022e ]
If we fail to synchronize the filesystem while preparing to freeze the fs, abort the freeze.
--- fs/super.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
fs/super.c +12 -7
@@ -1404,11 +1404,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb)percpu_rwsem_acquire (sb->s_writers.rw_sem + level,0 , _THIS_IP_); } -static void sb_freeze_unlock (struct super_block *sb) +static void sb_freeze_unlock (struct super_block *sb,int level) { -int level; - -for (level =SB_FREEZE_LEVELS -1 ; level >=0 ; level--) +for (level--; level >=0 ; level--)percpu_up_write (sb->s_writers.rw_sem + level); }
@@ -1479,7 +1477,14 @@ int freeze_super(struct super_block *sb)sb_wait_write (sb,SB_FREEZE_PAGEFAULT );/* All writers are done so after syncing there won't be dirty data */ -sync_filesystem (sb); + ret =sync_filesystem (sb); +if (ret) { + sb->s_writers.frozen =SB_UNFROZEN ; +sb_freeze_unlock (sb,SB_FREEZE_PAGEFAULT ); +wake_up (&sb->s_writers.wait_unfrozen); +deactivate_locked_super (sb); +return ret; + }/* Now wait for internal filesystem counter */ sb->s_writers.frozen =SB_FREEZE_FS ;
@@ -1491,7 +1496,7 @@ int freeze_super(struct super_block *sb)printk (KERN_ERR "VFS:Filesystem freeze failed\n" ); sb->s_writers.frozen =SB_UNFROZEN ; -sb_freeze_unlock (sb); +sb_freeze_unlock (sb,SB_FREEZE_FS );wake_up (&sb->s_writers.wait_unfrozen);deactivate_locked_super (sb);return ret;
@@ -1542,7 +1547,7 @@ static int thaw_super_locked(struct super_block *sb) } sb->s_writers.frozen =SB_UNFROZEN ; -sb_freeze_unlock (sb); +sb_freeze_unlock (sb,SB_FREEZE_FS ); out:wake_up (&sb->s_writers.wait_unfrozen);deactivate_locked_super (sb);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 13/58 quota: make dquot_quota_sync return errors from ->sync_fs
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit dd5532a4994bfda0386eb2286ec00758cee08444 ]
Strangely, dquot_quota_sync ignores the return code from the ->sync_fs call, which means that quotacalls like Q_SYNC never see the error. This doesn't seem right, so fix that.
--- fs/quota/dquot.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/quota/dquot.c +8 -3
@@ -687,9 +687,14 @@ int dquot_quota_sync(struct super_block *sb, int type)/* This is not very clever (and fast) but currently I don't know about * any other simple way of getting quota data to disk and we must get * them there for userspace to be visible... */ -if (sb->s_op->sync_fs) - sb->s_op->sync_fs (sb,1 ); -sync_blockdev (sb->s_bdev); +if (sb->s_op->sync_fs) { + ret = sb->s_op->sync_fs (sb,1 ); +if (ret) +return ret; + } + ret =sync_blockdev (sb->s_bdev); +if (ret) +return ret;/* * Now when everything is written we can discard the pagecache so
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 14/58 nvme: fix a possible use-after-free in controller reset during load
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 0fa0f99fc84e41057cbdd2efbfe91c6b2f47dd9d ]
Unlike .queue_rq, in .submit_async_event drivers may not check the ctrl readiness for AER submission. This may lead to a use-after-free condition that was observed with nvme-tcp.
The race condition may happen in the following scenario:
1. driver executes its reset_ctrl_work
2. -> nvme_stop_ctrl - flushes ctrl async_event_work
3. ctrl sends AEN which is received by the host, which in turn schedules AEN handling
4. teardown admin queue (which releases the queue socket)
5. AEN processed, submits another AER, calling the driver to submit
6. driver attempts to send the cmd
==> use-after-free
In order to fix that, add ctrl state check to validate the ctrl is actually able to accept the AER submission.
This addresses the above race in controller resets because the driver during teardown should:
1. change ctrl state to RESETTING
2. flush async_event_work (as well as other async work elements)
So after 1,2, any other AER command will find the
ctrl state to be RESETTING and bail out without submitting the AER.
--- drivers/nvme/host/core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +8 -1
@@ -3463,7 +3463,14 @@ static void nvme_async_event_work(struct work_struct *work) container_of(work, struct nvme_ctrl, async_event_work);nvme_aen_uevent (ctrl); - ctrl->ops->submit_async_event (ctrl); + +/* +* The transport drivers must guarantee AER submission here is safe by +* flushing ctrl async_event_work after changing the controller state +* from LIVE and before freeing the admin queue. +*/ +if (ctrl->state ==NVME_CTRL_LIVE ) + ctrl->ops->submit_async_event (ctrl); }static bool nvme_ctrl_pp_status (struct nvme_ctrl *ctrl)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 15/58 nvme-rdma: fix possible use-after-free in transport error_recovery work
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit b6bb1722f34bbdbabed27acdceaf585d300c5fd2 ]
While nvme_rdma_submit_async_event_work is checking the ctrl and queue state before preparing the AER command and scheduling io_work, in order to fully prevent a race where this check is not reliable the error recovery work must flush async_event_work before continuing to destroy the admin queue after setting the ctrl state to RESETTING such that there is no race .submit_async_event and the error recovery handler itself changing the ctrl state.
--- drivers/nvme/host/rdma.c | 1 + 1 file changed, 1 insertion(+)
drivers/nvme/host/rdma.c +1 -0
@@ -1050,6 +1050,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work) struct nvme_rdma_ctrl, err_work);nvme_stop_keep_alive (&ctrl->ctrl); +flush_work (&ctrl->ctrl.async_event_work);nvme_rdma_teardown_io_queues (ctrl, false);nvme_start_queues (&ctrl->ctrl);nvme_rdma_teardown_admin_queue (ctrl, false);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 16/58 Revert "module, async: async_synchronize_full() on module init iff async is used"
In reply to Greg Kroah-HartmanFrom: Igor Pylypiv <[email protected]>
[ Upstream commit 67d6212afda218d564890d1674bab28e8612170f ]
This reverts commit 774a1221e862b343388347bac9b318767336b20b.
We need to finish all async code before the module init sequence is done. In the reverted commit the PF_USED_ASYNC flag was added to mark a thread that called async_schedule(). Then the PF_USED_ASYNC flag was used to determine whether or not async_synchronize_full() needs to be invoked. This works when modprobe thread is calling async_schedule(), but it does not work if module dispatches init code to a worker thread which then calls async_schedule().
For example, PCI driver probing is invoked from a worker thread based on a node where device is attached:
if (cpu < nr_cpu_ids) error = work_on_cpu(cpu, local_pci_probe, &ddi); else error = local_pci_probe(&ddi);
We end up in a situation where a worker thread gets the PF_USED_ASYNC flag set instead of the modprobe thread. As a result, async_synchronize_full() is not invoked and modprobe completes without waiting for the async code to finish.
The issue was discovered while loading the pm80xx driver:
(scsi_mod.scan=async)
modprobe pm80xx worker
...
do_init_module()
...
pci_call_probe()
work_on_cpu(local_pci_probe)
local_pci_probe()
pm8001_pci_probe()
scsi_scan_host()
async_schedule()
worker->flags |= PF_USED_ASYNC;
...
< return from worker > ...
if (current->flags & PF_USED_ASYNC) <--- false
async_synchronize_full();
Commit 21c3c5d28007 ("block: don't request module during elevator init") fixed the deadlock issue which the reverted commit 774a1221e862 ("module, async: async_synchronize_full() on module init iff async is used") tried to fix.
Since commit 0fdff3ec6d87 ("async, kmod: warn on synchronous request_module() from async workers") synchronous module loading from async is not allowed.
Given that the original deadlock issue is fixed and it is no longer allowed to call synchronous request_module() from async we can remove PF_USED_ASYNC flag to make module init consistently invoke async_synchronize_full() unless async module probe is requested.
--- include/linux/sched.h | 1 - kernel/async.c | 3 --- kernel/module.c | 25 +++++-------------------- 3 files changed, 5 insertions(+), 24 deletions(-)
include/linux/sched.h +0 -1
@@ -1389,7 +1389,6 @@ extern struct pid *cad_pid;#define PF_MEMALLOC 0x00000800/* Allocating memory */ #define PF_NPROC_EXCEEDED 0x00001000/* set_user() noticed that RLIMIT_NPROC was exceeded */ #define PF_USED_MATH 0x00002000/* If unset the fpu must be initialized before use */ -#define PF_USED_ASYNC 0x00004000/* Used async_schedule*(), used by module init */ #define PF_NOFREEZE 0x00008000/* This thread should not be frozen */ #define PF_FROZEN 0x00010000/* Frozen for system suspend */ #define PF_KSWAPD 0x00020000/* I am kswapd */
kernel/async.c +0 -3
@@ -191,9 +191,6 @@ static async_cookie_t __async_schedule(async_func_t func, void *data, struct asyatomic_inc (&entry_count);spin_unlock_irqrestore (&async_lock, flags); -/* mark that this task has queued an async job, used by module init */ - current->flags |=PF_USED_ASYNC ; -/* schedule for execution */ queue_work (system_unbound_wq, &entry->work);
kernel/module.c +5 -20
@@ -3526,12 +3526,6 @@ static noinline int do_init_module(struct module *mod) } freeinit->module_init = mod->init_layout.base; -/* -* We want to find out whether @mod uses async during init. Clear -* PF_USED_ASYNC. async_schedule*() will set it. -*/ - current->flags &= ~PF_USED_ASYNC ; -do_mod_ctors (mod);/* Start the module */ if (mod->init !=NULL )
@@ -3557,22 +3551,13 @@ static noinline int do_init_module(struct module *mod)/* * We need to finish all async code before the module init sequence -* is done. This has potential to deadlock. For example, a newly -* detected block device can trigger request_module() of the -* default iosched from async probing task. Once userland helper -* reaches here, async_synchronize_full() will wait on the async -* task waiting on request_module() and deadlock. -* -* This deadlock is avoided by perfomring async_synchronize_full() -* iff module init queued any async jobs. This isn't a full -* solution as it will deadlock the same if module loading from -* async jobs nests more than once; however, due to the various -* constraints, this hack seems to be the best option for now. -* Please refer to the following thread for details. +* is done. This has potential to deadlock if synchronous module +* loading is requested from async (which is not allowed!). * -* http://thread.gmane.org/gmane.linux.kernel/1420814 +* See commit 0fdff3ec6d87 ("async, kmod: warn on synchronous +* request_module() from async workers") for more details. */ -if (!mod->async_probe_requested && (current->flags &PF_USED_ASYNC )) +if (!mod->async_probe_requested)async_synchronize_full (); ftrace_free_mem(mod, mod->init_layout.base, mod->init_layout.base +
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 17/58 iwlwifi: fix use-after-free
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
commit bea2662e7818e15d7607d17d57912ac984275d94 upstream.
If no firmware was present at all (or, presumably, all of the firmware files failed to parse), we end up unbinding by calling device_release_driver(), which calls remove(), which then in iwlwifi calls iwl_drv_stop(), freeing the 'drv' struct. However the new code I added will still erroneously access it after it was freed.
Set 'failure=false' in this case to avoid the access, all data was already freed anyway.
--- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/intel/iwlwifi/iwl-drv.c +2 -0
@@ -1549,6 +1549,8 @@ static void iwl_req_fw_callback(const st out_unbind:complete (&drv->request_firmware_complete);device_release_driver (drv->trans->dev); +/* drv has just been freed by the release */ + failure = false; free:if (failure)iwl_dealloc_ucode (drv);
Greg Kroah-Hartman
maintainerPATCH 18/58 drm/radeon: Fix backlight control on iMac 12,1
In reply to Greg Kroah-HartmanFrom: Nicholas Bishop <[email protected]>
commit 364438fd629f7611a84c8e6d7de91659300f1502 upstream.
The iMac 12,1 does not use the gmux driver for backlight, so the radeon backlight device is needed to set the brightness.
--- drivers/gpu/drm/radeon/atombios_encoders.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/radeon/atombios_encoders.c +2 -1
@@ -193,7 +193,8 @@ void radeon_atom_backlight_init(struct r* so don't register a backlight device */ if ((rdev->pdev->subsystem_vendor ==PCI_VENDOR_ID_APPLE ) && - (rdev->pdev->device ==0x6741 )) + (rdev->pdev->device ==0x6741 ) && + !dmi_match (DMI_PRODUCT_NAME ,"iMac12,1" ))return ;if (!radeon_encoder->enc_priv)
Greg Kroah-Hartman
maintainerPATCH 19/58 xfrm: Dont accidentally set RTO_ONLINK in decode_session4()
In reply to Greg Kroah-HartmanFrom: Guillaume Nault <[email protected]>
commit 23e7b1bfed61e301853b5e35472820d919498278 upstream.
Similar to commit 94e2238969e8 ("xfrm4: strip ECN bits from tos field"), clear the ECN bits from iph->tos when setting ->flowi4_tos. This ensures that the last bit of ->flowi4_tos is cleared, so ip_route_output_key_hash() isn't going to restrict the scope of the route lookup.
Use ~INET_ECN_MASK instead of IPTOS_RT_MASK, because we have no reason to clear the high order bits.
Found by code inspection, compile tested only.
--- net/ipv4/xfrm4_policy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/xfrm4_policy.c +2 -1
@@ -17,6 +17,7 @@#include <net/xfrm.h> #include <net/ip.h> #include <net/l3mdev.h> +#include <net/inet_ecn.h> static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4, int tos, int oif,
@@ -126,7 +127,7 @@ _decode_session4(struct sk_buff *skb, st fl4->flowi4_proto = iph->protocol; fl4->daddr = reverse ? iph->saddr : iph->daddr; fl4->saddr = reverse ? iph->daddr : iph->saddr; - fl4->flowi4_tos = iph->tos; + fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK ;if (!ip_is_fragment (iph)) {switch (iph->protocol) {
Greg Kroah-Hartman
maintainerPATCH 20/58 taskstats: Cleanup the use of task->exit_code
In reply to Greg Kroah-HartmanFrom: "Eric W. Biederman" <[email protected]>
commit 1b5a42d9c85f0e731f01c8d1129001fd8531a8a0 upstream.
In the function bacct_add_task the code reading task->exit_code was introduced in commit f3cef7a99469 ("[PATCH] csa: basic accounting over taskstats"), and it is not entirely clear what the taskstats interface is trying to return as only returning the exit_code of the first task in a process doesn't make a lot of sense.
As best as I can figure the intent is to return task->exit_code after a task exits. The field is returned with per task fields, so the exit_code of the entire process is not wanted. Only the value of the first task is returned so this is not a useful way to get the per task ptrace stop code. The ordinary case of returning this value is returning after a task exits, which also precludes use for getting a ptrace value.
It is common to for the first task of a process to also be the last task of a process so this field may have done something reasonable by accident in testing.
Make ac_exitcode a reliable per task value by always returning it for every exited task.
Setting ac_exitcode in a sensible mannter makes it possible to continue to provide this value going forward.
--- kernel/tsacct.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
kernel/tsacct.c +3 -4
@@ -46,11 +46,10 @@ void bacct_add_tsk(struct user_namespace/* Convert to seconds for btime */ do_div (delta,USEC_PER_SEC ); stats->ac_btime =get_seconds () - delta; -if (thread_group_leader (tsk)) { +if (tsk->flags &PF_EXITING ) stats->ac_exitcode = tsk->exit_code; -if (tsk->flags &PF_FORKNOEXEC ) - stats->ac_flag |=AFORK ; - } +if (thread_group_leader (tsk) && (tsk->flags &PF_FORKNOEXEC )) + stats->ac_flag |=AFORK ;if (tsk->flags &PF_SUPERPRIV ) stats->ac_flag |=ASU ;if (tsk->flags &PF_DUMPCORE )
Greg Kroah-Hartman
maintainerPATCH 21/58 mmc: block: fix read single on recovery logic
In reply to Greg Kroah-HartmanFrom: Christian Löhle <[email protected]>
commit 54309fde1a352ad2674ebba004a79f7d20b9f037 upstream.
On reads with MMC_READ_MULTIPLE_BLOCK that fail,
the recovery handler will use MMC_READ_SINGLE_BLOCK for each of the blocks, up to MMC_READ_SINGLE_RETRIES times each. The logic for this is fixed to never report unsuccessful reads as success to the block layer.
On command error with retries remaining, blk_update_request was called with whatever value error was set last to.
In case it was last set to BLK_STS_OK (default), the read will be reported as success, even though there was no data read from the device. This could happen on a CRC mismatch for the response,
a card rejecting the command (e.g. again due to a CRC mismatch). In case it was last set to BLK_STS_IOERR, the error is reported correctly, but no retries will be attempted.
--- drivers/mmc/core/block.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/mmc/core/block.c +14 -14
@@ -1678,31 +1678,31 @@ static void mmc_blk_read_single(struct mstruct mmc_card *card = mq->card;struct mmc_host *host = card->host;blk_status_t error =BLK_STS_OK ; -int retries =0 ; do { u32 status; int err; + int retries = 0; - mmc_blk_rw_rq_prep(mqrq, card, 1, mq); + while (retries++ <= MMC_READ_SINGLE_RETRIES) { + mmc_blk_rw_rq_prep(mqrq, card, 1, mq); - mmc_wait_for_req(host, mrq); + mmc_wait_for_req(host, mrq); - err = mmc_send_status(card, &status); - if (err) - goto error_exit; - - if (!mmc_host_is_spi(host) && - !mmc_blk_in_tran_state(status)) { - err = mmc_blk_fix_state(card, req); + err = mmc_send_status(card, &status); if (err) goto error_exit; - } - if (mrq->cmd->error && retries++ < MMC_READ_SINGLE_RETRIES) - continue; + if (!mmc_host_is_spi(host) && + !mmc_blk_in_tran_state(status)) { + err = mmc_blk_fix_state(card, req); + if (err) + goto error_exit; + } - retries = 0; + if (!mrq->cmd->error) + break; + } if (mrq->cmd->error || mrq->data->error ||
Greg Kroah-Hartman
maintainerPATCH 22/58 vsock: remove vsock from connected table when connect is interrupted by a signal
In reply to Greg Kroah-HartmanFrom: Seth Forshee <[email protected]>
commit b9208492fcaecff8f43915529ae34b3bcb03877c upstream.
vsock_connect() expects that the socket could already be in the TCP_ESTABLISHED state when the connecting task wakes up with a signal pending. If this happens the socket will be in the connected table, and it is not removed when the socket state is reset. In this situation it's common for the process to retry connect(), and if the connection is successful the socket will be added to the connected table a second time, corrupting the list.
Prevent this by calling vsock_remove_connected() if a signal is received while waiting for a connection. This is harmless if the socket is not in the connected table, and if it is in the table then removing it will prevent list corruption from a double add.
Note for backporting: this patch requires d5afa82c977e ("vsock: correct removal of socket from the list"), which is in all current stable trees except 4.9.y.
--- net/vmw_vsock/af_vsock.c | 1 + 1 file changed, 1 insertion(+)
net/vmw_vsock/af_vsock.c +1 -0
@@ -1230,6 +1230,7 @@ static int vsock_stream_connect(struct s sk->sk_state = sk->sk_state ==TCP_ESTABLISHED ?TCP_CLOSING :TCP_CLOSE ; sock->state =SS_UNCONNECTED ;vsock_transport_cancel_pkt (vsk); +vsock_remove_connected (vsk); goto out_wait; }else if (timeout ==0 ) { err = -ETIMEDOUT ;
Greg Kroah-Hartman
maintainerPATCH 23/58 iwlwifi: pcie: fix locking when "HW not ready"
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
commit e9848aed147708a06193b40d78493b0ef6abccf2 upstream.
If we run into this error path, we shouldn't unlock the mutex since it's not locked since. Fix this.
--- drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/trans.c +1 -2
@@ -1363,8 +1363,7 @@ static int iwl_trans_pcie_start_fw(struc/* This may fail if AMT took ownership of the device */ if (iwl_pcie_prepare_card_hw (trans)) {IWL_WARN (trans,"Exit HW not ready\n" ); - ret = -EIO ; - goto out; +return -EIO ; }iwl_enable_rfkill_int (trans);
Greg Kroah-Hartman
maintainerPATCH 24/58 iwlwifi: pcie: gen2: fix locking when "HW not ready"
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
commit 4c29c1e27a1e178a219b3877d055e6dd643bdfda upstream.
If we run into this error path, we shouldn't unlock the mutex since it's not locked since. Fix this in the gen2 code as well.
--- drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +1 -2
@@ -310,8 +310,7 @@ int iwl_trans_pcie_gen2_start_fw(struct/* This may fail if AMT took ownership of the device */ if (iwl_pcie_prepare_card_hw (trans)) {IWL_WARN (trans,"Exit HW not ready\n" ); - ret = -EIO ; - goto out; +return -EIO ; }iwl_enable_rfkill_int (trans);
Greg Kroah-Hartman
maintainerPATCH 25/58 net: dsa: lan9303: fix reset on probe
In reply to Greg Kroah-HartmanFrom: Mans Rullgard <[email protected]>
commit 6bb9681a43f34f2cab4aad6e2a02da4ce54d13c5 upstream.
The reset input to the LAN9303 chip is active low, and devicetree gpio handles reflect this. Therefore, the gpio should be requested with an initial state of high in order for the reset signal to be asserted. Other uses of the gpio already use the correct polarity.
--- drivers/net/dsa/lan9303-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/lan9303-core.c +1 -1
@@ -1307,7 +1307,7 @@ static int lan9303_probe_reset_gpio(stru struct device_node *np) { chip->reset_gpio =devm_gpiod_get_optional (chip->dev,"reset" , -GPIOD_OUT_LOW ); +GPIOD_OUT_HIGH );if (IS_ERR (chip->reset_gpio))return PTR_ERR (chip->reset_gpio);
Greg Kroah-Hartman
maintainerPATCH 26/58 net: ieee802154: ca8210: Fix lifs/sifs periods
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
commit bdc120a2bcd834e571ce4115aaddf71ab34495de upstream.
These periods are expressed in time units (microseconds) while 40 and 12 are the number of symbol durations these periods will last. We need to multiply them both with the symbol_duration in order to get these values in microseconds.
--- drivers/net/ieee802154/ca8210.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ieee802154/ca8210.c +2 -2
@@ -2975,8 +2975,8 @@ static void ca8210_hw_setup(struct ieee8 ca8210_hw->phy->cca.opt =NL802154_CCA_OPT_ENERGY_CARRIER_AND ; ca8210_hw->phy->cca_ed_level =-9800 ; ca8210_hw->phy->symbol_duration =16 ; - ca8210_hw->phy->lifs_period =40 ; - ca8210_hw->phy->sifs_period =12 ; + ca8210_hw->phy->lifs_period =40 * ca8210_hw->phy->symbol_duration; + ca8210_hw->phy->sifs_period =12 * ca8210_hw->phy->symbol_duration; ca8210_hw->flags =IEEE802154_HW_AFILT | IEEE802154_HW_OMIT_CKSUM |
Greg Kroah-Hartman
maintainerPATCH 27/58 ping: fix the dif and sdif check in ping_lookup
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
commit 35a79e64de29e8d57a5989aac57611c0cd29e13e upstream.
When 'ping' changes to use PING socket instead of RAW socket by:
# sysctl -w net.ipv4.ping_group_range="0 100"
There is another regression caused when matching sk_bound_dev_if and dif, RAW socket is using inet_iif() while PING socket lookup is using skb->dev->ifindex, the cmd below fails due to this:
# ip link add dummy0 type dummy # ip link set dummy0 up # ip addr add 192.168.111.1/24 dev dummy0 # ping -I dummy0 192.168.111.1 -c1
The issue was also reported on:
https://github.com/iputils/iputils/issues/104
But fixed in iputils in a wrong way by not binding to device when destination IP is on device, and it will cause some of kselftests to fail, as Jianlin noticed.
This patch is to use inet(6)_iif and inet(6)_sdif to get dif and sdif for PING socket, and keep consistent with RAW socket.
--- net/ipv4/ping.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/ipv4/ping.c +9 -2
@@ -177,16 +177,23 @@ static struct sock *ping_lookup(struct nstruct sock *sk =NULL ;struct inet_sock *isk;struct hlist_nulls_node *hnode; -int dif = skb->dev->ifindex; +int dif, sdif;if (skb->protocol ==htons (ETH_P_IP )) { + dif =inet_iif (skb); + sdif =inet_sdif (skb);pr_debug ("try to find: num = %d, daddr = %pI4, dif = %d\n" , (int )ident, &ip_hdr (skb)->daddr, dif);#if IS_ENABLED (CONFIG_IPV6 ) } else if (skb->protocol == htons(ETH_P_IPV6)) { + dif =inet6_iif (skb); + sdif =inet6_sdif (skb);pr_debug ("try to find: num = %d, daddr = %pI6c, dif = %d\n" , (int )ident, &ipv6_hdr (skb)->daddr, dif);#endif + }else { +pr_err ("ping: protocol(%x) is not supported\n" ,ntohs (skb->protocol)); +return NULL ; }read_lock_bh (&ping_table.lock);
@@ -226,7 +233,7 @@ static struct sock *ping_lookup(struct n }if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif && - sk->sk_bound_dev_if !=inet_sdif (skb)) + sk->sk_bound_dev_if != sdif)continue ;sock_hold (sk);
Greg Kroah-Hartman
maintainerPATCH 28/58 drop_monitor: fix data-race in dropmon_net_event / trace_napi_poll_hit
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit dcd54265c8bc14bd023815e36e2d5f9d66ee1fee upstream.
trace_napi_poll_hit() is reading stat->dev while another thread can write on it from dropmon_net_event()
Use READ_ONCE()/WRITE_ONCE() here, RCU rules are properly enforced already, we only have to take care of load/store tearing.
BUG: KCSAN: data-race in dropmon_net_event / trace_napi_poll_hit
write to 0xffff88816f3ab9c0 of 8 bytes by task 20260 on cpu 1:
dropmon_net_event+0xb8/0x2b0 net/core/drop_monitor.c:1579 notifier_call_chain kernel/notifier.c:84 [inline] raw_notifier_call_chain+0x53/0xb0 kernel/notifier.c:392 call_netdevice_notifiers_info net/core/dev.c:1919 [inline] call_netdevice_notifiers_extack net/core/dev.c:1931 [inline] call_netdevice_notifiers net/core/dev.c:1945 [inline] unregister_netdevice_many+0x867/0xfb0 net/core/dev.c:10415 ip_tunnel_delete_nets+0x24a/0x280 net/ipv4/ip_tunnel.c:1123 vti_exit_batch_net+0x2a/0x30 net/ipv4/ip_vti.c:515 ops_exit_list net/core/net_namespace.c:173 [inline] cleanup_net+0x4dc/0x8d0 net/core/net_namespace.c:597 process_one_work+0x3f6/0x960 kernel/workqueue.c:2307 worker_thread+0x616/0xa70 kernel/workqueue.c:2454 kthread+0x1bf/0x1e0 kernel/kthread.c:377 ret_from_fork+0x1f/0x30
read to 0xffff88816f3ab9c0 of 8 bytes by interrupt on cpu 0:
trace_napi_poll_hit+0x89/0x1c0 net/core/drop_monitor.c:292 trace_napi_poll include/trace/events/napi.h:14 [inline] __napi_poll+0x36b/0x3f0 net/core/dev.c:6366 napi_poll net/core/dev.c:6432 [inline] net_rx_action+0x29e/0x650 net/core/dev.c:6519 __do_softirq+0x158/0x2de kernel/softirq.c:558 do_softirq+0xb1/0xf0 kernel/softirq.c:459 __local_bh_enable_ip+0x68/0x70 kernel/softirq.c:383 __raw_spin_unlock_bh include/linux/spinlock_api_smp.h:167 [inline] _raw_spin_unlock_bh+0x33/0x40 kernel/locking/spinlock.c:210 spin_unlock_bh include/linux/spinlock.h:394 [inline] ptr_ring_consume_bh include/linux/ptr_ring.h:367 [inline] wg_packet_decrypt_worker+0x73c/0x780 drivers/net/wireguard/receive.c:506 process_one_work+0x3f6/0x960 kernel/workqueue.c:2307 worker_thread+0x616/0xa70 kernel/workqueue.c:2454 kthread+0x1bf/0x1e0 kernel/kthread.c:377 ret_from_fork+0x1f/0x30
value changed: 0xffff88815883e000 -> 0x0000000000000000
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 26435 Comm: kworker/0:1 Not tainted 5.17.0-rc1-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: wg-crypt-wg2 wg_packet_decrypt_worker
--- net/core/drop_monitor.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/core/drop_monitor.c +9 -2
@@ -219,13 +219,17 @@ static void trace_napi_poll_hit(void *igrcu_read_lock ();list_for_each_entry_rcu (new_stat, &hw_stats_list, list) { +struct net_device *dev; +/* * only add a note to our monitor buffer if: * 1) this is the dev we received on * 2) its after the last_rx delta * 3) our rx_dropped count has gone up */ -if ((new_stat->dev == napi->dev) && +/* Paired with WRITE_ONCE() in dropmon_net_event() */ + dev =READ_ONCE (new_stat->dev); +if ((dev == napi->dev) && (time_after (jiffies, new_stat->last_rx + dm_hw_check_delta)) && (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) {trace_drop_common (NULL ,NULL );
@@ -340,7 +344,10 @@ static int dropmon_net_event(struct notimutex_lock (&trace_state_mutex);list_for_each_entry_safe (new_stat, tmp, &hw_stats_list, list) {if (new_stat->dev == dev) { - new_stat->dev =NULL ; + +/* Paired with READ_ONCE() in trace_napi_poll_hit() */ +WRITE_ONCE (new_stat->dev,NULL ); +if (trace_state ==TRACE_OFF ) {list_del_rcu (&new_stat->list);kfree_rcu (new_stat, rcu);
Greg Kroah-Hartman
maintainerPATCH 29/58 bonding: fix data-races around agg_select_timer
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 9ceaf6f76b203682bb6100e14b3d7da4c0bedde8 upstream.
syzbot reported that two threads might write over agg_select_timer at the same time. Make agg_select_timer atomic to fix the races.
BUG: KCSAN: data-race in bond_3ad_initiate_agg_selection / bond_3ad_state_machine_handler
read to 0xffff8881242aea90 of 4 bytes by task 1846 on cpu 1:
bond_3ad_state_machine_handler+0x99/0x2810 drivers/net/bonding/bond_3ad.c:2317 process_one_work+0x3f6/0x960 kernel/workqueue.c:2307 worker_thread+0x616/0xa70 kernel/workqueue.c:2454 kthread+0x1bf/0x1e0 kernel/kthread.c:377 ret_from_fork+0x1f/0x30
write to 0xffff8881242aea90 of 4 bytes by task 25910 on cpu 0:
bond_3ad_initiate_agg_selection+0x18/0x30 drivers/net/bonding/bond_3ad.c:1998 bond_open+0x658/0x6f0 drivers/net/bonding/bond_main.c:3967 __dev_open+0x274/0x3a0 net/core/dev.c:1407 dev_open+0x54/0x190 net/core/dev.c:1443 bond_enslave+0xcef/0x3000 drivers/net/bonding/bond_main.c:1937 do_set_master net/core/rtnetlink.c:2532 [inline] do_setlink+0x94f/0x2500 net/core/rtnetlink.c:2736 __rtnl_newlink net/core/rtnetlink.c:3414 [inline] rtnl_newlink+0xfeb/0x13e0 net/core/rtnetlink.c:3529 rtnetlink_rcv_msg+0x745/0x7e0 net/core/rtnetlink.c:5594 netlink_rcv_skb+0x14e/0x250 net/netlink/af_netlink.c:2494 rtnetlink_rcv+0x18/0x20 net/core/rtnetlink.c:5612 netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline] netlink_unicast+0x602/0x6d0 net/netlink/af_netlink.c:1343 netlink_sendmsg+0x728/0x850 net/netlink/af_netlink.c:1919 sock_sendmsg_nosec net/socket.c:705 [inline] sock_sendmsg net/socket.c:725 [inline] ____sys_sendmsg+0x39a/0x510 net/socket.c:2413 ___sys_sendmsg net/socket.c:2467 [inline] __sys_sendmsg+0x195/0x230 net/socket.c:2496 __do_sys_sendmsg net/socket.c:2505 [inline] __se_sys_sendmsg net/socket.c:2503 [inline] __x64_sys_sendmsg+0x42/0x50 net/socket.c:2503 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x44/0xd0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x44/0xae
value changed: 0x00000050 -> 0x0000004f
Reported by Kernel Concurrency Sanitizer on:
CPU: 0 PID: 25910 Comm: syz-executor.1 Tainted: G W 5.17.0-rc4-syzkaller-dirty #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
--- drivers/net/bonding/bond_3ad.c | 30 +++++++++++++++++++++++++----- include/net/bond_3ad.h | 2 +- 2 files changed, 26 insertions(+), 6 deletions(-)
drivers/net/bonding/bond_3ad.c +25 -5
@@ -249,7 +249,7 @@ static inline int __check_agg_selection_if (bond ==NULL )return 0 ; -return BOND_AD_INFO (bond).agg_select_timer ?1 :0 ; +return atomic_read (&BOND_AD_INFO (bond).agg_select_timer) ?1 :0 ; }/**
@@ -1965,7 +1965,7 @@ static void ad_marker_response_received(*/ void bond_3ad_initiate_agg_selection (struct bonding *bond,int timeout) { -BOND_AD_INFO (bond).agg_select_timer = timeout; +atomic_set (&BOND_AD_INFO (bond).agg_select_timer, timeout); }/**
@@ -2250,6 +2250,28 @@ void bond_3ad_update_ad_actor_settings(s }/** +* bond_agg_timer_advance - advance agg_select_timer +* @bond: bonding structure +* +* Return true when agg_select_timer reaches 0. +*/ +static bool bond_agg_timer_advance (struct bonding *bond) +{ +int val, nval; + +while (1 ) { + val =atomic_read (&BOND_AD_INFO (bond).agg_select_timer); +if (!val) +return false; + nval = val -1 ; +if (atomic_cmpxchg (&BOND_AD_INFO (bond).agg_select_timer, + val, nval) == val) +break ; + } +return nval ==0 ; +} + +/** * bond_3ad_state_machine_handler - handle state machines timeout * @bond: bonding struct to work on *
@@ -2284,9 +2306,7 @@ void bond_3ad_state_machine_handler(struif (!bond_has_slaves (bond)) goto re_arm; -/* check if agg_select_timer timer after initialize is timed out */ -if (BOND_AD_INFO (bond).agg_select_timer && - !(--BOND_AD_INFO (bond).agg_select_timer)) { +if (bond_agg_timer_advance (bond)) { slave =bond_first_slave_rcu (bond); port = slave ? &(SLAVE_AD_INFO (slave)->port) :NULL ;
include/net/bond_3ad.h +1 -1
@@ -265,7 +265,7 @@ struct ad_system {struct ad_bond_info {struct ad_system system;/* 802.3ad system structure */ -u32 agg_select_timer;/* Timer to select aggregator after all adapter's hand shakes */ +atomic_t agg_select_timer;/* Timer to select aggregator after all adapter's hand shakes */ u16 aggregator_identifier; };
Re: [PATCH 4.19 29/58] bonding: fix data-races around agg_select_timer
Hi!
Quoted 2 lines
syzbot reported that two threads might write over
agg_select_timerat the same time. Makeagg_select_timeratomic to fix the races.
Ok, but:
drivers/net/bonding/bond_3ad.c static inline int __check_agg_selection_ · line 253
Quoted 9 lines
drivers/net/bonding/bond_3ad.c +1
-1@@ -249,7 +249,7 @@ static inline int __check_agg_selection_if (bond ==NULL )return 0 ; -return BOND_AD_INFO (bond).agg_select_timer ?1 :0 ; +return atomic_read (&BOND_AD_INFO (bond).agg_select_timer) ?1 :0 ; }
This could probably use !!.
Quoted 5 lines
drivers/net/bonding/bond_3ad.c +5
-0+static bool bond_agg_timer_advance (struct bonding *bond) +{ +int val, nval; + +while (1 ) {
drivers/net/bonding/bond_3ad.c void bond_3ad_update_ad_actor_settings(s · line 2272
Quoted 10 lines
drivers/net/bonding/bond_3ad.c +10
-0+ val =atomic_read (&BOND_AD_INFO (bond).agg_select_timer); +if (!val) +return false; + nval = val -1 ; +if (atomic_cmpxchg (&BOND_AD_INFO (bond).agg_select_timer, + val, nval) == val) +break ; + } +return nval ==0 ; +}
This should really be atomic_dec_if_positive, no?
Best regards,
Pavel
Signature · 1 line
http://www.livejournal.com/~pavelmachek
Re: [PATCH 4.19 29/58] bonding: fix data-races around agg_select_timer
Quoted 14 lines · Pavel Machek
Hi!
Quoted 2 lines
syzbot reported that two threads might write over
agg_select_timerat the same time. Makeagg_select_timeratomic to fix the races.Ok, but:
Quoted 6 lines
drivers/net/bonding/bond_3ad.c +0
-0@@ -249,7 +249,7 @@ static inline int __check_agg_selection_if (bond ==NULL )return 0 ;
Quoted 5 lines
drivers/net/bonding/bond_3ad.c static inline int __check_agg_selection_ · line 253
Quoted 3 lines
drivers/net/bonding/bond_3ad.c +1
-1-return BOND_AD_INFO (bond).agg_select_timer ?1 :0 ; +return atomic_read (&BOND_AD_INFO (bond).agg_select_timer) ?1 :0 ; }This could probably use !!.
Probably... I chose to not change code style in a bug fix.
Quoted 10 lines
Quoted 10 lines
drivers/net/bonding/bond_3ad.c +9
-0+static bool bond_agg_timer_advance (struct bonding *bond) +{ +int val, nval; + +while (1 ) { + val =atomic_read (&BOND_AD_INFO (bond).agg_select_timer); +if (!val) +return false; + nval = val -1 ;
Quoted 8 lines
drivers/net/bonding/bond_3ad.c void bond_3ad_update_ad_actor_settings(s · line 2272
Quoted 6 lines
drivers/net/bonding/bond_3ad.c +6
-0+if (atomic_cmpxchg (&BOND_AD_INFO (bond).agg_select_timer, + val, nval) == val) +break ; + } +return nval ==0 ; +}This should really be
atomic_dec_if_positive, no?
SGTM, please send a patch, thank you.
Greg Kroah-Hartman
maintainerPATCH 30/58 libsubcmd: Fix use-after-free for realloc(..., 0)
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 52a9dab6d892763b2a8334a568bd4e2c1a6fde66 upstream.
GCC 12 correctly reports a potential use-after-free condition in the xrealloc helper. Fix the warning by avoiding an implicit "free(ptr)" when size == 0:
In file included from help.c:12:
In function 'xrealloc',
inlined from 'add_cmdname' at help.c:24:2: subcmd-util.h:56:23: error: pointer may be used after 'realloc' [-Werror=use-after-free]
56 | ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~
subcmd-util.h:52:21: note: call to 'realloc' here
52 | void *ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~
subcmd-util.h:58:31: error: pointer may be used after 'realloc' [-Werror=use-after-free]
58 | ret = realloc(ptr, 1);
| ^~~~~~~~~~~~~~~
subcmd-util.h:52:21: note: call to 'realloc' here
52 | void *ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~--- tools/lib/subcmd/subcmd-util.h | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-)
tools/lib/subcmd/subcmd-util.h +2 -9
@@ -50,15 +50,8 @@ static NORETURN inline void die(const chstatic inline void *xrealloc (void *ptr,size_t size) {void *ret =realloc (ptr, size); -if (!ret && !size) - ret =realloc (ptr,1 ); -if (!ret) { - ret =realloc (ptr, size); -if (!ret && !size) - ret =realloc (ptr,1 ); -if (!ret) -die ("Out of memory, realloc failed" ); - } +if (!ret) +die ("Out of memory, realloc failed" );return ret; }
Greg Kroah-Hartman
maintainerPATCH 31/58 ALSA: hda: Fix regression on forced probe mask option
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 6317f7449348a897483a2b4841f7a9190745c81b upstream.
The forced probe mask via probe_mask 0x100 bit doesn't work any longer as expected since the bus init code was moved and it's clearing the codec_mask value that was set beforehand. This patch fixes the long-time regression by moving the check_probe_mask() call.
--- sound/pci/hda/hda_intel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/hda/hda_intel.c +2 -2
@@ -1859,8 +1859,6 @@ static int azx_create(struct snd_card *cassign_position_fix (chip,check_position_fix (chip, position_fix[dev])); -check_probe_mask (chip, dev); -if (single_cmd <0 )/* allow fallback to single_cmd at errors */ chip->fallback_to_single_cmd =1 ;else /* explicitly set to single_cmd or not */
@@ -1889,6 +1887,8 @@ static int azx_create(struct snd_card *c chip->bus.needs_damn_long_delay =1 ; } +check_probe_mask (chip, dev); + err =snd_device_new (card,SNDRV_DEV_LOWLEVEL , chip, &ops);if (err <0 ) {dev_err (card->dev,"Error creating device [card]!\n" );
Greg Kroah-Hartman
maintainerPATCH 32/58 ALSA: hda: Fix missing codec probe on Shenker Dock 15
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit dd8e5b161d7fb9cefa1f1d6e35a39b9e1563c8d3 upstream.
By some unknown reason, BIOS on Shenker Dock 15 doesn't set up the codec mask properly for the onboard audio. Let's set the forced codec mask to enable the codec discovery.
--- sound/pci/hda/hda_intel.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/hda_intel.c +1 -0
@@ -1674,6 +1674,7 @@ static struct snd_pci_quirk probe_mask_l/* forced codec slots */ SND_PCI_QUIRK (0x1043 ,0x1262 ,"ASUS W5Fm" ,0x103 ),SND_PCI_QUIRK (0x1046 ,0x1262 ,"ASUS W5F" ,0x103 ), +SND_PCI_QUIRK (0x1558 ,0x0351 ,"Schenker Dock 15" ,0x105 ),/* WinFast VP200 H (Teradici) user reported broken communication */ SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), {}
Greg Kroah-Hartman
maintainerPATCH 33/58 ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw()
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 564778d7b1ea465f9487eedeece7527a033549c5 upstream.
When writing out a stereo control we discard the change notification from the first channel, meaning that events are only generated based on changes to the second channel. Ensure that we report a change if either channel has changed.
--- sound/soc/soc-ops.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
sound/soc/soc-ops.c +10 -4
@@ -314,7 +314,7 @@ int snd_soc_put_volsw(struct snd_kcontrounsigned int sign_bit = mc->sign_bit;unsigned int mask = (1 <<fls (max)) -1 ;unsigned int invert = mc->invert; -int err; +int err, ret;bool type_2r = false;unsigned int val2 =0 ;unsigned int val, val_mask;
@@ -356,12 +356,18 @@ int snd_soc_put_volsw(struct snd_kcontro err =snd_soc_component_update_bits (component, reg, val_mask, val);if (err <0 )return err; + ret = err; -if (type_2r) +if (type_2r) { err =snd_soc_component_update_bits (component, reg2, val_mask, - val2); + val2); +/* Don't discard any error code or drop change flag */ +if (ret ==0 || err <0 ) { + ret = err; + } + } -return err; +return ret; }EXPORT_SYMBOL_GPL (snd_soc_put_volsw);
Greg Kroah-Hartman
maintainerPATCH 34/58 ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_range()
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 650204ded3703b5817bd4b6a77fa47d333c4f902 upstream.
When writing out a stereo control we discard the change notification from the first channel, meaning that events are only generated based on changes to the second channel. Ensure that we report a change if either channel has changed.
--- sound/soc/soc-ops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
sound/soc/soc-ops.c +10 -5
@@ -523,7 +523,7 @@ int snd_soc_put_volsw_range(struct snd_kunsigned int mask = (1 <<fls (max)) -1 ;unsigned int invert = mc->invert;unsigned int val, val_mask; -int ret; +int err, ret;if (invert) val = (max - ucontrol->value.integer.value[0 ]) & mask;
@@ -532,9 +532,10 @@ int snd_soc_put_volsw_range(struct snd_k val_mask = mask << shift; val = val << shift; - ret =snd_soc_component_update_bits (component, reg, val_mask, val); -if (ret <0 ) -return ret; + err =snd_soc_component_update_bits (component, reg, val_mask, val); +if (err <0 ) +return err; + ret = err;if (snd_soc_volsw_is_stereo (mc)) {if (invert)
@@ -544,8 +545,12 @@ int snd_soc_put_volsw_range(struct snd_k val_mask = mask << shift; val = val << shift; - ret =snd_soc_component_update_bits (component, rreg, val_mask, + err =snd_soc_component_update_bits (component, rreg, val_mask, val); +/* Don't discard any error code or drop change flag */ +if (ret ==0 || err <0 ) { + ret = err; + } }return ret;
Greg Kroah-Hartman
maintainerPATCH 35/58 powerpc/lib/sstep: fix ptesync build error
In reply to Greg Kroah-HartmanFrom: Anders Roxell <[email protected]>
commit fe663df7825811358531dc2e8a52d9eaa5e3515e upstream.
Building tinyconfig with gcc (Debian 11.2.0-16) and assembler (Debian 2.37.90.20220207) the following build error shows up:
{standard input}: Assembler messages:
{standard input}:2088: Error: unrecognized opcode: `ptesync'
make[3]: *** [/builds/linux/scripts/Makefile.build:287: arch/powerpc/lib/sstep.o] Error 1
Add the 'ifdef CONFIG_PPC64' around the 'ptesync' in function 'emulate_update_regs()' to like it is in 'analyse_instr()'. Since it looks like it got dropped inadvertently by commit 3cdfcbfd32b9 ("powerpc: Change analyse_instr so it doesn't modify *regs").
A key detail is that analyse_instr() will never recognise lwsync or ptesync on 32-bit (because of the existing ifdef), and as a result emulate_update_regs() should never be called with an op specifying either of those on 32-bit. So removing them from emulate_update_regs() should be a nop in terms of runtime behaviour.
--- arch/powerpc/lib/sstep.c | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/lib/sstep.c +2 -0
@@ -2681,12 +2681,14 @@ void emulate_update_regs(struct pt_regscase BARRIER_EIEIO :eieio ();break ; +#ifdef CONFIG_PPC64 case BARRIER_LWSYNC : asmvolatile ("lwsync" : : :"memory" );break ;case BARRIER_PTESYNC : asmvolatile ("ptesync" : : :"memory" );break ; +#endif }break ;
Greg Kroah-Hartman
maintainerPATCH 36/58 ext4: check for out-of-order index extents in ext4_valid_extent_entries()
In reply to Greg Kroah-HartmanFrom: Zhang Yi <[email protected]>
commit 8dd27fecede55e8a4e67eef2878040ecad0f0d33 upstream.
After commit 5946d089379a ("ext4: check for overlapping extents in ext4_valid_extent_entries()"), we can check out the overlapping extent entry in leaf extent blocks. But the out-of-order extent entry in index extent blocks could also trigger bad things if the filesystem is inconsistent. So this patch add a check to figure out the out-of-order index extents and return error.
--- fs/ext4/extents.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
fs/ext4/extents.c +14 -7
@@ -390,9 +390,12 @@ static int ext4_valid_extent_idx(structstatic int ext4_valid_extent_entries (struct inode *inode,struct ext4_extent_header *eh, -int depth) +ext4_fsblk_t *pblk,int depth) {unsigned short entries; +ext4_lblk_t lblock =0 ; +ext4_lblk_t prev =0 ; +if (eh->eh_entries ==0 )return 1 ;
@@ -403,32 +406,36 @@ static int ext4_valid_extent_entries(strstruct ext4_extent *ext =EXT_FIRST_EXTENT (eh);struct ext4_super_block *es =EXT4_SB (inode->i_sb)->s_es;ext4_fsblk_t pblock =0 ; -ext4_lblk_t lblock =0 ; -ext4_lblk_t prev =0 ; -int len =0 ;while (entries) {if (!ext4_valid_extent (inode, ext))return 0 ;/* Check for overlapping extents */ lblock =le32_to_cpu (ext->ee_block); - len =ext4_ext_get_actual_len (ext);if ((lblock <= prev) && prev) { pblock =ext4_ext_pblock (ext); es->s_last_error_block =cpu_to_le64 (pblock);return 0 ; } + prev = lblock +ext4_ext_get_actual_len (ext) -1 ; ext++; entries--; - prev = lblock + len -1 ; } }else {struct ext4_extent_idx *ext_idx =EXT_FIRST_INDEX (eh);while (entries) {if (!ext4_valid_extent_idx (inode, ext_idx))return 0 ; + +/* Check for overlapping index extents */ + lblock =le32_to_cpu (ext_idx->ei_block); +if ((lblock <= prev) && prev) { + *pblk =ext4_idx_pblock (ext_idx); +return 0 ; + } ext_idx++; entries--; + prev = lblock; } }return 1 ;
@@ -462,7 +469,7 @@ static int __ext4_ext_check(const char * error_msg ="invalid eh_entries" ; goto corrupted; } -if (!ext4_valid_extent_entries (inode, eh, depth)) { +if (!ext4_valid_extent_entries (inode, eh, &pblk, depth)) { error_msg ="invalid extent entries" ; goto corrupted; }
Greg Kroah-Hartman
maintainerPATCH 37/58 block/wbt: fix negative inflight counter when remove scsi device
In reply to Greg Kroah-HartmanFrom: Laibin Qiu <[email protected]>
commit e92bc4cd34de2ce454bdea8cd198b8067ee4e123 upstream.
Now that we disable wbt by set WBT_STATE_OFF_DEFAULT in wbt_disable_default() when switch elevator to bfq. And when we remove scsi device, wbt will be enabled by wbt_enable_default. If it become false positive between wbt_wait() and wbt_track() when submit write request.
The following is the scenario that triggered the problem.
T1 T2 T3
elevator_switch_mq bfq_init_queue wbt_disable_default <= Set rwb->enable_state (OFF)Submit_bioblk_mq_make_requestrq_qos_throttle
<= rwb->enable_state (OFF)
scsi_remove_device
sd_remove
del_gendisk
blk_unregister_queue
elv_unregister_queue
wbt_enable_default
<= Set rwb->enable_state (ON)q_qos_track
<= rwb->enable_state (ON)
^^^^^^ this request will mark WBT_TRACKED without inflight add and will lead to drop rqw->inflight to -1 in wbt_done() which will trigger IO hung.
Fix this by move wbt_enable_default() from elv_unregister to bfq_exit_queue(). Only re-enable wbt when bfq exit.
Remove oneline stale comment, and kill one oneshot local variable.
--- block/bfq-iosched.c | 2 ++ block/elevator.c | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-)
block/bfq-iosched.c +2 -0
@@ -5417,6 +5417,8 @@ static void bfq_exit_queue(struct elevatspin_unlock_irq (&bfqd->lock);#endif +wbt_enable_default (bfqd->queue); +kfree (bfqd); }
block/elevator.c +0 -2
@@ -877,8 +877,6 @@ void elv_unregister_queue(struct requestkobject_del (&e->kobj); e->registered =0 ; -/* Re-enable throttling in case elevator disabled it */ -wbt_enable_default (q); } }
Greg Kroah-Hartman
maintainerPATCH 38/58 NFS: LOOKUP_DIRECTORY is also ok with symlinks
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit e0caaf75d443e02e55e146fd75fe2efc8aed5540 upstream.
Commit ac795161c936 (NFSv4: Handle case where the lookup of a directory fails) [1], part of Linux since 5.17-rc2, introduced a regression, where a symbolic link on an NFS mount to a directory on another NFS does not resolve(?) the first time it is accessed:
--- fs/nfs/dir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfs/dir.c +2 -2
@@ -1629,14 +1629,14 @@ no_open:if (!res) { inode =d_inode (dentry);if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && - !S_ISDIR (inode->i_mode)) + !(S_ISDIR (inode->i_mode) ||S_ISLNK (inode->i_mode))) res =ERR_PTR (-ENOTDIR );else if (inode &&S_ISREG (inode->i_mode)) res =ERR_PTR (-EOPENSTALE ); }else if (!IS_ERR (res)) { inode =d_inode (res);if ((lookup_flags &LOOKUP_DIRECTORY ) && inode && - !S_ISDIR (inode->i_mode)) { + !(S_ISDIR (inode->i_mode) ||S_ISLNK (inode->i_mode))) {dput (res); res =ERR_PTR (-ENOTDIR ); }else if (inode &&S_ISREG (inode->i_mode)) {
Greg Kroah-Hartman
maintainerPATCH 39/58 NFS: Do not report writeback errors in nfs_getattr()
In reply to Greg Kroah-HartmanFrom: Trond Myklebust <[email protected]>
commit d19e0183a88306acda07f4a01fedeeffe2a2a06b upstream.
The result of the writeback, whether it is an ENOSPC or an EIO, or anything else, does not inhibit the NFS client from reporting the correct file timestamps.
--- fs/nfs/inode.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
fs/nfs/inode.c +3 -6
@@ -787,12 +787,9 @@ int nfs_getattr(const struct path *path, goto out_no_update;/* Flush out writes to the server in order to update c/mtime. */ -if ((request_mask & (STATX_CTIME |STATX_MTIME )) && -S_ISREG (inode->i_mode)) { - err =filemap_write_and_wait (inode->i_mapping); -if (err) - goto out; - } +if ((request_mask & (STATX_CTIME |STATX_MTIME )) && +S_ISREG (inode->i_mode)) +filemap_write_and_wait (inode->i_mapping);/* * We may force a getattr if the user cares about atime.
Greg Kroah-Hartman
maintainerPATCH 40/58 mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe()
In reply to Greg Kroah-HartmanFrom: Bryan O'Donoghue <[email protected]>
commit 5c23b3f965bc9ee696bf2ed4bdc54d339dd9a455 upstream.
Interacting with a NAND chip on an IPQ6018 I found that the qcomsmem NAND partition parser was returning -EPROBE_DEFER waiting for the main smem driver to load.
This caused the board to reset. Playing about with the probe() function shows that the problem lies in the core clock being switched off before the nandc_unalloc() routine has completed.
If we look at how qcom_nandc_remove() tears down allocated resources we see the expected order is
qcom_nandc_unalloc(nandc);
clk_disable_unprepare(nandc->aon_clk);clk_disable_unprepare(nandc->core_clk);
dma_unmap_resource(&pdev->dev, nandc->base_dma, resource_size(res),
DMA_BIDIRECTIONAL, 0);
Tweaking probe() to both bring up and tear-down in that order removes the reset if we end up deferring elsewhere.
--- drivers/mtd/nand/raw/qcom_nandc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
drivers/mtd/nand/raw/qcom_nandc.c +6 -8
@@ -10,7 +10,6 @@* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ -#include <linux/clk.h> #include <linux/slab.h> #include <linux/bitops.h>
@@ -2959,10 +2958,6 @@ static int qcom_nandc_probe(struct platfif (!nandc->base_dma)return -ENXIO ; - ret =qcom_nandc_alloc (nandc); -if (ret) - goto err_nandc_alloc; - ret =clk_prepare_enable (nandc->core_clk);if (ret) goto err_core_clk;
@@ -2971,6 +2966,10 @@ static int qcom_nandc_probe(struct platfif (ret) goto err_aon_clk; + ret =qcom_nandc_alloc (nandc); +if (ret) + goto err_nandc_alloc; + ret =qcom_nandc_setup (nandc);if (ret) goto err_setup;
@@ -2982,15 +2981,14 @@ static int qcom_nandc_probe(struct platfreturn 0 ; err_setup: +qcom_nandc_unalloc (nandc); +err_nandc_alloc:clk_disable_unprepare (nandc->aon_clk); err_aon_clk:clk_disable_unprepare (nandc->core_clk); err_core_clk: -qcom_nandc_unalloc (nandc); -err_nandc_alloc:dma_unmap_resource (dev, res->start,resource_size (res),DMA_BIDIRECTIONAL ,0 ); -return ret; }
Greg Kroah-Hartman
maintainerPATCH 41/58 EDAC: Fix calculation of returned address and next offset in edac_align_ptr()
In reply to Greg Kroah-HartmanFrom: Eliav Farber <[email protected]>
commit f8efca92ae509c25e0a4bd5d0a86decea4f0c41e upstream.
Do alignment logic properly and use the "ptr" local variable for calculating the remainder of the alignment.
This became an issue because struct edac_mc_layer has a size that is not zero modulo eight, and the next offset that was prepared for the private data was unaligned, causing an alignment exception.
The patch in Fixes: which broke this actually wanted to "what we actually care about is the alignment of the actual pointer that's about to be returned." But it didn't check that alignment.
Use the correct variable "ptr" for that.
[ bp: Massage commit message. ]
--- drivers/edac/edac_mc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/edac/edac_mc.c +1 -1
@@ -265,7 +265,7 @@ void *edac_align_ptr(void **p, unsignedelse return (char *)ptr; - r = (unsigned long )p % align; + r = (unsigned long )ptr % align;if (r ==0 )return (char *)ptr;
Greg Kroah-Hartman
maintainerPATCH 42/58 net: sched: limit TC_ACT_REPEAT loops
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 5740d068909676d4bdb5c9c00c37a83df7728909 upstream.
We have been living dangerously, at the mercy of malicious users, abusing TC_ACT_REPEAT, as shown by this syzpot report [1].
Add an arbitrary limit (32) to the number of times an action can return TC_ACT_REPEAT.
v2: switch the limit to 32 instead of 10.
Use net_warn_ratelimited() instead of pr_err_once().
[1] (C repro available on demand)
rcu: INFO: rcu_preempt self-detected stall on CPU
rcu: 1-...!: (10500 ticks this GP) idle=021/1/0x4000000000000000 softirq=5592/5592 fqs=0
(t=10502 jiffies g=5305 q=190)
rcu: rcu_preempt kthread timer wakeup didn't happen for 10502 jiffies! g5305 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x402
rcu: Possible timer handling issue on cpu=0 timer-softirq=3527
rcu: rcu_preempt kthread starved for 10505 jiffies! g5305 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x402 ->cpu=0
rcu: Unless rcu_preempt kthread gets sufficient CPU time, OOM is now expected behavior.
rcu: RCU grace-period kthread stack dump:
task:rcu_preempt state:I stack:29344 pid: 14 ppid: 2 flags:0x00004000
Call Trace:
<TASK>
context_switch kernel/sched/core.c:4986 [inline]
__schedule+0xab2/0x4db0 kernel/sched/core.c:6295
schedule+0xd2/0x260 kernel/sched/core.c:6368
schedule_timeout+0x14a/0x2a0 kernel/time/timer.c:1881
rcu_gp_fqs_loop+0x186/0x810 kernel/rcu/tree.c:1963
rcu_gp_kthread+0x1de/0x320 kernel/rcu/tree.c:2136
kthread+0x2e9/0x3a0 kernel/kthread.c:377
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
</TASK>
rcu: Stack dump where RCU GP kthread last ran:
Sending NMI from CPU 1 to CPUs 0:
NMI backtrace for cpu 0
CPU: 0 PID: 3646 Comm: syz-executor358 Not tainted 5.17.0-rc3-syzkaller-00149-gbf8e59fd315f #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
RIP: 0010:rep_nop arch/x86/include/asm/vdso/processor.h:13 [inline]
RIP: 0010:cpu_relax arch/x86/include/asm/vdso/processor.h:18 [inline]
RIP: 0010:pv_wait_head_or_lock kernel/locking/qspinlock_paravirt.h:437 [inline]
RIP: 0010:__pv_queued_spin_lock_slowpath+0x3b8/0xb40 kernel/locking/qspinlock.c:508
Code: 48 89 eb c6 45 01 01 41 bc 00 80 00 00 48 c1 e9 03 83 e3 07 41 be 01 00 00 00 48 b8 00 00 00 00 00 fc ff df 4c 8d 2c 01 eb 0c <f3> 90 41 83 ec 01 0f 84 72 04 00 00 41 0f b6 45 00 38 d8 7f 08 84
RSP: 0018:ffffc9000283f1b0 EFLAGS: 00000206
RAX: 0000000000000003 RBX: 0000000000000000 RCX: 1ffff1100fc0071e
RDX: 0000000000000001 RSI: 0000000000000201 RDI: 0000000000000000
RBP: ffff88807e0038f0 R08: 0000000000000001 R09: ffffffff8ffbf9ff
R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000004c1e
R13: ffffed100fc0071e R14: 0000000000000001 R15: ffff8880b9c3aa80
FS: 00005555562bf300(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007ffdbfef12b8 CR3: 00000000723c2000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<TASK>
pv_queued_spin_lock_slowpath arch/x86/include/asm/paravirt.h:591 [inline]
queued_spin_lock_slowpath arch/x86/include/asm/qspinlock.h:51 [inline]
queued_spin_lock include/asm-generic/qspinlock.h:85 [inline]
do_raw_spin_lock+0x200/0x2b0 kernel/locking/spinlock_debug.c:115
spin_lock_bh include/linux/spinlock.h:354 [inline]
sch_tree_lock include/net/sch_generic.h:610 [inline]
sch_tree_lock include/net/sch_generic.h:605 [inline]
prio_tune+0x3b9/0xb50 net/sched/sch_prio.c:211
prio_init+0x5c/0x80 net/sched/sch_prio.c:244
qdisc_create.constprop.0+0x44a/0x10f0 net/sched/sch_api.c:1253
tc_modify_qdisc+0x4c5/0x1980 net/sched/sch_api.c:1660
rtnetlink_rcv_msg+0x413/0xb80 net/core/rtnetlink.c:5594
netlink_rcv_skb+0x153/0x420 net/netlink/af_netlink.c:2494
netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
netlink_unicast+0x539/0x7e0 net/netlink/af_netlink.c:1343
netlink_sendmsg+0x904/0xe00 net/netlink/af_netlink.c:1919
sock_sendmsg_nosec net/socket.c:705 [inline]
sock_sendmsg+0xcf/0x120 net/socket.c:725
____sys_sendmsg+0x6e8/0x810 net/socket.c:2413
___sys_sendmsg+0xf3/0x170 net/socket.c:2467
__sys_sendmsg+0xe5/0x1b0 net/socket.c:2496
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x44/0xae
RIP: 0033:0x7f7ee98aae99
Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 41 15 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffdbfef12d8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
RAX: ffffffffffffffda RBX: 00007ffdbfef1300 RCX: 00007f7ee98aae99
RDX: 0000000000000000 RSI: 0000000020000000 RDI: 0000000000000003
RBP: 0000000000000000 R08: 000000000000000d R09: 000000000000000d
R10: 000000000000000d R11: 0000000000000246 R12: 00007ffdbfef12f0
R13: 00000000000f4240 R14: 000000000004ca47 R15: 00007ffdbfef12e4
</TASK>
INFO: NMI handler (nmi_cpu_backtrace_handler) took too long to run: 2.293 msecs
NMI backtrace for cpu 1
CPU: 1 PID: 3260 Comm: kworker/1:3 Not tainted 5.17.0-rc3-syzkaller-00149-gbf8e59fd315f #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Workqueue: mld mld_ifc_work
Call Trace:
<IRQ>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
nmi_cpu_backtrace.cold+0x47/0x144 lib/nmi_backtrace.c:111
nmi_trigger_cpumask_backtrace+0x1b3/0x230 lib/nmi_backtrace.c:62
trigger_single_cpu_backtrace include/linux/nmi.h:164 [inline]
rcu_dump_cpu_stacks+0x25e/0x3f0 kernel/rcu/tree_stall.h:343
print_cpu_stall kernel/rcu/tree_stall.h:604 [inline]
check_cpu_stall kernel/rcu/tree_stall.h:688 [inline]
rcu_pending kernel/rcu/tree.c:3919 [inline]
rcu_sched_clock_irq.cold+0x5c/0x759 kernel/rcu/tree.c:2617
update_process_times+0x16d/0x200 kernel/time/timer.c:1785
tick_sched_handle+0x9b/0x180 kernel/time/tick-sched.c:226
tick_sched_timer+0x1b0/0x2d0 kernel/time/tick-sched.c:1428
__run_hrtimer kernel/time/hrtimer.c:1685 [inline]
__hrtimer_run_queues+0x1c0/0xe50 kernel/time/hrtimer.c:1749
hrtimer_interrupt+0x31c/0x790 kernel/time/hrtimer.c:1811
local_apic_timer_interrupt arch/x86/kernel/apic/apic.c:1086 [inline]
__sysvec_apic_timer_interrupt+0x146/0x530 arch/x86/kernel/apic/apic.c:1103
sysvec_apic_timer_interrupt+0x8e/0xc0 arch/x86/kernel/apic/apic.c:1097
</IRQ>
<TASK>
asm_sysvec_apic_timer_interrupt+0x12/0x20 arch/x86/include/asm/idtentry.h:638
RIP: 0010:__sanitizer_cov_trace_const_cmp4+0xc/0x70 kernel/kcov.c:286
Code: 00 00 00 48 89 7c 30 e8 48 89 4c 30 f0 4c 89 54 d8 20 48 89 10 5b c3 0f 1f 80 00 00 00 00 41 89 f8 bf 03 00 00 00 4c 8b 14 24 <89> f1 65 48 8b 34 25 00 70 02 00 e8 14 f9 ff ff 84 c0 74 4b 48 8b
RSP: 0018:ffffc90002c5eea8 EFLAGS: 00000246
RAX: 0000000000000007 RBX: ffff88801c625800 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003
RBP: ffff8880137d3100 R08: 0000000000000000 R09: 0000000000000000
R10: ffffffff874fcd88 R11: 0000000000000000 R12: ffff88801d692dc0
R13: ffff8880137d3104 R14: 0000000000000000 R15: ffff88801d692de8
tcf_police_act+0x358/0x11d0 net/sched/act_police.c:256
tcf_action_exec net/sched/act_api.c:1049 [inline]
tcf_action_exec+0x1a6/0x530 net/sched/act_api.c:1026
tcf_exts_exec include/net/pkt_cls.h:326 [inline]
route4_classify+0xef0/0x1400 net/sched/cls_route.c:179
__tcf_classify net/sched/cls_api.c:1549 [inline]
tcf_classify+0x3e8/0x9d0 net/sched/cls_api.c:1615
prio_classify net/sched/sch_prio.c:42 [inline]
prio_enqueue+0x3a7/0x790 net/sched/sch_prio.c:75
dev_qdisc_enqueue+0x40/0x300 net/core/dev.c:3668
__dev_xmit_skb net/core/dev.c:3756 [inline]
__dev_queue_xmit+0x1f61/0x3660 net/core/dev.c:4081
neigh_hh_output include/net/neighbour.h:533 [inline]
neigh_output include/net/neighbour.h:547 [inline]
ip_finish_output2+0x14dc/0x2170 net/ipv4/ip_output.c:228
__ip_finish_output net/ipv4/ip_output.c:306 [inline]
__ip_finish_output+0x396/0x650 net/ipv4/ip_output.c:288
ip_finish_output+0x32/0x200 net/ipv4/ip_output.c:316
NF_HOOK_COND include/linux/netfilter.h:296 [inline]
ip_output+0x196/0x310 net/ipv4/ip_output.c:430
dst_output include/net/dst.h:451 [inline]
ip_local_out+0xaf/0x1a0 net/ipv4/ip_output.c:126
iptunnel_xmit+0x628/0xa50 net/ipv4/ip_tunnel_core.c:82
geneve_xmit_skb drivers/net/geneve.c:966 [inline]
geneve_xmit+0x10c8/0x3530 drivers/net/geneve.c:1077
__netdev_start_xmit include/linux/netdevice.h:4683 [inline]
netdev_start_xmit include/linux/netdevice.h:4697 [inline]
xmit_one net/core/dev.c:3473 [inline]
dev_hard_start_xmit+0x1eb/0x920 net/core/dev.c:3489
__dev_queue_xmit+0x2985/0x3660 net/core/dev.c:4116
neigh_hh_output include/net/neighbour.h:533 [inline]
neigh_output include/net/neighbour.h:547 [inline]
ip6_finish_output2+0xf7a/0x14f0 net/ipv6/ip6_output.c:126
__ip6_finish_output net/ipv6/ip6_output.c:191 [inline]
__ip6_finish_output+0x61e/0xe90 net/ipv6/ip6_output.c:170
ip6_finish_output+0x32/0x200 net/ipv6/ip6_output.c:201
NF_HOOK_COND include/linux/netfilter.h:296 [inline]
ip6_output+0x1e4/0x530 net/ipv6/ip6_output.c:224
dst_output include/net/dst.h:451 [inline]
NF_HOOK include/linux/netfilter.h:307 [inline]
NF_HOOK include/linux/netfilter.h:301 [inline]
mld_sendpack+0x9a3/0xe40 net/ipv6/mcast.c:1826
mld_send_cr net/ipv6/mcast.c:2127 [inline]
mld_ifc_work+0x71c/0xdc0 net/ipv6/mcast.c:2659
process_one_work+0x9ac/0x1650 kernel/workqueue.c:2307
worker_thread+0x657/0x1110 kernel/workqueue.c:2454
kthread+0x2e9/0x3a0 kernel/kthread.c:377
ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:295
</TASK>
----------------
Code disassembly (best guess):
0: 48 89 eb mov %rbp,%rbx
3: c6 45 01 01 movb $0x1,0x1(%rbp)
7: 41 bc 00 80 00 00 mov $0x8000,%r12d
d: 48 c1 e9 03 shr $0x3,%rcx
11: 83 e3 07 and $0x7,%ebx
14: 41 be 01 00 00 00 mov $0x1,%r14d
1a: 48 b8 00 00 00 00 00 movabs $0xdffffc0000000000,%rax
21: fc ff df
24: 4c 8d 2c 01 lea (%rcx,%rax,1),%r13
28: eb 0c jmp 0x36
* 2a: f3 90 pause <-- trapping instruction
2c: 41 83 ec 01 sub $0x1,%r12d
30: 0f 84 72 04 00 00 je 0x4a8
36: 41 0f b6 45 00 movzbl 0x0(%r13),%eax
3b: 38 d8 cmp %bl,%al
3d: 7f 08 jg 0x47
3f: 84 .byte 0x84--- net/sched/act_api.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
net/sched/act_api.c +11 -2
@@ -609,15 +609,24 @@ int tcf_action_exec(struct sk_buff *skb, restart_act_graph:for (i =0 ; i < nr_actions; i++) {const struct tc_action *a = actions[i]; +int repeat_ttl;if (jmp_prgcnt >0 ) { jmp_prgcnt -=1 ;continue ; } + + repeat_ttl =32 ; repeat: ret = a->ops->act (skb, a, res); -if (ret ==TC_ACT_REPEAT ) - goto repeat;/* we need a ttl - JHS */ + +if (unlikely (ret ==TC_ACT_REPEAT )) { +if (--repeat_ttl !=0 ) + goto repeat; +/* suspicious opcode, stop pipeline */ +net_warn_ratelimited ("TC_ACT_REPEAT abuse ?\n" ); +return TC_ACT_OK ; + }if (TC_ACT_EXT_CMP (ret,TC_ACT_JUMP )) { jmp_prgcnt = ret &TCA_ACT_MAX_PRIO_MASK ;
Greg Kroah-Hartman
maintainerPATCH 43/58 dmaengine: sh: rcar-dmac: Check for error num after setting mask
In reply to Greg Kroah-HartmanFrom: Jiasheng Jiang <[email protected]>
commit 2d21543efe332cd8c8f212fb7d365bc8b0690bfa upstream.
Because of the possible failure of the dma_supported(), the dma_set_mask_and_coherent() may return error num. Therefore, it should be better to check it and return the error if fails.
--- drivers/dma/sh/rcar-dmac.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/dma/sh/rcar-dmac.c +3 -1
@@ -1817,7 +1817,9 @@ static int rcar_dmac_probe(struct platfoplatform_set_drvdata (pdev, dmac); dmac->dev->dma_parms = &dmac->parms;dma_set_max_seg_size (dmac->dev,RCAR_DMATCR_MASK ); -dma_set_mask_and_coherent (dmac->dev,DMA_BIT_MASK (40 )); + ret =dma_set_mask_and_coherent (dmac->dev,DMA_BIT_MASK (40 )); +if (ret) +return ret; ret =rcar_dmac_parse_of (&pdev->dev, dmac);if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 44/58 i2c: brcmstb: fix support for DSL and CM variants
In reply to Greg Kroah-HartmanFrom: Rafał Miłecki <[email protected]>
commit 834cea3a252ed4847db076a769ad9efe06afe2d5 upstream.
DSL and CM (Cable Modem) support 8 B max transfer size and have a custom DT binding for that reason. This driver was checking for a wrong "compatible" however which resulted in an incorrect setup.
--- drivers/i2c/busses/i2c-brcmstb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-brcmstb.c +1 -1
@@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct plat/* set the data in/out register size for compatible SoCs */ if (of_device_is_compatible (dev->device->of_node, -"brcmstb,brcmper-i2c" )) +"brcm,brcmper-i2c" )) dev->data_regsz =sizeof (u8);else dev->data_regsz =sizeof (u32);
Greg Kroah-Hartman
maintainerPATCH 45/58 mtd: rawnand: brcmnand: Refactored code to introduce helper functions
In reply to Greg Kroah-HartmanFrom: Kamal Dasu <[email protected]>
[ Upstream commit 3c7c1e4594efd57b98ae6f7298f40cff4f4fb47b ]
Refactored NAND ECC and CMD address configuration code to use helper functions.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 100 ++++++++++++++--------- 1 file changed, 62 insertions(+), 38 deletions(-)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +62 -38
@@ -589,6 +589,54 @@ static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,__raw_writel (val, ctrl->nand_fc + word *4 ); } +static void brcmnand_clear_ecc_addr (struct brcmnand_controller *ctrl) +{ + +/* Clear error addresses */ +brcmnand_write_reg (ctrl,BRCMNAND_UNCORR_ADDR ,0 ); +brcmnand_write_reg (ctrl,BRCMNAND_CORR_ADDR ,0 ); +brcmnand_write_reg (ctrl,BRCMNAND_UNCORR_EXT_ADDR ,0 ); +brcmnand_write_reg (ctrl,BRCMNAND_CORR_EXT_ADDR ,0 ); +} + +static u64 brcmnand_get_uncorrecc_addr (struct brcmnand_controller *ctrl) +{ +u64 err_addr; + + err_addr =brcmnand_read_reg (ctrl,BRCMNAND_UNCORR_ADDR ); + err_addr |= ((u64)(brcmnand_read_reg (ctrl, +BRCMNAND_UNCORR_EXT_ADDR ) + &0xffff ) <<32 ); + +return err_addr; +} + +static u64 brcmnand_get_correcc_addr (struct brcmnand_controller *ctrl) +{ +u64 err_addr; + + err_addr =brcmnand_read_reg (ctrl,BRCMNAND_CORR_ADDR ); + err_addr |= ((u64)(brcmnand_read_reg (ctrl, +BRCMNAND_CORR_EXT_ADDR ) + &0xffff ) <<32 ); + +return err_addr; +} + +static void brcmnand_set_cmd_addr (struct mtd_info *mtd,u64 addr) +{ +struct nand_chip *chip =mtd_to_nand (mtd); +struct brcmnand_host *host =nand_get_controller_data (chip); +struct brcmnand_controller *ctrl = host->ctrl; + +brcmnand_write_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS , + (host->cs <<16 ) | ((addr >>32 ) &0xffff )); + (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS ); +brcmnand_write_reg (ctrl,BRCMNAND_CMD_ADDRESS , +lower_32_bits (addr)); + (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ); +} +static inline u16 brcmnand_cs_offset (struct brcmnand_controller *ctrl,int cs,enum brcmnand_cs_reg reg) {
@@ -1217,9 +1265,12 @@ static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) {struct brcmnand_controller *ctrl = host->ctrl;int ret; +u64 cmd_addr; + + cmd_addr =brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ); + +dev_dbg (ctrl->dev,"send native cmd %d addr 0x%llx\n" , cmd, cmd_addr); -dev_dbg (ctrl->dev,"send native cmd %d addr_lo 0x%x\n" , cmd, -brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ));BUG_ON (ctrl->cmd_pending !=0 ); ctrl->cmd_pending = cmd;
@@ -1380,12 +1431,7 @@ static void brcmnand_cmdfunc(struct mtd_info *mtd, unsigned command,if (!native_cmd)return ; -brcmnand_write_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS , - (host->cs <<16 ) | ((addr >>32 ) &0xffff )); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS ); -brcmnand_write_reg (ctrl,BRCMNAND_CMD_ADDRESS ,lower_32_bits (addr)); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ); - +brcmnand_set_cmd_addr (mtd, addr);brcmnand_send_cmd (host, native_cmd);brcmnand_waitfunc (mtd, chip);
@@ -1605,20 +1651,10 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip,struct brcmnand_controller *ctrl = host->ctrl;int i, j, ret =0 ; -/* Clear error addresses */ -brcmnand_write_reg (ctrl,BRCMNAND_UNCORR_ADDR ,0 ); -brcmnand_write_reg (ctrl,BRCMNAND_CORR_ADDR ,0 ); -brcmnand_write_reg (ctrl,BRCMNAND_UNCORR_EXT_ADDR ,0 ); -brcmnand_write_reg (ctrl,BRCMNAND_CORR_EXT_ADDR ,0 ); - -brcmnand_write_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS , - (host->cs <<16 ) | ((addr >>32 ) &0xffff )); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS ); +brcmnand_clear_ecc_addr (ctrl);for (i =0 ; i < trans; i++, addr +=FC_BYTES ) { -brcmnand_write_reg (ctrl,BRCMNAND_CMD_ADDRESS , -lower_32_bits (addr)); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ); +brcmnand_set_cmd_addr (mtd, addr);/* SPARE_AREA_READ does not use ECC, so just use PAGE_READ */ brcmnand_send_cmd (host,CMD_PAGE_READ );brcmnand_waitfunc (mtd, chip);
@@ -1638,21 +1674,15 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, host->hwcfg.sector_size_1k);if (!ret) { - *err_addr =brcmnand_read_reg (ctrl, -BRCMNAND_UNCORR_ADDR ) | - ((u64)(brcmnand_read_reg (ctrl, -BRCMNAND_UNCORR_EXT_ADDR ) - &0xffff ) <<32 ); + *err_addr =brcmnand_get_uncorrecc_addr (ctrl); +if (*err_addr) ret = -EBADMSG ; }if (!ret) { - *err_addr =brcmnand_read_reg (ctrl, -BRCMNAND_CORR_ADDR ) | - ((u64)(brcmnand_read_reg (ctrl, -BRCMNAND_CORR_EXT_ADDR ) - &0xffff ) <<32 ); + *err_addr =brcmnand_get_correcc_addr (ctrl); +if (*err_addr) ret = -EUCLEAN ; }
@@ -1722,7 +1752,7 @@ static int brcmnand_read(struct mtd_info *mtd, struct nand_chip *chip,dev_dbg (ctrl->dev,"read %llx -> %p\n" , (unsigned long long )addr, buf); try_dmaread: -brcmnand_write_reg (ctrl,BRCMNAND_UNCORR_COUNT ,0 ); +brcmnand_clear_ecc_addr (ctrl);if (has_flash_dma (ctrl) && !oob &&flash_dma_buf_ok (buf)) { err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES,
@@ -1866,15 +1896,9 @@ static int brcmnand_write(struct mtd_info *mtd, struct nand_chip *chip, goto out; } -brcmnand_write_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS , - (host->cs <<16 ) | ((addr >>32 ) &0xffff )); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_EXT_ADDRESS ); -for (i =0 ; i < trans; i++, addr +=FC_BYTES ) {/* full address MUST be set before populating FC */ -brcmnand_write_reg (ctrl,BRCMNAND_CMD_ADDRESS , -lower_32_bits (addr)); - (void )brcmnand_read_reg (ctrl,BRCMNAND_CMD_ADDRESS ); +brcmnand_set_cmd_addr (mtd, addr);if (buf) {brcmnand_soc_data_bus_prepare (ctrl->soc, false);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 46/58 mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status
In reply to Greg Kroah-HartmanFrom: david regan <[email protected]>
[ Upstream commit 36415a7964711822e63695ea67fede63979054d9 ]
The brcmnand driver contains a bug in which if a page (example 2k byte) is read from the parallel/ONFI NAND and within that page a subpage (512 byte) has correctable errors which is followed by a subpage with uncorrectable errors, the page read will return the wrong status of correctable (as opposed to the actual status of uncorrectable.)
The bug is in function brcmnand_read_by_pio where there is a check for uncorrectable bits which will be preempted if a previous status for correctable bits is detected.
The fix is to stop checking for bad bits only if we already have a bad bits status.
--- drivers/mtd/nand/raw/brcmnand/brcmnand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/raw/brcmnand/brcmnand.c +1 -1
@@ -1673,7 +1673,7 @@ static int brcmnand_read_by_pio(struct mtd_info *mtd, struct nand_chip *chip, mtd->oobsize / trans, host->hwcfg.sector_size_1k); -if (!ret) { +if (ret != -EBADMSG ) { *err_addr =brcmnand_get_uncorrecc_addr (ctrl);if (*err_addr)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 47/58 Drivers: hv: vmbus: Expose monitor data only when monitor pages are used
In reply to Greg Kroah-HartmanFrom: Kimberly Brown <[email protected]>
[ Upstream commit 46fc15487d02451448c11b83c4d086d87a6ad588 ]
There are two methods for signaling the host: the monitor page mechanism and hypercalls. The monitor page mechanism is used by performance critical channels (storage, networking, etc.) because it provides improved throughput. However, latency is increased. Monitor pages are allocated to these channels.
Monitor pages are not allocated to channels that do not use the monitor page mechanism. Therefore, these channels do not have a valid monitor id or valid monitor page data. In these cases, some of the "_show" functions return incorrect data. They return an invalid monitor id and data that is beyond the bounds of the hv_monitor_page array fields.
The "channel->offermsg.monitor_allocated" value can be used to determine whether monitor pages have been allocated to a channel.
Add "is_visible()" callback functions for the device-level and channel-level attribute groups. These functions will hide the monitor sysfs files when the monitor mechanism is not used.
Remove ".default_attributes" from "vmbus_chan_attrs" and create a channel-level attribute group. These changes allow the new "is_visible()" callback function to be applied to the channel-level attributes.
Call "sysfs_create_group()" in "vmbus_add_channel_kobj()" to create the channel's sysfs files. Add a new function, “vmbus_remove_channel_attr_group()”, and call it in "free_channel()" to remove the channel's sysfs files when the channel is closed.
--- Documentation/ABI/stable/sysfs-bus-vmbus | 12 +++- drivers/hv/channel_mgmt.c | 1 + drivers/hv/hyperv_vmbus.h | 2 + drivers/hv/vmbus_drv.c | 77 +++++++++++++++++++++++- 4 files changed, 87 insertions(+), 5 deletions(-)
Documentation/ABI/stable/sysfs-bus-vmbus +9 -3
@@ -81,7 +81,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/latency Date: September. 2017 KernelVersion: 4.14 Contact: Stephen Hemminger <[email protected]> -Description: Channel signaling latency +Description: Channel signaling latency. This file is available only for + performance critical channels (storage, network, etc.) that use + the monitor page mechanism. Users: Debugging tools What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/out_mask
@@ -95,7 +97,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/pending Date: September. 2017 KernelVersion: 4.14 Contact: Stephen Hemminger <[email protected]> -Description: Channel interrupt pending state +Description: Channel interrupt pending state. This file is available only for + performance critical channels (storage, network, etc.) that use + the monitor page mechanism. Users: Debugging tools What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/read_avail
@@ -137,7 +141,9 @@ What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/monitor_id Date: January. 2018 KernelVersion: 4.16 Contact: Stephen Hemminger <[email protected]> -Description: Monitor bit associated with channel +Description: Monitor bit associated with channel. This file is available only + for performance critical channels (storage, network, etc.) that + use the monitor page mechanism. Users: Debugging tools and userspace drivers What: /sys/bus/vmbus/devices/<UUID>/channels/<N>/ring
drivers/hv/channel_mgmt.c +1 -0
@@ -350,6 +350,7 @@ static struct vmbus_channel *alloc_channel(void)static void free_channel (struct vmbus_channel *channel) {tasklet_kill (&channel->callback_event); +vmbus_remove_channel_attr_group (channel);kobject_put (&channel->kobj); }
drivers/hv/hyperv_vmbus.h +2 -0
@@ -392,6 +392,8 @@ void vmbus_device_unregister(struct hv_device *device_obj);int vmbus_add_channel_kobj (struct hv_device *device_obj,struct vmbus_channel *channel); +void vmbus_remove_channel_attr_group (struct vmbus_channel *channel); +struct vmbus_channel *relid2channel (u32 relid);void vmbus_free_channels (void );
drivers/hv/vmbus_drv.c +75 -2
109 lines not on this page · raw message
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 48/58 Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit 8bc69f86328e87a0ffa79438430cc82f3aa6a194 ]
kobject_init_and_add() takes reference even when it fails. According to the doc of kobject_init_and_add():
If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object.
Fix memory leak by calling kobject_put().
--- drivers/hv/vmbus_drv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/hv/vmbus_drv.c +4 -1
@@ -1556,8 +1556,10 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel) kobj->kset = dev->channels_kset; ret =kobject_init_and_add (kobj, &vmbus_chan_ktype,NULL ,"%u" , relid); -if (ret) +if (ret) { +kobject_put (kobj);return ret; + } ret =sysfs_create_group (kobj, &vmbus_chan_group);
@@ -1566,6 +1568,7 @@ int vmbus_add_channel_kobj(struct hv_device *dev, struct vmbus_channel *channel)* The calling functions' error handling paths will cleanup the * empty channel directory. */ +kobject_put (kobj);dev_err (device,"Unable to set up channel sysfs files\n" );return ret; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 49/58 KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW
In reply to Greg Kroah-HartmanFrom: Jim Mattson <[email protected]>
[ Upstream commit 710c476514313c74045c41c0571bb5178fd16e3d ]
AMD's event select is 3 nybbles, with the high nybble in bits 35:32 of a PerfEvtSeln MSR. Don't mask off the high nybble when configuring a RAW perf event.
Message-Id: <[email protected]>
--- arch/x86/kvm/pmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/pmu.c +1 -1
@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) }if (type ==PERF_TYPE_RAW ) - config = eventsel &X86_RAW_EVENT_MASK ; + config = eventsel &AMD64_RAW_EVENT_MASK ; pmc_reprogram_counter(pmc, type, config, !(eventsel & ARCH_PERFMON_EVENTSEL_USR),
Signature · 1 line
2.34.1
Re: [PATCH 4.19 49/58] KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW
Hi!
Quoted 5 lines
[ Upstream commit
710c476514313c74045c41c0571bb5178fd16e3d]AMD's event select is 3 nybbles, with the high nybble in bits 35:32 of a PerfEvtSeln MSR. Don't mask off the high nybble when configuring a RAW perf event.
Ok, but this depends on b8bfee "KVM: x86/pmu: Don't truncate the PerfEvtSeln MSR when creating a perf event", and that is backported to 5.10 but not 4.19... so we don't need this, either, right...?
Best regards,
Pavel
Quoted 10 lines
+++
b/arch/x86/kvm/pmu.carch/x86/kvm/pmu.c +1
-1@@ -171,7 +171,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) }if (type ==PERF_TYPE_RAW ) - config = eventsel &X86_RAW_EVENT_MASK ; + config = eventsel &AMD64_RAW_EVENT_MASK ; pmc_reprogram_counter(pmc, type, config, !(eventsel & ARCH_PERFMON_EVENTSEL_USR),
Signature · 1 line
http://www.livejournal.com/~pavelmachek
Greg Kroah-Hartman
maintainerPATCH 50/58 ARM: OMAP2+: hwmod: Add of_node_put() before break
In reply to Greg Kroah-HartmanFrom: Wan Jiabing <[email protected]>
[ Upstream commit 80c469a0a03763f814715f3d12b6f3964c7423e8 ]
Fix following coccicheck warning:
./arch/arm/mach-omap2/omap_hwmod.c:753:1-23: WARNING: Function for_each_matching_node should have of_node_put() before break
Early exits from for_each_matching_node should decrement the node reference counter.
--- arch/arm/mach-omap2/omap_hwmod.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/mach-omap2/omap_hwmod.c +3 -1
@@ -754,8 +754,10 @@ static int __init _init_clkctrl_providers(void)for_each_matching_node (np, ti_clkctrl_match_table) { ret =_setup_clkctrl_provider (np); -if (ret) +if (ret) { +of_node_put (np);break ; + } }return ret;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 51/58 irqchip/sifive-plic: Add missing thead,c900-plic match string
In reply to Greg Kroah-HartmanFrom: Guo Ren <[email protected]>
[ Upstream commit 1d4df649cbb4b26d19bea38ecff4b65b10a1bbca ]
The thead,c900-plic has been used in opensbi to distinguish PLIC [1]. Although PLICs have the same behaviors in Linux, they are different hardware with some custom initializing in firmware(opensbi).
Qute opensbi patch commit-msg by Samuel:
The T-HEAD PLIC implementation requires setting a delegation bit to allow access from S-mode. Now that the T-HEAD PLIC has its own compatible string, set this bit automatically from the PLIC driver, instead of reaching into the PLIC's MMIO space from another driver.
[1]: https://github.com/riscv-software-src/opensbi/commit/78c2b19218bd62653b9fb31623a42ced45f38ea6
--- drivers/irqchip/irq-sifive-plic.c | 1 + 1 file changed, 1 insertion(+)
drivers/irqchip/irq-sifive-plic.c +1 -0
@@ -258,3 +258,4 @@ static int __init plic_init(struct device_node *node,IRQCHIP_DECLARE (sifive_plic,"sifive,plic-1.0.0" , plic_init);IRQCHIP_DECLARE (riscv_plic0,"riscv,plic0" , plic_init);/* for legacy systems */ +IRQCHIP_DECLARE (thead_c900_plic,"thead,c900-plic" , plic_init);/* for firmware driver */
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 52/58 netfilter: conntrack: dont refresh sctp entries in closed state
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
[ Upstream commit 77b337196a9d87f3d6bb9b07c0436ecafbffda1e ]
Vivek Thrivikraman reported:
An SCTP server application which is accessed continuously by client application.
When the session disconnects the client retries to establish a connection. After restart of SCTP server application the session is not established because of stale conntrack entry with connection state CLOSED as below.
(removing this entry manually established new connection):
sctp 9 CLOSED src=10.141.189.233 [..] [ASSURED]
Just skip timeout update of closed entries, we don't want them to stay around forever.
--- net/netfilter/nf_conntrack_proto_sctp.c | 9 +++++++++ 1 file changed, 9 insertions(+)
net/netfilter/nf_conntrack_proto_sctp.c +9 -0
@@ -394,6 +394,15 @@ static int sctp_packet(struct nf_conn *ct,pr_debug ("Setting vtag %x for dir %d\n" , ih->init_tag, !dir); ct->proto.sctp.vtag[!dir] = ih->init_tag; + +/* don't renew timeout on init retransmit so +* port reuse by client or NAT middlebox cannot +* keep entry alive indefinitely (incl. nat info). +*/ +if (new_state ==SCTP_CONNTRACK_CLOSED && + old_state ==SCTP_CONNTRACK_CLOSED && +nf_ct_is_confirmed (ct)) + ignore = true; } ct->proto.sctp.state = new_state;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 53/58 arm64: dts: meson-gx: add ATF BL32 reserved-memory region
In reply to Greg Kroah-HartmanFrom: Christian Hewitt <[email protected]>
[ Upstream commit 76577c9137456febb05b0e17d244113196a98968 ]
Add an additional reserved memory region for the BL32 trusted firmware present in many devices that boot from Amlogic vendor u-boot.
--- arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm64/boot/dts/amlogic/meson-gx.dtsi +6 -0
@@ -41,6 +41,12 @@ no-map; }; + /* 32 MiB reserved for ARM Trusted Firmware (BL32) */ + secmon_reserved_bl32: secmon@5300000 { + reg = <0x0 0x05300000 0x0 0x2000000>; + no-map; + }; + linux,cma { compatible = "shared-dma-pool"; reusable;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 54/58 kconfig: let shell return enough output for deep path names
In reply to Greg Kroah-HartmanFrom: Brenda Streiff <[email protected]>
[ Upstream commit 8a4c5b2a6d8ea079fa36034e8167de87ab6f8880 ]
The 'shell' built-in only returns the first 256 bytes of the command's output. In some cases, 'shell' is used to return a path; by bumping up the buffer size to 4096 this lets us capture up to PATH_MAX.
The specific case where I ran into this was due to commit 1e860048c53e ("gcc-plugins: simplify GCC plugin-dev capability test"). After this change, we now use $(shell,$(CC) -print-file-name=plugin) to return a path; if the gcc path is particularly long, then the path ends up truncated at the 256 byte mark, which makes the HAVE_GCC_PLUGINS depends test always fail.
--- scripts/kconfig/preprocess.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/kconfig/preprocess.c +1 -1
@@ -138,7 +138,7 @@ static char *do_lineno(int argc, char *argv[])static char *do_shell (int argc,char *argv[]) {FILE *p; -char buf[256 ]; +char buf[4096 ];char *cmd;size_t nread;int i;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 55/58 ata: libata-core: Disable TRIM on M88V29
In reply to Greg Kroah-HartmanFrom: Zoltán Böszörményi <[email protected]>
[ Upstream commit c8ea23d5fa59f28302d4e3370c75d9c308e64410 ]
This device is a CF card, or possibly an SSD in CF form factor. It supports NCQ and high speed DMA.
While it also advertises TRIM support, I/O errors are reported when the discard mount option fstrim is used. TRIM also fails when disabling NCQ and not just as an NCQ command.
TRIM must be disabled for this device.
--- drivers/ata/libata-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/ata/libata-core.c +1 -0
@@ -4613,6 +4613,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {/* devices that don't properly handle TRIM commands */ { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, + { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, },/* * As defined, the DRAT (Deterministic Read After Trim) and RZAT
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 56/58 tracing: Fix tp_printk option related with tp_printk_stop_on_boot
In reply to Greg Kroah-HartmanFrom: JaeSang Yoo <[email protected]>
[ Upstream commit 3203ce39ac0b2a57a84382ec184c7d4a0bede175 ]
The kernel parameter "tp_printk_stop_on_boot" starts with "tp_printk" which is the same as another kernel parameter "tp_printk". If "tp_printk" setup is called before the "tp_printk_stop_on_boot", it will override the latter and keep it from being set.
This is similar to other kernel parameter issues, such as:
Commit 745a600cf1a6 ("um: console: Ignore console= option")
or init/do_mounts.c:45 (setup function of "ro" kernel param)
Fix it by checking for a "_" right after the "tp_printk" and if that exists do not process the parameter.
--- kernel/trace/trace.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/trace/trace.c +4 -0
@@ -232,6 +232,10 @@ __setup("trace_clock=", set_trace_boot_clock);static int __init set_tracepoint_printk (char *str) { +/* Ignore the "tp_printk_stop_on_boot" param */ +if (*str =='_' ) +return 0 ; +if ((strcmp (str,"=0" ) !=0 &&strcmp (str,"=off" ) !=0 )) tracepoint_printk =1 ;return 1 ;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 57/58 net: usb: qmi_wwan: Add support for Dell DW5829e
In reply to Greg Kroah-HartmanFrom: Slark Xiao <[email protected]>
[ Upstream commit 8ecbb179286cbc91810c16caeb3396e06305cd0c ]
Dell DW5829e same as DW5821e except the CAT level. DW5821e supports CAT16 but DW5829e supports CAT9. Also, DW5829e includes normal and eSIM type. Please see below test evidence:
T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 5 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 P: Vendor=413c ProdID=81e6 Rev=03.18 S: Manufacturer=Dell Inc. S: Product=DW5829e Snapdragon X20 LTE S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 7 Spd=5000 MxCh= 0 D: Ver= 3.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS= 9 #Cfgs= 1 P: Vendor=413c ProdID=81e4 Rev=03.18 S: Manufacturer=Dell Inc. S: Product=DW5829e-eSIM Snapdragon X20 LTE S: SerialNumber=0123456789ABCDEF C: #Ifs= 6 Cfg#= 1 Atr=a0 MxPwr=896mA I: If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan I: If#=0x1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid I: If#=0x2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option I: If#=0x5 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
--- drivers/net/usb/qmi_wwan.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/usb/qmi_wwan.c +2 -0
@@ -1358,6 +1358,8 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ + {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ + {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 58/58 net: macb: Align the dma and coherent dma masks
In reply to Greg Kroah-HartmanFrom: Marc St-Amand <[email protected]>
[ Upstream commit 37f7860602b5b2d99fc7465f6407f403f5941988 ]
Single page and coherent memory blocks can use different DMA masks when the macb accesses physical memory directly. The kernel is clever enough to allocate pages that fit into the requested address width.
When using the ARM SMMU, the DMA mask must be the same for single pages and big coherent memory blocks. Otherwise the translation tables turn into one big mess.
[ 74.959909] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK [ 74.959989] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1 [ 75.173939] macb ff0e0000.ethernet eth0: DMA bus error: HRESP not OK [ 75.173955] arm-smmu fd800000.smmu: Unhandled context fault: fsr=0x402, iova=0x3165687460, fsynr=0x20001, cbfrsynra=0x877, cb=1
Since using the same DMA mask does not hurt direct 1:1 physical memory mappings, this commit always aligns DMA and coherent masks.
--- drivers/net/ethernet/cadence/macb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/cadence/macb_main.c +1 -1
@@ -4073,7 +4073,7 @@ static int macb_probe(struct platform_device *pdev)#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT if (GEM_BFEXT (DAW64 ,gem_readl (bp,DCFG6 ))) { -dma_set_mask (&pdev->dev,DMA_BIT_MASK (44 )); +dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (44 )); bp->hw_dma_cap |=HW_DMA_CAP_64B ; }#endif
Signature · 1 line
2.34.1
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Tested on arm64 and x86 for 4.19.231-rc1,
Kernel repo:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-4.19.y
Version: 4.19.231-rc1
Commit: 73351b9c55d94bed5257874bcbb4dabc116f755c
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8938
passed: 8938
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8938
passed: 8938
failed: 0
timeout: 0
--------------------------------------------------------------------
Hi!
Quoted 8 lines
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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.
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.
Do you think you could quote git hash of the respective commit here? It would be good to double-check we tested right commit.
We tested df7ca783, and CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-4.19.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Greg Kroah-Hartman
maintainerQuoted 7 lines · Pavel Machek
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.231 release. There are 58 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 5 lines
Quoted 3 lines
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.Do you think you could quote git hash of the respective commit here?
No, as that tree is a "throw away" one which I delete instantly on my side once I create it and push it out. I am only creating it so that people who use git for their CI can have an easy way to test it.
Once I do a -rc announcement, the branch here should always work, if not, please report it.
thanks,
greg k-h
Hi!
Quoted 9 lines
Quoted 9 lines
Quoted 8 lines
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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.
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.
Quoted 5 lines
Quoted 1 line
Do you think you could quote git hash of the respective commit here?
No, as that tree is a "throw away" one which I delete instantly on my side once I create it and push it out. I am only creating it so that people who use git for their CI can have an easy way to test it.
You deleting the tree should not be a problem, no?
Quoted 2 lines
Once I do a -rc announcement, the branch here should always work, if not, please report it.
So I want to make sure we are testing the right kernel. It would be good to mention the hash of the release, so that I can double-check against our CI system that we are testing right commit.
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +0000. Anything received after that time might be too late.
4.19.231-rc1 compiled and booted with no errors or regressions on my x86_64 test system.
Cheers,
Slade
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +0000. Anything received after that time might be too late.
Build results:
total: 156 pass: 156 fail: 0 Qemu test results: total: 425 pass: 425 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.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: 4.19.231-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git branch: linux-4.19.y
* git commit: 354a12b76a6c54b40409ab943189cc91fc906ac6
* git describe: v4.19.230-59-g354a12b76a6c
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-4.19.y/build/v4.19.230-59-g354a12b76a6c
## Test Regressions (compared to v4.19.230-41-g73351b9c55d9) No test regressions found.
## Metric Regressions (compared to v4.19.230-41-g73351b9c55d9) No metric regressions found.
## Test Fixes (compared to v4.19.230-41-g73351b9c55d9) No test fixes found.
## Metric Fixes (compared to v4.19.230-41-g73351b9c55d9) No metric fixes found.
## Test result summary
total: 62331, pass: 52272, fail: 343, skip: 8895, xfail: 821
## Build Summary
* arm: 281 total, 275 passed, 6 failed
* arm64: 39 total, 37 passed, 2 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 19 total, 19 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 27 total, 27 passed, 0 failed
* powerpc: 60 total, 49 passed, 11 failed
* s390: 12 total, 12 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x15: 1 total, 1 passed, 0 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 38 total, 38 passed, 0 failed
## Test suites summary
* fwts
* kselftest-android
* kselftest-bpf
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* 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-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kvm-unit-tests
* 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
* rcutorture
* ssuite
* v4l2-compliance
--
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 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.2.1 20220213): 63 configs -> no failure arm (gcc version 11.2.1 20220213): 116 configs -> no new failure arm64 (gcc version 11.2.1 20220213): 2 configs -> no failure x86_64 (gcc version 11.2.1 20220213): 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/791
--
Regards
Sudip
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v4.19:
10 builds: 10 pass, 0 fail
22 boots: 22 pass, 0 fail
40 tests: 40 pass, 0 failLinux version: 4.19.231-rc1-g354a12b76a6c
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04Jon
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.231 release. There are 58 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, 23 Feb 2022 08:48:58 +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/v4.x/stable-review/patch-4.19.231-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
hello,
Compiled and booted 4.19.231-rc1+ on ...
Processor Information
Socket Designation: FM2
Type: Central Processor
Family: A-Series
Manufacturer: AuthenticAMD
ID: 31 0F 61 00 FF FB 8B 17
Signature: Family 21, Model 19, Stepping 1
NO new regression or regressions from dmesg.
Signature · 2 lines
software engineer rajagiri school of engineering and technology - autonomous