4.19.10-stable review
Greg Kroah-Hartman
maintainercover 4.19.10-stable review
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. 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.10-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.10-rc1
Edward Cree <[email protected]>
bpf: fix off-by-one error in adjust_subprog_starts
Piotr Stankiewicz <[email protected]>
IB/hfi1: Fix an out-of-bounds access in get_hw_stats
Hui Wang <[email protected]>
ALSA: hda/realtek - Fix the mute LED regresion on Lenovo X1 Carbon
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek: Enable audio jacks of ASUS UX433FN/UX333FA with ALC294
Jian-Hong Pan <[email protected]>
ALSA: hda/realtek: Enable audio jacks of ASUS UX533FD with ALC294
Chris Chiu <[email protected]>
ALSA: hda/realtek: ALC294 mic and headset-mode fixups for ASUS X542UN
Kailang Yang <[email protected]>
ALSA: hda/realtek - Fixed headphone issue for ALC700
Takashi Sakamoto <[email protected]>
ALSA: fireface: fix reference to wrong register for clock configuration
Matthew Wilcox <[email protected]>
dax: Check page->mapping isn't NULL
Tigran Mkrtchyan <[email protected]>
flexfiles: enforce per-mirror stateid only for v4 DSes
Pan Bian <[email protected]>
ocfs2: fix potential use after free
Li Zhijian <[email protected]>
initramfs: clean old path before creating a hardlink
Anders Roxell <[email protected]>
kernel/kcov.c: mark funcs in __sanitizer_cov_trace_pc() as notrace
Alexey Dobriyan <[email protected]>
proc: fixup map_files test on arm
Qian Cai <[email protected]>
debugobjects: avoid recursive calls with kmemleak
Pan Bian <[email protected]>
hfsplus: do not free node before using
Pan Bian <[email protected]>
hfs: do not free node before using
Wei Yang <[email protected]>
mm/page_alloc.c: fix calculation of pgdat->nr_zones
Larry Chen <[email protected]>
ocfs2: fix deadlock caused by ocfs2_defrag_extent()
Lorenzo Pieralisi <[email protected]>
ACPI/IORT: Fix iort_get_platform_device_domain() uninitialized pointer value
Prabhath Sajeepa <[email protected]>
nvme-rdma: fix double freeing of async event data
Sagi Grimberg <[email protected]>
nvme: flush namespace scanning work just before removing namespaces
Christoph Hellwig <[email protected]>
nvme: warn when finding multi-port subsystems without multipathing enabled
Colin Ian King <[email protected]>
fscache, cachefiles: remove redundant variable 'cache'
Nathan Chancellor <[email protected]>
cachefiles: Explicitly cast enumerated type in put_object
NeilBrown <[email protected]>
fscache: fix race between enablement and dropping of object
David Howells <[email protected]>
afs: Fix validation/callback interaction
Kees Cook <[email protected]>
pstore/ram: Correctly calculate usable PRZ bytes
Pan Bian <[email protected]>
pvcalls-front: fixes incorrect error handling
Igor Druzhinin <[email protected]>
Revert "xen/balloon: Mark unallocated host memory as UNUSABLE"
Srikanth Boddepalli <[email protected]>
xen: xlate_mmu: add missing header to fix 'W=1' warning
Y.C. Chen <[email protected]>
drm/ast: fixed reading monitor EDID not stable issue
shaoyunl <[email protected]>
drm/amdgpu: Add delay after enable RLC ucode
Pan Bian <[email protected]>
net: hisilicon: remove unexpected free_netdev
Josh Elsasser <[email protected]>
ixgbe: recognize 1000BaseLX SFP modules as 1Gbps
Yunjian Wang <[email protected]>
igb: fix uninitialized variables
Kiran Kumar Modukuri <[email protected]>
cachefiles: Fix page leak in cachefiles_read_backing_file while vmscan is active
kiran.modukuri <[email protected]>
fscache: Fix race in fscache_op_complete() due to split atomic_sub & read
David Howells <[email protected]>
cachefiles: Fix an assertion failure when trying to update a failed object
Hui Wang <[email protected]>
ALSA: usb-audio: Add vendor and product name for Dell WD19 Dock
Taehee Yoo <[email protected]>
netfilter: nf_tables: deactivate expressions in rule replecement routine
Marek Szyprowski <[email protected]>
usb: gadget: u_ether: fix unsafe list iteration
Lorenzo Bianconi <[email protected]>
net: thunderx: fix NULL pointer dereference in nic_remove
Yi Wang <[email protected]>
x86/kvm/vmx: fix old-style function declaration
Yi Wang <[email protected]>
KVM: x86: fix empty-body warnings
Liran Alon <[email protected]>
KVM: VMX: Update shared MSRs to be saved/restored on MSR_EFER.LMA changes
Taehee Yoo <[email protected]>
netfilter: nf_conncount: remove wrong condition check routine
Taehee Yoo <[email protected]>
netfilter: nat: fix double register in masquerade modules
Taehee Yoo <[email protected]>
netfilter: add missing error handling code for register functions
Artemy Kovalyov <[email protected]>
IB/mlx5: Fix page fault handling for MW
Alin Nastac <[email protected]>
netfilter: ipv6: Preserve link scope traffic original oif
Christian Hewitt <[email protected]>
drm/meson: add support for 1080p25 mode
Mika Westerberg <[email protected]>
thunderbolt: Prevent root port runtime suspend during NVM upgrade
Aaro Koskinen <[email protected]>
USB: omap_udc: fix rejection of out transfers when DMA is used
Aaro Koskinen <[email protected]>
USB: omap_udc: fix USB gadget functionality on Palm Tungsten E
Aaro Koskinen <[email protected]>
USB: omap_udc: fix omap_udc_start() on 15xx machines
Aaro Koskinen <[email protected]>
USB: omap_udc: fix crashes on probe error and module removal
Aaro Koskinen <[email protected]>
USB: omap_udc: use devm_request_irq()
Xin Long <[email protected]>
ipvs: call ip_vs_dst_notifier earlier than ipv6_dev_notf
Arnd Bergmann <[email protected]>
fsi: master-ast-cf: select GENERIC_ALLOCATOR
Martynas Pumputis <[email protected]>
bpf: fix check of allowed specifiers in bpf_trace_printk
Yixian Liu <[email protected]>
RDMA/hns: Bugfix pbl configuration for rereg mr
Pan Bian <[email protected]>
exportfs: do not read dentry after free
Peter Ujfalusi <[email protected]>
ASoC: omap-dmic: Add pm_qos handling to avoid overruns with CPU_IDLE
Peter Ujfalusi <[email protected]>
ASoC: omap-mcpdm: Add pm_qos handling to avoid under/overruns with CPU_IDLE
Peter Ujfalusi <[email protected]>
ASoC: omap-mcbsp: Fix latency value calculation for pm_qos
Jakub Kicinski <[email protected]>
tools: bpftool: fix potential NULL pointer dereference in do_load
Kamal Heib <[email protected]>
RDMA/rdmavt: Fix rvt_create_ah function signature
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Avoid accessing the device structure after it is freed
Selvin Xavier <[email protected]>
RDMA/bnxt_re: Fix system hang when registration with L2 driver fails
Parav Pandit <[email protected]>
RDMA/core: Add GIDs while changing MAC addr only for registered ndev
Majd Dibbiny <[email protected]>
RDMA/mlx5: Fix fence type for IB_WR_LOCAL_INV WR
Robbie Ko <[email protected]>
Btrfs: send, fix infinite loop due to directory rename dependencies
Romain Izard <[email protected]>
ARM: dts: at91: sama5d2: use the divided clock for SMC
Manu Gautam <[email protected]>
phy: qcom-qusb2: Fix HSTX_TRIM tuning with fused value for SDM845
Manu Gautam <[email protected]>
phy: qcom-qusb2: Use HSTX_TRIM fused value as is
Artem Savkov <[email protected]>
objtool: Fix segfault in .cold detection with -ffunction-sections
Artem Savkov <[email protected]>
objtool: Fix double-free in .cold detection error path
Keyon Jie <[email protected]>
ASoC: acpi: fix: continue searching when machine is ignored
Trent Piepho <[email protected]>
PCI: imx6: Fix link training status detection in link up check
Jiri Olsa <[email protected]>
perf tools: Restore proper cwd on return from mnt namespace
Huacai Chen <[email protected]>
hwmon: (w83795) temp4_type has writable permission
Taehee Yoo <[email protected]>
netfilter: xt_hashlimit: fix a possible memory leak in htable_create()
Jens Axboe <[email protected]>
aio: fix failure to put the file pointer
Roman Gushchin <[email protected]>
bpf: allocate local storage buffers using GFP_ATOMIC
Vadim Pasternak <[email protected]>
hwmon: (mlxreg-fan) Fix macros for tacho fault reading
Tony Lindgren <[email protected]>
spi: omap2-mcspi: Add missing suspend and resume calls
Tzung-Bi Shih <[email protected]>
ASoC: dapm: Recalculate audio map forcely when card instantiated
Peter Ujfalusi <[email protected]>
ASoC: omap-abe-twl6040: Fix missing audio card caused by deferred probing
Nicolin Chen <[email protected]>
hwmon: (ina2xx) Fix current value calculation
Thomas Richter <[email protected]>
s390/cpum_cf: Reject request for sampling in event initialization
Rohit kumar <[email protected]>
ASoC: qcom: Set dai_link id to each dai_link
Pierre-Louis Bossart <[email protected]>
ASoC: Intel: Power down links before turning off display audio power
Richard Fitzgerald <[email protected]>
ASoC: wm_adsp: Fix dma-unsafe read of scratch registers
Katsuhiro Suzuki <[email protected]>
ASoC: rockchip: add missing slave_config setting for I2S
Stefan Wahren <[email protected]>
hwmon: (raspberrypi) Fix initial notify
Nicolin Chen <[email protected]>
hwmon (ina2xx) Fix NULL id pointer in probe()
Eric Farman <[email protected]>
s390/cio: Fix cleanup when unsupported IDA format is used
Eric Farman <[email protected]>
s390/cio: Fix cleanup of pfn_array alloc failure
Florian Westphal <[email protected]>
netfilter: nf_tables: fix use-after-free when deleting compat expressions
Taehee Yoo <[email protected]>
netfilter: xt_RATEEST: remove netns exit routine
Jiri Olsa <[email protected]>
perf tools: Fix crash on synthesizing the unit
Florian Westphal <[email protected]>
selftests: add script to stress-test nft packet path vs. control plane
Florian Westphal <[email protected]>
netfilter: nf_tables: don't skip inactive chains during update
Taehee Yoo <[email protected]>
netfilter: nf_conncount: fix unexpected permanent node of list.
Taehee Yoo <[email protected]>
netfilter: nf_conncount: fix list_del corruption in conn_free
Taehee Yoo <[email protected]>
netfilter: nf_conncount: use spin_lock_bh instead of spin_lock
YueHaibing <[email protected]>
sysv: return 'err' instead of 0 in __sysv_write_inode
Bjorn Andersson <[email protected]>
arm64: dts: sdm845-mtp: Reserve reserved gpios
Vasily Khoruzhick <[email protected]>
ASoC: sun8i-codec: fix crash on module removal
Quentin Monnet <[email protected]>
tools: bpftool: prevent infinite loop in get_fdinfo()
Janusz Krzysztofik <[email protected]>
ARM: OMAP1: ams-delta: Fix possible use of uninitialized field
Adam Ford <[email protected]>
ARM: dts: am3517-som: Fix WL127x Wifi interrupt
Adam Ford <[email protected]>
ARM: dts: logicpd-somlv: Fix interrupt on mmc3_dat1
Adam Ford <[email protected]>
ARM: dts: LogicPD Torpedo: Fix mmc3_dat1 interrupt
Adam Ford <[email protected]>
ARM: dts: am3517: Fix pinmuxing for CD on MMC1
Christophe JAILLET <[email protected]>
staging: rtl8723bs: Fix the return value in case of error in 'rtw_wx_read32()'
Srinivas Kandagatla <[email protected]>
ASoC: qdsp6: q6afe-dai: Fix the dai widgets
Rohit kumar <[email protected]>
ASoC: qdsp6: q6afe: Fix wrong MI2S SD line mask
Kuninori Morimoto <[email protected]>
ASoC: rsnd: fixup clock start checker
Nathan Chancellor <[email protected]>
ARM: OMAP2+: prm44xx: Fix section annotation on omap44xx_prm_enable_io_wakeup
Sabrina Dubroca <[email protected]>
net: fix XPS static_key accounting
Sabrina Dubroca <[email protected]>
net: restore call to netdev_queue_numa_node_write when resetting XPS
Xin Long <[email protected]>
sctp: update frag_point when stream_interleave is set
Baruch Siach <[email protected]>
net: phy: sfp: correct store of detected link modes
Jason Wang <[email protected]>
virtio-net: keep vnet header zeroed after processing XDP
Nicolas Dichtel <[email protected]>
tun: forbid iface creation with rtnl ops
Yuchung Cheng <[email protected]>
tcp: fix NULL ref in tail loss probe
Eric Dumazet <[email protected]>
tcp: Do not underestimate rwnd_limited
Xin Long <[email protected]>
sctp: kfree_rcu asoc
Eric Dumazet <[email protected]>
rtnetlink: ndo_dflt_fdb_dump() only work for ARPHRD_ETHER devices
Benjamin Herrenschmidt <[email protected]>
Revert "net/ibm/emac: wrong bit is used for STA control"
Edward Cree <[email protected]>
net: use skb_list_del_init() to remove from RX sublists
Christoph Paasch <[email protected]>
net: Prevent invalid access to skb->prev in __qdisc_drop_all
Heiner Kallweit <[email protected]>
net: phy: don't allow __set_phy_supported to add unsupported modes
Eran Ben Elisha <[email protected]>
net/mlx4_en: Change min MTU size to ETH_MIN_MTU
Tarick Bedeir <[email protected]>
net/mlx4_core: Correctly set PFC param if global pause is turned off.
Su Yanjun <[email protected]>
net: 8139cp: fix a BUG triggered by changing mtu with network traffic
Shmulik Ladkani <[email protected]>
ipv6: sr: properly initialize flowi6 prior passing to ip6_route_output
Stefano Brivio <[email protected]>
neighbour: Avoid writing before skb->head in neigh_hh_output()
Stefano Brivio <[email protected]>
ipv6: Check available headroom in ip6_xmit() even without options
Jiri Wiesner <[email protected]>
ipv4: ipv6: netfilter: Adjust the frag mem limit when truesize changes
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/am3517-evm.dts | 2 +- arch/arm/boot/dts/am3517-som.dtsi | 2 +- arch/arm/boot/dts/logicpd-som-lv.dtsi | 2 +- arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts | 2 +- arch/arm/boot/dts/sama5d2.dtsi | 2 +- arch/arm/mach-omap1/board-ams-delta.c | 3 + arch/arm/mach-omap2/prm44xx.c | 2 +- arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 4 + arch/s390/kernel/perf_cpum_cf.c | 2 + arch/x86/kvm/lapic.c | 2 +- arch/x86/kvm/vmx.c | 29 ++- arch/x86/xen/enlighten.c | 78 -------- arch/x86/xen/setup.c | 6 +- drivers/acpi/arm64/iort.c | 2 +- drivers/fsi/Kconfig | 1 + drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 7 +- drivers/gpu/drm/ast/ast_mode.c | 36 +++- drivers/gpu/drm/meson/meson_venc.c | 1 + drivers/hwmon/ina2xx.c | 6 +- drivers/hwmon/mlxreg-fan.c | 2 +- drivers/hwmon/raspberrypi-hwmon.c | 6 - drivers/hwmon/w83795.c | 2 +- drivers/infiniband/core/roce_gid_mgmt.c | 6 +- drivers/infiniband/hw/bnxt_re/main.c | 3 + drivers/infiniband/hw/hfi1/chip.c | 3 +- drivers/infiniband/hw/hfi1/hfi.h | 2 + drivers/infiniband/hw/hfi1/verbs.c | 2 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 128 ++++++------- drivers/infiniband/hw/mlx5/odp.c | 1 + drivers/infiniband/hw/mlx5/qp.c | 19 +- drivers/infiniband/sw/rdmavt/ah.c | 4 +- drivers/infiniband/sw/rdmavt/ah.h | 3 +- drivers/net/ethernet/cavium/thunder/nic_main.c | 3 + drivers/net/ethernet/hisilicon/hip04_eth.c | 4 +- drivers/net/ethernet/ibm/emac/emac.h | 2 +- drivers/net/ethernet/intel/igb/e1000_i210.c | 1 + drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 4 +- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 4 +- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 4 +- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - drivers/net/ethernet/realtek/8139cp.c | 5 + drivers/net/phy/phy_device.c | 19 +- drivers/net/phy/sfp-bus.c | 2 +- drivers/net/tun.c | 6 +- drivers/net/virtio_net.c | 14 +- drivers/nvme/host/core.c | 4 +- drivers/nvme/host/nvme.h | 3 + drivers/nvme/host/rdma.c | 2 + drivers/pci/controller/dwc/pci-imx6.c | 10 +- drivers/phy/qualcomm/phy-qcom-qusb2.c | 20 +- drivers/s390/cio/vfio_ccw_cp.c | 6 +- drivers/spi/spi-omap2-mcspi.c | 37 ++-- drivers/staging/rtl8723bs/os_dep/ioctl_linux.c | 2 +- drivers/thunderbolt/switch.c | 40 +++- drivers/usb/gadget/function/u_ether.c | 11 +- drivers/usb/gadget/udc/omap_udc.c | 88 +++------ drivers/xen/balloon.c | 65 +------ drivers/xen/pvcalls-front.c | 4 +- drivers/xen/xlate_mmu.c | 1 + fs/afs/inode.c | 18 +- fs/aio.c | 1 + fs/btrfs/send.c | 11 +- fs/cachefiles/namei.c | 6 +- fs/cachefiles/rdwr.c | 9 +- fs/cachefiles/xattr.c | 3 +- fs/dax.c | 2 +- fs/exportfs/expfs.c | 2 +- fs/fscache/object.c | 3 + fs/hfs/btree.c | 3 +- fs/hfsplus/btree.c | 3 +- fs/nfs/flexfilelayout/flexfilelayout.c | 6 +- fs/ocfs2/export.c | 2 +- fs/ocfs2/move_extents.c | 47 ++--- fs/pstore/ram.c | 15 +- fs/sysv/inode.c | 2 +- include/linux/fscache-cache.h | 3 +- include/linux/pstore.h | 5 +- include/linux/skbuff.h | 11 ++ include/net/neighbour.h | 28 ++- include/net/netfilter/ipv4/nf_nat_masquerade.h | 2 +- include/net/netfilter/ipv6/nf_nat_masquerade.h | 2 +- include/net/sctp/structs.h | 2 + include/xen/balloon.h | 5 - init/initramfs.c | 22 ++- kernel/bpf/local_storage.c | 3 +- kernel/bpf/verifier.c | 2 +- kernel/kcov.c | 4 +- kernel/trace/bpf_trace.c | 8 +- lib/debugobjects.c | 5 +- mm/page_alloc.c | 4 +- net/core/dev.c | 61 +++--- net/core/rtnetlink.c | 3 + net/ipv4/ip_fragment.c | 7 + net/ipv4/ip_input.c | 4 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 7 +- net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | 38 +++- net/ipv4/netfilter/nft_masq_ipv4.c | 4 +- net/ipv4/tcp_output.c | 16 +- net/ipv6/ip6_input.c | 4 +- net/ipv6/ip6_output.c | 42 ++--- net/ipv6/netfilter.c | 3 +- net/ipv6/netfilter/ip6t_MASQUERADE.c | 8 +- net/ipv6/netfilter/nf_conntrack_reasm.c | 8 +- net/ipv6/netfilter/nf_nat_masquerade_ipv6.c | 49 +++-- net/ipv6/netfilter/nft_masq_ipv6.c | 4 +- net/ipv6/reassembly.c | 8 +- net/ipv6/seg6_iptunnel.c | 1 + net/netfilter/ipvs/ip_vs_ctl.c | 3 + net/netfilter/nf_conncount.c | 44 +++-- net/netfilter/nf_tables_api.c | 29 +-- net/netfilter/nft_compat.c | 3 +- net/netfilter/nft_flow_offload.c | 5 +- net/netfilter/xt_RATEEST.c | 10 - net/netfilter/xt_hashlimit.c | 9 +- net/sched/sch_netem.c | 3 + net/sctp/associola.c | 9 +- net/sctp/sm_make_chunk.c | 3 + sound/firewire/fireface/ff-protocol-ff400.c | 2 +- sound/pci/hda/patch_realtek.c | 77 ++++++++ sound/soc/codecs/hdac_hdmi.c | 11 +- sound/soc/codecs/wm_adsp.c | 37 ++-- sound/soc/intel/skylake/skl.c | 12 +- sound/soc/omap/omap-abe-twl6040.c | 67 +++---- sound/soc/omap/omap-dmic.c | 9 + sound/soc/omap/omap-mcbsp.c | 6 +- sound/soc/omap/omap-mcpdm.c | 43 ++++- sound/soc/qcom/common.c | 9 +- sound/soc/qcom/qdsp6/q6afe-dai.c | 208 ++++++++++----------- sound/soc/qcom/qdsp6/q6afe.c | 16 +- sound/soc/rockchip/rockchip_pcm.c | 1 + sound/soc/sh/rcar/ssi.c | 2 +- sound/soc/soc-acpi.c | 10 +- sound/soc/soc-core.c | 1 + sound/soc/sunxi/sun8i-codec.c | 6 - sound/usb/quirks-table.h | 10 + tools/bpf/bpftool/common.c | 2 +- tools/bpf/bpftool/prog.c | 10 +- tools/objtool/elf.c | 19 +- tools/perf/tests/attr/base-record | 2 +- tools/perf/util/evsel.c | 2 +- tools/perf/util/namespaces.c | 17 +- tools/perf/util/namespaces.h | 1 + tools/testing/selftests/Makefile | 1 + tools/testing/selftests/bpf/test_verifier.c | 19 ++ tools/testing/selftests/netfilter/Makefile | 6 + tools/testing/selftests/netfilter/config | 2 + .../selftests/netfilter/nft_trans_stress.sh | 78 ++++++++ .../selftests/proc/proc-self-map-files-002.c | 9 +- 149 files changed, 1223 insertions(+), 832 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 4/142 ipv6: sr: properly initialize flowi6 prior passing to ip6_route_output
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shmulik Ladkani <[email protected]>
[ Upstream commit 1b4e5ad5d6b9f15cd0b5121f86d4719165958417 ]
In 'seg6_output', stack variable 'struct flowi6 fl6' was missing initialization.
--- net/ipv6/seg6_iptunnel.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/seg6_iptunnel.c +1 -0
@@ -347,6 +347,7 @@ static int seg6_output(struct net *net,struct ipv6hdr *hdr =ipv6_hdr (skb);struct flowi6 fl6; +memset (&fl6,0 ,sizeof (fl6)); fl6.daddr = hdr->daddr; fl6.saddr = hdr->saddr; fl6.flowlabel =ip6_flowinfo (hdr);
Greg Kroah-Hartman
maintainerPATCH 8/142 net: phy: dont allow __set_phy_supported to add unsupported modes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit d2a36971ef595069b7a600d1144c2e0881a930a1 ]
Currently __set_phy_supported allows to add modes w/o checking whether the PHY supports them. This is wrong, it should never add modes but only remove modes we don't want to support.
The commit marked as fixed didn't do anything wrong, it just copied existing functionality to the helper which is being fixed now.
--- drivers/net/phy/phy_device.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
drivers/net/phy/phy_device.c +8 -11
@@ -1738,20 +1738,17 @@ EXPORT_SYMBOL(genphy_loopback);static int __set_phy_supported (struct phy_device *phydev,u32 max_speed) { - phydev->supported &= ~(PHY_1000BT_FEATURES |PHY_100BT_FEATURES | -PHY_10BT_FEATURES ); -switch (max_speed) { -default : -return -ENOTSUPP ; -case SPEED_1000 : - phydev->supported |=PHY_1000BT_FEATURES ; +case SPEED_10 : + phydev->supported &= ~PHY_100BT_FEATURES ;/* fall through */ case SPEED_100 : - phydev->supported |=PHY_100BT_FEATURES ; -/* fall through */ -case SPEED_10 : - phydev->supported |=PHY_10BT_FEATURES ; + phydev->supported &= ~PHY_1000BT_FEATURES ; +break ; +case SPEED_1000 : +break ; +default : +return -ENOTSUPP ; }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 10/142 net: use skb_list_del_init() to remove from RX sublists
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Cree <[email protected]>
[ Upstream commit 22f6bbb7bcfcef0b373b0502a7ff390275c575dd ]
list_del() leaves the skb->next pointer poisoned, which can then lead to
a crash in e.g. OVS forwarding. For example, setting up an OVS VXLAN forwarding bridge on sfc as per:
========
$ ovs-vsctl show
5dfd9c47-f04b-4aaa-aa96-4fbb0a522a30
Bridge "br0"
Port "br0"
Interface "br0"
type: internal
Port "enp6s0f0"
Interface "enp6s0f0"
Port "vxlan0"
Interface "vxlan0"
type: vxlan
options: {key="1", local_ip="10.0.0.5", remote_ip="10.0.0.4"}
ovs_version: "2.5.0"
========
(where 10.0.0.5 is an address on enp6s0f1)
and sending traffic across it will lead to the following panic:
========
general protection fault: 0000 [#1] SMP PTI
CPU: 5 PID: 0 Comm: swapper/5 Not tainted 4.20.0-rc3-ehc+ #701
Hardware name: Dell Inc. PowerEdge R710/0M233H, BIOS 6.4.0 07/23/2013
RIP: 0010:dev_hard_start_xmit+0x38/0x200
Code: 53 48 89 fb 48 83 ec 20 48 85 ff 48 89 54 24 08 48 89 4c 24 18 0f 84 ab 01 00 00 48 8d 86 90 00 00 00 48 89 f5 48 89 44 24 10 <4c> 8b 33 48 c7 03 00 00 00 00 48 8b 05 c7 d1 b3 00 4d 85 f6 0f 95
RSP: 0018:ffff888627b437e0 EFLAGS: 00010202
RAX: 0000000000000000 RBX: dead000000000100 RCX: ffff88862279c000
RDX: ffff888614a342c0 RSI: 0000000000000000 RDI: 0000000000000000
RBP: ffff888618a88000 R08: 0000000000000001 R09: 00000000000003e8
R10: 0000000000000000 R11: ffff888614a34140 R12: 0000000000000000
R13: 0000000000000062 R14: dead000000000100 R15: ffff888616430000
FS: 0000000000000000(0000) GS:ffff888627b40000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f6d2bc6d000 CR3: 000000000200a000 CR4: 00000000000006e0
Call Trace:
<IRQ>
__dev_queue_xmit+0x623/0x870
? masked_flow_lookup+0xf7/0x220 [openvswitch]
? ep_poll_callback+0x101/0x310
do_execute_actions+0xaba/0xaf0 [openvswitch]
? __wake_up_common+0x8a/0x150
? __wake_up_common_lock+0x87/0xc0
? queue_userspace_packet+0x31c/0x5b0 [openvswitch]
ovs_execute_actions+0x47/0x120 [openvswitch]
ovs_dp_process_packet+0x7d/0x110 [openvswitch]
ovs_vport_receive+0x6e/0xd0 [openvswitch]
? dst_alloc+0x64/0x90
? rt_dst_alloc+0x50/0xd0
? ip_route_input_slow+0x19a/0x9a0
? __udp_enqueue_schedule_skb+0x198/0x1b0
? __udp4_lib_rcv+0x856/0xa30
? __udp4_lib_rcv+0x856/0xa30
? cpumask_next_and+0x19/0x20
? find_busiest_group+0x12d/0xcd0
netdev_frame_hook+0xce/0x150 [openvswitch]
__netif_receive_skb_core+0x205/0xae0
__netif_receive_skb_list_core+0x11e/0x220
netif_receive_skb_list+0x203/0x460
? __efx_rx_packet+0x335/0x5e0 [sfc]
efx_poll+0x182/0x320 [sfc]
net_rx_action+0x294/0x3c0
__do_softirq+0xca/0x297
irq_exit+0xa6/0xb0
do_IRQ+0x54/0xd0
common_interrupt+0xf/0xf
</IRQ>
========
So, in all listified-receive handling, instead pull skbs off the lists with
skb_list_del_init().--- include/linux/skbuff.h | 11 +++++++++++ net/core/dev.c | 8 ++++---- net/ipv4/ip_input.c | 4 ++-- net/ipv6/ip6_input.c | 4 ++-- 4 files changed, 19 insertions(+), 8 deletions(-)
include/linux/skbuff.h +11 -0
@@ -1355,6 +1355,17 @@ static inline void skb_zcopy_abort(struc } } +static inline void skb_mark_not_on_list (struct sk_buff *skb) +{ + skb->next =NULL ; +} + +static inline void skb_list_del_init (struct sk_buff *skb) +{ +__list_del_entry (&skb->list); +skb_mark_not_on_list (skb); +} +/** * skb_queue_empty - check if a queue is empty * @list: queue head
net/core/dev.c +4 -4
@@ -4981,7 +4981,7 @@ static void __netif_receive_skb_list_corstruct net_device *orig_dev = skb->dev;struct packet_type *pt_prev =NULL ; -list_del (&skb->list); +skb_list_del_init (skb);__netif_receive_skb_core (skb, pfmemalloc, &pt_prev);if (!pt_prev)continue ;
@@ -5137,7 +5137,7 @@ static void netif_receive_skb_list_interINIT_LIST_HEAD (&sublist);list_for_each_entry_safe (skb, next, head, list) {net_timestamp_check (netdev_tstamp_prequeue, skb); -list_del (&skb->list); +skb_list_del_init (skb);if (!skb_defer_rx_timestamp (skb))list_add_tail (&skb->list, &sublist); }
@@ -5148,7 +5148,7 @@ static void netif_receive_skb_list_interrcu_read_lock ();list_for_each_entry_safe (skb, next, head, list) { xdp_prog =rcu_dereference (skb->dev->xdp_prog); -list_del (&skb->list); +skb_list_del_init (skb);if (do_xdp_generic (xdp_prog, skb) ==XDP_PASS )list_add_tail (&skb->list, &sublist); }
@@ -5167,7 +5167,7 @@ static void netif_receive_skb_list_interif (cpu >=0 ) {/* Will be handled, remove from list */ -list_del (&skb->list); +skb_list_del_init (skb);enqueue_to_backlog (skb, cpu, &rflow->last_qtail); } }
net/ipv4/ip_input.c +2 -2
@@ -551,7 +551,7 @@ static void ip_list_rcv_finish(struct nelist_for_each_entry_safe (skb, next, head, list) {struct dst_entry *dst; -list_del (&skb->list); +skb_list_del_init (skb);/* if ingress device is enslaved to an L3 master device pass the * skb to its handler for processing */
@@ -598,7 +598,7 @@ void ip_list_rcv(struct list_head *head,struct net_device *dev = skb->dev;struct net *net =dev_net (dev); -list_del (&skb->list); +skb_list_del_init (skb); skb =ip_rcv_core (skb, net);if (skb ==NULL )continue ;
net/ipv6/ip6_input.c +2 -2
@@ -95,7 +95,7 @@ static void ip6_list_rcv_finish(struct nlist_for_each_entry_safe (skb, next, head, list) {struct dst_entry *dst; -list_del (&skb->list); +skb_list_del_init (skb);/* if ingress device is enslaved to an L3 master device pass the * skb to its handler for processing */
@@ -295,7 +295,7 @@ void ipv6_list_rcv(struct list_head *heastruct net_device *dev = skb->dev;struct net *net =dev_net (dev); -list_del (&skb->list); +skb_list_del_init (skb); skb =ip6_rcv_core (skb, dev, net);if (skb ==NULL )continue ;
Greg Kroah-Hartman
maintainerPATCH 12/142 rtnetlink: ndo_dflt_fdb_dump() only work for ARPHRD_ETHER devices
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 688838934c231bb08f46db687e57f6d8bf82709c ]
kmsan was able to trigger a kernel-infoleak using a gre device [1]
nlmsg_populate_fdb_fill() has a hard coded assumption that dev->addr_len is ETH_ALEN, as normally guaranteed for ARPHRD_ETHER devices.
A similar issue was fixed recently in commit da71577545a5 ("rtnetlink: Disallow FDB configuration for non-Ethernet device")
[1]
BUG: KMSAN: kernel-infoleak in copyout lib/iov_iter.c:143 [inline] BUG: KMSAN: kernel-infoleak in _copy_to_iter+0x4c0/0x2700 lib/iov_iter.c:576 CPU: 0 PID: 6697 Comm: syz-executor310 Not tainted 4.20.0-rc3+ #95 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x32d/0x480 lib/dump_stack.c:113 kmsan_report+0x12c/0x290 mm/kmsan/kmsan.c:683 kmsan_internal_check_memory+0x32a/0xa50 mm/kmsan/kmsan.c:743 kmsan_copy_to_user+0x78/0xd0 mm/kmsan/kmsan_hooks.c:634 copyout lib/iov_iter.c:143 [inline] _copy_to_iter+0x4c0/0x2700 lib/iov_iter.c:576 copy_to_iter include/linux/uio.h:143 [inline] skb_copy_datagram_iter+0x4e2/0x1070 net/core/datagram.c:431 skb_copy_datagram_msg include/linux/skbuff.h:3316 [inline] netlink_recvmsg+0x6f9/0x19d0 net/netlink/af_netlink.c:1975 sock_recvmsg_nosec net/socket.c:794 [inline] sock_recvmsg+0x1d1/0x230 net/socket.c:801 ___sys_recvmsg+0x444/0xae0 net/socket.c:2278 __sys_recvmsg net/socket.c:2327 [inline] __do_sys_recvmsg net/socket.c:2337 [inline] __se_sys_recvmsg+0x2fa/0x450 net/socket.c:2334 __x64_sys_recvmsg+0x4a/0x70 net/socket.c:2334 do_syscall_64+0xcf/0x110 arch/x86/entry/common.c:291 entry_SYSCALL_64_after_hwframe+0x63/0xe7 RIP: 0033:0x441119 Code: 18 89 d0 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 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 0f 83 db 0a fc ff c3 66 2e 0f 1f 84 00 00 00 00 RSP: 002b:00007fffc7f008a8 EFLAGS: 00000207 ORIG_RAX: 000000000000002f RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 0000000000441119 RDX: 0000000000000040 RSI: 00000000200005c0 RDI: 0000000000000003 RBP: 00000000006cc018 R08: 0000000000000100 R09: 0000000000000100 R10: 0000000000000100 R11: 0000000000000207 R12: 0000000000402080 R13: 0000000000402110 R14: 0000000000000000 R15: 0000000000000000
Uninit was stored to memory at:
kmsan_save_stack_with_flags mm/kmsan/kmsan.c:246 [inline] kmsan_save_stack mm/kmsan/kmsan.c:261 [inline] kmsan_internal_chain_origin+0x13d/0x240 mm/kmsan/kmsan.c:469 kmsan_memcpy_memmove_metadata+0x1a9/0xf70 mm/kmsan/kmsan.c:344 kmsan_memcpy_metadata+0xb/0x10 mm/kmsan/kmsan.c:362 __msan_memcpy+0x61/0x70 mm/kmsan/kmsan_instr.c:162 __nla_put lib/nlattr.c:744 [inline] nla_put+0x20a/0x2d0 lib/nlattr.c:802 nlmsg_populate_fdb_fill+0x444/0x810 net/core/rtnetlink.c:3466 nlmsg_populate_fdb net/core/rtnetlink.c:3775 [inline] ndo_dflt_fdb_dump+0x73a/0x960 net/core/rtnetlink.c:3807 rtnl_fdb_dump+0x1318/0x1cb0 net/core/rtnetlink.c:3979 netlink_dump+0xc79/0x1c90 net/netlink/af_netlink.c:2244 __netlink_dump_start+0x10c4/0x11d0 net/netlink/af_netlink.c:2352 netlink_dump_start include/linux/netlink.h:216 [inline] rtnetlink_rcv_msg+0x141b/0x1540 net/core/rtnetlink.c:4910 netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2477 rtnetlink_rcv+0x50/0x60 net/core/rtnetlink.c:4965 netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline] netlink_unicast+0x1699/0x1740 net/netlink/af_netlink.c:1336 netlink_sendmsg+0x13c7/0x1440 net/netlink/af_netlink.c:1917 sock_sendmsg_nosec net/socket.c:621 [inline] sock_sendmsg net/socket.c:631 [inline] ___sys_sendmsg+0xe3b/0x1240 net/socket.c:2116 __sys_sendmsg net/socket.c:2154 [inline] __do_sys_sendmsg net/socket.c:2163 [inline] __se_sys_sendmsg+0x305/0x460 net/socket.c:2161 __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161 do_syscall_64+0xcf/0x110 arch/x86/entry/common.c:291 entry_SYSCALL_64_after_hwframe+0x63/0xe7
Uninit was created at:
kmsan_save_stack_with_flags mm/kmsan/kmsan.c:246 [inline] kmsan_internal_poison_shadow+0x6d/0x130 mm/kmsan/kmsan.c:170 kmsan_kmalloc+0xa1/0x100 mm/kmsan/kmsan_hooks.c:186 __kmalloc+0x14c/0x4d0 mm/slub.c:3825 kmalloc include/linux/slab.h:551 [inline] __hw_addr_create_ex net/core/dev_addr_lists.c:34 [inline] __hw_addr_add_ex net/core/dev_addr_lists.c:80 [inline] __dev_mc_add+0x357/0x8a0 net/core/dev_addr_lists.c:670 dev_mc_add+0x6d/0x80 net/core/dev_addr_lists.c:687 ip_mc_filter_add net/ipv4/igmp.c:1128 [inline] igmp_group_added+0x4d4/0xb80 net/ipv4/igmp.c:1311 __ip_mc_inc_group+0xea9/0xf70 net/ipv4/igmp.c:1444 ip_mc_inc_group net/ipv4/igmp.c:1453 [inline] ip_mc_up+0x1c3/0x400 net/ipv4/igmp.c:1775 inetdev_event+0x1d03/0x1d80 net/ipv4/devinet.c:1522 notifier_call_chain kernel/notifier.c:93 [inline] __raw_notifier_call_chain kernel/notifier.c:394 [inline] raw_notifier_call_chain+0x13d/0x240 kernel/notifier.c:401 __dev_notify_flags+0x3da/0x860 net/core/dev.c:1733 dev_change_flags+0x1ac/0x230 net/core/dev.c:7569 do_setlink+0x165f/0x5ea0 net/core/rtnetlink.c:2492 rtnl_newlink+0x2ad7/0x35a0 net/core/rtnetlink.c:3111 rtnetlink_rcv_msg+0x1148/0x1540 net/core/rtnetlink.c:4947 netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2477 rtnetlink_rcv+0x50/0x60 net/core/rtnetlink.c:4965 netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline] netlink_unicast+0x1699/0x1740 net/netlink/af_netlink.c:1336 netlink_sendmsg+0x13c7/0x1440 net/netlink/af_netlink.c:1917 sock_sendmsg_nosec net/socket.c:621 [inline] sock_sendmsg net/socket.c:631 [inline] ___sys_sendmsg+0xe3b/0x1240 net/socket.c:2116 __sys_sendmsg net/socket.c:2154 [inline] __do_sys_sendmsg net/socket.c:2163 [inline] __se_sys_sendmsg+0x305/0x460 net/socket.c:2161 __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161 do_syscall_64+0xcf/0x110 arch/x86/entry/common.c:291 entry_SYSCALL_64_after_hwframe+0x63/0xe7
Bytes 36-37 of 105 are uninitialized
Memory access of size 105 starts at ffff88819686c000 Data copied to user address 0000000020000380
--- net/core/rtnetlink.c | 3 +++ 1 file changed, 3 insertions(+)
net/core/rtnetlink.c +3 -0
@@ -3730,6 +3730,9 @@ int ndo_dflt_fdb_dump(struct sk_buff *sk {int err; +if (dev->type !=ARPHRD_ETHER ) +return -EINVAL ; +netif_addr_lock_bh (dev); err =nlmsg_populate_fdb (skb, cb, dev, idx, &dev->uc);if (err)
Greg Kroah-Hartman
maintainerPATCH 13/142 sctp: kfree_rcu asoc
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit fb6df5a6234c38a9c551559506a49a677ac6f07a ]
In sctp_hash_transport/sctp_epaddr_lookup_transport, it dereferences a transport's asoc under rcu_read_lock while asoc is freed not after a grace period, which leads to a use-after-free panic.
This patch fixes it by calling kfree_rcu to make asoc be freed after a grace period.
Note that only the asoc's memory is delayed to free in the patch, it won't cause sk to linger longer.
Thanks Neil and Marcelo to make this clear.
--- include/net/sctp/structs.h | 2 ++ net/sctp/associola.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-)
include/net/sctp/structs.h +2 -0
@@ -2075,6 +2075,8 @@ struct sctp_association {__u64 abandoned_unsent[SCTP_PR_INDEX (MAX ) +1 ];__u64 abandoned_sent[SCTP_PR_INDEX (MAX ) +1 ]; + +struct rcu_head rcu; };
net/sctp/associola.c +1 -1
@@ -434,7 +434,7 @@ static void sctp_association_destroy(strWARN_ON (atomic_read (&asoc->rmem_alloc)); -kfree (asoc); +kfree_rcu (asoc, rcu);SCTP_DBG_OBJCNT_DEC (assoc); }
Greg Kroah-Hartman
maintainerPATCH 17/142 virtio-net: keep vnet header zeroed after processing XDP
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
[ Upstream commit 436c9453a1ac0944b82870ef2e0d9be956b396d9 ]
We copy vnet header unconditionally in page_to_skb() this is wrong since XDP may modify the packet data. So let's keep a zeroed vnet header for not confusing the conversion between vnet header and skb metadata.
In the future, we should able to detect whether or not the packet was modified and keep using the vnet header when packet was not touched.
--- drivers/net/virtio_net.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/virtio_net.c +9 -5
@@ -365,7 +365,8 @@ static unsigned int mergeable_ctx_to_trustatic struct sk_buff *page_to_skb (struct virtnet_info *vi,struct receive_queue *rq,struct page *page,unsigned int offset, -unsigned int len,unsigned int truesize) +unsigned int len,unsigned int truesize, +bool hdr_valid) {struct sk_buff *skb;struct virtio_net_hdr_mrg_rxbuf *hdr;
@@ -387,7 +388,8 @@ static struct sk_buff *page_to_skb(strucelse hdr_padded_len =sizeof (struct padded_vnet_hdr ); -memcpy (hdr, p, hdr_len); +if (hdr_valid) +memcpy (hdr, p, hdr_len); len -= hdr_len; offset += hdr_padded_len;
@@ -739,7 +741,8 @@ static struct sk_buff *receive_big(struc struct virtnet_rq_stats *stats) {struct page *page = buf; -struct sk_buff *skb =page_to_skb (vi, rq, page,0 , len,PAGE_SIZE ); +struct sk_buff *skb =page_to_skb (vi, rq, page,0 , len, +PAGE_SIZE , true); stats->bytes += len - vi->hdr_len;if (unlikely (!skb))
@@ -842,7 +845,8 @@ static struct sk_buff *receive_mergeablercu_read_unlock ();put_page (page); head_skb =page_to_skb (vi, rq, xdp_page, - offset, len,PAGE_SIZE ); + offset, len, +PAGE_SIZE , false);return head_skb; }break ;
@@ -898,7 +902,7 @@ static struct sk_buff *receive_mergeable goto err_skb; } - head_skb =page_to_skb (vi, rq, page, offset, len, truesize); + head_skb =page_to_skb (vi, rq, page, offset, len, truesize, !xdp_prog); curr_skb = head_skb;if (unlikely (!curr_skb))
Greg Kroah-Hartman
maintainerPATCH 19/142 sctp: update frag_point when stream_interleave is set
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 4135cce7fd0a0d755665c02728578c7c5afe4726 ]
sctp_assoc_update_frag_point() should be called whenever asoc->pathmtu changes, but we missed one place in sctp_association_init(). It would cause frag_point is zero when sending data.
As says in Jakub's reproducer, if sp->pathmtu is set by socketopt, the new asoc->pathmtu inherits it in sctp_association_init(). Later when transports are added and their pmtu >= asoc->pathmtu, it will never call sctp_assoc_update_frag_point() to set frag_point.
This patch is to fix it by updating frag_point after asoc->pathmtu is set as sp->pathmtu in sctp_association_init(). Note that it moved them after sctp_stream_init(), as stream->si needs to be set first.
Frag_point's calculation is also related with datachunk's type, so it needs to update frag_point when stream->si may be changed in sctp_process_init().
v1->v2:
- call sctp_assoc_update_frag_point() separately in sctp_process_init and sctp_association_init, per Marcelo's suggestion.
--- net/sctp/associola.c | 7 ++++--- net/sctp/sm_make_chunk.c | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-)
net/sctp/associola.c +4 -3
@@ -118,9 +118,6 @@ static struct sctp_association *sctp_ass asoc->flowlabel = sp->flowlabel; asoc->dscp = sp->dscp; -/* Initialize default path MTU. */ - asoc->pathmtu = sp->pathmtu; -/* Set association default SACK delay */ asoc->sackdelay =msecs_to_jiffies (sp->sackdelay); asoc->sackfreq = sp->sackfreq;
@@ -252,6 +249,10 @@ static struct sctp_association *sctp_ass 0, gfp)) goto fail_init; +/* Initialize default path MTU. */ + asoc->pathmtu = sp->pathmtu; +sctp_assoc_update_frag_point (asoc); +/* Assume that peer would support both address types unless we are * told otherwise. */
net/sctp/sm_make_chunk.c +3 -0
@@ -2462,6 +2462,9 @@ int sctp_process_init(struct sctp_associ asoc->c.sinit_max_instreams, gfp)) goto clean_up; +/* Update frag_point when stream_interleave may get changed. */ +sctp_assoc_update_frag_point (asoc); +if (!asoc->temp &&sctp_assoc_set_id (asoc, gfp)) goto clean_up;
Greg Kroah-Hartman
maintainerPATCH 22/142 ARM: OMAP2+: prm44xx: Fix section annotation on omap44xx_prm_enable_io_wakeup
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit eef3dc34a1e0b01d53328b88c25237bcc7323777 ]
When building the kernel with Clang, the following section mismatch warning appears:
WARNING: vmlinux.o(.text+0x38b3c): Section mismatch in reference from the function omap44xx_prm_late_init() to the function .init.text:omap44xx_prm_enable_io_wakeup()
The function omap44xx_prm_late_init() references
the function __init omap44xx_prm_enable_io_wakeup().
This is often because omap44xx_prm_late_init lacks a __init annotation or the annotation of omap44xx_prm_enable_io_wakeup is wrong.
Remove the __init annotation from omap44xx_prm_enable_io_wakeup so there is no more mismatch.
--- arch/arm/mach-omap2/prm44xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-omap2/prm44xx.c +1 -1
@@ -351,7 +351,7 @@ static void omap44xx_prm_reconfigure_io_chain(void)* to occur, WAKEUPENABLE bits must be set in the pad mux registers, and * omap44xx_prm_reconfigure_io_chain() must be called. No return value. */ -static void __init omap44xx_prm_enable_io_wakeup (void ) +static void omap44xx_prm_enable_io_wakeup (void ) {s32 inst =omap4_prmst_get_prm_dev_inst ();
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 23/142 ASoC: rsnd: fixup clock start checker
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3ee9a76a8c5a10e1bfb04b81db767c6d562ddaf3 ]
commit 4d230d12710646 ("ASoC: rsnd: fixup not to call clk_get/set under non-atomic") fixuped clock start timing. But it exchanged clock start checker from ssi->usrcnt to ssi->rate.
Current rsnd_ssi_master_clk_start() is called from .prepare, but some player (for example GStreamer) might calls it many times. In such case, the checker might returns error even though it was not error. It should check ssi->usrcnt instead of ssi->rate. This patch fixup it. Without this patch, GStreamer can't switch 48kHz / 44.1kHz.
--- sound/soc/sh/rcar/ssi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/sh/rcar/ssi.c +1 -1
@@ -283,7 +283,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,if (rsnd_ssi_is_multi_slave (mod, io))return 0 ; -if (ssi->rate) { +if (ssi->usrcnt >1 ) {if (ssi->rate != rate) {dev_err (dev,"SSI parent/child should use same rate\n" );return -EINVAL ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 24/142 ASoC: qdsp6: q6afe: Fix wrong MI2S SD line mask
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 112b57fa737445b2361be332ce8cc0fd3e2b994e ]
SD line mask for MI2S starts from BIT 0 instead of BIT 1. Fix all bit mask for MI2S SD lines.
--- sound/soc/qcom/qdsp6/q6afe.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
sound/soc/qcom/qdsp6/q6afe.c +8 -8
@@ -49,14 +49,14 @@#define AFE_PORT_I2S_SD1 0x2#define AFE_PORT_I2S_SD2 0x3#define AFE_PORT_I2S_SD3 0x4 -#define AFE_PORT_I2S_SD0_MASK BIT(0x1) -#define AFE_PORT_I2S_SD1_MASK BIT(0x2) -#define AFE_PORT_I2S_SD2_MASK BIT(0x3) -#define AFE_PORT_I2S_SD3_MASK BIT(0x4) -#define AFE_PORT_I2S_SD0_1_MASK GENMASK(2, 1) -#define AFE_PORT_I2S_SD2_3_MASK GENMASK(4, 3) -#define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(3, 1) -#define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(4, 1) +#define AFE_PORT_I2S_SD0_MASK BIT(0x0) +#define AFE_PORT_I2S_SD1_MASK BIT(0x1) +#define AFE_PORT_I2S_SD2_MASK BIT(0x2) +#define AFE_PORT_I2S_SD3_MASK BIT(0x3) +#define AFE_PORT_I2S_SD0_1_MASK GENMASK(1, 0) +#define AFE_PORT_I2S_SD2_3_MASK GENMASK(3, 2) +#define AFE_PORT_I2S_SD0_1_2_MASK GENMASK(2, 0) +#define AFE_PORT_I2S_SD0_1_2_3_MASK GENMASK(3, 0)#define AFE_PORT_I2S_QUAD01 0x5#define AFE_PORT_I2S_QUAD23 0x6#define AFE_PORT_I2S_6CHS 0x7
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 25/142 ASoC: qdsp6: q6afe-dai: Fix the dai widgets
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e14856f6cfbb1b96aa45a68f188b147b5bde76b4 ]
For some reason the dapm widgets are incorrectly defined from the start, Not sure how we ended up with such thing. Fix them now!
Without this fix the backend dais are always powered up even if there is no active stream.
--- sound/soc/qcom/qdsp6/q6afe-dai.c | 208 +++++++++++++++---------------- 1 file changed, 104 insertions(+), 104 deletions(-)
sound/soc/qcom/qdsp6/q6afe-dai.c +104 -104
@@ -1112,204 +1112,204 @@ static int q6afe_of_xlate_dai_name(struct snd_soc_component *component, }static const struct snd_soc_dapm_widget q6afe_dai_widgets[] = { -SND_SOC_DAPM_AIF_OUT ("HDMI_RX" ,"HDMI Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_0_RX" ,"Slimbus Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_1_RX" ,"Slimbus1 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_2_RX" ,"Slimbus2 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_3_RX" ,"Slimbus3 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_4_RX" ,"Slimbus4 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_5_RX" ,"Slimbus5 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SLIMBUS_6_RX" ,"Slimbus6 Playback" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_0_TX" ,"Slimbus Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_1_TX" ,"Slimbus1 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_2_TX" ,"Slimbus2 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_3_TX" ,"Slimbus3 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_4_TX" ,"Slimbus4 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_5_TX" ,"Slimbus5 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SLIMBUS_6_TX" ,"Slimbus6 Capture" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_MI2S_RX" ,"Quaternary MI2S Playback" , +SND_SOC_DAPM_AIF_IN ("HDMI_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_0_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_1_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_2_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_3_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_4_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_5_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("SLIMBUS_6_RX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_0_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_1_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_2_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_3_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_4_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_5_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_OUT ("SLIMBUS_6_TX" ,NULL ,0 ,0 ,0 ,0 ), +SND_SOC_DAPM_AIF_IN ("QUAT_MI2S_RX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_MI2S_TX" ,"Quaternary MI2S Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_MI2S_TX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_MI2S_RX" ,"Tertiary MI2S Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_MI2S_RX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_MI2S_TX" ,"Tertiary MI2S Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_MI2S_TX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_MI2S_RX" ,"Secondary MI2S Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_MI2S_RX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_MI2S_TX" ,"Secondary MI2S Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_MI2S_TX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_MI2S_RX_SD1" , +SND_SOC_DAPM_AIF_IN ("SEC_MI2S_RX_SD1" ,"Secondary MI2S Playback SD1" ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRI_MI2S_RX" ,"Primary MI2S Playback" , +SND_SOC_DAPM_AIF_IN ("PRI_MI2S_RX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRI_MI2S_TX" ,"Primary MI2S Capture" , +SND_SOC_DAPM_AIF_OUT ("PRI_MI2S_TX" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_0" ,"Primary TDM0 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_1" ,"Primary TDM1 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_2" ,"Primary TDM2 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_3" ,"Primary TDM3 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_4" ,"Primary TDM4 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_5" ,"Primary TDM5 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_6" ,"Primary TDM6 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_RX_7" ,"Primary TDM7 Playback" , +SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_RX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_0" ,"Primary TDM0 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_1" ,"Primary TDM1 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_2" ,"Primary TDM2 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_3" ,"Primary TDM3 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_4" ,"Primary TDM4 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_5" ,"Primary TDM5 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_6" ,"Primary TDM6 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("PRIMARY_TDM_TX_7" ,"Primary TDM7 Capture" , +SND_SOC_DAPM_AIF_OUT ("PRIMARY_TDM_TX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_0" ,"Secondary TDM0 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_1" ,"Secondary TDM1 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_2" ,"Secondary TDM2 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_3" ,"Secondary TDM3 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_4" ,"Secondary TDM4 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_5" ,"Secondary TDM5 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_6" ,"Secondary TDM6 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("SEC_TDM_RX_7" ,"Secondary TDM7 Playback" , +SND_SOC_DAPM_AIF_IN ("SEC_TDM_RX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_0" ,"Secondary TDM0 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_1" ,"Secondary TDM1 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_2" ,"Secondary TDM2 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_3" ,"Secondary TDM3 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_4" ,"Secondary TDM4 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_5" ,"Secondary TDM5 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_6" ,"Secondary TDM6 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("SEC_TDM_TX_7" ,"Secondary TDM7 Capture" , +SND_SOC_DAPM_AIF_OUT ("SEC_TDM_TX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_0" ,"Tertiary TDM0 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_1" ,"Tertiary TDM1 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_2" ,"Tertiary TDM2 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_3" ,"Tertiary TDM3 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_4" ,"Tertiary TDM4 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_5" ,"Tertiary TDM5 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_6" ,"Tertiary TDM6 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("TERT_TDM_RX_7" ,"Tertiary TDM7 Playback" , +SND_SOC_DAPM_AIF_IN ("TERT_TDM_RX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_0" ,"Tertiary TDM0 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_1" ,"Tertiary TDM1 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_2" ,"Tertiary TDM2 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_3" ,"Tertiary TDM3 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_4" ,"Tertiary TDM4 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_5" ,"Tertiary TDM5 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_6" ,"Tertiary TDM6 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("TERT_TDM_TX_7" ,"Tertiary TDM7 Capture" , +SND_SOC_DAPM_AIF_OUT ("TERT_TDM_TX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_0" ,"Quaternary TDM0 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_1" ,"Quaternary TDM1 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_2" ,"Quaternary TDM2 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_3" ,"Quaternary TDM3 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_4" ,"Quaternary TDM4 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_5" ,"Quaternary TDM5 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_6" ,"Quaternary TDM6 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_RX_7" ,"Quaternary TDM7 Playback" , +SND_SOC_DAPM_AIF_IN ("QUAT_TDM_RX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_0" ,"Quaternary TDM0 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_1" ,"Quaternary TDM1 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_2" ,"Quaternary TDM2 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_3" ,"Quaternary TDM3 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_4" ,"Quaternary TDM4 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_5" ,"Quaternary TDM5 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_6" ,"Quaternary TDM6 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUAT_TDM_TX_7" ,"Quaternary TDM7 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUAT_TDM_TX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_0" ,"Quinary TDM0 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_1" ,"Quinary TDM1 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_2" ,"Quinary TDM2 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_3" ,"Quinary TDM3 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_4" ,"Quinary TDM4 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_5" ,"Quinary TDM5 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_6" ,"Quinary TDM6 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_RX_7" ,"Quinary TDM7 Playback" , +SND_SOC_DAPM_AIF_IN ("QUIN_TDM_RX_7" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_0" ,"Quinary TDM0 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_0" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_1" ,"Quinary TDM1 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_1" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_2" ,"Quinary TDM2 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_2" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_3" ,"Quinary TDM3 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_3" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_4" ,"Quinary TDM4 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_4" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_5" ,"Quinary TDM5 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_5" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_6" ,"Quinary TDM6 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_6" ,NULL ,0 ,0 ,0 ,0 ), -SND_SOC_DAPM_AIF_IN ("QUIN_TDM_TX_7" ,"Quinary TDM7 Capture" , +SND_SOC_DAPM_AIF_OUT ("QUIN_TDM_TX_7" ,NULL ,0 ,0 ,0 ,0 ), };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 26/142 staging: rtl8723bs: Fix the return value in case of error in rtw_wx_read32()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c3e43d8b958bd6849817393483e805d8638a8ab7 ]
We return 0 unconditionally in 'rtw_wx_read32()'.
However, 'ret' is set to some error codes in several error handling paths.
Return 'ret' instead to propagate the error code.
--- drivers/staging/rtl8723bs/os_dep/ioctl_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/rtl8723bs/os_dep/ioctl_linux.c +1 -1
@@ -2289,7 +2289,7 @@ static int rtw_wx_read32(struct net_device *dev, exit:kfree (ptmp); -return 0 ; +return ret; } static int rtw_wx_write32(struct net_device *dev,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 27/142 ARM: dts: am3517: Fix pinmuxing for CD on MMC1
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e7f4ffffa972db4820c23ff9831a6a4f3f6d8cc5 ]
The MMC1 is active low, not active high. For some reason, this worked with different combination of U-Boot and kernels, but it's supposed to be active low and is currently broken.
WP for MMC1") #kernel 4.18+
--- arch/arm/boot/dts/am3517-evm.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/am3517-evm.dts +1 -1
@@ -227,7 +227,7 @@ vmmc-supply = <&vmmc_fixed>; bus-width = <4>; wp-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>; /* gpio_126 */ - cd-gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>; /* gpio_127 */ + cd-gpios = <&gpio4 31 GPIO_ACTIVE_LOW>; /* gpio_127 */ }; &mmc3 {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 28/142 ARM: dts: LogicPD Torpedo: Fix mmc3_dat1 interrupt
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6809564d64ff1301d44c13334cc0e8369e825a20 ]
When the Torpedo was first introduced back at Kernel 4.2, the interrupt extended flag has been set incorrectly.
It was subsequently moved, so this patch corrects Kernel 4.18+
logicpd-torpedo-37xx-devkit") # v4.18+
--- arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/logicpd-torpedo-37xx-devkit.dts +1 -1
@@ -35,7 +35,7 @@ * jumpering combinations for the long run. */ &mmc3 { - interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>; + interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>; pinctrl-0 = <&mmc3_pins &mmc3_core2_pins>; pinctrl-names = "default"; vmmc-supply = <&wl12xx_vmmc>;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 29/142 ARM: dts: logicpd-somlv: Fix interrupt on mmc3_dat1
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3d8b804bc528d3720ec0c39c212af92dafaf6e84 ]
The interrupt on mmc3_dat1 is wrong which prevents this from appearing in /proc/interrupts.
DM3730 SOM-LV") #Kernel 4.9+
--- arch/arm/boot/dts/logicpd-som-lv.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/logicpd-som-lv.dtsi +1 -1
@@ -129,7 +129,7 @@ }; &mmc3 { - interrupts-extended = <&intc 94 &omap3_pmx_core2 0x46>; + interrupts-extended = <&intc 94 &omap3_pmx_core 0x136>; pinctrl-0 = <&mmc3_pins &wl127x_gpio>; pinctrl-names = "default"; vmmc-supply = <&wl12xx_vmmc>;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 30/142 ARM: dts: am3517-som: Fix WL127x Wifi interrupt
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 419b194cdedc76d0d3cd5b0900db0fa8177c4a52 ]
At the same time the AM3517 EVM was gaining WiFi support, separate patches were introduced to move the interrupt from HIGH to RISING. Because they overlapped, this was not done to the AM3517-EVM. This patch fixes Kernel 4.19+
--- arch/arm/boot/dts/am3517-som.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/am3517-som.dtsi +1 -1
@@ -163,7 +163,7 @@ compatible = "ti,wl1271"; reg = <2>; interrupt-parent = <&gpio6>; - interrupts = <10 IRQ_TYPE_LEVEL_HIGH>; /* gpio_170 */ + interrupts = <10 IRQ_TYPE_EDGE_RISING>; /* gpio_170 */ ref-clock-frequency = <26000000>; tcxo-clock-frequency = <26000000>; };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 31/142 ARM: OMAP1: ams-delta: Fix possible use of uninitialized field
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit cec83ff1241ec98113a19385ea9e9cfa9aa4125b ]
While playing with initialization order of modem device, it has been discovered that under some circumstances (early console init, I believe) its .pm() callback may be called before the uart_port->private_data pointer is initialized from plat_serial8250_port->private_data, resulting in NULL pointer dereference. Fix it by checking for uninitialized pointer before using it in modem_pm().
--- arch/arm/mach-omap1/board-ams-delta.c | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/mach-omap1/board-ams-delta.c +3 -0
@@ -726,6 +726,9 @@ static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)struct modem_private_data *priv = port->private_data;int ret; +if (!priv) +return ; +if (IS_ERR (priv->regulator))return ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 32/142 tools: bpftool: prevent infinite loop in get_fdinfo()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 53909030aa29bffe1f8490df62176c2375135652 ]
Function getline() returns -1 on failure to read a line, thus creating an infinite loop in get_fdinfo() if the key is not found. Fix it by calling the function only as long as we get a strictly positive return value.
Found by copying the code for a key which is not always present...
--- tools/bpf/bpftool/common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/bpf/bpftool/common.c +1 -1
@@ -304,7 +304,7 @@ char *get_fdinfo(int fd, const char *key)return NULL ; } -while ((n =getline (&line, &line_n, fdi))) { +while ((n =getline (&line, &line_n, fdi)) >0 ) {char *value;int len;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 33/142 ASoC: sun8i-codec: fix crash on module removal
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 278df5e5527b633f4882f1680ad58b62a7c07bfe ]
drvdata is actually sun8i_codec, not snd_soc_card, so it crashes when calling snd_soc_card_get_drvdata().
Drop card and scodec vars anyway since we don't need to disable/unprepare clocks - it's already done by calling runtime_suspend()
Drop clk_disable_unprepare() calls for the same reason.
--- sound/soc/sunxi/sun8i-codec.c | 6 ------ 1 file changed, 6 deletions(-)
sound/soc/sunxi/sun8i-codec.c +0 -6
@@ -589,16 +589,10 @@ static int sun8i_codec_probe(struct platform_device *pdev)static int sun8i_codec_remove (struct platform_device *pdev) { -struct snd_soc_card *card =platform_get_drvdata (pdev); -struct sun8i_codec *scodec =snd_soc_card_get_drvdata (card); -pm_runtime_disable (&pdev->dev);if (!pm_runtime_status_suspended (&pdev->dev))sun8i_codec_runtime_suspend (&pdev->dev); -clk_disable_unprepare (scodec->clk_module); -clk_disable_unprepare (scodec->clk_bus); -return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 34/142 arm64: dts: sdm845-mtp: Reserve reserved gpios
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5f8d3ab136d0ccb59c4d628d8f85e0d8f2761d07 ]
With the introduction of commit 3edfb7bd76bd ("gpiolib: Show correct direction from the beginning") the gpiolib will attempt to read the direction of all pins, which triggers a read from protected register regions.
The pins 0 through 3 and 81 through 84 are protected, so mark these as reserved.
--- arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm64/boot/dts/qcom/sdm845-mtp.dts +4 -0
@@ -31,6 +31,10 @@ status = "okay"; }; +&tlmm { + gpio-reserved-ranges = <0 4>, <81 4>; +}; + &uart9 { status = "okay"; };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 35/142 sysv: return err instead of 0 in __sysv_write_inode
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c4b7d1ba7d263b74bb72e9325262a67139605cde ]
Fixes gcc '-Wunused-but-set-variable' warning:
fs/sysv/inode.c: In function '__sysv_write_inode':fs/sysv/inode.c:239:6: warning:
variable 'err' set but not used [-Wunused-but-set-variable]
__sysv_write_inode should return 'err' instead of 0
--- fs/sysv/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/sysv/inode.c +1 -1
@@ -275,7 +275,7 @@ static int __sysv_write_inode(struct inode *inode, int wait) } }brelse (bh); -return 0 ; +return err; }int sysv_write_inode (struct inode *inode,struct writeback_control *wbc)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 36/142 netfilter: nf_conncount: use spin_lock_bh instead of spin_lock
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fd3e71a9f71e232181a225301a75936373636ccc ]
conn_free() holds lock with spin_lock() and it is called by both nf_conncount_lookup() and nf_conncount_gc_list(). nf_conncount_lookup() is called from bottom-half context and nf_conncount_gc_list() from process context. So that spin_lock() call is not safe. Hence conn_free() should use spin_lock_bh() instead of spin_lock().
test commands:
%nft add table ip filter
%nft add chain ip filter input { type filter hook input priority 0\; } %nft add rule filter input meter test { ip saddr ct count over 2 } \
counter
splat looks like:
[ 461.996507] ================================
[ 461.998999] WARNING: inconsistent lock state
[ 461.998999] 4.19.0-rc6+ #22 Not tainted
[ 461.998999] --------------------------------
[ 461.998999] inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage.
[ 461.998999] kworker/0:2/134 [HC0[0]:SC0[0]:HE1:SE1] takes:
[ 461.998999] 00000000a71a559a (&(&list->list_lock)->rlock){+.?.}, at: conn_free+0x69/0x2b0 [nf_conncount]
[ 461.998999] {IN-SOFTIRQ-W} state was registered at:
[ 461.998999] _raw_spin_lock+0x30/0x70
[ 461.998999] nf_conncount_add+0x28a/0x520 [nf_conncount]
[ 461.998999] nft_connlimit_eval+0x401/0x580 [nft_connlimit]
[ 461.998999] nft_dynset_eval+0x32b/0x590 [nf_tables]
[ 461.998999] nft_do_chain+0x497/0x1430 [nf_tables]
[ 461.998999] nft_do_chain_ipv4+0x255/0x330 [nf_tables]
[ 461.998999] nf_hook_slow+0xb1/0x160
[ ... ]
[ 461.998999] other info that might help us debug this:
[ 461.998999] Possible unsafe locking scenario:
[ 461.998999]
[ 461.998999] CPU0
[ 461.998999] ----
[ 461.998999] lock(&(&list->list_lock)->rlock);
[ 461.998999] <Interrupt>
[ 461.998999] lock(&(&list->list_lock)->rlock);
[ 461.998999]
[ 461.998999] *** DEADLOCK ***
[ 461.998999][ ... ]
--- net/netfilter/nf_conncount.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/netfilter/nf_conncount.c +6 -6
@@ -106,15 +106,15 @@ nf_conncount_add(struct nf_conncount_list *list, conn->zone = *zone; conn->cpu =raw_smp_processor_id (); conn->jiffies32 = (u32 )jiffies; -spin_lock (&list->list_lock); +spin_lock_bh (&list->list_lock);if (list->dead == true) {kmem_cache_free (conncount_conn_cachep, conn); -spin_unlock (&list->list_lock); +spin_unlock_bh (&list->list_lock);return NF_CONNCOUNT_SKIP ; }list_add_tail (&conn->node, &list->head); list->count++; -spin_unlock (&list->list_lock); +spin_unlock_bh (&list->list_lock);return NF_CONNCOUNT_ADDED ; }EXPORT_SYMBOL_GPL (nf_conncount_add);
@@ -132,10 +132,10 @@ static bool conn_free(struct nf_conncount_list *list, {bool free_entry = false; -spin_lock (&list->list_lock); +spin_lock_bh (&list->list_lock);if (list->count ==0 ) { -spin_unlock (&list->list_lock); +spin_unlock_bh (&list->list_lock);return free_entry; }
@@ -144,7 +144,7 @@ static bool conn_free(struct nf_conncount_list *list,if (list->count ==0 ) free_entry = true; -spin_unlock (&list->list_lock); +spin_unlock_bh (&list->list_lock);call_rcu (&conn->rcu_head, __conn_free);return free_entry; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 37/142 netfilter: nf_conncount: fix list_del corruption in conn_free
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31568ec09ea02a050249921698c9729419539cce ]
nf_conncount_tuple is an element of nft_connlimit and that is deleted by conn_free(). Elements can be deleted by both GC routine and data path functions (nf_conncount_lookup, nf_conncount_add) and they call conn_free() to free elements. But conn_free() only protects lists, not each element. So that list_del corruption could occurred.
The conn_free() doesn't check whether element is already deleted. In order to protect elements, dead flag is added. If an element is deleted, dead flag is set. The only conn_free() can delete elements so that both list lock and dead flag are enough to protect it.
test commands:
%nft add table ip filter
%nft add chain ip filter input { type filter hook input priority 0\; } %nft add rule filter input meter test { ip id ct count over 2 } counter
splat looks like:
[ 1779.495778] list_del corruption, ffff8800b6e12008->prev is LIST_POISON2 (dead000000000200) [ 1779.505453] ------------[ cut here ]------------ [ 1779.506260] kernel BUG at lib/list_debug.c:50! [ 1779.515831] invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN PTI [ 1779.516772] CPU: 0 PID: 33 Comm: kworker/0:2 Not tainted 4.19.0-rc6+ #22 [ 1779.516772] Workqueue: events_power_efficient nft_rhash_gc [nf_tables_set] [ 1779.516772] RIP: 0010:__list_del_entry_valid+0xd8/0x150 [ 1779.516772] Code: 39 48 83 c4 08 b8 01 00 00 00 5b 5d c3 48 89 ea 48 c7 c7 00 c3 5b 98 e8 0f dc 40 ff 0f 0b 48 c7 c7 60 c3 5b 98 e8 01 dc 40 ff <0f> 0b 48 c7 c7 c0 c3 5b 98 e8 f3 db 40 ff 0f 0b 48 c7 c7 20 c4 5b [ 1779.516772] RSP: 0018:ffff880119127420 EFLAGS: 00010286 [ 1779.516772] RAX: 000000000000004e RBX: dead000000000200 RCX: 0000000000000000 [ 1779.516772] RDX: 000000000000004e RSI: 0000000000000008 RDI: ffffed0023224e7a [ 1779.516772] RBP: ffff88011934bc10 R08: ffffed002367cea9 R09: ffffed002367cea9 [ 1779.516772] R10: 0000000000000001 R11: ffffed002367cea8 R12: ffff8800b6e12008 [ 1779.516772] R13: ffff8800b6e12010 R14: ffff88011934bc20 R15: ffff8800b6e12008 [ 1779.516772] FS: 0000000000000000(0000) GS:ffff88011b200000(0000) knlGS:0000000000000000 [ 1779.516772] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1779.516772] CR2: 00007fc876534010 CR3: 000000010da16000 CR4: 00000000001006f0 [ 1779.516772] Call Trace: [ 1779.516772] conn_free+0x9f/0x2b0 [nf_conncount] [ 1779.516772] ? nf_ct_tmpl_alloc+0x2a0/0x2a0 [nf_conntrack] [ 1779.516772] ? nf_conncount_add+0x520/0x520 [nf_conncount] [ 1779.516772] ? do_raw_spin_trylock+0x1a0/0x1a0 [ 1779.516772] ? do_raw_spin_trylock+0x10/0x1a0 [ 1779.516772] find_or_evict+0xe5/0x150 [nf_conncount] [ 1779.516772] nf_conncount_gc_list+0x162/0x360 [nf_conncount] [ 1779.516772] ? nf_conncount_lookup+0xee0/0xee0 [nf_conncount] [ 1779.516772] ? _raw_spin_unlock_irqrestore+0x45/0x50 [ 1779.516772] ? trace_hardirqs_off+0x6b/0x220 [ 1779.516772] ? trace_hardirqs_on_caller+0x220/0x220 [ 1779.516772] nft_rhash_gc+0x16b/0x540 [nf_tables_set]
[ ... ]
--- net/netfilter/nf_conncount.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/netfilter/nf_conncount.c +5 -2
@@ -49,6 +49,7 @@ struct nf_conncount_tuple {struct nf_conntrack_zone zone;int cpu;u32 jiffies32; +bool dead;struct rcu_head rcu_head; };
@@ -106,6 +107,7 @@ nf_conncount_add(struct nf_conncount_list *list, conn->zone = *zone; conn->cpu =raw_smp_processor_id (); conn->jiffies32 = (u32 )jiffies; + conn->dead = false;spin_lock_bh (&list->list_lock);if (list->dead == true) {kmem_cache_free (conncount_conn_cachep, conn);
@@ -134,12 +136,13 @@ static bool conn_free(struct nf_conncount_list *list,spin_lock_bh (&list->list_lock); -if (list->count ==0 ) { +if (conn->dead) {spin_unlock_bh (&list->list_lock); -return free_entry; +return free_entry; } list->count--; + conn->dead = true;list_del_rcu (&conn->node);if (list->count ==0 ) free_entry = true;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 38/142 netfilter: nf_conncount: fix unexpected permanent node of list.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3c5cdb17c3be76714dfd0d03e384f70579545614 ]
When list->count is 0, the list is deleted by GC. But list->count is never reached 0 because initial count value is 1 and it is increased when node is inserted. So that initial value of list->count should be 0.
Originally GC always finds zero count list through deleting node and decreasing count. However, list may be left empty since node insertion may fail eg. allocaton problem. In order to solve this problem, GC routine also finds zero count list without deleting node.
--- net/netfilter/nf_conncount.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
net/netfilter/nf_conncount.c +15 -3
@@ -144,8 +144,10 @@ static bool conn_free(struct nf_conncount_list *list, list->count--; conn->dead = true;list_del_rcu (&conn->node); -if (list->count ==0 ) +if (list->count ==0 ) { + list->dead = true; free_entry = true; + }spin_unlock_bh (&list->list_lock);call_rcu (&conn->rcu_head, __conn_free);
@@ -248,7 +250,7 @@ void nf_conncount_list_init(struct nf_conncount_list *list) {spin_lock_init (&list->list_lock);INIT_LIST_HEAD (&list->head); - list->count =1 ; + list->count =0 ; list->dead = false; }EXPORT_SYMBOL_GPL (nf_conncount_list_init);
@@ -262,6 +264,7 @@ bool nf_conncount_gc_list(struct net *net,struct nf_conn *found_ct;unsigned int collected =0 ;bool free_entry = false; +bool ret = false;list_for_each_entry_safe (conn, conn_n, &list->head, node) { found =find_or_evict (net, list, conn, &free_entry);
@@ -291,7 +294,15 @@ bool nf_conncount_gc_list(struct net *net,if (collected >CONNCOUNT_GC_MAX_NODES )return false; } -return false; + +spin_lock_bh (&list->list_lock); +if (!list->count) { + list->dead = true; + ret = true; + } +spin_unlock_bh (&list->list_lock); + +return ret; }EXPORT_SYMBOL_GPL (nf_conncount_gc_list);
@@ -417,6 +428,7 @@ insert_tree(struct net *net,nf_conncount_list_init (&rbconn->list);list_add (&conn->node, &rbconn->list.head); count =1 ; + rbconn->list.count = count;rb_link_node (&rbconn->node, parent, rbnode);rb_insert_color (&rbconn->node, root);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 39/142 netfilter: nf_tables: dont skip inactive chains during update
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0fb39bbe43d4481fcf300d2b5822de60942fd189 ]
There is no synchronization between packet path and the configuration plane.
The packet path uses two arrays with rules, one contains the current (active) generation. The other either contains the last (obsolete) generation or the future one.
Consider:
cpu1 cpu2
nft_do_chain(c);
delete c
net->gen++;
genbit = !!net->gen;
rules = c->rg[genbit];cpu1 ignores c when updating if c is not active anymore in the new generation.
On cpu2, we now use rules from wrong generation, as c->rg[old] contains the rules matching 'c' whereas c->rg[new] was not updated and can even point to rules that have been free'd already, causing a crash.
To fix this, make sure that 'current' to the 'next' generation are identical for chains that are going away so that c->rg[new] will just use the matching rules even if genbit was incremented already.
--- net/netfilter/nf_tables_api.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
net/netfilter/nf_tables_api.c +3 -6
@@ -6277,7 +6277,7 @@ static void nf_tables_commit_chain_free_rules_old(struct nft_rule **rules)call_rcu (&old->h, __nf_tables_commit_chain_free_rules_old); } -static void nf_tables_commit_chain_active (struct net *net,struct nft_chain *chain) +static void nf_tables_commit_chain (struct net *net,struct nft_chain *chain) {struct nft_rule **g0, **g1;bool next_genbit;
@@ -6363,11 +6363,8 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)/* step 2. Make rules_gen_X visible to packet path */ list_for_each_entry (table, &net->nft.tables, list) { -list_for_each_entry (chain, &table->chains, list) { -if (!nft_is_active_next (net, chain)) -continue ; -nf_tables_commit_chain_active (net, chain); - } +list_for_each_entry (chain, &table->chains, list) +nf_tables_commit_chain (net, chain); }/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 40/142 selftests: add script to stress-test nft packet path vs. control plane
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 25d8bcedbf4329895dbaf9dd67baa6f18dad918c ]
Start flood ping for each cpu while loading/flushing rulesets to make sure we do not access already-free'd rules from nf_tables evaluation loop.
Also add this to TARGETS so 'make run_tests' in selftest dir runs it automatically.
This would have caught the bug fixed in previous change ("netfilter: nf_tables: do not skip inactive chains during generation update") sooner.
--- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/netfilter/Makefile | 6 ++ tools/testing/selftests/netfilter/config | 2 + .../selftests/netfilter/nft_trans_stress.sh | 78 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 tools/testing/selftests/netfilter/Makefile create mode 100644 tools/testing/selftests/netfilter/config create mode 100755 tools/testing/selftests/netfilter/nft_trans_stress.sh
tools/testing/selftests/Makefile +1 -0
@@ -24,6 +24,7 @@ TARGETS += memory-hotplug TARGETS += mount TARGETS += mqueue TARGETS += net +TARGETS += netfilter TARGETS += nsfs TARGETS += powerpc TARGETS += proc
tools/testing/selftests/netfilter/Makefile new file +6 -0
@@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0 +# Makefile for netfilter selftests + +TEST_PROGS := nft_trans_stress.sh + +include ../lib.mk
tools/testing/selftests/netfilter/config new file +2 -0
@@ -0,0 +1,2 @@ +CONFIG_NET_NS=y +NF_TABLES_INET=y
tools/testing/selftests/netfilter/nft_trans_stress.sh new file +78 -0
78 lines not on this page · raw message
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 41/142 perf tools: Fix crash on synthesizing the unit
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fb50c09e923870a358d68b0d58891bd145b8d7c7 ]
Adam reported a record command crash for simple session like:
$ perf record -e cpu-clock ls
with following backtrace:
Program received signal SIGSEGV, Segmentation fault.
3543 ev = event_update_event__new(size + 1, PERF_EVENT_UPDATE__UNIT, evsel->id[0]);
(gdb) bt
#0 perf_event__synthesize_event_update_unit #1 0x000000000051e469 in perf_event__synthesize_extra_attr #2 0x00000000004445cb in record__synthesize #3 0x0000000000444bc5 in __cmd_record
...
We synthesize an update event that needs to touch the evsel id array, which is not defined at that time. Fix this by forcing the id allocation for events with their unit defined.
Reflecting possible read_format ID bit in the attr tests.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=201477
--- tools/perf/tests/attr/base-record | 2 +- tools/perf/util/evsel.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/tests/attr/base-record +1 -1
@@ -9,7 +9,7 @@ size=112 config=0 sample_period=* sample_type=263 -read_format=0 +read_format=0|4 disabled=1 inherit=1 pinned=0
tools/perf/util/evsel.c +1 -1
@@ -1088,7 +1088,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts, attr->exclude_user =1 ; } -if (evsel->own_cpus) +if (evsel->own_cpus || evsel->unit) evsel->attr.read_format |=PERF_FORMAT_ID ;/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 42/142 netfilter: xt_RATEEST: remove netns exit routine
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0fbcc5b568edab7d848b7c7fa66d44ffbd4133c0 ]
xt_rateest_net_exit() was added to check whether rules are flushed successfully. but ->net_exit() callback is called earlier than ->destroy() callback.
So that ->net_exit() callback can't check that.
test commands:
%ip netns add vm1
%ip netns exec vm1 iptables -t mangle -I PREROUTING -p udp \ --dport 1111 -j RATEEST --rateest-name ap \ --rateest-interval 250ms --rateest-ewma 0.5s
%ip netns del vm1
splat looks like:
[ 668.813518] WARNING: CPU: 0 PID: 87 at net/netfilter/xt_RATEEST.c:210 xt_rateest_net_exit+0x210/0x340 [xt_RATEEST] [ 668.813518] Modules linked in: xt_RATEEST xt_tcpudp iptable_mangle bpfilter ip_tables x_tables [ 668.813518] CPU: 0 PID: 87 Comm: kworker/u4:2 Not tainted 4.19.0-rc7+ #21 [ 668.813518] Workqueue: netns cleanup_net [ 668.813518] RIP: 0010:xt_rateest_net_exit+0x210/0x340 [xt_RATEEST] [ 668.813518] Code: 00 48 8b 85 30 ff ff ff 4c 8b 23 80 38 00 0f 85 24 01 00 00 48 8b 85 30 ff ff ff 4d 85 e4 4c 89 a5 58 ff ff ff c6 00 f8 74 b2 <0f> 0b 48 83 c3 08 4c 39 f3 75 b0 48 b8 00 00 00 00 00 fc ff df 49 [ 668.813518] RSP: 0018:ffff8801156c73f8 EFLAGS: 00010282 [ 668.813518] RAX: ffffed0022ad8e85 RBX: ffff880118928e98 RCX: 5db8012a00000000 [ 668.813518] RDX: ffff8801156c7428 RSI: 00000000cb1d185f RDI: ffff880115663b74 [ 668.813518] RBP: ffff8801156c74d0 R08: ffff8801156633c0 R09: 1ffff100236440be [ 668.813518] R10: 0000000000000001 R11: ffffed002367d852 R12: ffff880115142b08 [ 668.813518] R13: 1ffff10022ad8e81 R14: ffff880118928ea8 R15: dffffc0000000000 [ 668.813518] FS: 0000000000000000(0000) GS:ffff88011b200000(0000) knlGS:0000000000000000 [ 668.813518] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 668.813518] CR2: 0000563aa69f4f28 CR3: 0000000105a16000 CR4: 00000000001006f0 [ 668.813518] Call Trace: [ 668.813518] ? unregister_netdevice_many+0xe0/0xe0 [ 668.813518] ? xt_rateest_net_init+0x2c0/0x2c0 [xt_RATEEST] [ 668.813518] ? default_device_exit+0x1ca/0x270 [ 668.813518] ? remove_proc_entry+0x1cd/0x390 [ 668.813518] ? dev_change_net_namespace+0xd00/0xd00 [ 668.813518] ? __init_waitqueue_head+0x130/0x130 [ 668.813518] ops_exit_list.isra.10+0x94/0x140 [ 668.813518] cleanup_net+0x45b/0x900 [ 668.813518] ? net_drop_ns+0x110/0x110 [ 668.813518] ? swapgs_restore_regs_and_return_to_usermode+0x3c/0x80 [ 668.813518] ? save_trace+0x300/0x300 [ 668.813518] ? lock_acquire+0x196/0x470 [ 668.813518] ? lock_acquire+0x196/0x470 [ 668.813518] ? process_one_work+0xb60/0x1de0 [ 668.813518] ? _raw_spin_unlock_irq+0x29/0x40 [ 668.813518] ? _raw_spin_unlock_irq+0x29/0x40 [ 668.813518] ? __lock_acquire+0x4500/0x4500 [ 668.813518] ? __lock_is_held+0xb4/0x140 [ 668.813518] process_one_work+0xc13/0x1de0 [ 668.813518] ? pwq_dec_nr_in_flight+0x3c0/0x3c0 [ 668.813518] ? set_load_weight+0x270/0x270
[ ... ]
--- net/netfilter/xt_RATEEST.c | 10 ---------- 1 file changed, 10 deletions(-)
net/netfilter/xt_RATEEST.c +0 -10
@@ -201,18 +201,8 @@ static __net_init int xt_rateest_net_init(struct net *net)return 0 ; } -static void __net_exit xt_rateest_net_exit(struct net *net) -{ -struct xt_rateest_net *xn =net_generic (net, xt_rateest_id); -int i; - -for (i =0 ; i <ARRAY_SIZE (xn->hash); i++) -WARN_ON_ONCE (!hlist_empty (&xn->hash[i])); -} -static struct pernet_operations xt_rateest_net_ops = { .init = xt_rateest_net_init, - .exit = xt_rateest_net_exit, .id = &xt_rateest_id, .size =sizeof (struct xt_rateest_net ), };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 43/142 netfilter: nf_tables: fix use-after-free when deleting compat expressions
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 29e3880109e357fdc607b4393f8308cef6af9413 ]
nft_compat ops do not have static storage duration, unlike all other expressions.
When nf_tables_expr_destroy() returns, expr->ops might have been free'd already, so we need to store next address before calling expression destructor.
For same reason, we can't deref match pointer after nft_xt_put().
This can be easily reproduced by adding msleep() before nft_match_destroy() returns.
--- net/netfilter/nf_tables_api.c | 5 +++-- net/netfilter/nft_compat.c | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-)
net/netfilter/nf_tables_api.c +3 -2
@@ -2432,7 +2432,7 @@ static int nf_tables_getrule(struct net *net, struct sock *nlsk,static void nf_tables_rule_destroy (const struct nft_ctx *ctx,struct nft_rule *rule) { -struct nft_expr *expr; +struct nft_expr *expr, *next;lockdep_assert_held (&ctx->net->nft.commit_mutex);/*
@@ -2441,8 +2441,9 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx,*/ expr =nft_expr_first (rule);while (expr !=nft_expr_last (rule) && expr->ops) { + next =nft_expr_next (expr);nf_tables_expr_destroy (ctx, expr); - expr =nft_expr_next (expr); + expr = next; }kfree (rule); }
net/netfilter/nft_compat.c +2 -1
@@ -501,6 +501,7 @@ __nft_match_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr, void *info) {struct xt_match *match = expr->ops->data; +struct module *me = match->me;struct xt_mtdtor_param par; par.net = ctx->net;
@@ -511,7 +512,7 @@ __nft_match_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr, par.match->destroy (&par); if (nft_xt_put(container_of(expr->ops, struct nft_xt, ops))) -module_put (match->me); +module_put (me); } static void
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 44/142 s390/cio: Fix cleanup of pfn_array alloc failure
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 806212f91c874b24cf9eb4a9f180323671b6c5ed ]
If pfn_array_alloc fails somehow, we need to release the pfn_array_table that was malloc'd earlier.
Message-Id: <[email protected]>
--- drivers/s390/cio/vfio_ccw_cp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/s390/cio/vfio_ccw_cp.c +1 -1
@@ -528,7 +528,7 @@ static int ccwchain_fetch_direct(struct ccwchain *chain, ret =pfn_array_alloc_pin (pat->pat_pa, cp->mdev, ccw->cda, ccw->count);if (ret <0 ) - goto out_init; + goto out_unpin;/* Translate this direct ccw to a idal ccw. */ idaws =kcalloc (ret,sizeof (*idaws),GFP_DMA |GFP_KERNEL );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 45/142 s390/cio: Fix cleanup when unsupported IDA format is used
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b89e242eee8d4cd8261d8d821c62c5d1efc454d0 ]
Direct returns from within a loop are rude, but it doesn't mean it gets to avoid releasing the memory acquired beforehand.
Message-Id: <[email protected]>
--- drivers/s390/cio/vfio_ccw_cp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/s390/cio/vfio_ccw_cp.c +3 -1
@@ -387,8 +387,10 @@ static int ccwchain_calc_length(u64 iova, struct channel_program *cp)* orb specified one of the unsupported formats, we defer * checking for IDAWs in unsupported formats to here. */ -if ((!cp->orb.cmd.c64 || cp->orb.cmd.i2k) &&ccw_is_idal (ccw)) +if ((!cp->orb.cmd.c64 || cp->orb.cmd.i2k) &&ccw_is_idal (ccw)) { +kfree (p);return -EOPNOTSUPP ; + }if ((!ccw_is_chain (ccw)) && (!ccw_is_tic (ccw)))break ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 46/142 hwmon (ina2xx) Fix NULL id pointer in probe()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 70df9ebbd82c794ddfbb49d45b337f18d5588dc2 ]
When using DT configurations, the id pointer might turn out to be NULL. Then the driver encounters NULL pointer access:
Unable to handle kernel read from unreadable memory at vaddr 00000018 [...] PC is at ina2xx_probe+0x114/0x200 LR is at ina2xx_probe+0x10c/0x200 [...] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
The reason is that i2c core returns the id pointer by matching id_table with client->name, while the client->name is actually using the name from the first string in the DT compatible list, not the best one. So i2c core would fail to match the id_table if the best matched compatible string isn't the first one, and then would return a NULL id pointer.
This probably should be fixed in i2c core. But it doesn't hurt to make the driver robust. So this patch fixes it by using the "chip" that's added to unify both DT and non-DT configurations.
Additionally, since id pointer could be null, so as id->name:
ina2xx 10-0047: power monitor (null) (Rshunt = 1000 uOhm) ina2xx 10-0048: power monitor (null) (Rshunt = 10000 uOhm)
So this patch also fixes NULL name pointer, using client->name to play safe and to align with hwmon->name.
--- drivers/hwmon/ina2xx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/ina2xx.c +2 -2
@@ -491,7 +491,7 @@ static int ina2xx_probe(struct i2c_client *client, } data->groups[group++] = &ina2xx_group; -if (id->driver_data == ina226) +if (chip == ina226) data->groups[group++] = &ina226_group; hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
@@ -500,7 +500,7 @@ static int ina2xx_probe(struct i2c_client *client,return PTR_ERR (hwmon_dev);dev_info (dev,"power monitor %s (Rshunt = %li uOhm)\n" , - id->name, data->rshunt); + client->name, data->rshunt);return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 47/142 hwmon: (raspberrypi) Fix initial notify
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 35fdc3902179366489a12cae4cb3ccc3b95f0afe ]
In case an under-voltage happens before probing the driver wont write the critical warning into the kernel log. So don't init of last_throttled during probe and fix this issue.
--- drivers/hwmon/raspberrypi-hwmon.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/hwmon/raspberrypi-hwmon.c +0 -6
@@ -115,7 +115,6 @@ static int rpi_hwmon_probe(struct platform_device *pdev) {struct device *dev = &pdev->dev;struct rpi_hwmon_data *data; -int ret; data =devm_kzalloc (dev,sizeof (*data),GFP_KERNEL );if (!data)
@@ -124,11 +123,6 @@ static int rpi_hwmon_probe(struct platform_device *pdev)/* Parent driver assure that firmware is correct */ data->fw =dev_get_drvdata (dev->parent); -/* Init throttled */ - ret =rpi_firmware_property (data->fw,RPI_FIRMWARE_GET_THROTTLED , - &data->last_throttled, -sizeof (data->last_throttled)); - data->hwmon_dev = devm_hwmon_device_register_with_info(dev, "rpi_volt", data, &rpi_chip_info,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 48/142 ASoC: rockchip: add missing slave_config setting for I2S
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 16a8ee4c80b45984b6de1f90a49edcf336b7c621 ]
This patch adds missing prepare_sleve_config that is needed for setup the DMA slave channel for I2S.
--- sound/soc/rockchip/rockchip_pcm.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/rockchip/rockchip_pcm.c +1 -0
@@ -32,6 +32,7 @@ static const struct snd_pcm_hardware snd_rockchip_hardware = {static const struct snd_dmaengine_pcm_config rk_dmaengine_pcm_config = { .pcm_hardware = &snd_rockchip_hardware, + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, .prealloc_buffer_size =32 *1024 , };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 49/142 ASoC: wm_adsp: Fix dma-unsafe read of scratch registers
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 20e00db2f59bdddf8a8e241473ef8be94631d3ae ]
Stack memory isn't DMA-safe so it isn't safe to use either regmap_raw_read or regmap_bulk_read to read into stack memory.
The two functions to read the scratch registers were using stack memory and regmap_raw_read. It's not worth allocating memory just for this trivial read, and it isn't time-critical. A simple regmap_read for each register is sufficient.
--- sound/soc/codecs/wm_adsp.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-)
sound/soc/codecs/wm_adsp.c +20 -17
@@ -765,38 +765,41 @@ static unsigned int wm_adsp_region_to_reg(struct wm_adsp_region const *mem,static void wm_adsp2_show_fw_status (struct wm_adsp *dsp) { -u16 scratch[4 ]; +unsigned int scratch[4 ]; +unsigned int addr = dsp->base +ADSP2_SCRATCH0 ; +unsigned int i;int ret; - ret =regmap_raw_read (dsp->regmap, dsp->base +ADSP2_SCRATCH0 , - scratch,sizeof (scratch)); -if (ret) { -adsp_err (dsp,"Failed to read SCRATCH regs: %d\n" , ret); -return ; +for (i =0 ; i <ARRAY_SIZE (scratch); ++i) { + ret =regmap_read (dsp->regmap, addr + i, &scratch[i]); +if (ret) { +adsp_err (dsp,"Failed to read SCRATCH%u: %d\n" , i, ret); +return ; + } }adsp_dbg (dsp,"FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n" , -be16_to_cpu (scratch[0 ]), -be16_to_cpu (scratch[1 ]), -be16_to_cpu (scratch[2 ]), -be16_to_cpu (scratch[3 ])); + scratch[0 ], scratch[1 ], scratch[2 ], scratch[3 ]); }static void wm_adsp2v2_show_fw_status (struct wm_adsp *dsp) { -u32 scratch[2 ]; +unsigned int scratch[2 ];int ret; - ret =regmap_raw_read (dsp->regmap, dsp->base +ADSP2V2_SCRATCH0_1 , - scratch,sizeof (scratch)); - + ret =regmap_read (dsp->regmap, dsp->base +ADSP2V2_SCRATCH0_1 , + &scratch[0 ]);if (ret) { -adsp_err (dsp,"Failed to read SCRATCH regs: %d\n" , ret); +adsp_err (dsp,"Failed to read SCRATCH0_1: %d\n" , ret);return ; } - scratch[0 ] =be32_to_cpu (scratch[0 ]); - scratch[1 ] =be32_to_cpu (scratch[1 ]); + ret =regmap_read (dsp->regmap, dsp->base +ADSP2V2_SCRATCH2_3 , + &scratch[1 ]); +if (ret) { +adsp_err (dsp,"Failed to read SCRATCH2_3: %d\n" , ret); +return ; + } adsp_dbg(dsp, "FW SCRATCH 0:0x%x 1:0x%x 2:0x%x 3:0x%x\n", scratch[0] & 0xFFFF,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 50/142 ASoC: Intel: Power down links before turning off display audio power
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4c10473d6ddf12ec124c9ff71a5d23bb5388478b ]
On certain platforms, Display HDMI HDA codec was not going to sleep state after the use when links are powered down after turning off the display power. As per the HW recommendation, links are powered down before turning off the display power to ensure that the codec goes to sleep state.
This patch was updated from an earlier version submitted upstream [1] which conflicted with the changes merged for HDaudio codec support with the Intel DSP.
[1] https://patchwork.kernel.org/patch/10540213/
--- sound/soc/codecs/hdac_hdmi.c | 11 +++++------ sound/soc/intel/skylake/skl.c | 12 ++++++------ 2 files changed, 11 insertions(+), 12 deletions(-)
sound/soc/codecs/hdac_hdmi.c +5 -6
@@ -2184,11 +2184,6 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)*/ snd_hdac_codec_read (hdev, hdev->afg,0 ,AC_VERB_SET_POWER_STATE ,AC_PWRST_D3 ); - err =snd_hdac_display_power (bus, false); -if (err <0 ) { -dev_err (dev,"Cannot turn on display power on i915\n" ); -return err; - } hlink =snd_hdac_ext_bus_get_link (bus,dev_name (dev));if (!hlink) {
@@ -2198,7 +2193,11 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)snd_hdac_ext_bus_link_put (bus, hlink); -return 0 ; + err =snd_hdac_display_power (bus, false); +if (err <0 ) +dev_err (dev,"Cannot turn off display power on i915\n" ); + +return err; }static int hdac_hdmi_runtime_resume (struct device *dev)
sound/soc/intel/skylake/skl.c +6 -6
@@ -752,6 +752,12 @@ static void skl_probe_work(struct work_struct *work) } } +/* +* we are done probing so decrement link counts +*/ +list_for_each_entry (hlink, &bus->hlink_list, list) +snd_hdac_ext_bus_link_put (bus, hlink); +if (IS_ENABLED (CONFIG_SND_SOC_HDAC_HDMI )) { err =snd_hdac_display_power (bus, false);if (err <0 ) {
@@ -761,12 +767,6 @@ static void skl_probe_work(struct work_struct *work) } } -/* -* we are done probing so decrement link counts -*/ -list_for_each_entry (hlink, &bus->hlink_list, list) -snd_hdac_ext_bus_link_put (bus, hlink); -/* configure PM */ pm_runtime_put_noidle (bus->dev);pm_runtime_allow (bus->dev);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 51/142 ASoC: qcom: Set dai_link id to each dai_link
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 67fd1437d11620de8768b22fe20942e752ed52e9 ]
Frontend dai_link id is used for closing ADM sessions. During concurrent usecase when one session is closed, it closes other ADM session associated with other usecase too. Dai_link->id should always point to Frontend dai id. Set cpu_dai id as dai_link id to fix the issue.
--- sound/soc/qcom/common.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
sound/soc/qcom/common.c +6 -3
@@ -13,6 +13,7 @@ int qcom_snd_parse_of(struct snd_soc_card *card)struct device_node *cpu =NULL ;struct device *dev = card->dev;struct snd_soc_dai_link *link; +struct of_phandle_args args;int ret, num_links; ret =snd_soc_of_parse_card_name (card,"model" );
@@ -47,12 +48,14 @@ int qcom_snd_parse_of(struct snd_soc_card *card) goto err; } - link->cpu_of_node =of_parse_phandle (cpu,"sound-dai" ,0 ); -if (!link->cpu_of_node) { + ret =of_parse_phandle_with_args (cpu,"sound-dai" , +"#sound-dai-cells" ,0 , &args); +if (ret) {dev_err (card->dev,"error getting cpu phandle\n" ); - ret = -EINVAL ; goto err; } + link->cpu_of_node = args.np; + link->id = args.args[0 ]; ret =snd_soc_of_get_dai_name (cpu, &link->cpu_dai_name);if (ret) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 52/142 s390/cpum_cf: Reject request for sampling in event initialization
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 613a41b0d16e617f46776a93b975a1eeea96417c ]
On s390 command perf top fails
[root@s35lp76 perf] # ./perf top -F100000 --stdio
Error:
cycles: PMU Hardware doesn't support sampling/overflow-interrupts.
Try 'perf stat'
[root@s35lp76 perf] #
Using event -e rb0000 works as designed. Event rb0000 is the event number of the sampling facility for basic sampling.
During system start up the following PMUs are installed in the kernel's PMU list (from head to tail):
cpum_cf --> s390 PMU counter facility device driver cpum_sf --> s390 PMU sampling facility device driver uprobe
kprobe
tracepoint
task_clock
cpu_clock
Perf top executes following functions and calls perf_event_open(2) system call with different parameters many times:
cmd_top
--> __cmd_top
--> perf_evlist__add_default
--> __perf_evlist__add_default
--> perf_evlist__new_cycles (creates event type:0 (HW)
config 0 (CPU_CYCLES)
--> perf_event_attr__set_max_precise_ip
Uses perf_event_open(2) to detect correct
precise_ip level. Fails 3 times on s390 which is ok.Then functions cmd_top
--> __cmd_top
--> perf_top__start_counters
-->perf_evlist__config
--> perf_can_comm_exec
--> perf_probe_api
This functions test support for the following events:
"cycles:u", "instructions:u", "cpu-clock:u" using --> perf_do_probe_api
--> perf_event_open_cloexec
Test the close on exec flag support with perf_event_open(2).
perf_do_probe_api returns true if the event is supported.
The function returns true because event cpu-clock is supported by the PMU cpu_clock.
This is achieved by many calls to perf_event_open(2).
Function perf_top__start_counters now calls perf_evsel__open() for every event, which is the default event cpu_cycles (config:0) and type HARDWARE (type:0) which a predfined frequence of 4000.
Given the above order of the PMU list, the PMU cpum_cf gets called first and returns 0, which indicates support for this sampling. The event is fully allocated in the function perf_event_open (file kernel/event/core.c near line 10521 and the following check fails:
event = perf_event_alloc(&attr, cpu, task, group_leader, NULL,
NULL, NULL, cgroup_fd);
if (IS_ERR(event)) {
err = PTR_ERR(event);
goto err_cred;
}
if (is_sampling_event(event)) {
if (event->pmu->capabilities & PERF_PMU_CAP_NO_INTERRUPT) {
err = -EOPNOTSUPP;
goto err_alloc;
}
}The check for the interrupt capabilities fails and the system call perf_event_open() returns -EOPNOTSUPP (-95).
Add a check to return -ENODEV when sampling is requested in PMU cpum_cf. This allows common kernel code in the perf_event_open() system call to test the next PMU in above list.
--- arch/s390/kernel/perf_cpum_cf.c | 2 ++ 1 file changed, 2 insertions(+)
arch/s390/kernel/perf_cpum_cf.c +2 -0
@@ -346,6 +346,8 @@ static int __hw_perf_event_init(struct perf_event *event)break ;case PERF_TYPE_HARDWARE : +if (is_sampling_event (event))/* No sampling support */ +return -ENOENT ; ev = attr->config;/* Count user space (problem-state) only */ if (!attr->exclude_user && attr->exclude_kernel) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 53/142 hwmon: (ina2xx) Fix current value calculation
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 38cd989ee38c16388cde89db5b734f9d55b905f9 ]
The current register (04h) has a sign bit at MSB. The comments for this calculation also mention that it's a signed register.
However, the regval is unsigned type so result of calculation turns out to be an incorrect value when current is negative.
This patch simply fixes this by adding a casting to s16.
--- drivers/hwmon/ina2xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/ina2xx.c +1 -1
@@ -274,7 +274,7 @@ static int ina2xx_get_value(struct ina2xx_data *data, u8 reg,break ;case INA2XX_CURRENT :/* signed register, result in mA */ - val = regval * data->current_lsb_uA; + val = (s16 )regval * data->current_lsb_uA; val =DIV_ROUND_CLOSEST (val,1000 );break ;case INA2XX_CALIBRATION :
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 54/142 ASoC: omap-abe-twl6040: Fix missing audio card caused by deferred probing
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 76836fd354922ebe4798a64fda01f8dc6a8b0984 ]
The machine driver fails to probe in next-20181113 with:
[ 2.539093] omap-abe-twl6040 sound: ASoC: CODEC DAI twl6040-legacy not registered [ 2.546630] omap-abe-twl6040 sound: devm_snd_soc_register_card() failed: -517 ... [ 3.693206] omap-abe-twl6040 sound: ASoC: Both platform name/of_node are set for TWL6040 [ 3.701446] omap-abe-twl6040 sound: ASoC: failed to init link TWL6040 [ 3.708007] omap-abe-twl6040 sound: devm_snd_soc_register_card() failed: -22 [ 3.715148] omap-abe-twl6040: probe of sound failed with error -22
Bisect pointed to a merge commit:
first bad commit: [0f688ab20a540aafa984c5dbd68a71debebf4d7f] Merge remote-tracking branch 'net-next/master'
and a diff between a working kernel does not reveal anything which would explain the change in behavior.
Further investigation showed that on the second try of loading fails because the dai_link->platform is no longer NULL and it might be pointing to uninitialized memory.
The fix is to move the snd_soc_dai_link and snd_soc_card inside of the abe_twl6040 struct, which is dynamically allocated every time the driver probes.
--- sound/soc/omap/omap-abe-twl6040.c | 67 +++++++++++++------------------ 1 file changed, 29 insertions(+), 38 deletions(-)
sound/soc/omap/omap-abe-twl6040.c +29 -38
@@ -36,6 +36,8 @@#include "../codecs/twl6040.h" struct abe_twl6040 { +struct snd_soc_card card; +struct snd_soc_dai_link dai_links[2 ];int jack_detection;/* board can detect jack events */ int mclk_freq;/* MCLK frequency speed for twl6040 */ };
@@ -208,40 +210,10 @@ static int omap_abe_dmic_init(struct snd_soc_pcm_runtime *rtd) ARRAY_SIZE(dmic_audio_map)); } -/* Digital audio interface glue - connects codec <--> CPU */ -static struct snd_soc_dai_link abe_twl6040_dai_links[] = { - { - .name ="TWL6040" , - .stream_name ="TWL6040" , - .codec_dai_name ="twl6040-legacy" , - .codec_name ="twl6040-codec" , - .init = omap_abe_twl6040_init, - .ops = &omap_abe_ops, - }, - { - .name ="DMIC" , - .stream_name ="DMIC Capture" , - .codec_dai_name ="dmic-hifi" , - .codec_name ="dmic-codec" , - .init = omap_abe_dmic_init, - .ops = &omap_abe_dmic_ops, - }, -}; - -/* Audio machine driver */ -static struct snd_soc_card omap_abe_card = { - .owner =THIS_MODULE , - - .dapm_widgets = twl6040_dapm_widgets, - .num_dapm_widgets =ARRAY_SIZE (twl6040_dapm_widgets), - .dapm_routes = audio_map, - .num_dapm_routes =ARRAY_SIZE (audio_map), -}; -static int omap_abe_probe (struct platform_device *pdev) {struct device_node *node = pdev->dev.of_node; -struct snd_soc_card *card = &omap_abe_card; +struct snd_soc_card *card;struct device_node *dai_node;struct abe_twl6040 *priv;int num_links =0 ;
@@ -252,12 +224,18 @@ static int omap_abe_probe(struct platform_device *pdev)return -ENODEV ; } - card->dev = &pdev->dev; - priv =devm_kzalloc (&pdev->dev,sizeof (struct abe_twl6040 ),GFP_KERNEL );if (priv ==NULL )return -ENOMEM ; + card = &priv->card; + card->dev = &pdev->dev; + card->owner =THIS_MODULE ; + card->dapm_widgets = twl6040_dapm_widgets; + card->num_dapm_widgets =ARRAY_SIZE (twl6040_dapm_widgets); + card->dapm_routes = audio_map; + card->num_dapm_routes =ARRAY_SIZE (audio_map); +if (snd_soc_of_parse_card_name (card,"ti,model" )) {dev_err (&pdev->dev,"Card name is not provided\n" );return -ENODEV ;
@@ -274,14 +252,27 @@ static int omap_abe_probe(struct platform_device *pdev)dev_err (&pdev->dev,"McPDM node is not provided\n" );return -EINVAL ; } - abe_twl6040_dai_links[0 ].cpu_of_node = dai_node; - abe_twl6040_dai_links[0 ].platform_of_node = dai_node; + + priv->dai_links[0 ].name ="DMIC" ; + priv->dai_links[0 ].stream_name ="TWL6040" ; + priv->dai_links[0 ].cpu_of_node = dai_node; + priv->dai_links[0 ].platform_of_node = dai_node; + priv->dai_links[0 ].codec_dai_name ="twl6040-legacy" ; + priv->dai_links[0 ].codec_name ="twl6040-codec" ; + priv->dai_links[0 ].init = omap_abe_twl6040_init; + priv->dai_links[0 ].ops = &omap_abe_ops; dai_node =of_parse_phandle (node,"ti,dmic" ,0 );if (dai_node) { num_links =2 ; - abe_twl6040_dai_links[1 ].cpu_of_node = dai_node; - abe_twl6040_dai_links[1 ].platform_of_node = dai_node; + priv->dai_links[1 ].name ="TWL6040" ; + priv->dai_links[1 ].stream_name ="DMIC Capture" ; + priv->dai_links[1 ].cpu_of_node = dai_node; + priv->dai_links[1 ].platform_of_node = dai_node; + priv->dai_links[1 ].codec_dai_name ="dmic-hifi" ; + priv->dai_links[1 ].codec_name ="dmic-codec" ; + priv->dai_links[1 ].init = omap_abe_dmic_init; + priv->dai_links[1 ].ops = &omap_abe_dmic_ops; }else { num_links =1 ; }
@@ -300,7 +291,7 @@ static int omap_abe_probe(struct platform_device *pdev)return -ENODEV ; } - card->dai_link = abe_twl6040_dai_links; + card->dai_link = priv->dai_links; card->num_links = num_links;snd_soc_card_set_drvdata (card, priv);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 55/142 ASoC: dapm: Recalculate audio map forcely when card instantiated
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 882eab6c28d23a970ae73b7eb831b169a672d456 ]
Audio map are possible in wrong state before card->instantiated has been set to true. Imaging the following examples:
time 1: at the beginning
in:-1 in:-1 in:-1 in:-1
out:-1 out:-1 out:-1 out:-1
SIGGEN A B Spk
time 2: after someone called snd_soc_dapm_new_widgets() (e.g. create_fill_widget_route_map() in sound/soc/codecs/hdac_hdmi.c)
in:1 in:0 in:0 in:0
out:0 out:0 out:0 out:1
SIGGEN A B Spk
time 3: routes added
in:1 in:0 in:0 in:0
out:0 out:0 out:0 out:1
SIGGEN -----> A -----> B ---> Spk
In the end, the path should be powered on but it did not. At time 3, "in" of SIGGEN and "out" of Spk did not propagate to their neighbors because snd_soc_dapm_add_path() will not invalidate the paths if the card has not instantiated (i.e. card->instantiated is false). To correct the state of audio map, recalculate the whole map forcely.
--- sound/soc/soc-core.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/soc-core.c +1 -0
@@ -2126,6 +2126,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card) } card->instantiated =1 ; +dapm_mark_endpoints_dirty (card);snd_soc_dapm_sync (&card->dapm);mutex_unlock (&card->mutex);mutex_unlock (&client_mutex);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 56/142 spi: omap2-mcspi: Add missing suspend and resume calls
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 91b9deefedf4c35a01027ce38bed7299605026a3 ]
I've been wondering still about omap2-mcspi related suspend and resume flakeyness and looks like we're missing calls to spi_master_suspend() and spi_master_resume(). Adding those and using pm_runtime_force_suspend() and pm_runtime_force_resume() makes things work for suspend and resume and allows us to stop using noirq suspend and resume.
And while at it, let's use SET_SYSTEM_SLEEP_PM_OPS to simplify things further.
--- drivers/spi/spi-omap2-mcspi.c | 37 +++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-)
drivers/spi/spi-omap2-mcspi.c +25 -12
@@ -1455,13 +1455,26 @@ static int omap2_mcspi_remove(struct platform_device *pdev)/* work with hotplug and coldplug */ MODULE_ALIAS ("platform:omap2_mcspi" ); -#ifdef CONFIG_SUSPEND -static int omap2_mcspi_suspend_noirq (struct device *dev) +static int __maybe_unused omap2_mcspi_suspend (struct device *dev) { -return pinctrl_pm_select_sleep_state (dev); +struct spi_master *master =dev_get_drvdata (dev); +struct omap2_mcspi *mcspi =spi_master_get_devdata (master); +int error; + + error =pinctrl_pm_select_sleep_state (dev); +if (error) +dev_warn (mcspi->dev,"%s: failed to set pins: %i\n" , + __func__, error); + + error =spi_master_suspend (master); +if (error) +dev_warn (mcspi->dev,"%s: master suspend failed: %i\n" , + __func__, error); + +return pm_runtime_force_suspend (dev); } -static int omap2_mcspi_resume_noirq (struct device *dev) +static int __maybe_unused omap2_mcspi_resume (struct device *dev) {struct spi_master *master =dev_get_drvdata (dev);struct omap2_mcspi *mcspi =spi_master_get_devdata (master);
@@ -1472,17 +1485,17 @@ static int omap2_mcspi_resume_noirq(struct device *dev)dev_warn (mcspi->dev,"%s: failed to set pins: %i\n" , __func__, error); - return 0; -} + error =spi_master_resume (master); +if (error) +dev_warn (mcspi->dev,"%s: master resume failed: %i\n" , + __func__, error); -#else -#define omap2_mcspi_suspend_noirq NULL -#define omap2_mcspi_resume_noirq NULL -#endif +return pm_runtime_force_resume (dev); +}static const struct dev_pm_ops omap2_mcspi_pm_ops = { - .suspend_noirq = omap2_mcspi_suspend_noirq, - .resume_noirq = omap2_mcspi_resume_noirq, +SET_SYSTEM_SLEEP_PM_OPS (omap2_mcspi_suspend, + omap2_mcspi_resume) .runtime_resume = omap_mcspi_runtime_resume, };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 57/142 hwmon: (mlxreg-fan) Fix macros for tacho fault reading
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 243cfe3fb8978c7eec24511aba7dac98819ed896 ]
Fix macros for tacometer fault reading.
This fix is relevant for three Mellanox systems MQMB7, MSN37, MSN34, which are about to be released to the customers.
At the moment, none of them is at customers sites.
--- drivers/hwmon/mlxreg-fan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/mlxreg-fan.c +1 -1
@@ -51,7 +51,7 @@*/ #define MLXREG_FAN_GET_RPM (rval, d, s) (DIV_ROUND_CLOSEST(15000000 * 100, \ ((rval) + (s)) * (d))) -#define MLXREG_FAN_GET_FAULT (val, mask) (!!((val) ^ (mask))) +#define MLXREG_FAN_GET_FAULT (val, mask) (!((val) ^ (mask)))#define MLXREG_FAN_PWM_DUTY2STATE (duty) (DIV_ROUND_CLOSEST((duty) * \ MLXREG_FAN_MAX_STATE, \ MLXREG_FAN_MAX_DUTY))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 58/142 bpf: allocate local storage buffers using GFP_ATOMIC
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 569a933b03f3c48b392fe67c0086b3a6b9306b5a ]
Naresh reported an issue with the non-atomic memory allocation of cgroup local storage buffers:
[ 73.047526] BUG: sleeping function called from invalid context at /srv/oe/build/tmp-rpb-glibc/work-shared/intel-corei7-64/kernel-source/mm/slab.h:421 [ 73.060915] in_atomic(): 1, irqs_disabled(): 0, pid: 3157, name: test_cgroup_sto [ 73.068342] INFO: lockdep is turned off. [ 73.072293] CPU: 2 PID: 3157 Comm: test_cgroup_sto Not tainted 4.20.0-rc2-next-20181113 #1 [ 73.080548] Hardware name: Supermicro SYS-5019S-ML/X11SSH-F, BIOS 2.0b 07/27/2017 [ 73.088018] Call Trace: [ 73.090463] dump_stack+0x70/0xa5 [ 73.093783] ___might_sleep+0x152/0x240 [ 73.097619] __might_sleep+0x4a/0x80 [ 73.101191] __kmalloc_node+0x1cf/0x2f0 [ 73.105031] ? cgroup_storage_update_elem+0x46/0x90 [ 73.109909] cgroup_storage_update_elem+0x46/0x90
cgroup_storage_update_elem() (as well as other update map update callbacks) is called with disabled preemption, so GFP_ATOMIC allocation should be used: e.g. alloc_htab_elem() in hashtab.c.
--- kernel/bpf/local_storage.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/bpf/local_storage.c +2 -1
@@ -138,7 +138,8 @@ static int cgroup_storage_update_elem(struct bpf_map *map, void *_key,return -ENOENT ; new =kmalloc_node (sizeof (struct bpf_storage_buffer ) + - map->value_size, __GFP_ZERO |GFP_USER , + map->value_size, + __GFP_ZERO |GFP_ATOMIC | __GFP_NOWARN, map->numa_node);if (!new)return -ENOMEM ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 59/142 aio: fix failure to put the file pointer
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 53fffe29a9e664a999dd3787e4428da8c30533e0 ]
If the ioprio capability check fails, we return without putting the file pointer.
--- fs/aio.c | 1 + 1 file changed, 1 insertion(+)
fs/aio.c +1 -0
@@ -1436,6 +1436,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb) ret =ioprio_check_cap (iocb->aio_reqprio);if (ret) {pr_debug ("aio ioprio check cap error: %d\n" , ret); +fput (req->ki_filp);return ret; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 60/142 netfilter: xt_hashlimit: fix a possible memory leak in htable_create()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b4e955e9f372035361fbc6f07b21fe2cc6a5be4a ]
In the htable_create(), hinfo is allocated by vmalloc() So that if error occurred, hinfo should be freed.
--- net/netfilter/xt_hashlimit.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
net/netfilter/xt_hashlimit.c +3 -6
@@ -295,9 +295,10 @@ static int htable_create(struct net *net, struct hashlimit_cfg3 *cfg,/* copy match config into hashtable config */ ret =cfg_copy (&hinfo->cfg, (void *)cfg,3 ); - -if (ret) +if (ret) { +vfree (hinfo);return ret; + } hinfo->cfg.size = size;if (hinfo->cfg.max ==0 )
@@ -814,7 +815,6 @@ hashlimit_mt_v1(const struct sk_buff *skb, struct xt_action_param *par)int ret; ret =cfg_copy (&cfg, (void *)&info->cfg,1 ); -if (ret)return ret;
@@ -830,7 +830,6 @@ hashlimit_mt_v2(const struct sk_buff *skb, struct xt_action_param *par)int ret; ret =cfg_copy (&cfg, (void *)&info->cfg,2 ); -if (ret)return ret;
@@ -921,7 +920,6 @@ static int hashlimit_mt_check_v1(const struct xt_mtchk_param *par)return ret; ret =cfg_copy (&cfg, (void *)&info->cfg,1 ); -if (ret)return ret;
@@ -940,7 +938,6 @@ static int hashlimit_mt_check_v2(const struct xt_mtchk_param *par)return ret; ret =cfg_copy (&cfg, (void *)&info->cfg,2 ); -if (ret)return ret;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 61/142 hwmon: (w83795) temp4_type has writable permission
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 09aaf6813cfca4c18034fda7a43e68763f34abb1 ]
Both datasheet and comments of store_temp_mode() tell us that temp1~4_type is writable, so fix it.
--- drivers/hwmon/w83795.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwmon/w83795.c +1 -1
@@ -1691,7 +1691,7 @@ store_sf_setup(struct device *dev, struct device_attribute *attr,* somewhere else in the code */ #define SENSOR_ATTR_TEMP (index) { \ - SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 4 ? S_IWUSR : 0), \ + SENSOR_ATTR_2(temp##index##_type, S_IRUGO | (index < 5 ? S_IWUSR : 0), \ show_temp_mode, store_temp_mode, NOT_USED, index - 1), \ SENSOR_ATTR_2(temp##index##_input, S_IRUGO, show_temp, \ NULL, TEMP_READ, index - 1), \
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 62/142 perf tools: Restore proper cwd on return from mnt namespace
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b01c1f69c8660eaeab7d365cd570103c5c073a02 ]
When reporting on 'record' server we try to retrieve/use the mnt namespace of the profiled tasks. We use following API with cookie to hold the return namespace, roughly:
nsinfo__mountns_enter(struct nsinfo *nsi, struct nscookie *nc)
setns(newns, 0);
...
new ns related open..
...
nsinfo__mountns_exit(struct nscookie *nc)
setns(nc->oldns)Once finished we setns to old namespace, which also sets the current working directory (cwd) to "/", trashing the cwd we had.
This is mostly fine, because we use absolute paths almost everywhere, but it screws up 'perf diff':
# perf diff failed to open perf.data: No such file or directory (try 'perf record' first) ...
Adding the current working directory to be part of the cookie and restoring it in the nsinfo__mountns_exit call.
--- tools/perf/util/namespaces.c | 17 +++++++++++++++-- tools/perf/util/namespaces.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-)
tools/perf/util/namespaces.c +15 -2
@@ -18,6 +18,7 @@#include <stdio.h> #include <string.h> #include <unistd.h> +#include <asm/bug.h> struct namespaces *namespaces__new (struct namespaces_event *event) {
@@ -186,6 +187,7 @@ void nsinfo__mountns_enter(struct nsinfo *nsi,char curpath[PATH_MAX ];int oldns =-1 ;int newns =-1 ; +char *oldcwd =NULL ;if (nc ==NULL )return ;
@@ -199,9 +201,13 @@ void nsinfo__mountns_enter(struct nsinfo *nsi,if (snprintf (curpath,PATH_MAX ,"/proc/self/ns/mnt" ) >=PATH_MAX )return ; + oldcwd =get_current_dir_name (); +if (!oldcwd) +return ; + oldns =open (curpath,O_RDONLY );if (oldns <0 ) -return ; + goto errout; newns =open (nsi->mntns_path,O_RDONLY );if (newns <0 )
@@ -210,11 +216,13 @@ void nsinfo__mountns_enter(struct nsinfo *nsi,if (setns (newns,CLONE_NEWNS ) <0 ) goto errout; + nc->oldcwd = oldcwd; nc->oldns = oldns; nc->newns = newns;return ; errout: +free (oldcwd);if (oldns >-1 )close (oldns);if (newns >-1 )
@@ -223,11 +231,16 @@ void nsinfo__mountns_enter(struct nsinfo *nsi,void nsinfo__mountns_exit (struct nscookie *nc) { -if (nc ==NULL || nc->oldns ==-1 || nc->newns ==-1 ) +if (nc ==NULL || nc->oldns ==-1 || nc->newns ==-1 || !nc->oldcwd)return ;setns (nc->oldns,CLONE_NEWNS ); +if (nc->oldcwd) { +WARN_ON_ONCE (chdir (nc->oldcwd)); +zfree (&nc->oldcwd); + } +if (nc->oldns >-1 ) {close (nc->oldns); nc->oldns =-1 ;
tools/perf/util/namespaces.h +1 -0
@@ -38,6 +38,7 @@ struct nsinfo {struct nscookie {int oldns;int newns; +char *oldcwd; };int nsinfo__init (struct nsinfo *nsi);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 63/142 PCI: imx6: Fix link training status detection in link up check
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 68bc10bf992180f269816ff3d22eb30383138577 ]
This bug was introduced in the interaction for two commits on either branch of the merge commit 562df5c8521e ("Merge branch 'pci/host-designware' into next").
Commit 4d107d3b5a68 ("PCI: imx6: Move link up check into imx6_pcie_wait_for_link()"), changed imx6_pcie_wait_for_link() to poll the link status register directly, checking for link up and not training, and made imx6_pcie_link_up() only check the link up bit (once, not a polling loop).
While commit 886bc5ceb5cc ("PCI: designware: Add generic dw_pcie_wait_for_link()"), replaced the loop in imx6_pcie_wait_for_link() with a call to a new dwc core function, which polled imx6_pcie_link_up(), which still checked both link up and not training in a loop.
When these two commits were merged, the version of imx6_pcie_wait_for_link() from 886bc5ceb5cc was kept, which eliminated the link training check placed there by 4d107d3b5a68. However, the version of imx6_pcie_link_up() from 4d107d3b5a68 was kept, which eliminated the link training check that had been there and was moved to imx6_pcie_wait_for_link().
The result was the link training check got lost for the imx6 driver.
Eliminate imx6_pcie_link_up() so that the default handler, dw_pcie_link_up(), is used instead. The default handler has the correct code, which checks for link up and also that it still is not training, fixing the regression.
--- drivers/pci/controller/dwc/pci-imx6.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
drivers/pci/controller/dwc/pci-imx6.c +1 -9
@@ -80,8 +80,6 @@ struct imx6_pcie {#define PCIE_PL_PFLR_FORCE_LINK (1 << 15)#define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28)#define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c) -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29) -#define PCIE_PHY_DEBUG_R1_XMLH_LINK_UP (1 << 4)#define PCIE_PHY_CTRL (PL_OFFSET + 0x114)#define PCIE_PHY_CTRL_DATA_LOC 0
@@ -641,12 +639,6 @@ static int imx6_pcie_host_init(struct pcie_port *pp)return 0 ; } -static int imx6_pcie_link_up (struct dw_pcie *pci) -{ -return dw_pcie_readl_dbi (pci,PCIE_PHY_DEBUG_R1 ) & -PCIE_PHY_DEBUG_R1_XMLH_LINK_UP ; -} -static const struct dw_pcie_host_ops imx6_pcie_host_ops = { .host_init = imx6_pcie_host_init, };
@@ -679,7 +671,7 @@ static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie, }static const struct dw_pcie_ops dw_pcie_ops = { - .link_up = imx6_pcie_link_up, +/* No special ops needed, but pcie-designware still expects this struct */ };static int imx6_pcie_probe (struct platform_device *pdev)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 64/142 ASoC: acpi: fix: continue searching when machine is ignored
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a3e620f8422832afd832ad5e20aa97d0c72bada8 ]
The machine_quirk may return NULL which means the acpi entries should be skipped and search for next matched entry is needed, here add return check here and continue for NULL case.
--- sound/soc/soc-acpi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
sound/soc/soc-acpi.c +8 -2
@@ -10,11 +10,17 @@ struct snd_soc_acpi_mach * snd_soc_acpi_find_machine(struct snd_soc_acpi_mach *machines) {struct snd_soc_acpi_mach *mach; +struct snd_soc_acpi_mach *mach_alt;for (mach = machines; mach->id[0 ]; mach++) {if (acpi_dev_present (mach->id,NULL ,-1 )) { -if (mach->machine_quirk) - mach = mach->machine_quirk (mach); +if (mach->machine_quirk) { + mach_alt = mach->machine_quirk (mach); +if (!mach_alt) +continue ;/* not full match, ignore */ + mach = mach_alt; + } +return mach; } }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 65/142 objtool: Fix double-free in .cold detection error path
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0b9301fb632f7111a3293a30cc5b20f1b82ed08d ]
If read_symbols() fails during second list traversal (the one dealing with ".cold" subfunctions) it frees the symbol, but never deletes it from the list/hash_table resulting in symbol being freed again in elf_close(). Fix it by just returning an error, leaving cleanup to elf_close().
--- tools/objtool/elf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/objtool/elf.c +1 -1
@@ -312,7 +312,7 @@ static int read_symbols(struct elf *elf)if (!pfunc) {WARN ("%s(): can't find parent function" , sym->name); - goto err; +return -1 ; } sym->pfunc = pfunc;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 66/142 objtool: Fix segfault in .cold detection with -ffunction-sections
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 22566c1603030f0a036ad564634b064ad1a55db2 ]
Because find_symbol_by_name() traverses the same lists as read_symbols(), changing sym->name in place without copying it affects the result of find_symbol_by_name(). In the case where a ".cold" function precedes its parent in sec->symbol_list, it can result in a function being considered a parent of itself. This leads to function length being set to 0 and other consequent side-effects including a segfault in add_switch_table(). The effects of this bug are only visible when building with -ffunction-sections in KCFLAGS.
Fix by copying the search string instead of modifying it in place.
--- tools/objtool/elf.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
tools/objtool/elf.c +14 -3
@@ -31,6 +31,8 @@#include "elf.h" #include "warn.h" +#define MAX_NAME_LEN 128 +struct section *find_section_by_name (struct elf *elf,const char *name) {struct section *sec;
@@ -298,6 +300,8 @@ static int read_symbols(struct elf *elf)/* Create parent/child links for any cold subfunctions */ list_for_each_entry (sec, &elf->sections, list) {list_for_each_entry (sym, &sec->symbol_list, list) { +char pname[MAX_NAME_LEN +1 ]; +size_t pnamelen;if (sym->type !=STT_FUNC )continue ; sym->pfunc = sym->cfunc = sym;
@@ -305,9 +309,16 @@ static int read_symbols(struct elf *elf)if (!coldstr)continue ; - coldstr[0 ] ='\0' ; - pfunc =find_symbol_by_name (elf, sym->name); - coldstr[0 ] ='.' ; + pnamelen = coldstr - sym->name; +if (pnamelen >MAX_NAME_LEN ) { +WARN ("%s(): parent function name exceeds maximum length of %d characters" , + sym->name,MAX_NAME_LEN ); +return -1 ; + } + +strncpy (pname, sym->name, pnamelen); + pname[pnamelen] ='\0' ; + pfunc =find_symbol_by_name (elf, pname);if (!pfunc) { WARN("%s(): can't find parent function",
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 67/142 phy: qcom-qusb2: Use HSTX_TRIM fused value as is
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6e34d358b24ffc40764eb3681164c79091765429 ]
Fix HSTX_TRIM tuning logic which instead of using fused value as HSTX_TRIM, incorrectly performs bitwise OR operation with existing default value.
--- drivers/phy/qualcomm/phy-qcom-qusb2.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/phy/qualcomm/phy-qcom-qusb2.c +10 -9
@@ -402,10 +402,10 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy)/* * Read efuse register having TUNE2/1 parameter's high nibble. -* If efuse register shows value as 0x0, or if we fail to find -* a valid efuse register settings, then use default value -* as 0xB for high nibble that we have already set while -* configuring phy. +* If efuse register shows value as 0x0 (indicating value is not +* fused), or if we fail to find a valid efuse register setting, +* then use default value for high nibble that we have already +* set while configuring the phy. */ val =nvmem_cell_read (qphy->cell,NULL );if (IS_ERR (val) || !val[0 ]) {
@@ -415,12 +415,13 @@ static void qusb2_phy_set_tune2_param(struct qusb2_phy *qphy)/* Fused TUNE1/2 value is the higher nibble only */ if (cfg->update_tune1_with_efuse) -qusb2_setbits (qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1 ], - val[0 ] <<0x4 ); +qusb2_write_mask (qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE1 ], + val[0 ] <<HSTX_TRIM_SHIFT , +HSTX_TRIM_MASK );else -qusb2_setbits (qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2 ], - val[0 ] <<0x4 ); - +qusb2_write_mask (qphy->base, cfg->regs[QUSB2PHY_PORT_TUNE2 ], + val[0 ] <<HSTX_TRIM_SHIFT , +HSTX_TRIM_MASK ); }static int qusb2_phy_set_mode (struct phy *phy,enum phy_mode mode)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 68/142 phy: qcom-qusb2: Fix HSTX_TRIM tuning with fused value for SDM845
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c88520db18ba0b9a41326c3b8680e7c09eb4c381 ]
Tune1 register on sdm845 is used to update HSTX_TRIM with fused setting. Enable same by specifying update_tune1_with_efuse flag for sdm845, otherwise driver ends up programming tune2 register.
--- drivers/phy/qualcomm/phy-qcom-qusb2.c | 1 + 1 file changed, 1 insertion(+)
drivers/phy/qualcomm/phy-qcom-qusb2.c +1 -0
@@ -231,6 +231,7 @@ static const struct qusb2_phy_cfg sdm845_phy_cfg = { .mask_core_ready = CORE_READY_STATUS, .has_pll_override = true, .autoresume_en = BIT(0), + .update_tune1_with_efuse = true, };static const char *const qusb2_phy_vreg_names[] = {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 69/142 ARM: dts: at91: sama5d2: use the divided clock for SMC
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4ab7ca092c3c7ac8b16aa28eba723a8868f82f14 ]
The SAMA5D2 is different from SAMA5D3 and SAMA5D4, as there are two different clocks for the peripherals in the SoC. The Static Memory controller is connected to the divided master clock.
Unfortunately, the device tree does not correctly show this and uses the master clock directly. This clock is then used by the code for the NAND controller to calculate the timings for the controller, and we end up with slow NAND Flash access.
Fix the device tree, and the performance of Flash access is improved.
--- arch/arm/boot/dts/sama5d2.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/sama5d2.dtsi +1 -1
@@ -308,7 +308,7 @@ 0x1 0x0 0x60000000 0x10000000 0x2 0x0 0x70000000 0x10000000 0x3 0x0 0x80000000 0x10000000>; - clocks = <&mck>; + clocks = <&h32ck>; status = "disabled"; nand_controller: nand-controller {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 70/142 Btrfs: send, fix infinite loop due to directory rename dependencies
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a4390aee72713d9e73f1132bcdeb17d72fbbf974 ]
When doing an incremental send, due to the need of delaying directory move (rename) operations we can end up in infinite loop at apply_children_dir_moves().
An example scenario that triggers this problem is described below, where directory names correspond to the numbers of their respective inodes.
Parent snapshot:
.
|--- 261/
|--- 271/
|--- 266/
|--- 259/
|--- 260/
| |--- 267
|
|--- 264/
| |--- 258/
| |--- 257/
|
|--- 265/
|--- 268/
|--- 269/
| |--- 262/
|
|--- 270/
|--- 272/
| |--- 263/
| |--- 275/
|
|--- 274/
|--- 273/Send snapshot:
.
|-- 275/
|-- 274/
|-- 273/
|-- 262/
|-- 269/
|-- 258/
|-- 271/
|-- 268/
|-- 267/
|-- 270/
|-- 259/
| |-- 265/
|
|-- 272/
|-- 257/
|-- 260/
|-- 264/
|-- 263/
|-- 261/
|-- 266/When processing inode 257 we delay its move (rename) operation because its new parent in the send snapshot, inode 272, was not yet processed. Then when processing inode 272, we delay the move operation for that inode because inode 274 is its ancestor in the send snapshot. Finally we delay the move operation for inode 274 when processing it because inode 275 is its new parent in the send snapshot and was not yet moved.
When finishing processing inode 275, we start to do the move operations that were previously delayed (at apply_children_dir_moves()), resulting in the following iterations:
1) We issue the move operation for inode 274;
2) Because inode 262 depended on the move operation of inode 274 (it was delayed because 274 is its ancestor in the send snapshot), we issue the move operation for inode 262;
3) We issue the move operation for inode 272, because it was delayed by inode 274 too (ancestor of 272 in the send snapshot);
4) We issue the move operation for inode 269 (it was delayed by 262);
5) We issue the move operation for inode 257 (it was delayed by 272);
6) We issue the move operation for inode 260 (it was delayed by 272);
7) We issue the move operation for inode 258 (it was delayed by 269);
8) We issue the move operation for inode 264 (it was delayed by 257);
9) We issue the move operation for inode 271 (it was delayed by 258);
10) We issue the move operation for inode 263 (it was delayed by 264);
11) We issue the move operation for inode 268 (it was delayed by 271);
12) We verify if we can issue the move operation for inode 270 (it was delayed by 271). We detect a path loop in the current state, because inode 267 needs to be moved first before we can issue the move operation for inode 270. So we delay again the move operation for inode 270, this time we will attempt to do it after inode 267 is moved;
13) We issue the move operation for inode 261 (it was delayed by 263);
14) We verify if we can issue the move operation for inode 266 (it was delayed by 263). We detect a path loop in the current state, because inode 270 needs to be moved first before we can issue the move operation for inode 266. So we delay again the move operation for inode 266, this time we will attempt to do it after inode 270 is moved (its move operation was delayed in step 12);
15) We issue the move operation for inode 267 (it was delayed by 268);
16) We verify if we can issue the move operation for inode 266 (it was delayed by 270). We detect a path loop in the current state, because inode 270 needs to be moved first before we can issue the move operation for inode 266. So we delay again the move operation for inode 266, this time we will attempt to do it after inode 270 is moved (its move operation was delayed in step 12). So here we added again the same delayed move operation that we added in step 14;
17) We attempt again to see if we can issue the move operation for inode 266, and as in step 16, we realize we can not due to a path loop in the current state due to a dependency on inode 270. Again we delay inode's 266 rename to happen after inode's 270 move operation, adding the same dependency to the empty stack that we did in steps 14 and 16. The next iteration will pick the same move dependency on the stack (the only entry) and realize again there is still a path loop and then again the same dependency to the stack, over and over, resulting in an infinite loop.
So fix this by preventing adding the same move dependency entries to the stack by removing each pending move record from the red black tree of pending moves. This way the next call to get_pending_dir_moves() will not return anything for the current parent inode.
A test case for fstests, with this reproducer, follows soon.
--- fs/btrfs/send.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/btrfs/send.c +8 -3
@@ -3344,7 +3344,8 @@ static void free_pending_move(struct send_ctx *sctx, struct pending_dir_move *m)kfree (m); } -static void tail_append_pending_moves (struct pending_dir_move *moves, +static void tail_append_pending_moves (struct send_ctx *sctx, +struct pending_dir_move *moves,struct list_head *stack) {if (list_empty (&moves->list)) {
@@ -3355,6 +3356,10 @@ static void tail_append_pending_moves(struct pending_dir_move *moves,list_add_tail (&moves->list, stack);list_splice_tail (&list, stack); } +if (!RB_EMPTY_NODE (&moves->node)) { +rb_erase (&moves->node, &sctx->pending_dir_moves); +RB_CLEAR_NODE (&moves->node); + } }static int apply_children_dir_moves (struct send_ctx *sctx)
@@ -3369,7 +3374,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx)return 0 ;INIT_LIST_HEAD (&stack); -tail_append_pending_moves (pm, &stack); +tail_append_pending_moves (sctx, pm, &stack);while (!list_empty (&stack)) { pm = list_first_entry(&stack, struct pending_dir_move, list);
@@ -3380,7 +3385,7 @@ static int apply_children_dir_moves(struct send_ctx *sctx) goto out; pm =get_pending_dir_moves (sctx, parent_ino);if (pm) -tail_append_pending_moves (pm, &stack); +tail_append_pending_moves (sctx, pm, &stack); }return 0 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 71/142 RDMA/mlx5: Fix fence type for IB_WR_LOCAL_INV WR
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 074fca3a18e7e1e0d4d7dcc9d7badc43b90232f4 ]
Currently, for IB_WR_LOCAL_INV WR, when the next fence is None, the current fence will be SMALL instead of Normal Fence.
Without this patch krping doesn't work on CX-5 devices and throws following error:
The error messages are from CX5 driver are: (from server side)
[ 710.434014] mlx5_0:dump_cqe:278:(pid 2712): dump error cqe [ 710.434016] 00000000 00000000 00000000 00000000 [ 710.434016] 00000000 00000000 00000000 00000000 [ 710.434017] 00000000 00000000 00000000 00000000 [ 710.434018] 00000000 93003204 100000b8 000524d2 [ 710.434019] krping: cq completion failed with wr_id 0 status 4 opcode 128 vender_err 32
Fixed the logic to set the correct fence type.
--- drivers/infiniband/hw/mlx5/qp.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/infiniband/hw/mlx5/qp.c +10 -9
@@ -4413,17 +4413,18 @@ static int _mlx5_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, goto out; } -if (wr->opcode ==IB_WR_LOCAL_INV || - wr->opcode ==IB_WR_REG_MR ) { +if (wr->opcode ==IB_WR_REG_MR ) { fence = dev->umr_fence; next_fence =MLX5_FENCE_MODE_INITIATOR_SMALL ; - }else if (wr->send_flags &IB_SEND_FENCE ) { -if (qp->next_fence) - fence =MLX5_FENCE_MODE_SMALL_AND_FENCE ; -else - fence =MLX5_FENCE_MODE_FENCE ; - }else { - fence = qp->next_fence; + }else { +if (wr->send_flags &IB_SEND_FENCE ) { +if (qp->next_fence) + fence =MLX5_FENCE_MODE_SMALL_AND_FENCE ; +else + fence =MLX5_FENCE_MODE_FENCE ; + }else { + fence = qp->next_fence; + } }switch (ibqp->qp_type) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 72/142 RDMA/core: Add GIDs while changing MAC addr only for registered ndev
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d52ef88a9f4be523425730da3239cf87bee936da ]
Currently when MAC address is changed, regardless of the netdev reg_state, GID entries are removed and added to reflect the new MAC address and new default GID entries.
When a bonding device is used and the underlying PCI device is removed several netdevice events are generated. Two events of the interest are CHANGEADDR and UNREGISTER event on lower(slave) netdevice of the bond netdevice.
Sometimes CHANGEADDR event is generated when netdev state is UNREGISTERING (after UNREGISTER event is generated). In this scenario, GID entries for default GIDs are added and never deleted because GID entries are deleted only when netdev state is < UNREGISTERED.
This leads to non zero reference count on the netdevice. Due to this, PCI device unbind operation is getting stuck.
To avoid it, when changing mac address, add GID entries only if netdev is in REGISTERED state.
--- drivers/infiniband/core/roce_gid_mgmt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/core/roce_gid_mgmt.c +4 -2
@@ -767,8 +767,10 @@ static int netdevice_event(struct notifier_block *this, unsigned long event,case NETDEV_CHANGEADDR : cmds[0 ] = netdev_del_cmd; - cmds[1 ] = add_default_gid_cmd; - cmds[2 ] = add_cmd; +if (ndev->reg_state ==NETREG_REGISTERED ) { + cmds[1 ] = add_default_gid_cmd; + cmds[2 ] = add_cmd; + }break ;case NETDEV_CHANGEUPPER :
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 73/142 RDMA/bnxt_re: Fix system hang when registration with L2 driver fails
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3c4b1419c33c2417836a63f8126834ee36968321 ]
Driver doesn't release rtnl lock if registration with L2 driver (bnxt_re_register_netdev) fais and this causes hang while requesting for the next lock.
[ 371.635416] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 371.635417] kworker/u48:1 D 0 634 2 0x80000000 [ 371.635423] Workqueue: bnxt_re bnxt_re_task [bnxt_re] [ 371.635424] Call Trace: [ 371.635426] ? __schedule+0x36b/0xbd0 [ 371.635429] schedule+0x39/0x90 [ 371.635430] schedule_preempt_disabled+0x11/0x20 [ 371.635431] __mutex_lock+0x45b/0x9c0 [ 371.635433] ? __mutex_lock+0x16d/0x9c0 [ 371.635435] ? bnxt_re_ib_reg+0x2b/0xb30 [bnxt_re] [ 371.635438] ? wake_up_klogd+0x37/0x40 [ 371.635442] bnxt_re_ib_reg+0x2b/0xb30 [bnxt_re] [ 371.635447] bnxt_re_task+0xfd/0x180 [bnxt_re] [ 371.635449] process_one_work+0x216/0x5b0 [ 371.635450] ? process_one_work+0x189/0x5b0 [ 371.635453] worker_thread+0x4e/0x3d0 [ 371.635455] kthread+0x10e/0x140 [ 371.635456] ? process_one_work+0x5b0/0x5b0 [ 371.635458] ? kthread_stop+0x220/0x220 [ 371.635460] ret_from_fork+0x3a/0x50 [ 371.635477] INFO: task NetworkManager:1228 blocked for more than 120 seconds. [ 371.635478] Tainted: G B OE 4.20.0-rc1+ #42 [ 371.635479] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Release the rtnl_lock correctly in the failure path.
--- drivers/infiniband/hw/bnxt_re/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/bnxt_re/main.c +1 -0
@@ -1252,6 +1252,7 @@ static int bnxt_re_ib_reg(struct bnxt_re_dev *rdev)/* Registered a new RoCE device instance to netdev */ rc =bnxt_re_register_netdev (rdev);if (rc) { +rtnl_unlock ();pr_err ("Failed to register with netedev: %#x\n" , rc);return -EINVAL ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 74/142 RDMA/bnxt_re: Avoid accessing the device structure after it is freed
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a6c66d6a08b88cc10aca9d3f65cfae31e7652a99 ]
When bnxt_re_ib_reg returns failure, the device structure gets freed. Driver tries to access the device pointer after it is freed.
[ 4871.034744] Failed to register with netedev: 0xffffffa1 [ 4871.034765] infiniband (null): Failed to register with IB: 0xffffffea [ 4871.046430] ================================================================== [ 4871.046437] BUG: KASAN: use-after-free in bnxt_re_task+0x63/0x180 [bnxt_re] [ 4871.046439] Write of size 4 at addr ffff880fa8406f48 by task kworker/u48:2/17813
[ 4871.046443] CPU: 20 PID: 17813 Comm: kworker/u48:2 Kdump: loaded Tainted: G B OE 4.20.0-rc1+ #42 [ 4871.046444] Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 1.0.4 08/28/2014 [ 4871.046447] Workqueue: bnxt_re bnxt_re_task [bnxt_re] [ 4871.046449] Call Trace: [ 4871.046454] dump_stack+0x91/0xeb [ 4871.046458] print_address_description+0x6a/0x2a0 [ 4871.046461] kasan_report+0x176/0x2d0 [ 4871.046463] ? bnxt_re_task+0x63/0x180 [bnxt_re] [ 4871.046466] bnxt_re_task+0x63/0x180 [bnxt_re] [ 4871.046470] process_one_work+0x216/0x5b0 [ 4871.046471] ? process_one_work+0x189/0x5b0 [ 4871.046475] worker_thread+0x4e/0x3d0 [ 4871.046479] kthread+0x10e/0x140 [ 4871.046480] ? process_one_work+0x5b0/0x5b0 [ 4871.046482] ? kthread_stop+0x220/0x220 [ 4871.046486] ret_from_fork+0x3a/0x50
[ 4871.046492] The buggy address belongs to the page: [ 4871.046494] page:ffffea003ea10180 count:0 mapcount:0 mapping:0000000000000000 index:0x0 [ 4871.046495] flags: 0x57ffffc0000000() [ 4871.046498] raw: 0057ffffc0000000 0000000000000000 ffffea003ea10188 0000000000000000 [ 4871.046500] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 [ 4871.046501] page dumped because: kasan: bad access detected
Avoid accessing the device structure once it is freed.
--- drivers/infiniband/hw/bnxt_re/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/bnxt_re/main.c +2 -0
@@ -1462,6 +1462,7 @@ static void bnxt_re_task(struct work_struct *work) "Failed to register with IB: %#x", rc);bnxt_re_remove_one (rdev);bnxt_re_dev_unreg (rdev); + goto exit; }break ;case NETDEV_UP :
@@ -1485,6 +1486,7 @@ static void bnxt_re_task(struct work_struct *work) }smp_mb__before_atomic ();atomic_dec (&rdev->sched_count); +exit:kfree (re_work); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 75/142 RDMA/rdmavt: Fix rvt_create_ah function signature
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4f32fb921b153ae9ea280e02a3e91509fffc03d3 ]
rdmavt uses a crazy system that looses the type checking when assinging functions to struct ib_device function pointers. Because of this the signature to this function was not changed when the below commit revised things.
Fix the signature so we are not calling a function pointer with a mismatched signature.
--- drivers/infiniband/sw/rdmavt/ah.c | 4 +++- drivers/infiniband/sw/rdmavt/ah.h | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/sw/rdmavt/ah.c +3 -1
@@ -91,13 +91,15 @@ EXPORT_SYMBOL(rvt_check_ah);* rvt_create_ah - create an address handle * @pd: the protection domain * @ah_attr: the attributes of the AH +* @udata: pointer to user's input output buffer information. * * This may be called from interrupt context. * * Return: newly allocated ah */ struct ib_ah *rvt_create_ah (struct ib_pd *pd, -struct rdma_ah_attr *ah_attr) +struct rdma_ah_attr *ah_attr, +struct ib_udata *udata) {struct rvt_ah *ah;struct rvt_dev_info *dev =ib_to_rvt (pd->device);
drivers/infiniband/sw/rdmavt/ah.h +2 -1
@@ -51,7 +51,8 @@#include <rdma/rdma_vt.h> struct ib_ah *rvt_create_ah (struct ib_pd *pd, -struct rdma_ah_attr *ah_attr); +struct rdma_ah_attr *ah_attr, +struct ib_udata *udata);int rvt_destroy_ah (struct ib_ah *ibah);int rvt_modify_ah (struct ib_ah *ibah,struct rdma_ah_attr *ah_attr);int rvt_query_ah (struct ib_ah *ibah,struct rdma_ah_attr *ah_attr);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 76/142 tools: bpftool: fix potential NULL pointer dereference in do_load
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit dde7011a824cfa815b03f853ec985ff46b740939 ]
This patch fixes a possible null pointer dereference in do_load, detected by the semantic patch deref_null.cocci, with the following warning:
./tools/bpf/bpftool/prog.c:1021:23-25: ERROR: map_replace is NULL but dereferenced.
The following code has potential null pointer references:
881 map_replace = reallocarray(map_replace, old_map_fds + 1,
882 sizeof(*map_replace));
883 if (!map_replace) {
884 p_err("mem alloc failed");
885 goto err_free_reuse_maps;
886 }
...
1019 err_free_reuse_maps:
1020 for (i = 0; i < old_map_fds; i++)
1021 close(map_replace[i].fd);
1022 free(map_replace);
--- tools/bpf/bpftool/prog.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
tools/bpf/bpftool/prog.c +7 -3
@@ -749,6 +749,7 @@ static int do_load(int argc, char **argv) }NEXT_ARG (); }else if (is_prefix (*argv,"map" )) { +void *new_map_replace;char *endptr, *name;int fd;
@@ -782,12 +783,15 @@ static int do_load(int argc, char **argv)if (fd <0 ) goto err_free_reuse_maps; - map_replace =reallocarray (map_replace, old_map_fds +1 , -sizeof (*map_replace)); -if (!map_replace) { + new_map_replace =reallocarray (map_replace, + old_map_fds +1 , +sizeof (*map_replace)); +if (!new_map_replace) {p_err ("mem alloc failed" ); goto err_free_reuse_maps; } + map_replace = new_map_replace; + map_replace[old_map_fds].idx = idx; map_replace[old_map_fds].name = name; map_replace[old_map_fds].fd = fd;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 77/142 ASoC: omap-mcbsp: Fix latency value calculation for pm_qos
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit dd2f52d8991af9fe0928d59ec502ba52be7bc38d ]
The latency number is in usec for the pm_qos. Correct the calculation to give us the time in usec
--- sound/soc/omap/omap-mcbsp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/omap/omap-mcbsp.c +3 -3
@@ -308,9 +308,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, pkt_size = channels; } - latency = ((((buffer_size - pkt_size) / channels) *1000 ) - / (params->rate_num / params->rate_den)); - + latency = (buffer_size - pkt_size) / channels; + latency = latency *USEC_PER_SEC / + (params->rate_num / params->rate_den); mcbsp->latency[substream->stream] = latency;omap_mcbsp_set_threshold (substream, pkt_size);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 78/142 ASoC: omap-mcpdm: Add pm_qos handling to avoid under/overruns with CPU_IDLE
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 373a500e34aea97971c9d71e45edad458d3da98f ]
We need to block sleep states which would require longer time to leave than the time the DMA must react to the DMA request in order to keep the FIFO serviced without under of overrun.
--- sound/soc/omap/omap-mcpdm.c | 43 ++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-)
sound/soc/omap/omap-mcpdm.c +42 -1
@@ -54,6 +54,8 @@ struct omap_mcpdm {unsigned long phys_base;void __iomem *io_base;int irq; +struct pm_qos_request pm_qos_req; +int latency[2 ];struct mutex mutex;
@@ -277,6 +279,9 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) {struct omap_mcpdm *mcpdm =snd_soc_dai_get_drvdata (dai); +int tx = (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ); +int stream1 = tx ?SNDRV_PCM_STREAM_PLAYBACK :SNDRV_PCM_STREAM_CAPTURE ; +int stream2 = tx ?SNDRV_PCM_STREAM_CAPTURE :SNDRV_PCM_STREAM_PLAYBACK ;mutex_lock (&mcpdm->mutex);
@@ -289,6 +294,14 @@ static void omap_mcpdm_dai_shutdown(struct snd_pcm_substream *substream, } } +if (mcpdm->latency[stream2]) +pm_qos_update_request (&mcpdm->pm_qos_req, + mcpdm->latency[stream2]); +else if (mcpdm->latency[stream1]) +pm_qos_remove_request (&mcpdm->pm_qos_req); + + mcpdm->latency[stream1] =0 ; +mutex_unlock (&mcpdm->mutex); }
@@ -300,7 +313,7 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream,int stream = substream->stream;struct snd_dmaengine_dai_dma_data *dma_data;u32 threshold; -int channels; +int channels, latency;int link_mask =0 ; channels =params_channels (params);
@@ -344,14 +357,25 @@ static int omap_mcpdm_dai_hw_params(struct snd_pcm_substream *substream, dma_data->maxburst = (MCPDM_DN_THRES_MAX - threshold) * channels; + latency = threshold; }else {/* If playback is not running assume a stereo stream to come */ if (!mcpdm->config[!stream].link_mask) mcpdm->config[!stream].link_mask = (0x3 <<3 ); dma_data->maxburst = threshold * channels; + latency = (MCPDM_DN_THRES_MAX - threshold); } +/* +* The DMA must act to a DMA request within latency time (usec) to avoid +* under/overflow +*/ + mcpdm->latency[stream] = latency *USEC_PER_SEC /params_rate (params); + +if (!mcpdm->latency[stream]) + mcpdm->latency[stream] =10 ; +/* Check if we need to restart McPDM with this stream */ if (mcpdm->config[stream].link_mask && mcpdm->config[stream].link_mask != link_mask)
@@ -366,6 +390,20 @@ static int omap_mcpdm_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) {struct omap_mcpdm *mcpdm =snd_soc_dai_get_drvdata (dai); +struct pm_qos_request *pm_qos_req = &mcpdm->pm_qos_req; +int tx = (substream->stream ==SNDRV_PCM_STREAM_PLAYBACK ); +int stream1 = tx ?SNDRV_PCM_STREAM_PLAYBACK :SNDRV_PCM_STREAM_CAPTURE ; +int stream2 = tx ?SNDRV_PCM_STREAM_CAPTURE :SNDRV_PCM_STREAM_PLAYBACK ; +int latency = mcpdm->latency[stream2]; + +/* Prevent omap hardware from hitting off between FIFO fills */ +if (!latency || mcpdm->latency[stream1] < latency) + latency = mcpdm->latency[stream1]; + +if (pm_qos_request_active (pm_qos_req)) +pm_qos_update_request (pm_qos_req, latency); +else if (latency) +pm_qos_add_request (pm_qos_req,PM_QOS_CPU_DMA_LATENCY , latency);if (!omap_mcpdm_active (mcpdm)) {omap_mcpdm_start (mcpdm);
@@ -427,6 +465,9 @@ static int omap_mcpdm_remove(struct snd_soc_dai *dai)free_irq (mcpdm->irq, (void *)mcpdm);pm_runtime_disable (mcpdm->dev); +if (pm_qos_request_active (&mcpdm->pm_qos_req)) +pm_qos_remove_request (&mcpdm->pm_qos_req); +return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 79/142 ASoC: omap-dmic: Add pm_qos handling to avoid overruns with CPU_IDLE
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ffdcc3638c58d55a6fa68b6e5dfd4fb4109652eb ]
We need to block sleep states which would require longer time to leave than the time the DMA must react to the DMA request in order to keep the FIFO serviced without overrun.
--- sound/soc/omap/omap-dmic.c | 9 +++++++++ 1 file changed, 9 insertions(+)
sound/soc/omap/omap-dmic.c +9 -0
@@ -48,6 +48,8 @@ struct omap_dmic {struct device *dev;void __iomem *io_base;struct clk *fclk; +struct pm_qos_request pm_qos_req; +int latency;int fclk_freq;int out_freq;int clk_div;
@@ -124,6 +126,8 @@ static void omap_dmic_dai_shutdown(struct snd_pcm_substream *substream,mutex_lock (&dmic->mutex); +pm_qos_remove_request (&dmic->pm_qos_req); +if (!dai->active) dmic->active =0 ;
@@ -228,6 +232,8 @@ static int omap_dmic_dai_hw_params(struct snd_pcm_substream *substream,/* packet size is threshold * channels */ dma_data =snd_soc_dai_get_dma_data (dai, substream); dma_data->maxburst = dmic->threshold * channels; + dmic->latency = (OMAP_DMIC_THRES_MAX - dmic->threshold) *USEC_PER_SEC / +params_rate (params);return 0 ; }
@@ -238,6 +244,9 @@ static int omap_dmic_dai_prepare(struct snd_pcm_substream *substream,struct omap_dmic *dmic =snd_soc_dai_get_drvdata (dai);u32 ctrl; +if (pm_qos_request_active (&dmic->pm_qos_req)) +pm_qos_update_request (&dmic->pm_qos_req, dmic->latency); +/* Configure uplink threshold */ omap_dmic_write (dmic,OMAP_DMIC_FIFO_CTRL_REG , dmic->threshold);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 80/142 exportfs: do not read dentry after free
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2084ac6c505a58f7efdec13eba633c6aaa085ca5 ]
The function dentry_connected calls dput(dentry) to drop the previously acquired reference to dentry. In this case, dentry can be released. After that, IS_ROOT(dentry) checks the condition
(dentry == dentry->d_parent), which may result in a use-after-free bug. This patch directly compares dentry with its parent obtained before dropping the reference.
rename/remove")
--- fs/exportfs/expfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/exportfs/expfs.c +1 -1
@@ -77,7 +77,7 @@ static bool dentry_connected(struct dentry *dentry)struct dentry *parent =dget_parent (dentry);dput (dentry); -if (IS_ROOT (dentry)) { +if (dentry == parent) {dput (parent);return false; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 81/142 RDMA/hns: Bugfix pbl configuration for rereg mr
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ca088320a02537f36c243ac21794525d8eabb3bd ]
Current hns driver assigned the first two PBL page addresses from previous registered MR to the hardware when reregister MR changing the memory locations occurred. This will lead to PBL addressing error as the PBL has already been released. This patch fixes this wrong assignment by using the page address from new allocated PBL.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 128 ++++++++++----------- 1 file changed, 60 insertions(+), 68 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +60 -68
@@ -1661,10 +1661,9 @@ static int hns_roce_v2_set_mac(struct hns_roce_dev *hr_dev, u8 phy_port,return hns_roce_cmq_send (hr_dev, &desc,1 ); } -static int hns_roce_v2_write_mtpt (void *mb_buf,struct hns_roce_mr *mr, -unsigned long mtpt_idx) +static int set_mtpt_pbl (struct hns_roce_v2_mpt_entry *mpt_entry, +struct hns_roce_mr *mr) { -struct hns_roce_v2_mpt_entry *mpt_entry;struct scatterlist *sg;u64 page_addr;u64 *pages;
@@ -1672,6 +1671,53 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,int len;int entry; + mpt_entry->pbl_size =cpu_to_le32 (mr->pbl_size); + mpt_entry->pbl_ba_l =cpu_to_le32 (lower_32_bits (mr->pbl_ba >>3 )); +roce_set_field (mpt_entry->byte_48_mode_ba, +V2_MPT_BYTE_48_PBL_BA_H_M ,V2_MPT_BYTE_48_PBL_BA_H_S , +upper_32_bits (mr->pbl_ba >>3 )); + + pages = (u64 *)__get_free_page (GFP_KERNEL ); +if (!pages) +return -ENOMEM ; + + i =0 ; +for_each_sg (mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) { + len =sg_dma_len (sg) >>PAGE_SHIFT ; +for (j =0 ; j < len; ++j) { + page_addr =sg_dma_address (sg) + + (j << mr->umem->page_shift); + pages[i] = page_addr >>6 ; +/* Record the first 2 entry directly to MTPT table */ +if (i >=HNS_ROCE_V2_MAX_INNER_MTPT_NUM -1 ) + goto found; + i++; + } + } +found: + mpt_entry->pa0_l =cpu_to_le32 (lower_32_bits (pages[0 ])); +roce_set_field (mpt_entry->byte_56_pa0_h,V2_MPT_BYTE_56_PA0_H_M , +V2_MPT_BYTE_56_PA0_H_S ,upper_32_bits (pages[0 ])); + + mpt_entry->pa1_l =cpu_to_le32 (lower_32_bits (pages[1 ])); +roce_set_field (mpt_entry->byte_64_buf_pa1,V2_MPT_BYTE_64_PA1_H_M , +V2_MPT_BYTE_64_PA1_H_S ,upper_32_bits (pages[1 ])); +roce_set_field (mpt_entry->byte_64_buf_pa1, +V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M , +V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S , + mr->pbl_buf_pg_sz +PG_SHIFT_OFFSET ); + +free_page ((unsigned long )pages); + +return 0 ; +} + +static int hns_roce_v2_write_mtpt (void *mb_buf,struct hns_roce_mr *mr, +unsigned long mtpt_idx) +{ +struct hns_roce_v2_mpt_entry *mpt_entry; +int ret; + mpt_entry = mb_buf;memset (mpt_entry,0 ,sizeof (*mpt_entry));
@@ -1686,7 +1732,6 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, mr->pbl_ba_pg_sz + PG_SHIFT_OFFSET);roce_set_field (mpt_entry->byte_4_pd_hop_st,V2_MPT_BYTE_4_PD_M ,V2_MPT_BYTE_4_PD_S , mr->pd); - mpt_entry->byte_4_pd_hop_st =cpu_to_le32 (mpt_entry->byte_4_pd_hop_st);roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_RA_EN_S ,0 );roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_R_INV_EN_S ,1 );
@@ -1700,13 +1745,11 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr, (mr->access & IB_ACCESS_REMOTE_WRITE ? 1 : 0));roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_LW_EN_S , (mr->access &IB_ACCESS_LOCAL_WRITE ?1 :0 )); - mpt_entry->byte_8_mw_cnt_en =cpu_to_le32 (mpt_entry->byte_8_mw_cnt_en);roce_set_bit (mpt_entry->byte_12_mw_pa,V2_MPT_BYTE_12_PA_S , mr->type ==MR_TYPE_MR ?0 :1 );roce_set_bit (mpt_entry->byte_12_mw_pa,V2_MPT_BYTE_12_INNER_PA_VLD_S ,1 ); - mpt_entry->byte_12_mw_pa =cpu_to_le32 (mpt_entry->byte_12_mw_pa); mpt_entry->len_l =cpu_to_le32 (lower_32_bits (mr->size)); mpt_entry->len_h =cpu_to_le32 (upper_32_bits (mr->size));
@@ -1717,53 +1760,9 @@ static int hns_roce_v2_write_mtpt(void *mb_buf, struct hns_roce_mr *mr,if (mr->type ==MR_TYPE_DMA )return 0 ; - mpt_entry->pbl_size =cpu_to_le32 (mr->pbl_size); - - mpt_entry->pbl_ba_l =cpu_to_le32 (lower_32_bits (mr->pbl_ba >>3 )); -roce_set_field (mpt_entry->byte_48_mode_ba,V2_MPT_BYTE_48_PBL_BA_H_M , -V2_MPT_BYTE_48_PBL_BA_H_S , -upper_32_bits (mr->pbl_ba >>3 )); - mpt_entry->byte_48_mode_ba =cpu_to_le32 (mpt_entry->byte_48_mode_ba); - - pages = (u64 *)__get_free_page (GFP_KERNEL ); -if (!pages) -return -ENOMEM ; - - i =0 ; -for_each_sg (mr->umem->sg_head.sgl, sg, mr->umem->nmap, entry) { - len =sg_dma_len (sg) >>PAGE_SHIFT ; -for (j =0 ; j < len; ++j) { - page_addr =sg_dma_address (sg) + - (j << mr->umem->page_shift); - pages[i] = page_addr >>6 ; - -/* Record the first 2 entry directly to MTPT table */ -if (i >=HNS_ROCE_V2_MAX_INNER_MTPT_NUM -1 ) - goto found; - i++; - } - } + ret =set_mtpt_pbl (mpt_entry, mr); -found: - mpt_entry->pa0_l =cpu_to_le32 (lower_32_bits (pages[0 ])); -roce_set_field (mpt_entry->byte_56_pa0_h,V2_MPT_BYTE_56_PA0_H_M , -V2_MPT_BYTE_56_PA0_H_S , -upper_32_bits (pages[0 ])); - mpt_entry->byte_56_pa0_h =cpu_to_le32 (mpt_entry->byte_56_pa0_h); - - mpt_entry->pa1_l =cpu_to_le32 (lower_32_bits (pages[1 ])); -roce_set_field (mpt_entry->byte_64_buf_pa1,V2_MPT_BYTE_64_PA1_H_M , -V2_MPT_BYTE_64_PA1_H_S ,upper_32_bits (pages[1 ])); - -free_page ((unsigned long )pages); - -roce_set_field (mpt_entry->byte_64_buf_pa1, -V2_MPT_BYTE_64_PBL_BUF_PG_SZ_M , -V2_MPT_BYTE_64_PBL_BUF_PG_SZ_S , - mr->pbl_buf_pg_sz +PG_SHIFT_OFFSET ); - mpt_entry->byte_64_buf_pa1 =cpu_to_le32 (mpt_entry->byte_64_buf_pa1); - -return 0 ; +return ret; } static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,
@@ -1772,6 +1771,7 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, u64 size, void *mb_buf) { struct hns_roce_v2_mpt_entry *mpt_entry = mb_buf; +int ret =0 ;if (flags &IB_MR_REREG_PD ) { roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M,
@@ -1784,14 +1784,14 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev,V2_MPT_BYTE_8_BIND_EN_S , (mr_access_flags & IB_ACCESS_MW_BIND ? 1 : 0));roce_set_bit (mpt_entry->byte_8_mw_cnt_en, -V2_MPT_BYTE_8_ATOMIC_EN_S , - (mr_access_flags &IB_ACCESS_REMOTE_ATOMIC ?1 :0 )); +V2_MPT_BYTE_8_ATOMIC_EN_S , + mr_access_flags &IB_ACCESS_REMOTE_ATOMIC ?1 :0 );roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_RR_EN_S , - (mr_access_flags &IB_ACCESS_REMOTE_READ ?1 :0 )); + mr_access_flags &IB_ACCESS_REMOTE_READ ?1 :0 );roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_RW_EN_S , - (mr_access_flags &IB_ACCESS_REMOTE_WRITE ?1 :0 )); + mr_access_flags &IB_ACCESS_REMOTE_WRITE ?1 :0 );roce_set_bit (mpt_entry->byte_8_mw_cnt_en,V2_MPT_BYTE_8_LW_EN_S , - (mr_access_flags &IB_ACCESS_LOCAL_WRITE ?1 :0 )); + mr_access_flags &IB_ACCESS_LOCAL_WRITE ?1 :0 ); }if (flags &IB_MR_REREG_TRANS ) {
@@ -1800,21 +1800,13 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, mpt_entry->len_l =cpu_to_le32 (lower_32_bits (size)); mpt_entry->len_h =cpu_to_le32 (upper_32_bits (size)); - mpt_entry->pbl_size =cpu_to_le32 (mr->pbl_size); - mpt_entry->pbl_ba_l = -cpu_to_le32 (lower_32_bits (mr->pbl_ba >>3 )); -roce_set_field (mpt_entry->byte_48_mode_ba, -V2_MPT_BYTE_48_PBL_BA_H_M , -V2_MPT_BYTE_48_PBL_BA_H_S , -upper_32_bits (mr->pbl_ba >>3 )); - mpt_entry->byte_48_mode_ba = -cpu_to_le32 (mpt_entry->byte_48_mode_ba); - mr->iova = iova; mr->size = size; + + ret =set_mtpt_pbl (mpt_entry, mr); } -return 0 ; +return ret; }static void *get_cqe_v2 (struct hns_roce_cq *hr_cq,int n)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 82/142 bpf: fix check of allowed specifiers in bpf_trace_printk
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1efb6ee3edea57f57f9fb05dba8dcb3f7333f61f ]
A format string consisting of "%p" or "%s" followed by an invalid specifier (e.g. "%p%\n" or "%s%") could pass the check which would make format_decode (lib/vsprintf.c) to warn.
--- kernel/trace/bpf_trace.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
kernel/trace/bpf_trace.c +5 -3
@@ -196,11 +196,13 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, i++; }else if (fmt[i] =='p' || fmt[i] =='s' ) { mod[fmt_cnt]++; - i++; -if (!isspace (fmt[i]) && !ispunct (fmt[i]) && fmt[i] !=0 ) +/* disallow any further format extensions */ +if (fmt[i +1 ] !=0 && + !isspace (fmt[i +1 ]) && + !ispunct (fmt[i +1 ]))return -EINVAL ; fmt_cnt++; -if (fmt[i -1 ] =='s' ) { +if (fmt[i] =='s' ) {if (str_seen)/* allow only one '%s' per fmt string */ return -EINVAL ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 83/142 fsi: master-ast-cf: select GENERIC_ALLOCATOR
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 64999fa7aa2c076ec6d05aee481f11f5296ceb8c ]
In randconfig builds without CONFIG_GENERIC_ALLOCATOR, this driver fails to link:
ERROR: "gen_pool_alloc_algo" [drivers/fsi/fsi-master-ast-cf.ko] undefined!
ERROR: "gen_pool_fixed_alloc" [drivers/fsi/fsi-master-ast-cf.ko] undefined!
ERROR: "of_gen_pool_get" [drivers/fsi/fsi-master-ast-cf.ko] undefined!
ERROR: "gen_pool_free" [drivers/fsi/fsi-master-ast-cf.ko] undefined!
Select the dependency as all other users do.
--- drivers/fsi/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/fsi/Kconfig +1 -0
@@ -46,6 +46,7 @@ config FSI_MASTER_AST_CF tristate "FSI master based on Aspeed ColdFire coprocessor" depends on GPIOLIB depends on GPIO_ASPEED + select GENERIC_ALLOCATOR ---help--- This option enables a FSI master using the AST2400 and AST2500 GPIO lines driven by the internal ColdFire coprocessor. This requires
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 84/142 ipvs: call ip_vs_dst_notifier earlier than ipv6_dev_notf
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2a31e4bd9ad255ee40809b5c798c4b1c2b09703b ]
ip_vs_dst_event is supposed to clean up all dst used in ipvs' destinations when a net dev is going down. But it works only when the dst's dev is the same as the dev from the event.
Now with the same priority but late registration, ip_vs_dst_notifier is always called later than ipv6_dev_notf where the dst's dev is set to lo for NETDEV_DOWN event.
As the dst's dev lo is not the same as the dev from the event in ip_vs_dst_event, ip_vs_dst_notifier doesn't actually work. Also as these dst have to wait for dest_trash_timer to clean them up. It would cause some non-permanent kernel warnings:
unregister_netdevice: waiting for br0 to become free. Usage count = 3
To fix it, call ip_vs_dst_notifier earlier than ipv6_dev_notf by increasing its priority to ADDRCONF_NOTIFY_PRIORITY + 5.
Note that for ipv4 route fib_netdev_notifier doesn't set dst's dev to lo in NETDEV_DOWN event, so this fix is only needed when IP_VS_IPV6 is defined.
--- net/netfilter/ipvs/ip_vs_ctl.c | 3 +++ 1 file changed, 3 insertions(+)
net/netfilter/ipvs/ip_vs_ctl.c +3 -0
@@ -3980,6 +3980,9 @@ static void __net_exit ip_vs_control_net_cleanup_sysctl(struct netns_ipvs *ipvs)static struct notifier_block ip_vs_dst_notifier = { .notifier_call = ip_vs_dst_event, +#ifdef CONFIG_IP_VS_IPV6 + .priority =ADDRCONF_NOTIFY_PRIORITY +5 , +#endif };int __net_init ip_vs_control_net_init (struct netns_ipvs *ipvs)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 85/142 USB: omap_udc: use devm_request_irq()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 286afdde1640d8ea8916a0f05e811441fbbf4b9d ]
The current code fails to release the third irq on the error path (observed by reading the code), and we get also multiple WARNs with failing gadget drivers due to duplicate IRQ releases. Fix by using devm_request_irq().
--- drivers/usb/gadget/udc/omap_udc.c | 37 +++++++++---------------------- 1 file changed, 10 insertions(+), 27 deletions(-)
drivers/usb/gadget/udc/omap_udc.c +10 -27
@@ -2867,8 +2867,8 @@ static int omap_udc_probe(struct platform_device *pdev) udc->clr_halt =UDC_RESET_EP ;/* USB general purpose IRQ: ep0, state changes, dma, etc */ - status =request_irq (pdev->resource[1 ].start, omap_udc_irq, -0 , driver_name, udc); + status =devm_request_irq (&pdev->dev, pdev->resource[1 ].start, + omap_udc_irq,0 , driver_name, udc);if (status !=0 ) {ERR ("can't get irq %d, err %d\n" , (int ) pdev->resource[1 ].start, status);
@@ -2876,20 +2876,20 @@ static int omap_udc_probe(struct platform_device *pdev) }/* USB "non-iso" IRQ (PIO for all but ep0) */ - status =request_irq (pdev->resource[2 ].start, omap_udc_pio_irq, -0 ,"omap_udc pio" , udc); + status =devm_request_irq (&pdev->dev, pdev->resource[2 ].start, + omap_udc_pio_irq,0 ,"omap_udc pio" , udc);if (status !=0 ) {ERR ("can't get irq %d, err %d\n" , (int ) pdev->resource[2 ].start, status); - goto cleanup2; + goto cleanup1; }#ifdef USE_ISO - status =request_irq (pdev->resource[3 ].start, omap_udc_iso_irq, -0 ,"omap_udc iso" , udc); + status =devm_request_irq (&pdev->dev, pdev->resource[3 ].start, + omap_udc_iso_irq,0 ,"omap_udc iso" , udc);if (status !=0 ) {ERR ("can't get irq %d, err %d\n" , (int ) pdev->resource[3 ].start, status); - goto cleanup3; + goto cleanup1; }#endif if (cpu_is_omap16xx () ||cpu_is_omap7xx ()) {
@@ -2902,22 +2902,11 @@ static int omap_udc_probe(struct platform_device *pdev)create_proc_file (); status =usb_add_gadget_udc_release (&pdev->dev, &udc->gadget, omap_udc_release); -if (status) - goto cleanup4; - -return 0 ; +if (!status) +return 0 ; -cleanup4:remove_proc_file (); -#ifdef USE_ISO -cleanup3: -free_irq (pdev->resource[2 ].start, udc); -#endif - -cleanup2: -free_irq (pdev->resource[1 ].start, udc); - cleanup1:kfree (udc); udc =NULL ;
@@ -2961,12 +2950,6 @@ static int omap_udc_remove(struct platform_device *pdev)remove_proc_file (); -#ifdef USE_ISO -free_irq (pdev->resource[3 ].start, udc); -#endif -free_irq (pdev->resource[2 ].start, udc); -free_irq (pdev->resource[1 ].start, udc); -if (udc->dc_clk) {if (udc->clk_requested)omap_udc_enable_clock (0 );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 86/142 USB: omap_udc: fix crashes on probe error and module removal
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 99f700366fcea1aa2fa3c49c99f371670c3c62f8 ]
We currently crash if usb_add_gadget_udc_release() fails, since the udc->done is not initialized until in the remove function. Furthermore, on module removal the udc data is accessed although the release function is already triggered by usb_del_gadget_udc() early in the function.
Fix by rewriting the release and remove functions, basically moving all the cleanup into the release function, and doing the completion only in the module removal case.
The patch fixes omap_udc module probe with a failing gadged, and also allows the removal of omap_udc. Tested by running "modprobe omap_udc; modprobe -r omap_udc" in a loop.
--- drivers/usb/gadget/udc/omap_udc.c | 50 ++++++++++++------------------- 1 file changed, 19 insertions(+), 31 deletions(-)
drivers/usb/gadget/udc/omap_udc.c +19 -31
@@ -2593,9 +2593,22 @@ omap_ep_setup(char *name, u8 addr, u8 type,static void omap_udc_release (struct device *dev) { -complete (udc->done); +pullup_disable (udc); +if (!IS_ERR_OR_NULL (udc->transceiver)) { +usb_put_phy (udc->transceiver); + udc->transceiver =NULL ; + } +omap_writew (0 ,UDC_SYSCON1 ); +remove_proc_file (); +if (udc->dc_clk) { +if (udc->clk_requested) +omap_udc_enable_clock (0 ); +clk_put (udc->hhc_clk); +clk_put (udc->dc_clk); + } +if (udc->done) +complete (udc->done);kfree (udc); - udc =NULL ; } static int
@@ -2900,12 +2913,8 @@ static int omap_udc_probe(struct platform_device *pdev) }create_proc_file (); - status =usb_add_gadget_udc_release (&pdev->dev, &udc->gadget, - omap_udc_release); -if (!status) -return 0 ; - -remove_proc_file (); +return usb_add_gadget_udc_release (&pdev->dev, &udc->gadget, + omap_udc_release); cleanup1:kfree (udc);
@@ -2932,36 +2941,15 @@ static int omap_udc_remove(struct platform_device *pdev) {DECLARE_COMPLETION_ONSTACK (done); -if (!udc) -return -ENODEV ; - -usb_del_gadget_udc (&udc->gadget); -if (udc->driver) -return -EBUSY ; - udc->done = &done; -pullup_disable (udc); -if (!IS_ERR_OR_NULL (udc->transceiver)) { -usb_put_phy (udc->transceiver); - udc->transceiver =NULL ; - } -omap_writew (0 ,UDC_SYSCON1 ); - -remove_proc_file (); +usb_del_gadget_udc (&udc->gadget); -if (udc->dc_clk) { -if (udc->clk_requested) -omap_udc_enable_clock (0 ); -clk_put (udc->hhc_clk); -clk_put (udc->dc_clk); - } +wait_for_completion (&done);release_mem_region (pdev->resource[0 ].start, pdev->resource[0 ].end - pdev->resource[0 ].start +1 ); -wait_for_completion (&done); -return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 87/142 USB: omap_udc: fix omap_udc_start() on 15xx machines
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6ca6695f576b8453fe68865e84d25946d63b10ad ]
On OMAP 15xx machines there are no transceivers, and omap_udc_start() always fails as it forgot to adjust the default return value.
--- drivers/usb/gadget/udc/omap_udc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/omap_udc.c +2 -1
@@ -2041,7 +2041,7 @@ static inline int machine_without_vbus_sense(void)static int omap_udc_start (struct usb_gadget *g,struct usb_gadget_driver *driver) { -int status = -ENODEV ; +int status;struct omap_ep *ep;unsigned long flags;
@@ -2079,6 +2079,7 @@ static int omap_udc_start(struct usb_gadget *g, goto done; } }else { + status =0 ;if (can_pullup (udc))pullup_enable (udc);else
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 88/142 USB: omap_udc: fix USB gadget functionality on Palm Tungsten E
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2c2322fbcab8102b8cadc09d66714700a2da42c2 ]
On Palm TE nothing happens when you try to use gadget drivers and plug the USB cable. Fix by adding the board to the vbus sense quirk list.
--- drivers/usb/gadget/udc/omap_udc.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/gadget/udc/omap_udc.c +1 -0
@@ -2033,6 +2033,7 @@ static inline int machine_without_vbus_sense(void) {return machine_is_omap_innovator () ||machine_is_omap_osk () + ||machine_is_omap_palmte () ||machine_is_sx1 ()/* No known omap7xx boards with vbus sense */ ||cpu_is_omap7xx ();
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 89/142 USB: omap_udc: fix rejection of out transfers when DMA is used
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 069caf5950dfa75d0526cd89c439ff9d9d3136d8 ]
Commit 387f869d2579 ("usb: gadget: u_ether: conditionally align transfer size") started aligning transfer size only if requested, breaking omap_udc DMA mode. Set quirk_ep_out_aligned_size to restore the old behaviour.
--- drivers/usb/gadget/udc/omap_udc.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/gadget/udc/omap_udc.c +1 -0
@@ -2642,6 +2642,7 @@ omap_udc_setup(struct platform_device *odev, struct usb_phy *xceiv) udc->gadget.speed =USB_SPEED_UNKNOWN ; udc->gadget.max_speed =USB_SPEED_FULL ; udc->gadget.name = driver_name; + udc->gadget.quirk_ep_out_aligned_size =1 ; udc->transceiver = xceiv;/* ep0 is special; put it right after the SETUP buffer */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 90/142 thunderbolt: Prevent root port runtime suspend during NVM upgrade
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1830b6eeda1fed42d85f2388f79c926331a9b2d0 ]
During NVM upgrade process the host router is hot-removed for a short while. During this time it is possible that the root port is moved into D3cold which would be fine if the root port could trigger PME on itself. However, many systems actually do not implement it so what happens is that the root port goes into D3cold and never wakes up unless userspace does PCI config space access, such as running 'lscpi'.
For this reason we explicitly prevent the root port from runtime suspending during NVM upgrade.
--- drivers/thunderbolt/switch.c | 40 ++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-)
drivers/thunderbolt/switch.c +38 -2
@@ -864,6 +864,30 @@ static ssize_t key_store(struct device *dev, struct device_attribute *attr, } static DEVICE_ATTR(key, 0600, key_show, key_store); +static void nvm_authenticate_start (struct tb_switch *sw) +{ +struct pci_dev *root_port; + +/* +* During host router NVM upgrade we should not allow root port to +* go into D3cold because some root ports cannot trigger PME +* itself. To be on the safe side keep the root port in D0 during +* the whole upgrade process. +*/ + root_port =pci_find_pcie_root_port (sw->tb->nhi->pdev); +if (root_port) +pm_runtime_get_noresume (&root_port->dev); +} + +static void nvm_authenticate_complete (struct tb_switch *sw) +{ +struct pci_dev *root_port; + + root_port =pci_find_pcie_root_port (sw->tb->nhi->pdev); +if (root_port) +pm_runtime_put (&root_port->dev); +} +static ssize_t nvm_authenticate_show (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -913,10 +937,18 @@ static ssize_t nvm_authenticate_store(struct device *dev, sw->nvm->authenticating = true; -if (!tb_route (sw)) +if (!tb_route (sw)) { +/* +* Keep root port from suspending as long as the +* NVM upgrade process is running. +*/ +nvm_authenticate_start (sw); ret =nvm_authenticate_host (sw); -else +if (ret) +nvm_authenticate_complete (sw); + }else { ret =nvm_authenticate_device (sw); + }pm_runtime_mark_last_busy (&sw->dev);pm_runtime_put_autosuspend (&sw->dev); }
@@ -1336,6 +1368,10 @@ static int tb_switch_add_dma_port(struct tb_switch *sw)if (ret <=0 )return ret; +/* Now we can allow root port to suspend again */ +if (!tb_route (sw)) +nvm_authenticate_complete (sw); +if (status) {tb_sw_info (sw,"switch flash authentication failed\n" );tb_switch_set_uuid (sw);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 91/142 drm/meson: add support for 1080p25 mode
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31e1ab494559fb46de304cc6c2aed1528f94b298 ]
This essential mode for PAL users is missing, so add it.
--- drivers/gpu/drm/meson/meson_venc.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/meson/meson_venc.c +1 -0
@@ -715,6 +715,7 @@ struct meson_hdmi_venc_vic_mode { { 5, &meson_hdmi_encp_mode_1080i60 }, { 20, &meson_hdmi_encp_mode_1080i50 }, { 32, &meson_hdmi_encp_mode_1080p24 }, + { 33, &meson_hdmi_encp_mode_1080p50 }, { 34, &meson_hdmi_encp_mode_1080p30 }, { 31, &meson_hdmi_encp_mode_1080p50 }, { 16, &meson_hdmi_encp_mode_1080p60 },
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 92/142 netfilter: ipv6: Preserve link scope traffic original oif
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 508b09046c0f21678652fb66fd1e9959d55591d2 ]
When ip6_route_me_harder is invoked, it resets outgoing interface of:
- link-local scoped packets sent by neighbor discovery
- multicast packets sent by MLD host
- multicast packets send by MLD proxy daemon that sets outgoing interface through IPV6_PKTINFO ipi6_ifindex
Link-local and multicast packets must keep their original oif after ip6_route_me_harder is called.
--- net/ipv6/netfilter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/netfilter.c +2 -1
@@ -24,7 +24,8 @@ int ip6_route_me_harder(struct net *net, struct sk_buff *skb)unsigned int hh_len;struct dst_entry *dst;struct flowi6 fl6 = { - .flowi6_oif = sk ? sk->sk_bound_dev_if :0 , + .flowi6_oif = sk && sk->sk_bound_dev_if ? sk->sk_bound_dev_if : +rt6_need_strict (&iph->daddr) ?skb_dst (skb)->dev->ifindex :0 , .flowi6_mark = skb->mark, .flowi6_uid =sock_net_uid (net, sk), .daddr = iph->daddr,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 93/142 IB/mlx5: Fix page fault handling for MW
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 75b7b86bdb0df37e08e44b6c1f99010967f81944 ]
Memory windows are implemented with an indirect MKey, when a page fault event comes for a MW Mkey we need to find the MR at the end of the list of the indirect MKeys by iterating on all items from the first to the last.
The offset calculated during this process has to be zeroed after the first iteration or the next iteration will start from a wrong address, resulting incorrect ODP faulting behavior.
--- drivers/infiniband/hw/mlx5/odp.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/mlx5/odp.c +1 -0
@@ -724,6 +724,7 @@ static int pagefault_single_data_segment(struct mlx5_ib_dev *dev, head = frame; bcnt -= frame->bcnt; + offset =0 ; }break ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 94/142 netfilter: add missing error handling code for register functions
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 584eab291c67894cb17cc87544b9d086228ea70f ]
register_{netdevice/inetaddr/inet6addr}_notifier may return an error value, this patch adds the code to handle these error paths.
--- .../net/netfilter/ipv4/nf_nat_masquerade.h | 2 +- .../net/netfilter/ipv6/nf_nat_masquerade.h | 2 +- net/ipv4/netfilter/ipt_MASQUERADE.c | 7 ++-- net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | 21 +++++++++--- net/ipv4/netfilter/nft_masq_ipv4.c | 4 ++- net/ipv6/netfilter/ip6t_MASQUERADE.c | 8 +++-- net/ipv6/netfilter/nf_nat_masquerade_ipv6.c | 32 +++++++++++++------ net/ipv6/netfilter/nft_masq_ipv6.c | 4 ++- net/netfilter/nft_flow_offload.c | 5 ++- 9 files changed, 63 insertions(+), 22 deletions(-)
include/net/netfilter/ipv4/nf_nat_masquerade.h +1 -1
@@ -9,7 +9,7 @@ nf_nat_masquerade_ipv4(struct sk_buff *skb, unsigned int hooknum,const struct nf_nat_range2 *range, const struct net_device *out); -void nf_nat_masquerade_ipv4_register_notifier (void ); +int nf_nat_masquerade_ipv4_register_notifier (void );void nf_nat_masquerade_ipv4_unregister_notifier (void );#endif /*_NF_NAT_MASQUERADE_IPV4_H_ */
include/net/netfilter/ipv6/nf_nat_masquerade.h +1 -1
@@ -5,7 +5,7 @@unsigned int nf_nat_masquerade_ipv6 (struct sk_buff *skb,const struct nf_nat_range2 *range,const struct net_device *out); -void nf_nat_masquerade_ipv6_register_notifier (void ); +int nf_nat_masquerade_ipv6_register_notifier (void );void nf_nat_masquerade_ipv6_unregister_notifier (void );#endif /* _NF_NAT_MASQUERADE_IPV6_H_ */
net/ipv4/netfilter/ipt_MASQUERADE.c +5 -2
@@ -81,9 +81,12 @@ static int __init masquerade_tg_init(void)int ret; ret =xt_register_target (&masquerade_tg_reg); +if (ret) +return ret; -if (ret ==0 ) -nf_nat_masquerade_ipv4_register_notifier (); + ret =nf_nat_masquerade_ipv4_register_notifier (); +if (ret) +xt_unregister_target (&masquerade_tg_reg);return ret; }
net/ipv4/netfilter/nf_nat_masquerade_ipv4.c +17 -4
@@ -133,16 +133,29 @@ static struct notifier_block masq_inet_notifier = {static atomic_t masquerade_notifier_refcount =ATOMIC_INIT (0 ); -void nf_nat_masquerade_ipv4_register_notifier (void ) +int nf_nat_masquerade_ipv4_register_notifier (void ) { +int ret; +/* check if the notifier was already set */ if (atomic_inc_return (&masquerade_notifier_refcount) >1 ) -return ; +return 0 ;/* Register for device down reports */ -register_netdevice_notifier (&masq_dev_notifier); + ret =register_netdevice_notifier (&masq_dev_notifier); +if (ret) + goto err_dec;/* Register IP address change reports */ -register_inetaddr_notifier (&masq_inet_notifier); + ret =register_inetaddr_notifier (&masq_inet_notifier); +if (ret) + goto err_unregister; + +return ret; +err_unregister: +unregister_netdevice_notifier (&masq_dev_notifier); +err_dec: +atomic_dec (&masquerade_notifier_refcount); +return ret; }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv4_register_notifier);
net/ipv4/netfilter/nft_masq_ipv4.c +3 -1
@@ -69,7 +69,9 @@ static int __init nft_masq_ipv4_module_init(void)if (ret <0 )return ret; -nf_nat_masquerade_ipv4_register_notifier (); + ret =nf_nat_masquerade_ipv4_register_notifier (); +if (ret) +nft_unregister_expr (&nft_masq_ipv4_type);return ret; }
net/ipv6/netfilter/ip6t_MASQUERADE.c +6 -2
@@ -58,8 +58,12 @@ static int __init masquerade_tg6_init(void)int err; err =xt_register_target (&masquerade_tg6_reg); -if (err ==0 ) -nf_nat_masquerade_ipv6_register_notifier (); +if (err) +return err; + + err =nf_nat_masquerade_ipv6_register_notifier (); +if (err) +xt_unregister_target (&masquerade_tg6_reg);return err; }
net/ipv6/netfilter/nf_nat_masquerade_ipv6.c +23 -9
@@ -120,8 +120,8 @@ static void iterate_cleanup_work(struct work_struct *work)* of ipv6 addresses being deleted), we also need to add an upper * limit to the number of queued work items. */ -static int masq_inet_event (struct notifier_block *this, -unsigned long event,void *ptr) +static int masq_inet6_event (struct notifier_block *this, +unsigned long event,void *ptr) {struct inet6_ifaddr *ifa = ptr;const struct net_device *dev;
@@ -158,20 +158,34 @@ static int masq_inet_event(struct notifier_block *this,return NOTIFY_DONE ; } -static struct notifier_block masq_inet_notifier = { - .notifier_call = masq_inet_event, +static struct notifier_block masq_inet6_notifier = { + .notifier_call = masq_inet6_event, };static atomic_t masquerade_notifier_refcount =ATOMIC_INIT (0 ); -void nf_nat_masquerade_ipv6_register_notifier (void ) +int nf_nat_masquerade_ipv6_register_notifier (void ) { +int ret; +/* check if the notifier is already set */ if (atomic_inc_return (&masquerade_notifier_refcount) >1 ) -return ; +return 0 ; -register_netdevice_notifier (&masq_dev_notifier); -register_inet6addr_notifier (&masq_inet_notifier); + ret =register_netdevice_notifier (&masq_dev_notifier); +if (ret) + goto err_dec; + + ret =register_inet6addr_notifier (&masq_inet6_notifier); +if (ret) + goto err_unregister; + +return ret; +err_unregister: +unregister_netdevice_notifier (&masq_dev_notifier); +err_dec: +atomic_dec (&masquerade_notifier_refcount); +return ret; }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv6_register_notifier);
@@ -181,7 +195,7 @@ void nf_nat_masquerade_ipv6_unregister_notifier(void)if (atomic_dec_return (&masquerade_notifier_refcount) >0 )return ; -unregister_inet6addr_notifier (&masq_inet_notifier); +unregister_inet6addr_notifier (&masq_inet6_notifier);unregister_netdevice_notifier (&masq_dev_notifier); }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv6_unregister_notifier);
net/ipv6/netfilter/nft_masq_ipv6.c +3 -1
@@ -70,7 +70,9 @@ static int __init nft_masq_ipv6_module_init(void)if (ret <0 )return ret; -nf_nat_masquerade_ipv6_register_notifier (); + ret =nf_nat_masquerade_ipv6_register_notifier (); +if (ret) +nft_unregister_expr (&nft_masq_ipv6_type);return ret; }
net/netfilter/nft_flow_offload.c +4 -1
@@ -214,7 +214,9 @@ static int __init nft_flow_offload_module_init(void) {int err; -register_netdevice_notifier (&flow_offload_netdev_notifier); + err =register_netdevice_notifier (&flow_offload_netdev_notifier); +if (err) + goto err; err =nft_register_expr (&nft_flow_offload_type);if (err <0 )
@@ -224,6 +226,7 @@ static int __init nft_flow_offload_module_init(void) register_expr:unregister_netdevice_notifier (&flow_offload_netdev_notifier); +err:return err; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 95/142 netfilter: nat: fix double register in masquerade modules
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 095faf45e64be00bff4da2d6182dface3d69c9b7 ]
There is a reference counter to ensure that masquerade modules register notifiers only once. However, the existing reference counter approach is not safe, test commands are:
while :
do
modprobe ip6t_MASQUERADE &
modprobe nft_masq_ipv6 &
modprobe -rv ip6t_MASQUERADE &
modprobe -rv nft_masq_ipv6 &
done
numbers below represent the reference counter.
--------------------------------------------------------
CPU0 CPU1 CPU2 CPU3 CPU4
[insmod] [insmod] [rmmod] [rmmod] [insmod]
--------------------------------------------------------
0->1
register 1->2
returns 2->1
returns 1->0
0->1
register <--
unregister--------------------------------------------------------
The unregistation of CPU3 should be processed before the registration of CPU4.
In order to fix this, use a mutex instead of reference counter.
splat looks like:
[ 323.869557] watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [modprobe:1381] [ 323.869574] Modules linked in: nf_tables(+) nf_nat_ipv6(-) nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 n] [ 323.869574] irq event stamp: 194074 [ 323.898930] hardirqs last enabled at (194073): [<ffffffff90004a0d>] trace_hardirqs_on_thunk+0x1a/0x1c [ 323.898930] hardirqs last disabled at (194074): [<ffffffff90004a29>] trace_hardirqs_off_thunk+0x1a/0x1c [ 323.898930] softirqs last enabled at (182132): [<ffffffff922006ec>] __do_softirq+0x6ec/0xa3b [ 323.898930] softirqs last disabled at (182109): [<ffffffff90193426>] irq_exit+0x1a6/0x1e0 [ 323.898930] CPU: 0 PID: 1381 Comm: modprobe Not tainted 4.20.0-rc2+ #27 [ 323.898930] RIP: 0010:raw_notifier_chain_register+0xea/0x240 [ 323.898930] Code: 3c 03 0f 8e f2 00 00 00 44 3b 6b 10 7f 4d 49 bc 00 00 00 00 00 fc ff df eb 22 48 8d 7b 10 488 [ 323.898930] RSP: 0018:ffff888101597218 EFLAGS: 00000206 ORIG_RAX: ffffffffffffff13 [ 323.898930] RAX: 0000000000000000 RBX: ffffffffc04361c0 RCX: 0000000000000000 [ 323.898930] RDX: 1ffffffff26132ae RSI: ffffffffc04aa3c0 RDI: ffffffffc04361d0 [ 323.898930] RBP: ffffffffc04361c8 R08: 0000000000000000 R09: 0000000000000001 [ 323.898930] R10: ffff8881015972b0 R11: fffffbfff26132c4 R12: dffffc0000000000 [ 323.898930] R13: 0000000000000000 R14: 1ffff110202b2e44 R15: ffffffffc04aa3c0 [ 323.898930] FS: 00007f813ed41540(0000) GS:ffff88811ae00000(0000) knlGS:0000000000000000 [ 323.898930] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 323.898930] CR2: 0000559bf2c9f120 CR3: 000000010bc80000 CR4: 00000000001006f0 [ 323.898930] Call Trace: [ 323.898930] ? atomic_notifier_chain_register+0x2d0/0x2d0 [ 323.898930] ? down_read+0x150/0x150 [ 323.898930] ? sched_clock_cpu+0x126/0x170 [ 323.898930] ? nf_tables_core_module_init+0xe4/0xe4 [nf_tables] [ 323.898930] ? nf_tables_core_module_init+0xe4/0xe4 [nf_tables] [ 323.898930] register_netdevice_notifier+0xbb/0x790 [ 323.898930] ? __dev_close_many+0x2d0/0x2d0 [ 323.898930] ? __mutex_unlock_slowpath+0x17f/0x740 [ 323.898930] ? wait_for_completion+0x710/0x710 [ 323.898930] ? nf_tables_core_module_init+0xe4/0xe4 [nf_tables] [ 323.898930] ? up_write+0x6c/0x210 [ 323.898930] ? nf_tables_core_module_init+0xe4/0xe4 [nf_tables] [ 324.127073] ? nf_tables_core_module_init+0xe4/0xe4 [nf_tables] [ 324.127073] nft_chain_filter_init+0x1e/0xe8a [nf_tables] [ 324.127073] nf_tables_module_init+0x37/0x92 [nf_tables]
[ ... ]
--- net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | 23 ++++++++++++++------- net/ipv6/netfilter/nf_nat_masquerade_ipv6.c | 23 ++++++++++++++------- 2 files changed, 32 insertions(+), 14 deletions(-)
net/ipv4/netfilter/nf_nat_masquerade_ipv4.c +16 -7
@@ -131,15 +131,17 @@ static struct notifier_block masq_inet_notifier = { .notifier_call = masq_inet_event, }; -static atomic_t masquerade_notifier_refcount =ATOMIC_INIT (0 ); +static int masq_refcnt; +static DEFINE_MUTEX (masq_mutex);int nf_nat_masquerade_ipv4_register_notifier (void ) { -int ret; +int ret =0 ; +mutex_lock (&masq_mutex);/* check if the notifier was already set */ -if (atomic_inc_return (&masquerade_notifier_refcount) >1 ) -return 0 ; +if (++masq_refcnt >1 ) + goto out_unlock;/* Register for device down reports */ ret =register_netdevice_notifier (&masq_dev_notifier);
@@ -150,22 +152,29 @@ int nf_nat_masquerade_ipv4_register_notifier(void)if (ret) goto err_unregister; +mutex_unlock (&masq_mutex);return ret; + err_unregister:unregister_netdevice_notifier (&masq_dev_notifier); err_dec: -atomic_dec (&masquerade_notifier_refcount); + masq_refcnt--; +out_unlock: +mutex_unlock (&masq_mutex);return ret; }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv4_register_notifier);void nf_nat_masquerade_ipv4_unregister_notifier (void ) { +mutex_lock (&masq_mutex);/* check if the notifier still has clients */ -if (atomic_dec_return (&masquerade_notifier_refcount) >0 ) -return ; +if (--masq_refcnt >0 ) + goto out_unlock;unregister_netdevice_notifier (&masq_dev_notifier);unregister_inetaddr_notifier (&masq_inet_notifier); +out_unlock: +mutex_unlock (&masq_mutex); }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv4_unregister_notifier);
net/ipv6/netfilter/nf_nat_masquerade_ipv6.c +16 -7
@@ -162,15 +162,17 @@ static struct notifier_block masq_inet6_notifier = { .notifier_call = masq_inet6_event, }; -static atomic_t masquerade_notifier_refcount =ATOMIC_INIT (0 ); +static int masq_refcnt; +static DEFINE_MUTEX (masq_mutex);int nf_nat_masquerade_ipv6_register_notifier (void ) { -int ret; +int ret =0 ; +mutex_lock (&masq_mutex);/* check if the notifier is already set */ -if (atomic_inc_return (&masquerade_notifier_refcount) >1 ) -return 0 ; +if (++masq_refcnt >1 ) + goto out_unlock; ret =register_netdevice_notifier (&masq_dev_notifier);if (ret)
@@ -180,22 +182,29 @@ int nf_nat_masquerade_ipv6_register_notifier(void)if (ret) goto err_unregister; +mutex_unlock (&masq_mutex);return ret; + err_unregister:unregister_netdevice_notifier (&masq_dev_notifier); err_dec: -atomic_dec (&masquerade_notifier_refcount); + masq_refcnt--; +out_unlock: +mutex_unlock (&masq_mutex);return ret; }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv6_register_notifier);void nf_nat_masquerade_ipv6_unregister_notifier (void ) { +mutex_lock (&masq_mutex);/* check if the notifier still has clients */ -if (atomic_dec_return (&masquerade_notifier_refcount) >0 ) -return ; +if (--masq_refcnt >0 ) + goto out_unlock;unregister_inet6addr_notifier (&masq_inet6_notifier);unregister_netdevice_notifier (&masq_dev_notifier); +out_unlock: +mutex_unlock (&masq_mutex); }EXPORT_SYMBOL_GPL (nf_nat_masquerade_ipv6_unregister_notifier);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 96/142 netfilter: nf_conncount: remove wrong condition check routine
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 53ca0f2fec39c80ccd19e6e3f30cc8daef174b70 ]
All lists that reach the tree_nodes_free() function have both zero counter and true dead flag. The reason for this is that lists to be release are selected by nf_conncount_gc_list() which already decrements the list counter and sets on the dead flag. Therefore, this if statement in tree_nodes_free() is unnecessary and wrong.
--- net/netfilter/nf_conncount.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
net/netfilter/nf_conncount.c +2 -5
@@ -323,11 +323,8 @@ static void tree_nodes_free(struct rb_root *root,while (gc_count) { rbconn = gc_nodes[--gc_count];spin_lock (&rbconn->list.list_lock); -if (rbconn->list.count ==0 && rbconn->list.dead == false) { - rbconn->list.dead = true; -rb_erase (&rbconn->node, root); -call_rcu (&rbconn->rcu_head, __tree_nodes_free); - } +rb_erase (&rbconn->node, root); +call_rcu (&rbconn->rcu_head, __tree_nodes_free);spin_unlock (&rbconn->list.list_lock); } }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 97/142 KVM: VMX: Update shared MSRs to be saved/restored on MSR_EFER.LMA changes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f48b4711dd6e1cf282f9dfd159c14a305909c97c ]
When guest transitions from/to long-mode by modifying MSR_EFER.LMA, the list of shared MSRs to be saved/restored on guest<->host transitions is updated (See vmx_set_efer() call to setup_msrs()).
On every entry to guest, vcpu_enter_guest() calls vmx_prepare_switch_to_guest(). This function should also take care of setting the shared MSRs to be saved/restored. However, the function does nothing in case we are already running with loaded guest state (vmx->loaded_cpu_state != NULL).
This means that even when guest modifies MSR_EFER.LMA which results in updating the list of shared MSRs, it isn't being taken into account by vmx_prepare_switch_to_guest() because it happens while we are running with loaded guest state.
To fix above mentioned issue, add a flag to mark that the list of shared MSRs has been updated and modify vmx_prepare_switch_to_guest() to set shared MSRs when running with host state *OR* list of shared MSRs has been updated.
Note that this issue was mistakenly introduced by commit 678e315e78a7 ("KVM: vmx: add dedicated utility to access guest's kernel_gs_base") because previously vmx_set_efer() always called vmx_load_host_state() which resulted in vmx_prepare_switch_to_guest() to set shared MSRs.
--- arch/x86/kvm/vmx.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
arch/x86/kvm/vmx.c +16 -5
@@ -962,6 +962,7 @@ struct vcpu_vmx {struct shared_msr_entry *guest_msrs;int nmsrs;int save_nmsrs; +bool guest_msrs_dirty;unsigned long host_idt_base;#ifdef CONFIG_X86_64 u64 msr_host_kernel_gs_base;
@@ -2874,6 +2875,20 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu) vmx->req_immediate_exit = false; +/* +* Note that guest MSRs to be saved/restored can also be changed +* when guest state is loaded. This happens when guest transitions +* to/from long-mode by setting MSR_EFER.LMA. +*/ +if (!vmx->loaded_cpu_state || vmx->guest_msrs_dirty) { + vmx->guest_msrs_dirty = false; +for (i =0 ; i < vmx->save_nmsrs; ++i) +kvm_set_shared_msr (vmx->guest_msrs[i].index, + vmx->guest_msrs[i].data, + vmx->guest_msrs[i].mask); + + } +if (vmx->loaded_cpu_state)return ;
@@ -2934,11 +2949,6 @@ static void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)vmcs_writel (HOST_GS_BASE , gs_base); host_state->gs_base = gs_base; } - -for (i =0 ; i < vmx->save_nmsrs; ++i) -kvm_set_shared_msr (vmx->guest_msrs[i].index, - vmx->guest_msrs[i].data, - vmx->guest_msrs[i].mask); }static void vmx_prepare_switch_to_host (struct vcpu_vmx *vmx)
@@ -3418,6 +3428,7 @@ static void setup_msrs(struct vcpu_vmx *vmx)move_msr_up (vmx, index, save_nmsrs++); vmx->save_nmsrs = save_nmsrs; + vmx->guest_msrs_dirty = true;if (cpu_has_vmx_msr_bitmap ())vmx_update_msr_bitmap (&vmx->vcpu);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 98/142 KVM: x86: fix empty-body warnings
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 354cb410d87314e2eda344feea84809e4261570a ]
We get the following warnings about empty statements when building with 'W=1':
arch/x86/kvm/lapic.c:632:53: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] arch/x86/kvm/lapic.c:1907:42: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] arch/x86/kvm/lapic.c:1936:65: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] arch/x86/kvm/lapic.c:1975:44: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
Rework the debug helper macro to get rid of these warnings.
--- arch/x86/kvm/lapic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/lapic.c +1 -1
@@ -55,7 +55,7 @@#define PRIo64 "o"/* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */ -#define apic_debug(fmt, arg...) +#define apic_debug(fmt, arg...) do {} while (0)/* 14 is the version for Xeon and Pentium 8.4.8*/ #define APIC_VERSION (0x14UL | ((KVM_APIC_LVT_NUM - 1) << 16))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 99/142 x86/kvm/vmx: fix old-style function declaration
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1e4329ee2c52692ea42cc677fb2133519718b34a ]
The inline keyword which is not at the beginning of the function declaration may trigger the following build warnings, so let's fix it:
arch/x86/kvm/vmx.c:1309:1: warning: ‘inline’ is not at beginning of declaration [-Wold-style-declaration] arch/x86/kvm/vmx.c:5947:1: warning: ‘inline’ is not at beginning of declaration [-Wold-style-declaration] arch/x86/kvm/vmx.c:5985:1: warning: ‘inline’ is not at beginning of declaration [-Wold-style-declaration] arch/x86/kvm/vmx.c:6023:1: warning: ‘inline’ is not at beginning of declaration [-Wold-style-declaration]
--- arch/x86/kvm/vmx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/x86/kvm/vmx.c +4 -4
@@ -1285,7 +1285,7 @@ static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked);static bool nested_vmx_is_page_fault_vmexit (struct vmcs12 *vmcs12,u16 error_code);static void vmx_update_msr_bitmap (struct kvm_vcpu *vcpu); -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap,u32 msr,int type); static DEFINE_PER_CPU(struct vmcs *, vmxarea);
@@ -5935,7 +5935,7 @@ static void free_vpid(int vpid)spin_unlock (&vmx_vpid_lock); } -static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, +static __always_inline void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap,u32 msr,int type) {int f =sizeof (unsigned long );
@@ -5973,7 +5973,7 @@ static void __always_inline vmx_disable_intercept_for_msr(unsigned long *msr_bit } } -static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitmap, +static __always_inline void vmx_enable_intercept_for_msr(unsigned long *msr_bitmap,u32 msr,int type) {int f =sizeof (unsigned long );
@@ -6011,7 +6011,7 @@ static void __always_inline vmx_enable_intercept_for_msr(unsigned long *msr_bitm } } -static void __always_inline vmx_set_intercept_for_msr(unsigned long *msr_bitmap, +static __always_inline void vmx_set_intercept_for_msr(unsigned long *msr_bitmap,u32 msr,int type,bool value) {if (value)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 100/142 net: thunderx: fix NULL pointer dereference in nic_remove
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 24a6d2dd263bc910de018c78d1148b3e33b94512 ]
Fix a possible NULL pointer dereference in nic_remove routine removing the nicpf module if nic_probe fails.
The issue can be triggered with the following reproducer:
$rmmod nicvf
$rmmod nicpf
[ 521.412008] Unable to handle kernel access to user memory outside uaccess routines at virtual address 0000000000000014 [ 521.422777] Mem abort info: [ 521.425561] ESR = 0x96000004 [ 521.428624] Exception class = DABT (current EL), IL = 32 bits [ 521.434535] SET = 0, FnV = 0 [ 521.437579] EA = 0, S1PTW = 0 [ 521.440730] Data abort info: [ 521.443603] ISV = 0, ISS = 0x00000004 [ 521.447431] CM = 0, WnR = 0 [ 521.450417] user pgtable: 4k pages, 48-bit VAs, pgdp = 0000000072a3da42 [ 521.457022] [0000000000000014] pgd=0000000000000000 [ 521.461916] Internal error: Oops: 96000004 [#1] SMP [ 521.511801] Hardware name: GIGABYTE H270-T70/MT70-HD0, BIOS T49 02/02/2018 [ 521.518664] pstate: 80400005 (Nzcv daif +PAN -UAO) [ 521.523451] pc : nic_remove+0x24/0x88 [nicpf] [ 521.527808] lr : pci_device_remove+0x48/0xd8 [ 521.532066] sp : ffff000013433cc0 [ 521.535370] x29: ffff000013433cc0 x28: ffff810f6ac50000 [ 521.540672] x27: 0000000000000000 x26: 0000000000000000 [ 521.545974] x25: 0000000056000000 x24: 0000000000000015 [ 521.551274] x23: ffff8007ff89a110 x22: ffff000001667070 [ 521.556576] x21: ffff8007ffb170b0 x20: ffff8007ffb17000 [ 521.561877] x19: 0000000000000000 x18: 0000000000000025 [ 521.567178] x17: 0000000000000000 x16: 000000000000010ffc33ff98 x8 : 0000000000000000 [ 521.593683] x7 : 0000000000000000 x6 : 0000000000000001 [ 521.598983] x5 : 0000000000000002 x4 : 0000000000000003 [ 521.604284] x3 : ffff8007ffb17184 x2 : ffff8007ffb17184 [ 521.609585] x1 : ffff000001662118 x0 : ffff000008557be0 [ 521.614887] Process rmmod (pid: 1897, stack limit = 0x00000000859535c3) [ 521.621490] Call trace: [ 521.623928] nic_remove+0x24/0x88 [nicpf] [ 521.627927] pci_device_remove+0x48/0xd8 [ 521.631847] device_release_driver_internal+0x1b0/0x248 [ 521.637062] driver_detach+0x50/0xc0 [ 521.640628] bus_remove_driver+0x60/0x100 [ 521.644627] driver_unregister+0x34/0x60 [ 521.648538] pci_unregister_driver+0x24/0xd8 [ 521.652798] nic_cleanup_module+0x14/0x111c [nicpf] [ 521.657672] __arm64_sys_delete_module+0x150/0x218 [ 521.662460] el0_svc_handler+0x94/0x110 [ 521.666287] el0_svc+0x8/0xc [ 521.669160] Code: aa1e03e0 9102c295 d503201f f9404eb3 (b9401660)
--- drivers/net/ethernet/cavium/thunder/nic_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/cavium/thunder/nic_main.c +3 -0
@@ -1441,6 +1441,9 @@ static void nic_remove(struct pci_dev *pdev) {struct nicpf *nic =pci_get_drvdata (pdev); +if (!nic) +return ; +if (nic->flags &NIC_SRIOV_ENABLED )pci_disable_sriov (pdev);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 101/142 usb: gadget: u_ether: fix unsafe list iteration
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c9287fa657b3328b4549c0ab39ea7f197a3d6a50 ]
list_for_each_entry_safe() is not safe for deleting entries from the list if the spin lock, which protects it, is released and reacquired during the list iteration. Fix this issue by replacing this construction with a simple check if list is empty and removing the first entry in each iteration. This is almost equivalent to a revert of the commit mentioned in the Fixes: tag.
This patch fixes following issue:
--->8---
Unable to handle kernel NULL pointer dereference at virtual address 00000104 pgd = (ptrval) [00000104] *pgd=00000000 Internal error: Oops: 817 [#1] PREEMPT SMP ARM Modules linked in: CPU: 1 PID: 84 Comm: kworker/1:1 Not tainted 4.20.0-rc2-next-20181114-00009-g8266b35ec404 #1061 Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) Workqueue: events eth_work PC is at rx_fill+0x60/0xac LR is at _raw_spin_lock_irqsave+0x50/0x5c pc : [<c065fee0>] lr : [<c0a056b8>] psr: 80000093
sp : ee7fbee8 ip : 00000100 fp : 00000000
r10: 006000c0 r9 : c10b0ab0 r8 : ee7eb5c0
r7 : ee7eb614 r6 : ee7eb5ec r5 : 000000dc r4 : ee12ac00 r3 : ee12ac24 r2 : 00000200 r1 : 60000013 r0 : ee7eb5ec
Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none
Control: 10c5387d Table: 6d5dc04a DAC: 00000051 Process kworker/1:1 (pid: 84, stack limit = 0x(ptrval))
Stack: (0xee7fbee8 to 0xee7fc000)
...
[<c065fee0>] (rx_fill) from [<c0143b7c>] (process_one_work+0x200/0x738) [<c0143b7c>] (process_one_work) from [<c0144118>] (worker_thread+0x2c/0x4c8) [<c0144118>] (worker_thread) from [<c014a8a4>] (kthread+0x128/0x164) [<c014a8a4>] (kthread) from [<c01010b4>] (ret_from_fork+0x14/0x20)
Exception stack(0xee7fbfb0 to 0xee7fbff8) ... ---[ end trace 64480bc835eba7d6 ]---
--- drivers/usb/gadget/function/u_ether.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/usb/gadget/function/u_ether.c +6 -5
@@ -401,12 +401,12 @@ static int alloc_requests(struct eth_dev *dev, struct gether *link, unsigned n)static void rx_fill (struct eth_dev *dev,gfp_t gfp_flags) {struct usb_request *req; -struct usb_request *tmp;unsigned long flags;/* fill unused rxq slots with some skb */ spin_lock_irqsave (&dev->req_lock, flags); -list_for_each_entry_safe (req, tmp, &dev->rx_reqs, list) { +while (!list_empty (&dev->rx_reqs)) { + req = list_first_entry(&dev->rx_reqs, struct usb_request, list);list_del_init (&req->list);spin_unlock_irqrestore (&dev->req_lock, flags);
@@ -1125,7 +1125,6 @@ void gether_disconnect(struct gether *link) {struct eth_dev *dev = link->ioport;struct usb_request *req; -struct usb_request *tmp;WARN_ON (!dev);if (!dev)
@@ -1142,7 +1141,8 @@ void gether_disconnect(struct gether *link)*/ usb_ep_disable (link->in_ep);spin_lock (&dev->req_lock); -list_for_each_entry_safe (req, tmp, &dev->tx_reqs, list) { +while (!list_empty (&dev->tx_reqs)) { + req = list_first_entry(&dev->tx_reqs, struct usb_request, list);list_del (&req->list);spin_unlock (&dev->req_lock);
@@ -1154,7 +1154,8 @@ void gether_disconnect(struct gether *link)usb_ep_disable (link->out_ep);spin_lock (&dev->req_lock); -list_for_each_entry_safe (req, tmp, &dev->rx_reqs, list) { +while (!list_empty (&dev->rx_reqs)) { + req = list_first_entry(&dev->rx_reqs, struct usb_request, list);list_del (&req->list);spin_unlock (&dev->req_lock);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 102/142 netfilter: nf_tables: deactivate expressions in rule replecement routine
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ca08987885a147643817d02bf260bc4756ce8cd4 ]
There is no expression deactivation call from the rule replacement path, hence, chain counter is not decremented. A few steps to reproduce the problem:
%nft add table ip filter
%nft add chain ip filter c1
%nft add chain ip filter c1
%nft add rule ip filter c1 jump c2
%nft replace rule ip filter c1 handle 3 accept
%nft flush ruleset
<jump c2> expression means immediate NFT_JUMP to chain c2. Reference count of chain c2 is increased when the rule is added.
When rule is deleted or replaced, the reference counter of c2 should be decreased via nft_rule_expr_deactivate() which calls nft_immediate_deactivate().
Splat looks like:
[ 214.396453] WARNING: CPU: 1 PID: 21 at net/netfilter/nf_tables_api.c:1432 nf_tables_chain_destroy.isra.38+0x2f9/0x3a0 [nf_tables] [ 214.398983] Modules linked in: nf_tables nfnetlink [ 214.398983] CPU: 1 PID: 21 Comm: kworker/1:1 Not tainted 4.20.0-rc2+ #44 [ 214.398983] Workqueue: events nf_tables_trans_destroy_work [nf_tables] [ 214.398983] RIP: 0010:nf_tables_chain_destroy.isra.38+0x2f9/0x3a0 [nf_tables] [ 214.398983] Code: 00 00 00 fc ff df 48 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 8e 00 00 00 48 8b 7b 58 e8 e1 2c 4e c6 48 89 df e8 d9 2c 4e c6 eb 9a <0f> 0b eb 96 0f 0b e9 7e fe ff ff e8 a7 7e 4e c6 e9 a4 fe ff ff e8 [ 214.398983] RSP: 0018:ffff8881152874e8 EFLAGS: 00010202 [ 214.398983] RAX: 0000000000000001 RBX: ffff88810ef9fc28 RCX: ffff8881152876f0 [ 214.398983] RDX: dffffc0000000000 RSI: 1ffff11022a50ede RDI: ffff88810ef9fc78 [ 214.398983] RBP: 1ffff11022a50e9d R08: 0000000080000000 R09: 0000000000000000 [ 214.398983] R10: 0000000000000000 R11: 0000000000000000 R12: 1ffff11022a50eba [ 214.398983] R13: ffff888114446e08 R14: ffff8881152876f0 R15: ffffed1022a50ed6 [ 214.398983] FS: 0000000000000000(0000) GS:ffff888116400000(0000) knlGS:0000000000000000 [ 214.398983] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 214.398983] CR2: 00007fab9bb5f868 CR3: 000000012aa16000 CR4: 00000000001006e0 [ 214.398983] Call Trace: [ 214.398983] ? nf_tables_table_destroy.isra.37+0x100/0x100 [nf_tables] [ 214.398983] ? __kasan_slab_free+0x145/0x180 [ 214.398983] ? nf_tables_trans_destroy_work+0x439/0x830 [nf_tables] [ 214.398983] ? kfree+0xdb/0x280 [ 214.398983] nf_tables_trans_destroy_work+0x5f5/0x830 [nf_tables]
[ ... ]
Reported by: Christoph Anton Mitterer <[email protected]>
--- net/netfilter/nf_tables_api.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-)
net/netfilter/nf_tables_api.c +4 -11
@@ -2646,21 +2646,14 @@ static int nf_tables_newrule(struct net *net, struct sock *nlsk, }if (nlh->nlmsg_flags &NLM_F_REPLACE ) { -if (!nft_is_active_next (net, old_rule)) { - err = -ENOENT ; - goto err2; - } - trans =nft_trans_rule_add (&ctx,NFT_MSG_DELRULE , - old_rule); + trans =nft_trans_rule_add (&ctx,NFT_MSG_NEWRULE , rule);if (trans ==NULL ) { err = -ENOMEM ; goto err2; } -nft_deactivate_next (net, old_rule); - chain->use--; - -if (nft_trans_rule_add (&ctx,NFT_MSG_NEWRULE , rule) ==NULL ) { - err = -ENOMEM ; + err =nft_delrule (&ctx, old_rule); +if (err <0 ) { +nft_trans_destroy (trans); goto err2; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 103/142 ALSA: usb-audio: Add vendor and product name for Dell WD19 Dock
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8159a6a4a7d2a092d5375f695ecfca22b4562b5f ]
Like the Dell WD15 Dock, the WD19 Dock (0bda:402e) doens't provide useful string for the vendor and product names too. In order to share the UCM with WD15, here we keep the profile_name same as the WD15.
--- sound/usb/quirks-table.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
sound/usb/quirks-table.h +10 -0
@@ -3387,5 +3387,15 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), .ifnum = QUIRK_NO_INTERFACE } }, +/* Dell WD19 Dock */ +{ + USB_DEVICE(0x0bda, 0x402e), + .driver_info = (unsigned long ) & (const struct snd_usb_audio_quirk ) { + .vendor_name ="Dell" , + .product_name ="WD19 Dock" , + .profile_name ="Dell-WD15-Dock" , + .ifnum =QUIRK_NO_INTERFACE + } +}, #undef USB_DEVICE_VENDOR_SPEC
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 104/142 cachefiles: Fix an assertion failure when trying to update a failed object
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e6bc06faf64a83384cc0abc537df954c9d3ff942 ]
If cachefiles gets an error other then ENOENT when trying to look up an object in the cache (in this case, EACCES), the object state machine will eventually transition to the DROP_OBJECT state.
This state invokes fscache_drop_object() which tries to sync the auxiliary data with the cache (this is done lazily since commit 402cb8dda949d) on an incomplete cache object struct.
The problem comes when cachefiles_update_object_xattr() is called to rewrite the xattr holding the data. There's an assertion there that the cache object points to a dentry as we're going to update its xattr. The assertion trips, however, as dentry didn't get set.
Fix the problem by skipping the update in cachefiles if the object doesn't refer to a dentry. A better way to do it could be to skip the update from the DROP_OBJECT state handler in fscache, but that might deny the cache the opportunity to update intermediate state.
If this error occurs, the kernel log includes lines that look like the following:
CacheFiles: Lookup failed error -13
CacheFiles:
CacheFiles: Assertion failed
------------[ cut here ]------------ kernel BUG at fs/cachefiles/xattr.c:138! ... Workqueue: fscache_object fscache_object_work_func [fscache] RIP: 0010:cachefiles_update_object_xattr.cold.4+0x18/0x1a [cachefiles] ... Call Trace: cachefiles_update_object+0xdd/0x1c0 [cachefiles] fscache_update_aux_data+0x23/0x30 [fscache] fscache_drop_object+0x18e/0x1c0 [fscache] fscache_object_work_func+0x74/0x2b0 [fscache] process_one_work+0x18d/0x340 worker_thread+0x2e/0x390 ? pwq_unbound_release_workfn+0xd0/0xd0 kthread+0x112/0x130 ? kthread_bind+0x30/0x30 ret_from_fork+0x35/0x40
Note that there are actually two issues here: (1) EACCES happened on a cache object and (2) an oops occurred. I think that the second is a consequence of the first (it certainly looks like it ought to be). This patch only deals with the second.
--- fs/cachefiles/xattr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/cachefiles/xattr.c +2 -1
@@ -135,7 +135,8 @@ int cachefiles_update_object_xattr(struct cachefiles_object *object,struct dentry *dentry = object->dentry;int ret; -ASSERT (dentry); +if (!dentry) +return -ESTALE ;_enter ("%p,#%d" , object, auxdata->len);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 105/142 fscache: Fix race in fscache_op_complete() due to split atomic_sub & read
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3f2b7b9035107d6096ea438ea3d97dcf0481b6d2 ]
The code in fscache_retrieval_complete is using atomic_sub followed by an atomic_read:
atomic_sub(n_pages, &op->n_pages);
if (atomic_read(&op->n_pages) <= 0)
fscache_op_complete(&op->op, true);This causes two threads doing a decrement of n_pages to race with each other seeing the op->refcount 0 at same time - and they end up calling fscache_op_complete() in both the threads leading to an assertion failure.
Fix this by using atomic_sub_return_relaxed() instead of two calls. Note that I'm using 'relaxed' rather than, say, 'release' as there aren't multiple variables that appear to need ordering across the release.
The oops looks something like:
FS-Cache: Assertion failed
FS-Cache: 0 > 0 is false
...
kernel BUG at /usr/src/linux-4.4.0/fs/fscache/operation.c:449!
...
Workqueue: fscache_operation fscache_op_work_func [fscache] ... RIP: 0010:[<ffffffffc037eacd>] fscache_op_complete+0x10d/0x180 [fscache] ... Call Trace: [<ffffffffc1464cf9>] cachefiles_read_copier+0x3a9/0x410 [cachefiles] [<ffffffffc037e272>] fscache_op_work_func+0x22/0x50 [fscache] [<ffffffff81096da0>] process_one_work+0x150/0x3f0 [<ffffffff8109751a>] worker_thread+0x11a/0x470 [<ffffffff81808e59>] ? __schedule+0x359/0x980 [<ffffffff81097400>] ? rescuer_thread+0x310/0x310 [<ffffffff8109cdd6>] kthread+0xd6/0xf0 [<ffffffff8109cd00>] ? kthread_park+0x60/0x60 [<ffffffff8180d0cf>] ret_from_fork+0x3f/0x70 [<ffffffff8109cd00>] ? kthread_park+0x60/0x60
This seen this in 4.4.x kernels and the same bug affects fscache in latest upstreams kernels.
--- include/linux/fscache-cache.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
include/linux/fscache-cache.h +1 -2
@@ -196,8 +196,7 @@ static inline void fscache_enqueue_retrieval(struct fscache_retrieval *op)static inline void fscache_retrieval_complete (struct fscache_retrieval *op,int n_pages) { -atomic_sub (n_pages, &op->n_pages); -if (atomic_read (&op->n_pages) <=0 ) +if (atomic_sub_return_relaxed (n_pages, &op->n_pages) <=0 )fscache_op_complete (&op->op, false); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 106/142 cachefiles: Fix page leak in cachefiles_read_backing_file while vmscan is active
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9a24ce5b66f9c8190d63b15f4473600db4935f1f ]
[Description]
In a heavily loaded system where the system pagecache is nearing memory limits and fscache is enabled, pages can be leaked by fscache while trying read pages from cachefiles backend. This can happen because two applications can be reading same page from a single mount, two threads can be trying to read the backing page at same time. This results in one of the threads finding that a page for the backing file or netfs file is already in the radix tree. During the error handling cachefiles does not clean up the reference on backing page, leading to page leak.
[Fix]
The fix is straightforward, to decrement the reference when error is encountered.
[dhowells: Note that I've removed the clearance and put of newpage as
they aren't attested in the commit message and don't appear to actually achieve anything since a new page is only allocated is newpage!=NULL and any residual new page is cleared before returning.]
[Testing]
I have tested the fix using following method for 12+ hrs.
1) mkdir -p /mnt/nfs ; mount -o vers=3,fsc <server_ip>:/export /mnt/nfs
2) create 10000 files of 2.8MB in a NFS mount.
3) start a thread to simulate heavy VM presssure
(while true ; do echo 3 > /proc/sys/vm/drop_caches ; sleep 1 ; done)&
4) start multiple parallel reader for data set at same time
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null & find /mnt/nfs -type f | xargs -P 80 cat > /dev/null & find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
..
..
find /mnt/nfs -type f | xargs -P 80 cat > /dev/null & find /mnt/nfs -type f | xargs -P 80 cat > /dev/null &
5) finally check using cat /proc/fs/fscache/stats | grep -i pages ; free -h , cat /proc/meminfo and page-types -r -b lru to ensure all pages are freed.
--- fs/cachefiles/rdwr.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/cachefiles/rdwr.c +6 -0
@@ -535,7 +535,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, netpage->index, cachefiles_gfp);if (ret <0 ) {if (ret == -EEXIST ) { +put_page (backpage); + backpage =NULL ;put_page (netpage); + netpage =NULL ;fscache_retrieval_complete (op,1 );continue ; }
@@ -608,7 +611,10 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object, netpage->index, cachefiles_gfp);if (ret <0 ) {if (ret == -EEXIST ) { +put_page (backpage); + backpage =NULL ;put_page (netpage); + netpage =NULL ;fscache_retrieval_complete (op,1 );continue ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 107/142 igb: fix uninitialized variables
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e4c39f7926b4de355f7df75651d75003806aae09 ]
This patch fixes the variable 'phy_word' may be used uninitialized.
--- drivers/net/ethernet/intel/igb/e1000_i210.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/igb/e1000_i210.c +1 -0
@@ -842,6 +842,7 @@ s32 igb_pll_workaround_i210(struct e1000_hw *hw) nvm_word =E1000_INVM_DEFAULT_AL ; tmp_nvm = nvm_word |E1000_INVM_PLL_WO_VAL ;igb_write_phy_reg_82580 (hw,I347AT4_PAGE_SELECT ,E1000_PHY_PLL_FREQ_PAGE ); + phy_word =E1000_PHY_PLL_UNCONF ;for (i =0 ; i <E1000_MAX_PLL_TRIES ; i++) {/* check current state directly from internal PHY */ igb_read_phy_reg_82580 (hw,E1000_PHY_PLL_FREQ_REG , &phy_word);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 108/142 ixgbe: recognize 1000BaseLX SFP modules as 1Gbps
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a8bf879af7b1999eba36303ce9cc60e0e7dd816c ]
Add the two 1000BaseLX enum values to the X550's check for 1Gbps modules, allowing the core driver code to establish a link over this SFP type.
This is done by the out-of-tree driver but the fix wasn't in mainline.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +3 -1
@@ -2248,7 +2248,9 @@ static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw, *autoneg = false;if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || - hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) { + hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || + hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) { *speed =IXGBE_LINK_SPEED_1GB_FULL ;return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 109/142 net: hisilicon: remove unexpected free_netdev
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c758940158bf29fe14e9d0f89d5848f227b48134 ]
The net device ndev is freed via free_netdev when failing to register the device. The control flow then jumps to the error handling code block. ndev is used and freed again. Resulting in a use-after-free bug.
--- drivers/net/ethernet/hisilicon/hip04_eth.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/ethernet/hisilicon/hip04_eth.c +1 -3
@@ -914,10 +914,8 @@ static int hip04_mac_probe(struct platform_device *pdev) } ret =register_netdev (ndev); -if (ret) { -free_netdev (ndev); +if (ret) goto alloc_fail; - }return 0 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 110/142 drm/amdgpu: Add delay after enable RLC ucode
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ad97d9de45835b6a0f71983b0ae0cffd7306730a ]
Driver shouldn't try to access any GFX registers until RLC is idle. During the test, it took 12 seconds for RLC to clear the BUSY bit in RLC_GPM_STAT register which is un-acceptable for driver. As per RLC engineer, it would take RLC Ucode less than 10,000 GFXCLK cycles to finish its critical section. In a lowest 300M enginer clock setting(default from vbios), 50 us delay is enough.
This commit fix the hang when RLC introduce the work around for XGMI which requires more cycles to setup more registers than normal
--- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +4 -3
@@ -2243,12 +2243,13 @@ static void gfx_v9_0_rlc_start(struct amdgpu_device *adev)#endif WREG32_FIELD15 (GC ,0 ,RLC_CNTL ,RLC_ENABLE_F32 ,1 ); +udelay (50 );/* carrizo do enable cp interrupt after cp inited */ -if (!(adev->flags &AMD_IS_APU )) +if (!(adev->flags &AMD_IS_APU )) {gfx_v9_0_enable_gui_idle_interrupt (adev, true); - -udelay (50 ); +udelay (50 ); + }#ifdef AMDGPU_RLC_DEBUG_RETRY /* RLC_GPM_GENERAL_6 : RLC Ucode version */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 111/142 drm/ast: fixed reading monitor EDID not stable issue
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 300625620314194d9e6d4f6dda71f2dc9cf62d9f ]
v1: over-sample data to increase the stability with some specific monitors
v2: refine to avoid infinite loop
v3: remove un-necessary "volatile" declaration
[airlied: fix two checkpatch warnings]
--- drivers/gpu/drm/ast/ast_mode.c | 36 ++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-)
drivers/gpu/drm/ast/ast_mode.c +30 -6
@@ -973,9 +973,21 @@ static int get_clock(void *i2c_priv) {struct ast_i2c_chan *i2c = i2c_priv;struct ast_private *ast = i2c->dev->dev_private; -uint32_t val; +uint32_t val, val2, count, pass; + + count =0 ; + pass =0 ; + val = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x10 ) >>4 ) &0x01 ; +do { + val2 = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x10 ) >>4 ) &0x01 ; +if (val == val2) { + pass++; + }else { + pass =0 ; + val = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x10 ) >>4 ) &0x01 ; + } + }while ((pass <5 ) && (count++ <0x10000 )); - val =ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x10 ) >>4 ;return val &1 ?1 :0 ; }
@@ -983,9 +995,21 @@ static int get_data(void *i2c_priv) {struct ast_i2c_chan *i2c = i2c_priv;struct ast_private *ast = i2c->dev->dev_private; -uint32_t val; +uint32_t val, val2, count, pass; + + count =0 ; + pass =0 ; + val = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x20 ) >>5 ) &0x01 ; +do { + val2 = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x20 ) >>5 ) &0x01 ; +if (val == val2) { + pass++; + }else { + pass =0 ; + val = (ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x20 ) >>5 ) &0x01 ; + } + }while ((pass <5 ) && (count++ <0x10000 )); - val =ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x20 ) >>5 ;return val &1 ?1 :0 ; }
@@ -998,7 +1022,7 @@ static void set_clock(void *i2c_priv, int clock)for (i =0 ; i <0x10000 ; i++) { ujcrb7 = ((clock &0x01 ) ?0 :1 ); -ast_set_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0xfe , ujcrb7); +ast_set_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0xf4 , ujcrb7); jtemp =ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x01 );if (ujcrb7 == jtemp)break ;
@@ -1014,7 +1038,7 @@ static void set_data(void *i2c_priv, int data)for (i =0 ; i <0x10000 ; i++) { ujcrb7 = ((data &0x01 ) ?0 :1 ) <<2 ; -ast_set_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0xfb , ujcrb7); +ast_set_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0xf1 , ujcrb7); jtemp =ast_get_index_reg_mask (ast,AST_IO_CRTC_PORT ,0xb7 ,0x04 );if (ujcrb7 == jtemp)break ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 112/142 xen: xlate_mmu: add missing header to fix W=1 warning
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 72791ac854fea36034fa7976b748fde585008e78 ]
Add a missing header otherwise compiler warns about missed prototype:
drivers/xen/xlate_mmu.c:183:5: warning: no previous prototype for 'xen_xlate_unmap_gfn_range?' [-Wmissing-prototypes]
int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
^~~~~~~~~~~~~~~~~~~~~~~~~
--- drivers/xen/xlate_mmu.c | 1 + 1 file changed, 1 insertion(+)
drivers/xen/xlate_mmu.c +1 -0
@@ -36,6 +36,7 @@#include <asm/xen/hypervisor.h> #include <xen/xen.h> +#include <xen/xen-ops.h> #include <xen/page.h> #include <xen/interface/xen.h> #include <xen/interface/memory.h>
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 113/142 Revert "xen/balloon: Mark unallocated host memory as UNUSABLE"
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 123664101aa2156d05251704fc63f9bcbf77741a ]
This reverts commit b3cf8528bb21febb650a7ecbf080d0647be40b9f.
That commit unintentionally broke Xen balloon memory hotplug with "hotplug_unpopulated" set to 1. As long as "System RAM" resource got assigned under a new "Unusable memory" resource in IO/Mem tree any attempt to online this memory would fail due to general kernel restrictions on having "System RAM" resources as 1st level only.
The original issue that commit has tried to workaround fa564ad96366 ("x86/PCI: Enable a 64bit BAR on AMD Family 15h (Models 00-1f, 30-3f, 60-7f)") also got amended by the following 03a551734 ("x86/PCI: Move and shrink AMD 64-bit window to avoid conflict") which made the original fix to Xen ballooning unnecessary.
--- arch/x86/xen/enlighten.c | 78 ---------------------------------------- arch/x86/xen/setup.c | 6 ++-- drivers/xen/balloon.c | 65 +++++---------------------------- include/xen/balloon.h | 5 --- 4 files changed, 13 insertions(+), 141 deletions(-)
arch/x86/xen/enlighten.c +0 -78
@@ -7,7 +7,6 @@#include <xen/features.h> #include <xen/page.h> -#include <xen/interface/memory.h> #include <asm/xen/hypercall.h> #include <asm/xen/hypervisor.h>
@@ -343,80 +342,3 @@ void xen_arch_unregister_cpu(int num) }EXPORT_SYMBOL (xen_arch_unregister_cpu);#endif - -#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG -void __init arch_xen_balloon_init (struct resource *hostmem_resource) -{ -struct xen_memory_map memmap; -int rc; -unsigned int i, last_guest_ram; -phys_addr_t max_addr =PFN_PHYS (max_pfn); -struct e820_table *xen_e820_table; -const struct e820_entry *entry; -struct resource *res; - -if (!xen_initial_domain ()) -return ; - - xen_e820_table =kmalloc (sizeof (*xen_e820_table),GFP_KERNEL ); -if (!xen_e820_table) -return ; - - memmap.nr_entries =ARRAY_SIZE (xen_e820_table->entries); -set_xen_guest_handle (memmap.buffer, xen_e820_table->entries); - rc =HYPERVISOR_memory_op (XENMEM_machine_memory_map, &memmap); -if (rc) { -pr_warn ("%s: Can't read host e820 (%d)\n" , __func__, rc); - goto out; - } - - last_guest_ram =0 ; -for (i =0 ; i < memmap.nr_entries; i++) { -if (xen_e820_table->entries[i].addr >= max_addr) -break ; -if (xen_e820_table->entries[i].type ==E820_TYPE_RAM ) - last_guest_ram = i; - } - - entry = &xen_e820_table->entries[last_guest_ram]; -if (max_addr >= entry->addr + entry->size) - goto out;/* No unallocated host RAM. */ - - hostmem_resource->start = max_addr; - hostmem_resource->end = entry->addr + entry->size; - -/* -* Mark non-RAM regions between the end of dom0 RAM and end of host RAM -* as unavailable. The rest of that region can be used for hotplug-based -* ballooning. -*/ -for (; i < memmap.nr_entries; i++) { - entry = &xen_e820_table->entries[i]; - -if (entry->type ==E820_TYPE_RAM ) -continue ; - -if (entry->addr >= hostmem_resource->end) -break ; - - res =kzalloc (sizeof (*res),GFP_KERNEL ); -if (!res) - goto out; - - res->name ="Unavailable host RAM" ; - res->start = entry->addr; - res->end = (entry->addr + entry->size < hostmem_resource->end) ? - entry->addr + entry->size : hostmem_resource->end; - rc =insert_resource (hostmem_resource, res); -if (rc) { -pr_warn ("%s: Can't insert [%llx - %llx) (%d)\n" , - __func__, res->start, res->end, rc); -kfree (res); - goto out; - } - } - - out: -kfree (xen_e820_table); -} -#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
arch/x86/xen/setup.c +4 -2
@@ -808,6 +808,7 @@ char * __init xen_memory_setup(void) addr = xen_e820_table.entries[0 ].addr; size = xen_e820_table.entries[0 ].size;while (i < xen_e820_table.nr_entries) { +bool discard = false; chunk_size = size; type = xen_e820_table.entries[i].type;
@@ -823,10 +824,11 @@ char * __init xen_memory_setup(void)xen_add_extra_mem (pfn_s, n_pfns); xen_max_p2m_pfn = pfn_s + n_pfns; }else - type =E820_TYPE_UNUSABLE ; + discard = true; } -xen_align_and_add_e820_region (addr, chunk_size, type); +if (!discard) +xen_align_and_add_e820_region (addr, chunk_size, type); addr += chunk_size; size -= chunk_size;
drivers/xen/balloon.c +9 -56
91 lines not on this page · raw message
include/xen/balloon.h +0 -5
@@ -44,8 +44,3 @@ static inline void xen_balloon_init(void) { }#endif - -#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG -struct resource ; -void arch_xen_balloon_init (struct resource *hostmem_resource); -#endif
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 114/142 pvcalls-front: fixes incorrect error handling
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 975ef94a0284648fb0137bd5e949b18cef604e33 ]
kfree() is incorrectly used to release the pages allocated by __get_free_page() and __get_free_pages(). Use the matching deallocators i.e., free_page() and free_pages(), respectively.
--- drivers/xen/pvcalls-front.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/xen/pvcalls-front.c +2 -2
@@ -385,8 +385,8 @@ static int create_active(struct sock_mapping *map, int *evtchn) out_error:if (*evtchn >=0 )xenbus_free_evtchn (pvcalls_front_dev, *evtchn); -kfree (map->active.data.in); -kfree (map->active.ring); +free_pages ((unsigned long )map->active.data.in,PVCALLS_RING_ORDER ); +free_page ((unsigned long )map->active.ring);return ret; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 115/142 pstore/ram: Correctly calculate usable PRZ bytes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 89d328f637b9904b6d4c9af73c8a608b8dd4d6f8 ]
The actual number of bytes stored in a PRZ is smaller than the bytes requested by platform data, since there is a header on each PRZ. Additionally, if ECC is enabled, there are trailing bytes used as well. Normally this mismatch doesn't matter since PRZs are circular buffers and the leading "overflow" bytes are just thrown away. However, in the case of a compressed record, this rather badly corrupts the results.
This corruption was visible with "ramoops.mem_size=204800 ramoops.ecc=1". Any stored crashes would not be uncompressable (producing a pstorefs "dmesg-*.enc.z" file), and triggering errors at boot:
[ 2.790759] pstore: crypto_comp_decompress failed, ret = -22!
Backporting this depends on commit 70ad35db3321 ("pstore: Convert console write to use ->write_buf")
--- fs/pstore/ram.c | 15 ++++++--------- include/linux/pstore.h | 5 ++++- 2 files changed, 10 insertions(+), 10 deletions(-)
fs/pstore/ram.c +6 -9
@@ -806,17 +806,14 @@ static int ramoops_probe(struct platform_device *pdev) cxt->pstore.data = cxt;/* -* Console can handle any buffer size, so prefer LOG_LINE_MAX. If we -* have to handle dumps, we must have at least record_size buffer. And -* for ftrace, bufsize is irrelevant (if bufsize is 0, buf will be -* ZERO_SIZE_PTR). +* Since bufsize is only used for dmesg crash dumps, it +* must match the size of the dprz record (after PRZ header +* and ECC bytes have been accounted for). */ -if (cxt->console_size) - cxt->pstore.bufsize =1024 ;/* LOG_LINE_MAX */ - cxt->pstore.bufsize =max (cxt->record_size, cxt->pstore.bufsize); - cxt->pstore.buf =kmalloc (cxt->pstore.bufsize,GFP_KERNEL ); + cxt->pstore.bufsize = cxt->dprzs[0 ]->buffer_size; + cxt->pstore.buf =kzalloc (cxt->pstore.bufsize,GFP_KERNEL );if (!cxt->pstore.buf) { -pr_err ("cannot allocate pstore buffer\n" ); +pr_err ("cannot allocate pstore crash dump buffer\n" ); err = -ENOMEM ; goto fail_clear; }
include/linux/pstore.h +4 -1
@@ -90,7 +90,10 @@ struct pstore_record {* * @buf_lock: spinlock to serialize access to @buf * @buf: preallocated crash dump buffer -* @bufsize: size of @buf available for crash dump writes +* @bufsize: size of @buf available for crash dump bytes (must match +* smallest number of bytes available for writing to a +* backend entry, since compressed bytes don't take kindly +* to being truncated) * * @read_mutex: serializes @open, @read, @close, and @erase callbacks * @flags: bitfield of frontends the backend can accept writes for
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 116/142 afs: Fix validation/callback interaction
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ae3b7361dc0ee9a425bf7d77ce211f533500b39b ]
When afs_validate() is called to validate a vnode (inode), there are two unhandled cases in the fastpath at the top of the function:
(1) If the vnode is promised (AFS_VNODE_CB_PROMISED is set), the break counters match and the data has expired, then there's an implicit case in which the vnode needs revalidating.
This has no consequences since the default "valid = false" set at the top of the function happens to do the right thing.
(2) If the vnode is not promised and it hasn't been deleted (AFS_VNODE_DELETED is not set) then there's a default case we're not handling in which the vnode is invalid. If the vnode is invalid, we need to bring cb_s_break and cb_v_break up to date before we refetch the status.
As a consequence, once the server loses track of the client (ie. sufficient time has passed since we last sent it an operation), it will send us a CB.InitCallBackState* operation when we next try to talk to it. This calls afs_init_callback_state() which increments afs_server::cb_s_break, but this then doesn't propagate to the afs_vnode record.
The result being that every afs_validate() call thereafter sends a status fetch operation to the server.
Clarify and fix this by:
(A) Setting valid in all the branches rather than initialising it at the top so that the compiler catches where we've missed.
(B) Restructuring the logic in the 'promised' branch so that we set valid to false if the callback is due to expire (or has expired) and so that the final case is that the vnode is still valid.
(C) Adding an else-statement that ups cb_s_break and cb_v_break if the promised and deleted cases don't match.
--- fs/afs/inode.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
fs/afs/inode.c +12 -6
@@ -379,7 +379,7 @@ void afs_zap_data(struct afs_vnode *vnode)int afs_validate (struct afs_vnode *vnode,struct key *key) {time64_t now =ktime_get_real_seconds (); -bool valid = false; +bool valid;int ret; _enter("{v={%x:%u} fl=%lx},%x",
@@ -399,15 +399,21 @@ int afs_validate(struct afs_vnode *vnode, struct key *key) vnode->cb_v_break = vnode->volume->cb_v_break; valid = false; }else if (vnode->status.type ==AFS_FTYPE_DIR && -test_bit (AFS_VNODE_DIR_VALID , &vnode->flags) && - vnode->cb_expires_at -10 > now) { - valid = true; - }else if (!test_bit (AFS_VNODE_ZAP_DATA , &vnode->flags) && - vnode->cb_expires_at -10 > now) { + (!test_bit (AFS_VNODE_DIR_VALID , &vnode->flags) || + vnode->cb_expires_at -10 <= now)) { + valid = false; + }else if (test_bit (AFS_VNODE_ZAP_DATA , &vnode->flags) || + vnode->cb_expires_at -10 <= now) { + valid = false; + }else { valid = true; } }else if (test_bit (AFS_VNODE_DELETED , &vnode->flags)) { valid = true; + }else { + vnode->cb_s_break = vnode->cb_interest->server->cb_s_break; + vnode->cb_v_break = vnode->volume->cb_v_break; + valid = false; }read_sequnlock_excl (&vnode->cb_lock);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 117/142 fscache: fix race between enablement and dropping of object
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c5a94f434c82529afda290df3235e4d85873c5b4 ]
It was observed that a process blocked indefintely in __fscache_read_or_alloc_page(), waiting for FSCACHE_COOKIE_LOOKING_UP to be cleared via fscache_wait_for_deferred_lookup().
At this time, ->backing_objects was empty, which would normaly prevent __fscache_read_or_alloc_page() from getting to the point of waiting. This implies that ->backing_objects was cleared *after* __fscache_read_or_alloc_page was was entered.
When an object is "killed" and then "dropped", FSCACHE_COOKIE_LOOKING_UP is cleared in fscache_lookup_failure(), then KILL_OBJECT and DROP_OBJECT are "called" and only in DROP_OBJECT is ->backing_objects cleared. This leaves a window where something else can set FSCACHE_COOKIE_LOOKING_UP and __fscache_read_or_alloc_page() can start waiting, before ->backing_objects is cleared
There is some uncertainty in this analysis, but it seems to be fit the observations. Adding the wake in this patch will be handled correctly by __fscache_read_or_alloc_page(), as it checks if ->backing_objects is empty again, after waiting.
Customer which reported the hang, also report that the hang cannot be reproduced with this fix.
The backtrace for the blocked process looked like:
PID: 29360 TASK: ffff881ff2ac0f80 CPU: 3 COMMAND: "zsh"
#0 [ffff881ff43efbf8] schedule at ffffffff815e56f1
#1 [ffff881ff43efc58] bit_wait at ffffffff815e64ed
#2 [ffff881ff43efc68] __wait_on_bit at ffffffff815e61b8
#3 [ffff881ff43efca0] out_of_line_wait_on_bit at ffffffff815e625e
#4 [ffff881ff43efd08] fscache_wait_for_deferred_lookup at ffffffffa04f2e8f [fscache] #5 [ffff881ff43efd18] __fscache_read_or_alloc_page at ffffffffa04f2ffe [fscache] #6 [ffff881ff43efd58] __nfs_readpage_from_fscache at ffffffffa0679668 [nfs] #7 [ffff881ff43efd78] nfs_readpage at ffffffffa067092b [nfs]
#8 [ffff881ff43efda0] generic_file_read_iter at ffffffff81187a73
#9 [ffff881ff43efe50] nfs_file_read at ffffffffa066544b [nfs]
#10 [ffff881ff43efe70] __vfs_read at ffffffff811fc756
#11 [ffff881ff43efee8] vfs_read at ffffffff811fccfa
#12 [ffff881ff43eff18] sys_read at ffffffff811fda62
#13 [ffff881ff43eff50] entry_SYSCALL_64_fastpath at ffffffff815e986e
--- fs/fscache/object.c | 3 +++ 1 file changed, 3 insertions(+)
fs/fscache/object.c +3 -0
@@ -730,6 +730,9 @@ static const struct fscache_state *fscache_drop_object(struct fscache_object *obif (awaken)wake_up_bit (&cookie->flags,FSCACHE_COOKIE_INVALIDATING ); +if (test_and_clear_bit (FSCACHE_COOKIE_LOOKING_UP , &cookie->flags)) +wake_up_bit (&cookie->flags,FSCACHE_COOKIE_LOOKING_UP ); +/* Prevent a race with our last child, which has to signal EV_CLEARED * before dropping our spinlock.
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 118/142 cachefiles: Explicitly cast enumerated type in put_object
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b7e768b7e3522695ed36dcb48ecdcd344bd30a9b ]
Clang warns when one enumerated type is implicitly converted to another.
fs/cachefiles/namei.c:247:50: warning: implicit conversion from enumeration type 'enum cachefiles_obj_ref_trace' to different enumeration type 'enum fscache_obj_ref_trace' [-Wenum-conversion]
cache->cache.ops->put_object(&xobject->fscache,
cachefiles_obj_put_wait_retry);
Silence this warning by explicitly casting to fscache_obj_ref_trace, which is also done in put_object.
--- fs/cachefiles/namei.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/cachefiles/namei.c +4 -2
@@ -244,11 +244,13 @@ static int cachefiles_mark_object_active(struct cachefiles_cache *cache,ASSERT (!test_bit (CACHEFILES_OBJECT_ACTIVE , &xobject->flags)); - cache->cache.ops->put_object (&xobject->fscache, cachefiles_obj_put_wait_retry); + cache->cache.ops->put_object (&xobject->fscache, + (enum fscache_obj_ref_trace )cachefiles_obj_put_wait_retry); goto try_again; requeue: - cache->cache.ops->put_object (&xobject->fscache, cachefiles_obj_put_wait_timeo); + cache->cache.ops->put_object (&xobject->fscache, + (enum fscache_obj_ref_trace )cachefiles_obj_put_wait_timeo);_leave (" = -ETIMEDOUT" );return -ETIMEDOUT ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 119/142 fscache, cachefiles: remove redundant variable cache
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31ffa563833576bd49a8bf53120568312755e6e2 ]
Variable 'cache' is being assigned but is never used hence it is redundant and can be removed.
Cleans up clang warning:
warning: variable 'cache' set but not used [-Wunused-but-set-variable]
--- fs/cachefiles/rdwr.c | 3 --- 1 file changed, 3 deletions(-)
fs/cachefiles/rdwr.c +0 -3
@@ -968,11 +968,8 @@ void cachefiles_uncache_page(struct fscache_object *_object, struct page *page) __releases(&object->fscache.cookie->lock) {struct cachefiles_object *object; -struct cachefiles_cache *cache; object = container_of(_object, struct cachefiles_object, fscache); - cache =container_of (object->fscache.cache, - struct cachefiles_cache, cache);_enter ("%p,{%lu}" , object, page->index);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 120/142 nvme: warn when finding multi-port subsystems without multipathing enabled
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 14a1336e6fff47dd1028b484d6c802105c58e2ee ]
Without CONFIG_NVME_MULTIPATH enabled a multi-port subsystem might show up as invididual devices and cause problems, warn about it.
--- drivers/nvme/host/nvme.h | 3 +++ 1 file changed, 3 insertions(+)
drivers/nvme/host/nvme.h +3 -0
@@ -537,6 +537,9 @@ static inline void nvme_mpath_check_last_path(struct nvme_ns *ns)static inline int nvme_mpath_init (struct nvme_ctrl *ctrl,struct nvme_id_ctrl *id) { +if (ctrl->subsys->cmic & (1 <<3 )) +dev_warn (ctrl->device, +"Please enable CONFIG_NVME_MULTIPATH for full support of multi-port devices.\n" );return 0 ; }static inline void nvme_mpath_uninit (struct nvme_ctrl *ctrl)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 121/142 nvme: flush namespace scanning work just before removing namespaces
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f6c8e432cb0479255322c5d0335b9f1699a0270c ]
nvme_stop_ctrl can be called also for reset flow and there is no need to flush the scan_work as namespaces are not being removed. This can cause deadlock in rdma, fc and loop drivers since nvme_stop_ctrl barriers before controller teardown (and specifically I/O cancellation of the scan_work itself) takes place, but the scan_work will be blocked anyways so there is no need to flush it.
Instead, move scan_work flush to nvme_remove_namespaces() where it really needs to flush.
Reviewed by: James Smart <[email protected]>
--- drivers/nvme/host/core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/nvme/host/core.c +3 -1
@@ -3308,6 +3308,9 @@ void nvme_remove_namespaces(struct nvme_ctrl *ctrl)struct nvme_ns *ns, *next;LIST_HEAD (ns_list); +/* prevent racing with ns scanning */ +flush_work (&ctrl->scan_work); +/* * The dead states indicates the controller was not gracefully * disconnected. In that case, we won't be able to flush any data while
@@ -3463,7 +3466,6 @@ void nvme_stop_ctrl(struct nvme_ctrl *ctrl)nvme_mpath_stop (ctrl);nvme_stop_keep_alive (ctrl);flush_work (&ctrl->async_event_work); -flush_work (&ctrl->scan_work);cancel_work_sync (&ctrl->fw_act_work);if (ctrl->ops->stop_ctrl) ctrl->ops->stop_ctrl (ctrl);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 122/142 nvme-rdma: fix double freeing of async event data
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6344d02dc8f886b6bbcd922ae1a17e4a41500f2d ]
Some error paths in configuration of admin queue free data buffer associated with async request SQE without resetting the data buffer pointer to NULL, This buffer is also freed up again if the controller is shutdown or reset.
--- drivers/nvme/host/rdma.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/nvme/host/rdma.c +2 -0
@@ -184,6 +184,7 @@ static int nvme_rdma_alloc_qe(struct ib_device *ibdev, struct nvme_rdma_qe *qe, qe->dma =ib_dma_map_single (ibdev, qe->data, capsule_size, dir);if (ib_dma_mapping_error (ibdev, qe->dma)) {kfree (qe->data); + qe->data =NULL ;return -ENOMEM ; }
@@ -816,6 +817,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, out_free_async_qe:nvme_rdma_free_qe (ctrl->device->dev, &ctrl->async_event_sqe,sizeof (struct nvme_command ),DMA_TO_DEVICE ); + ctrl->async_event_sqe.data =NULL ; out_free_queue:nvme_rdma_free_queue (&ctrl->queues[0 ]);return error;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 123/142 ACPI/IORT: Fix iort_get_platform_device_domain() uninitialized pointer value
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ea2412dc21cc790335d319181dddc43682aef164 ]
Running the Clang static analyzer on IORT code detected the following error:
Logic error: Branch condition evaluates to a garbage value
in
iort_get_platform_device_domain()
If the named component associated with a given device has no IORT mappings, iort_get_platform_device_domain() exits its MSI mapping loop with msi_parent pointer containing garbage, which can lead to erroneous code path execution.
Initialize the msi_parent pointer, fixing the bug.
platform device")
--- drivers/acpi/arm64/iort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/acpi/arm64/iort.c +1 -1
@@ -700,7 +700,7 @@ static void iort_set_device_domain(struct device *dev,*/ static struct irq_domain *iort_get_platform_device_domain (struct device *dev) { -struct acpi_iort_node *node, *msi_parent; +struct acpi_iort_node *node, *msi_parent =NULL ;struct fwnode_handle *iort_fwnode;struct acpi_iort_its_group *its;int i;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 124/142 ocfs2: fix deadlock caused by ocfs2_defrag_extent()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e21e57445a64598b29a6f629688f9b9a39e7242a ]
ocfs2_defrag_extent may fall into deadlock.
ocfs2_ioctl_move_extents
ocfs2_ioctl_move_extents
ocfs2_move_extents
ocfs2_defrag_extent
ocfs2_lock_allocators_move_extents
ocfs2_reserve_clusters
inode_lock GLOBAL_BITMAP_SYSTEM_INODE
__ocfs2_flush_truncate_log
inode_lock GLOBAL_BITMAP_SYSTEM_INODE
As backtrace shows above, ocfs2_reserve_clusters() will call inode_lock against the global bitmap if local allocator has not sufficient cluters. Once global bitmap could meet the demand, ocfs2_reserve_cluster will return success with global bitmap locked.
After ocfs2_reserve_cluster(), if truncate log is full, __ocfs2_flush_truncate_log() will definitely fall into deadlock because it needs to inode_lock global bitmap, which has already been locked.
To fix this bug, we could remove from ocfs2_lock_allocators_move_extents() the code which intends to lock global allocator, and put the removed code after __ocfs2_flush_truncate_log().
ocfs2_lock_allocators_move_extents() is referred by 2 places, one is here, the other does not need the data allocator context, which means this patch does not affect the caller so far.
--- fs/ocfs2/move_extents.c | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-)
fs/ocfs2/move_extents.c +26 -21
@@ -156,18 +156,14 @@ static int __ocfs2_move_extent(handle_t *handle, }/* -* lock allocators, and reserving appropriate number of bits for -* meta blocks and data clusters. -* -* in some cases, we don't need to reserve clusters, just let data_ac -* be NULL. +* lock allocator, and reserve appropriate number of bits for +* meta blocks. */ -static int ocfs2_lock_allocators_move_extents (struct inode *inode, +static int ocfs2_lock_meta_allocator_move_extents (struct inode *inode,struct ocfs2_extent_tree *et,u32 clusters_to_move,u32 extents_to_split,struct ocfs2_alloc_context **meta_ac, -struct ocfs2_alloc_context **data_ac,int extra_blocks,int *credits) {
@@ -192,13 +188,6 @@ static int ocfs2_lock_allocators_move_extents(struct inode *inode, goto out; } -if (data_ac) { - ret =ocfs2_reserve_clusters (osb, clusters_to_move, data_ac); -if (ret) { -mlog_errno (ret); - goto out; - } - } *credits +=ocfs2_calc_extend_credits (osb->sb, et->et_root_el);
@@ -257,10 +246,10 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, } } - ret =ocfs2_lock_allocators_move_extents (inode, &context->et, *len,1 , - &context->meta_ac, - &context->data_ac, - extra_blocks, &credits); + ret =ocfs2_lock_meta_allocator_move_extents (inode, &context->et, + *len,1 , + &context->meta_ac, + extra_blocks, &credits);if (ret) {mlog_errno (ret); goto out;
@@ -283,6 +272,21 @@ static int ocfs2_defrag_extent(struct ocfs2_move_extents_context *context, } } +/* +* Make sure ocfs2_reserve_cluster is called after +* __ocfs2_flush_truncate_log, otherwise, dead lock may happen. +* +* If ocfs2_reserve_cluster is called +* before __ocfs2_flush_truncate_log, dead lock on global bitmap +* may happen. +* +*/ + ret =ocfs2_reserve_clusters (osb, *len, &context->data_ac); +if (ret) { +mlog_errno (ret); + goto out_unlock_mutex; + } + handle =ocfs2_start_trans (osb, credits);if (IS_ERR (handle)) { ret =PTR_ERR (handle);
@@ -600,9 +604,10 @@ static int ocfs2_move_extent(struct ocfs2_move_extents_context *context, } } - ret =ocfs2_lock_allocators_move_extents (inode, &context->et, len,1 , - &context->meta_ac, -NULL , extra_blocks, &credits); + ret =ocfs2_lock_meta_allocator_move_extents (inode, &context->et, + len,1 , + &context->meta_ac, + extra_blocks, &credits);if (ret) {mlog_errno (ret); goto out;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 125/142 mm/page_alloc.c: fix calculation of pgdat->nr_zones
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8f416836c0d50b198cad1225132e5abebf8980dc ]
init_currently_empty_zone() will adjust pgdat->nr_zones and set it to 'zone_idx(zone) + 1' unconditionally. This is correct in the normal case, while not exact in hot-plug situation.
This function is used in two places:
* free_area_init_core()
* move_pfn_range_to_zone()
In the first case, we are sure zone index increase monotonically. While in the second one, this is under users control.
One way to reproduce this is:
----------------------------
1. create a virtual machine with empty node1
-m 4G,slots=32,maxmem=32G \ -smp 4,maxcpus=8 \ -numa node,nodeid=0,mem=4G,cpus=0-3 \ -numa node,nodeid=1,mem=0G,cpus=4-7
2. hot-add cpu 3-7
cpu-add [3-7]
2. hot-add memory to nod1
object_add memory-backend-ram,id=ram0,size=1G
device_add pc-dimm,id=dimm0,memdev=ram0,node=1
3. online memory with following order
echo online_movable > memory47/state
echo online > memory40/state
After this, node1 will have its nr_zones equals to (ZONE_NORMAL + 1) instead of (ZONE_MOVABLE + 1).
Michal said:
"Having an incorrect nr_zones might result in all sorts of problems
which would be quite hard to debug (e.g. reclaim not considering the movable zone). I do not expect many users would suffer from this it but still this is trivial and obviously right thing to do so backporting to the stable tree shouldn't be harmful (last famous words)"
--- mm/page_alloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/page_alloc.c +3 -1
@@ -5733,8 +5733,10 @@ void __meminit init_currently_empty_zone(struct zone *zone, unsigned long size) {struct pglist_data *pgdat = zone->zone_pgdat; +int zone_idx =zone_idx (zone) +1 ; - pgdat->nr_zones =zone_idx (zone) +1 ; +if (zone_idx > pgdat->nr_zones) + pgdat->nr_zones = zone_idx; zone->zone_start_pfn = zone_start_pfn;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 126/142 hfs: do not free node before using
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ce96a407adef126870b3f4a1b73529dd8aa80f49 ]
hfs_bmap_free() frees the node via hfs_bnode_put(node). However, it then reads node->this when dumping error message on an error path, which may result in a use-after-free bug. This patch frees the node only when it is never again used.
--- fs/hfs/btree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/hfs/btree.c +2 -1
@@ -329,13 +329,14 @@ void hfs_bmap_free(struct hfs_bnode *node) nidx -= len *8 ; i = node->next; -hfs_bnode_put (node);if (!i) {/* panic */ ;pr_crit ("unable to free bnode %u. bmap not found!\n" , node->this); +hfs_bnode_put (node);return ; } +hfs_bnode_put (node); node =hfs_bnode_find (tree, i);if (IS_ERR (node))return ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 127/142 hfsplus: do not free node before using
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c7d7d620dcbd2a1c595092280ca943f2fced7bbd ]
hfs_bmap_free() frees node via hfs_bnode_put(node). However it then reads node->this when dumping error message on an error path, which may result in a use-after-free bug. This patch frees node only when it is never used.
--- fs/hfsplus/btree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/hfsplus/btree.c +2 -1
@@ -454,14 +454,15 @@ void hfs_bmap_free(struct hfs_bnode *node) nidx -= len *8 ; i = node->next; -hfs_bnode_put (node);if (!i) {/* panic */ ;pr_crit ("unable to free bnode %u. " "bmap not found!\n" , node->this); +hfs_bnode_put (node);return ; } +hfs_bnode_put (node); node =hfs_bnode_find (tree, i);if (IS_ERR (node))return ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 128/142 debugobjects: avoid recursive calls with kmemleak
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8de456cf87ba863e028c4dd01bae44255ce3d835 ]
CONFIG_DEBUG_OBJECTS_RCU_HEAD does not play well with kmemleak due to recursive calls.
fill_pool
kmemleak_ignore
make_black_object
put_object
__call_rcu (kernel/rcu/tree.c)
debug_rcu_head_queue
debug_object_activate
debug_object_init
fill_pool
kmemleak_ignore
make_black_object
...So add SLAB_NOLEAKTRACE to kmem_cache_create() to not register newly allocated debug objects at all.
--- lib/debugobjects.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
lib/debugobjects.c +2 -3
@@ -135,7 +135,6 @@ static void fill_pool(void)if (!new)return ; -kmemleak_ignore (new);raw_spin_lock_irqsave (&pool_lock, flags);hlist_add_head (&new->node, &obj_pool); debug_objects_allocated++;
@@ -1128,7 +1127,6 @@ static int __init debug_objects_replace_static_objects(void) obj =kmem_cache_zalloc (obj_cache,GFP_KERNEL );if (!obj) goto free; -kmemleak_ignore (obj);hlist_add_head (&obj->node, &objects); }
@@ -1184,7 +1182,8 @@ void __init debug_objects_mem_init(void) obj_cache =kmem_cache_create ("debug_objects_cache" ,sizeof (struct debug_obj ),0 , -SLAB_DEBUG_OBJECTS ,NULL ); +SLAB_DEBUG_OBJECTS |SLAB_NOLEAKTRACE , +NULL );if (!obj_cache ||debug_objects_replace_static_objects ()) { debug_objects_enabled =0 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 129/142 proc: fixup map_files test on arm
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit dbd4af54745fc0c805217693c807a3928b2d408b ]
https://bugs.linaro.org/show_bug.cgi?id=3782
Turns out arm doesn't permit mapping address 0, so try minimum virtual address instead.
--- tools/testing/selftests/proc/proc-self-map-files-002.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
tools/testing/selftests/proc/proc-self-map-files-002.c +7 -2
@@ -13,7 +13,7 @@* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* Test readlink /proc/self/map_files/... with address 0. */ +/* Test readlink /proc/self/map_files/... with minimum address. */ #include <errno.h> #include <sys/types.h> #include <sys/stat.h>
@@ -47,6 +47,11 @@ static void fail(const char *fmt, unsigned long a, unsigned long b)int main (void ) {const unsigned int PAGE_SIZE =sysconf (_SC_PAGESIZE); +#ifdef __arm__ +unsigned long va =2 *PAGE_SIZE ; +#else +unsigned long va =0 ; +#endif void *p;int fd;unsigned long a, b;
@@ -55,7 +60,7 @@ int main(void)if (fd ==-1 )return 1 ; - p =mmap (NULL ,PAGE_SIZE ,PROT_NONE ,MAP_PRIVATE |MAP_FILE |MAP_FIXED , fd,0 ); + p =mmap ((void *)va,PAGE_SIZE ,PROT_NONE ,MAP_PRIVATE |MAP_FILE |MAP_FIXED , fd,0 );if (p ==MAP_FAILED ) {if (errno ==EPERM )return 2 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 130/142 kernel/kcov.c: mark funcs in __sanitizer_cov_trace_pc() as notrace
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 903e8ff86753e6f327bb92166a0665e4ecb8e2e7 ]
Since __sanitizer_cov_trace_pc() is marked as notrace, function calls in __sanitizer_cov_trace_pc() shouldn't be traced either. ftrace_graph_caller() gets called for each function that isn't marked 'notrace', like canonicalize_ip(). This is the call trace from a run:
[ 139.644550] ftrace_graph_caller+0x1c/0x24 [ 139.648352] canonicalize_ip+0x18/0x28 [ 139.652313] __sanitizer_cov_trace_pc+0x14/0x58 [ 139.656184] sched_clock+0x34/0x1e8 [ 139.659759] trace_clock_local+0x40/0x88 [ 139.663722] ftrace_push_return_trace+0x8c/0x1f0 [ 139.667767] prepare_ftrace_return+0xa8/0x100 [ 139.671709] ftrace_graph_caller+0x1c/0x24
Rework so that check_kcov_mode() and canonicalize_ip() that are called from __sanitizer_cov_trace_pc() are also marked as notrace.
--- kernel/kcov.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/kcov.c +2 -2
@@ -56,7 +56,7 @@ struct kcov {struct task_struct *t; }; -static bool check_kcov_mode (enum kcov_mode needed_mode,struct task_struct *t) +static notrace bool check_kcov_mode(enum kcov_mode needed_mode, struct task_struct *t) {unsigned int mode;
@@ -78,7 +78,7 @@ static bool check_kcov_mode(enum kcov_mode needed_mode, struct task_struct *t)return mode == needed_mode; } -static unsigned long canonicalize_ip (unsigned long ip) +static notrace unsigned long canonicalize_ip (unsigned long ip) {#ifdef CONFIG_RANDOMIZE_BASE ip -=kaslr_offset ();
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 131/142 initramfs: clean old path before creating a hardlink
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 7c0950d455d6ab610d2990a13120f935b75abf2c ]
sys_link() can fail due to the new path already existing. This case ofen occurs when we use a concated initrd, for example:
1) prepare a basic rootfs, it contains a regular files rc.local
lizhijian@:~/yocto-tiny-i386-2016-04-22$ cat etc/rc.local #!/bin/sh echo "Running /etc/rc.local..." yocto-tiny-i386-2016-04-22$ find . | sed 's,^\./,,' | cpio -o -H newc | gzip -n -9 >../rootfs.cgz
2) create a extra initrd which also includes a etc/rc.local
lizhijian@:~/lkp-x86_64/etc$ echo "append initrd" >rc.local lizhijian@:~/lkp/lkp-x86_64/etc$ cat rc.local append initrd lizhijian@:~/lkp/lkp-x86_64/etc$ ln rc.local rc.local.hardlink append initrd lizhijian@:~/lkp/lkp-x86_64/etc$ stat rc.local rc.local.hardlink File: 'rc.local' Size: 14 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 11296086 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 1002/lizhijian) Gid: ( 1002/lizhijian) Access: 2018-11-15 16:08:28.654464815 +0800 Modify: 2018-11-15 16:07:57.514903210 +0800 Change: 2018-11-15 16:08:24.180228872 +0800 Birth: - File: 'rc.local.hardlink' Size: 14 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 11296086 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 1002/lizhijian) Gid: ( 1002/lizhijian) Access: 2018-11-15 16:08:28.654464815 +0800 Modify: 2018-11-15 16:07:57.514903210 +0800 Change: 2018-11-15 16:08:24.180228872 +0800 Birth: -
lizhijian@:~/lkp/lkp-x86_64$ find . | sed 's,^\./,,' | cpio -o -H newc | gzip -n -9 >../rc-local.cgz lizhijian@:~/lkp/lkp-x86_64$ gzip -dc ../rc-local.cgz | cpio -t . etc etc/rc.local.hardlink <<< it will be extracted first at this initrd etc/rc.local
3) concate 2 initrds and boot
lizhijian@:~/lkp$ cat rootfs.cgz rc-local.cgz >concate-initrd.cgz lizhijian@:~/lkp$ qemu-system-x86_64 -nographic -enable-kvm -cpu host -smp 1 -m 1024 -kernel ~/lkp/linux/arch/x86/boot/bzImage -append "console=ttyS0 earlyprint=ttyS0 ignore_loglevel" -initrd ./concate-initr.cgz -serial stdio -nodefaults
In this case, sys_link(2) will fail and return -EEXIST, so we can only get the rc.local at rootfs.cgz instead of rc-local.cgz
--- init/initramfs.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
init/initramfs.c +12 -10
@@ -291,16 +291,6 @@ static int __init do_reset(void)return 1 ; } -static int __init maybe_link (void ) -{ -if (nlink >=2 ) { -char *old =find_link (major, minor, ino, mode, collected); -if (old) -return (ksys_link (old, collected) <0 ) ?-1 :1 ; - } -return 0 ; -} -static void __init clean_path (char *path,umode_t fmode) {struct kstat st;
@@ -313,6 +303,18 @@ static void __init clean_path(char *path, umode_t fmode) } } +static int __init maybe_link (void ) +{ +if (nlink >=2 ) { +char *old =find_link (major, minor, ino, mode, collected); +if (old) { +clean_path (collected,0 ); +return (ksys_link (old, collected) <0 ) ?-1 :1 ; + } + } +return 0 ; +} +static __initdata int wfd;static int __init do_name (void )
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 132/142 ocfs2: fix potential use after free
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 164f7e586739d07eb56af6f6d66acebb11f315c8 ]
ocfs2_get_dentry() calls iput(inode) to drop the reference count of inode, and if the reference count hits 0, inode is freed. However, in this function, it then reads inode->i_generation, which may result in a use after free bug. Move the put operation later.
--- fs/ocfs2/export.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ocfs2/export.c +1 -1
@@ -125,10 +125,10 @@ check_err: check_gen:if (handle->ih_generation != inode->i_generation) { -iput (inode);trace_ocfs2_get_dentry_generation ((unsigned long long )blkno, handle->ih_generation, inode->i_generation); +iput (inode); result =ERR_PTR (-ESTALE ); goto bail; }
Greg Kroah-Hartman
maintainerPATCH 135/142 ALSA: fireface: fix reference to wrong register for clock configuration
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Sakamoto <[email protected]>
commit fa9c98e4b975bb3192ed6af09d9fa282ed3cd8a0 upstream.
In an initial commit, 'SYNC_STATUS' register is referred to get clock configuration, however this is wrong, according to my local note at hand for reverse-engineering about packet dump. It should be 'CLOCK_CONFIG' register. Actually, ff400_dump_clock_config() is correctly programmed.
This commit fixes the bug.
--- sound/firewire/fireface/ff-protocol-ff400.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/firewire/fireface/ff-protocol-ff400.c +1 -1
@@ -30,7 +30,7 @@ static int ff400_get_clock(struct snd_ffint err; err =snd_fw_transaction (ff->unit,TCODE_READ_QUADLET_REQUEST , -FF400_SYNC_STATUS , ®,sizeof (reg),0 ); +FF400_CLOCK_CONFIG , ®,sizeof (reg),0 );if (err <0 )return err; data =le32_to_cpu (reg);
Greg Kroah-Hartman
maintainerPATCH 140/142 ALSA: hda/realtek - Fix the mute LED regresion on Lenovo X1 Carbon
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit 6ba189c5c1a4bda70dc1e4826c58b0246068bb8d upstream.
Users reported a mute LED regression on Lenovo X1 Carbon, the root cause is we applied the fixup of ALC285_FIXUP_LENOVO_HEADPHONE_NOISE to this machine, then the machine can't apply the fixup of ALC269_FIXUP_THINKPAD_ACPI anymore. To fix it, we chain two fixup together.
--- sound/pci/hda/patch_realtek.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/patch_realtek.c +2 -0
@@ -6395,6 +6395,8 @@ static const struct hda_fixup alc269_fix [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_invalidate_dacs, + .chained = true, + .chain_id =ALC269_FIXUP_THINKPAD_ACPI }, [ALC295_FIXUP_HP_AUTO_MUTE] = { .type = HDA_FIXUP_FUNC,
Greg Kroah-Hartman
maintainerPATCH 142/142 bpf: fix off-by-one error in adjust_subprog_starts
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Cree <[email protected]>
commit afd594240806acc138cf696c09f2f4829d55d02f upstream.
When patching in a new sequence for the first insn of a subprog, the start
of that subprog does not change (it's the first insn of the sequence), so adjust_subprog_starts should check start <= off (rather than < off).
Also added a test to test_verifier.c (it's essentially the syz reproducer).
--- kernel/bpf/verifier.c | 2 +- tools/testing/selftests/bpf/test_verifier.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-)
kernel/bpf/verifier.c +1 -1
@@ -5283,7 +5283,7 @@ static void adjust_subprog_starts(structreturn ;/* NOTE: fake 'exit' subprog should be updated as well. */ for (i =0 ; i <= env->subprog_cnt; i++) { -if (env->subprog_info[i].start < off) +if (env->subprog_info[i].start <= off)continue ; env->subprog_info[i].start += len -1 ; }
tools/testing/selftests/bpf/test_verifier.c +19 -0
@@ -12511,6 +12511,25 @@ static struct bpf_test tests[] = { .prog_type = BPF_PROG_TYPE_SCHED_CLS, .result = ACCEPT, }, + { + "calls: ctx read at start of subprog", + .insns = { +BPF_MOV64_REG (BPF_REG_6 ,BPF_REG_1 ), +BPF_RAW_INSN (BPF_JMP |BPF_CALL ,0 ,1 ,0 ,5 ), +BPF_JMP_REG (BPF_JSGT ,BPF_REG_0 ,BPF_REG_0 ,0 ), +BPF_MOV64_REG (BPF_REG_1 ,BPF_REG_6 ), +BPF_RAW_INSN (BPF_JMP |BPF_CALL ,0 ,1 ,0 ,2 ), +BPF_MOV64_REG (BPF_REG_1 ,BPF_REG_0 ), +BPF_EXIT_INSN (), +BPF_LDX_MEM (BPF_B ,BPF_REG_9 ,BPF_REG_1 ,0 ), +BPF_MOV64_IMM (BPF_REG_0 ,0 ), + BPF_EXIT_INSN(), + }, + .prog_type =BPF_PROG_TYPE_SOCKET_FILTER , + .errstr_unpriv = "function calls to other bpf functions are allowed for root only", + .result_unpriv = REJECT, + .result = ACCEPT, + }, };static int probe_filter_length (const struct bpf_insn *fp)
Greg Kroah-Hartman
maintainerPATCH 1/142 ipv4: ipv6: netfilter: Adjust the frag mem limit when truesize changes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Wiesner <[email protected]>
[ Upstream commit ebaf39e6032faf77218220707fc3fa22487784e0 ]
The *_frag_reasm() functions are susceptible to miscalculating the byte count of packet fragments in case the truesize of a head buffer changes. The truesize member may be changed by the call to skb_unclone(), leaving the fragment memory limit counter unbalanced even if all fragments are processed. This miscalculation goes unnoticed as long as the network namespace which holds the counter is not destroyed.
Should an attempt be made to destroy a network namespace that holds an unbalanced fragment memory limit counter the cleanup of the namespace never finishes. The thread handling the cleanup gets stuck in inet_frags_exit_net() waiting for the percpu counter to reach zero. The thread is usually in running state with a stacktrace similar to:
PID: 1073 TASK: ffff880626711440 CPU: 1 COMMAND: "kworker/u48:4"
#5 [ffff880621563d48] _raw_spin_lock at ffffffff815f5480 #6 [ffff880621563d48] inet_evict_bucket at ffffffff8158020b #7 [ffff880621563d80] inet_frags_exit_net at ffffffff8158051c #8 [ffff880621563db0] ops_exit_list at ffffffff814f5856 #9 [ffff880621563dd8] cleanup_net at ffffffff814f67c0
#10 [ffff880621563e38] process_one_work at ffffffff81096f14
It is not possible to create new network namespaces, and processes that call unshare() end up being stuck in uninterruptible sleep state waiting to acquire the net_mutex.
The bug was observed in the IPv6 netfilter code by Per Sundstrom. I thank him for his analysis of the problem. The parts of this patch that apply to IPv4 and IPv6 fragment reassembly are preemptive measures.
--- net/ipv4/ip_fragment.c | 7 +++++++ net/ipv6/netfilter/nf_conntrack_reasm.c | 8 +++++++- net/ipv6/reassembly.c | 8 +++++++- 3 files changed, 21 insertions(+), 2 deletions(-)
net/ipv4/ip_fragment.c +7 -0
@@ -513,6 +513,7 @@ static int ip_frag_reasm(struct ipq *qp,struct rb_node *rbn;int len;int ihlen; +int delta;int err;u8 ecn;
@@ -554,10 +555,16 @@ static int ip_frag_reasm(struct ipq *qp,if (len >65535 ) goto out_oversize; + delta = - head->truesize; +/* Head of list must not be cloned. */ if (skb_unclone (head,GFP_ATOMIC )) goto out_nomem; + delta += head->truesize; +if (delta) +add_frag_mem_limit (qp->q.net, delta); +/* If the first fragment is fragmented itself, we split * it to two chunks: the first with data and paged part * and the second, holding only fragments. */
net/ipv6/netfilter/nf_conntrack_reasm.c +7 -1
@@ -341,7 +341,7 @@ static bool nf_ct_frag6_reasm(struct frag_queue *fq, struct sk_buff *prev, struct net_device *dev) { struct sk_buff *fp, *head = fq->q.fragments; -int payload_len; +int payload_len, delta;u8 ecn;inet_frag_kill (&fq->q);
@@ -363,10 +363,16 @@ nf_ct_frag6_reasm(struct frag_queue *fq,return false; } + delta = - head->truesize; +/* Head of list must not be cloned. */ if (skb_unclone (head,GFP_ATOMIC ))return false; + delta += head->truesize; +if (delta) +add_frag_mem_limit (fq->q.net, delta); +/* If the first fragment is fragmented itself, we split * it to two chunks: the first with data and paged part * and the second, holding only fragments. */
net/ipv6/reassembly.c +7 -1
@@ -281,7 +281,7 @@ static int ip6_frag_reasm(struct frag_qu { struct net *net = container_of(fq->q.net, struct net, ipv6.frags);struct sk_buff *fp, *head = fq->q.fragments; -int payload_len; +int payload_len, delta;unsigned int nhoff;int sum_truesize;u8 ecn;
@@ -322,10 +322,16 @@ static int ip6_frag_reasm(struct frag_quif (payload_len >IPV6_MAXPLEN ) goto out_oversize; + delta = - head->truesize; +/* Head of list must not be cloned. */ if (skb_unclone (head,GFP_ATOMIC )) goto out_oom; + delta += head->truesize; +if (delta) +add_frag_mem_limit (fq->q.net, delta); +/* If the first fragment is fragmented itself, we split * it to two chunks: the first with data and paged part * and the second, holding only fragments. */
Greg Kroah-Hartman
maintainerPATCH 11/142 Revert "net/ibm/emac: wrong bit is used for STA control"
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Herrenschmidt <[email protected]>
[ Upstream commit 5b3279e2cba2238b37f6c18adfdea8bddb32715a ]
This reverts commit 624ca9c33c8a853a4a589836e310d776620f4ab9.
This commit is completely bogus. The STACR register has two formats, old and new, depending on the version of the IP block used. There's a pair of device-tree properties that can be used to specify the format used:
has-inverted-stacr-oc
has-new-stacr-staopc
What this commit did was to change the bit definition used with the old parts to match the new parts. This of course breaks the driver on all the old ones.
Instead, the author should have set the appropriate properties in the device-tree for the variant used on his board.
--- drivers/net/ethernet/ibm/emac/emac.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/ibm/emac/emac.h +1 -1
@@ -231,7 +231,7 @@ struct emac_regs {#define EMAC_STACR_PHYE 0x00004000#define EMAC_STACR_STAC_MASK 0x00003000#define EMAC_STACR_STAC_READ 0x00001000 -#define EMAC_STACR_STAC_WRITE 0x00000800 +#define EMAC_STACR_STAC_WRITE 0x00002000#define EMAC_STACR_OPBC_MASK 0x00000C00#define EMAC_STACR_OPBC_50 0x00000000#define EMAC_STACR_OPBC_66 0x00000400
Greg Kroah-Hartman
maintainerPATCH 14/142 tcp: Do not underestimate rwnd_limited
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 41727549de3e7281feb174d568c6e46823db8684 ]
If available rwnd is too small, tcp_tso_should_defer() can decide it is worth waiting before splitting a TSO packet.
This really means we are rwnd limited.
--- net/ipv4/tcp_output.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/ipv4/tcp_output.c +4 -1
@@ -2338,8 +2338,11 @@ static bool tcp_write_xmit(struct sock * }else {if (!push_one &&tcp_tso_should_defer (sk, skb, &is_cwnd_limited, - max_segs)) + max_segs)) { +if (!is_cwnd_limited) + is_rwnd_limited = true;break ; + } } limit = mss_now;
Greg Kroah-Hartman
maintainerPATCH 15/142 tcp: fix NULL ref in tail loss probe
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuchung Cheng <[email protected]>
[ Upstream commit b2b7af861122a0c0f6260155c29a1b2e594cd5b5 ]
TCP loss probe timer may fire when the retranmission queue is empty but has a non-zero tp->packets_out counter. tcp_send_loss_probe will call tcp_rearm_rto which triggers NULL pointer reference by fetching the retranmission queue head in its sub-routines.
Add a more detailed warning to help catch the root cause of the inflight accounting inconsistency.
--- net/ipv4/tcp_output.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
net/ipv4/tcp_output.c +7 -4
@@ -2479,15 +2479,18 @@ void tcp_send_loss_probe(struct sock *sk goto rearm_timer; } skb =skb_rb_last (&sk->tcp_rtx_queue); +if (unlikely (!skb)) { +WARN_ONCE (tp->packets_out, +"invalid inflight: %u state %u cwnd %u mss %d\n" , + tp->packets_out, sk->sk_state, tp->snd_cwnd, mss); +inet_csk (sk)->icsk_pending =0 ; +return ; + }/* At most one outstanding TLP retransmission. */ if (tp->tlp_high_seq) goto rearm_timer; -/* Retransmit last segment. */ -if (WARN_ON (!skb)) - goto rearm_timer; -if (skb_still_in_host_queue (sk, skb)) goto rearm_timer;
Greg Kroah-Hartman
maintainerPATCH 16/142 tun: forbid iface creation with rtnl ops
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit 35b827b6d06199841a83839e8bb69c0cd13a28be ]
It's not supported right now (the goal of the initial patch was to support 'ip link del' only).
Before the patch:
$ ip link add foo type tun [ 239.632660] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 [snip] [ 239.636410] RIP: 0010:register_netdevice+0x8e/0x3a0
This panic occurs because dev->netdev_ops is not set by tun_setup(). But to have something usable, it will require more than just setting netdev_ops.
--- drivers/net/tun.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/tun.c +3 -3
@@ -2268,9 +2268,9 @@ static void tun_setup(struct net_devicestatic int tun_validate (struct nlattr *tb[],struct nlattr *data[],struct netlink_ext_ack *extack) { -if (!data) -return 0 ; -return -EINVAL ; +NL_SET_ERR_MSG (extack, +"tun/tap creation via rtnetlink is not supported." ); +return -EOPNOTSUPP ; }static size_t tun_get_size (const struct net_device *dev)
Greg Kroah-Hartman
maintainerPATCH 2/142 ipv6: Check available headroom in ip6_xmit() even without options
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefano Brivio <[email protected]>
[ Upstream commit 66033f47ca60294a95fc85ec3a3cc909dab7b765 ]
Even if we send an IPv6 packet without options, MAX_HEADER might not be enough to account for the additional headroom required by alignment of hardware headers.
On a configuration without HYPERV_NET, WLAN, AX25, and with IPV6_TUNNEL, sending short SCTP packets over IPv4 over L2TP over IPv6, we start with 100 bytes of allocated headroom in sctp_packet_transmit(), end up with 54 bytes after l2tp_xmit_skb(), and 14 bytes in ip6_finish_output2().
Those would be enough to append our 14 bytes header, but we're going to align that to 16 bytes, and write 2 bytes out of the allocated slab in neigh_hh_output().
KASan says:
[ 264.967848] ================================================================== [ 264.967861] BUG: KASAN: slab-out-of-bounds in ip6_finish_output2+0x1aec/0x1c70 [ 264.967866] Write of size 16 at addr 000000006af1c7fe by task netperf/6201 [ 264.967870] [ 264.967876] CPU: 0 PID: 6201 Comm: netperf Not tainted 4.20.0-rc4+ #1 [ 264.967881] Hardware name: IBM 2827 H43 400 (z/VM 6.4.0) [ 264.967887] Call Trace: [ 264.967896] ([<00000000001347d6>] show_stack+0x56/0xa0) [ 264.967903] [<00000000017e379c>] dump_stack+0x23c/0x290 [ 264.967912] [<00000000007bc594>] print_address_description+0xf4/0x290 [ 264.967919] [<00000000007bc8fc>] kasan_report+0x13c/0x240 [ 264.967927] [<000000000162f5e4>] ip6_finish_output2+0x1aec/0x1c70 [ 264.967935] [<000000000163f890>] ip6_finish_output+0x430/0x7f0 [ 264.967943] [<000000000163fe44>] ip6_output+0x1f4/0x580 [ 264.967953] [<000000000163882a>] ip6_xmit+0xfea/0x1ce8 [ 264.967963] [<00000000017396e2>] inet6_csk_xmit+0x282/0x3f8 [ 264.968033] [<000003ff805fb0ba>] l2tp_xmit_skb+0xe02/0x13e0 [l2tp_core] [ 264.968037] [<000003ff80631192>] l2tp_eth_dev_xmit+0xda/0x150 [l2tp_eth] [ 264.968041] [<0000000001220020>] dev_hard_start_xmit+0x268/0x928 [ 264.968069] [<0000000001330e8e>] sch_direct_xmit+0x7ae/0x1350 [ 264.968071] [<000000000122359c>] __dev_queue_xmit+0x2b7c/0x3478 [ 264.968075] [<00000000013d2862>] ip_finish_output2+0xce2/0x11a0 [ 264.968078] [<00000000013d9b14>] ip_finish_output+0x56c/0x8c8 [ 264.968081] [<00000000013ddd1e>] ip_output+0x226/0x4c0 [ 264.968083] [<00000000013dbd6c>] __ip_queue_xmit+0x894/0x1938 [ 264.968100] [<000003ff80bc3a5c>] sctp_packet_transmit+0x29d4/0x3648 [sctp] [ 264.968116] [<000003ff80b7bf68>] sctp_outq_flush_ctrl.constprop.5+0x8d0/0xe50 [sctp] [ 264.968131] [<000003ff80b7c716>] sctp_outq_flush+0x22e/0x7d8 [sctp] [ 264.968146] [<000003ff80b35c68>] sctp_cmd_interpreter.isra.16+0x530/0x6800 [sctp] [ 264.968161] [<000003ff80b3410a>] sctp_do_sm+0x222/0x648 [sctp] [ 264.968177] [<000003ff80bbddac>] sctp_primitive_ASSOCIATE+0xbc/0xf8 [sctp] [ 264.968192] [<000003ff80b93328>] __sctp_connect+0x830/0xc20 [sctp] [ 264.968208] [<000003ff80bb11ce>] sctp_inet_connect+0x2e6/0x378 [sctp] [ 264.968212] [<0000000001197942>] __sys_connect+0x21a/0x450 [ 264.968215] [<000000000119aff8>] sys_socketcall+0x3d0/0xb08 [ 264.968218] [<000000000184ea7a>] system_call+0x2a2/0x2c0
[...]
Just like ip_finish_output2() does for IPv4, check that we have enough headroom in ip6_xmit(), and reallocate it if we don't.
This issue is older than git history.
--- net/ipv6/ip6_output.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)
net/ipv6/ip6_output.c +21 -21
@@ -195,37 +195,37 @@ int ip6_xmit(const struct sock *sk, struconst struct ipv6_pinfo *np =inet6_sk (sk);struct in6_addr *first_hop = &fl6->daddr;struct dst_entry *dst =skb_dst (skb); +unsigned int head_room;struct ipv6hdr *hdr;u8 proto = fl6->flowi6_proto;int seg_len = skb->len;int hlimit =-1 ;u32 mtu; -if (opt) { -unsigned int head_room; - -/* First: exthdrs may take lots of space (~8K for now) -MAX_HEADER is not enough. -*/ - head_room = opt->opt_nflen + opt->opt_flen; - seg_len += head_room; - head_room +=sizeof (struct ipv6hdr ) +LL_RESERVED_SPACE (dst->dev); + head_room =sizeof (struct ipv6hdr ) +LL_RESERVED_SPACE (dst->dev); +if (opt) + head_room += opt->opt_nflen + opt->opt_flen; -if (skb_headroom (skb) < head_room) { -struct sk_buff *skb2 =skb_realloc_headroom (skb, head_room); -if (!skb2) { -IP6_INC_STATS (net,ip6_dst_idev (skb_dst (skb)), -IPSTATS_MIB_OUTDISCARDS ); -kfree_skb (skb); -return -ENOBUFS ; - } -if (skb->sk) -skb_set_owner_w (skb2, skb->sk); -consume_skb (skb); - skb = skb2; +if (unlikely (skb_headroom (skb) < head_room)) { +struct sk_buff *skb2 =skb_realloc_headroom (skb, head_room); +if (!skb2) { +IP6_INC_STATS (net,ip6_dst_idev (skb_dst (skb)), +IPSTATS_MIB_OUTDISCARDS ); +kfree_skb (skb); +return -ENOBUFS ; } +if (skb->sk) +skb_set_owner_w (skb2, skb->sk); +consume_skb (skb); + skb = skb2; + } + +if (opt) { + seg_len += opt->opt_nflen + opt->opt_flen; +if (opt->opt_flen)ipv6_push_frag_opts (skb, opt, &proto); +if (opt->opt_nflen)ipv6_push_nfrag_opts (skb, opt, &proto, &first_hop, &fl6->saddr);
Greg Kroah-Hartman
maintainerPATCH 3/142 neighbour: Avoid writing before skb->head in neigh_hh_output()
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefano Brivio <[email protected]>
[ Upstream commit e6ac64d4c4d095085d7dd71cbd05704ac99829b2 ]
While skb_push() makes the kernel panic if the skb headroom is less than the unaligned hardware header size, it will proceed normally in case we copy more than that because of alignment, and we'll silently corrupt adjacent slabs.
In the case fixed by the previous patch,
"ipv6: Check available headroom in ip6_xmit() even without options", we end up in neigh_hh_output() with 14 bytes headroom, 14 bytes hardware header and write 16 bytes, starting 2 bytes before the allocated buffer.
Always check we're not writing before skb->head and, if the headroom is not enough, warn and drop the packet.
v2:
- instead of panicking with BUG_ON(), WARN_ON_ONCE() and drop the packet (Eric Dumazet)
- if we avoid the panic, though, we need to explicitly check the headroom before the memcpy(), otherwise we'll have corrupted slabs on a running kernel, after we warn
- use __skb_push() instead of skb_push(), as the headroom check is already implemented here explicitly (Eric Dumazet)
--- include/net/neighbour.h | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-)
include/net/neighbour.h +23 -5
@@ -453,6 +453,7 @@ static inline int neigh_hh_bridge(structstatic inline int neigh_hh_output (const struct hh_cache *hh,struct sk_buff *skb) { +unsigned int hh_alen =0 ;unsigned int seq;unsigned int hh_len;
@@ -460,16 +461,33 @@ static inline int neigh_hh_output(const seq =read_seqbegin (&hh->hh_lock); hh_len = hh->hh_len;if (likely (hh_len <=HH_DATA_MOD )) { -/* this is inlined by gcc */ -memcpy (skb->data -HH_DATA_MOD , hh->hh_data,HH_DATA_MOD ); + hh_alen =HH_DATA_MOD ; + +/* skb_push() would proceed silently if we have room for +* the unaligned size but not for the aligned size: +* check headroom explicitly. +*/ +if (likely (skb_headroom (skb) >=HH_DATA_MOD )) { +/* this is inlined by gcc */ +memcpy (skb->data -HH_DATA_MOD , hh->hh_data, +HH_DATA_MOD ); + } }else { -unsigned int hh_alen =HH_DATA_ALIGN (hh_len); + hh_alen =HH_DATA_ALIGN (hh_len); -memcpy (skb->data - hh_alen, hh->hh_data, hh_alen); +if (likely (skb_headroom (skb) >= hh_alen)) { +memcpy (skb->data - hh_alen, hh->hh_data, + hh_alen); + } } }while (read_seqretry (&hh->hh_lock, seq)); -skb_push (skb, hh_len); +if (WARN_ON_ONCE (skb_headroom (skb) < hh_alen)) { +kfree_skb (skb); +return NET_XMIT_DROP ; + } + +__skb_push (skb, hh_len);return dev_queue_xmit (skb); }
Greg Kroah-Hartman
maintainerPATCH 5/142 net: 8139cp: fix a BUG triggered by changing mtu with network traffic
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Yanjun <[email protected]>
[ Upstream commit a5d4a89245ead1f37ed135213653c5beebea4237 ]
When changing mtu many times with traffic, a bug is triggered:
[ 1035.684037] kernel BUG at lib/dynamic_queue_limits.c:26! [ 1035.684042] invalid opcode: 0000 [#1] SMP [ 1035.684049] Modules linked in: loop binfmt_misc 8139cp(OE) macsec
tcp_diag udp_diag inet_diag unix_diag af_packet_diag netlink_diag tcp_lp fuse uinput xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables ip6table_filter devlink ip6_tables iptable_filter sunrpc snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep ppdev snd_seq iosf_mbi crc32_pclmul parport_pc snd_seq_device ghash_clmulni_intel parport snd_pcm aesni_intel joydev lrw snd_timer virtio_balloon sg gf128mul glue_helper ablk_helper cryptd snd soundcore i2c_piix4 pcspkr ip_tables xfs libcrc32c sr_mod sd_mod cdrom crc_t10dif crct10dif_generic ata_generic
[ 1035.684102] pata_acpi virtio_console qxl drm_kms_helper syscopyarea
sysfillrect sysimgblt floppy fb_sys_fops crct10dif_pclmul crct10dif_common ttm crc32c_intel serio_raw ata_piix drm libata 8139too virtio_pci drm_panel_orientation_quirks virtio_ring virtio mii dm_mirror dm_region_hash dm_log dm_mod [last unloaded: 8139cp]
[ 1035.684132] CPU: 9 PID: 25140 Comm: if-mtu-change Kdump: loaded Tainted: G OE ------------ T 3.10.0-957.el7.x86_64 #1 [ 1035.684134] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 1035.684136] task: ffff8f59b1f5a080 ti: ffff8f5a2e32c000 task.ti: ffff8f5a2e32c000 [ 1035.684149] RIP: 0010:[<ffffffffba3a40d0>] [<ffffffffba3a40d0>] dql_completed+0x180/0x190 [ 1035.684162] RSP: 0000:ffff8f5a75483e50 EFLAGS: 00010093 [ 1035.684162] RAX: 00000000000000c2 RBX: ffff8f5a6f91c000 RCX: 0000000000000000 [ 1035.684162] RDX: 0000000000000000 RSI: 0000000000000184 RDI: ffff8f599fea3ec0 [ 1035.684162] RBP: ffff8f5a75483ea8 R08: 00000000000000c2 R09: 0000000000000000 [ 1035.684162] R10: 00000000000616ef R11: ffff8f5a75483b56 R12: ffff8f599fea3e00 [ 1035.684162] R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000184 [ 1035.684162] FS: 00007fa8434de740(0000) GS:ffff8f5a75480000(0000) knlGS:0000000000000000 [ 1035.684162] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1035.684162] CR2: 00000000004305d0 CR3: 000000024eb66000 CR4: 00000000001406e0 [ 1035.684162] Call Trace: [ 1035.684162] <IRQ> [ 1035.684162] [<ffffffffc08cbaf8>] ? cp_interrupt+0x478/0x580 [8139cp] [ 1035.684162] [<ffffffffba14a294>] __handle_irq_event_percpu+0x44/0x1c0 [ 1035.684162] [<ffffffffba14a442>] handle_irq_event_percpu+0x32/0x80 [ 1035.684162] [<ffffffffba14a4cc>] handle_irq_event+0x3c/0x60 [ 1035.684162] [<ffffffffba14db29>] handle_fasteoi_irq+0x59/0x110 [ 1035.684162] [<ffffffffba02e554>] handle_irq+0xe4/0x1a0 [ 1035.684162] [<ffffffffba7795dd>] do_IRQ+0x4d/0xf0 [ 1035.684162] [<ffffffffba76b362>] common_interrupt+0x162/0x162 [ 1035.684162] <EOI> [ 1035.684162] [<ffffffffba0c2ae4>] ? __wake_up_bit+0x24/0x70 [ 1035.684162] [<ffffffffba1e46f5>] ? do_set_pte+0xd5/0x120 [ 1035.684162] [<ffffffffba1b64fb>] unlock_page+0x2b/0x30 [ 1035.684162] [<ffffffffba1e4879>] do_read_fault.isra.61+0x139/0x1b0 [ 1035.684162] [<ffffffffba1e9134>] handle_pte_fault+0x2f4/0xd10 [ 1035.684162] [<ffffffffba1ebc6d>] handle_mm_fault+0x39d/0x9b0 [ 1035.684162] [<ffffffffba76f5e3>] __do_page_fault+0x203/0x500 [ 1035.684162] [<ffffffffba76f9c6>] trace_do_page_fault+0x56/0x150 [ 1035.684162] [<ffffffffba76ef42>] do_async_page_fault+0x22/0xf0 [ 1035.684162] [<ffffffffba76b788>] async_page_fault+0x28/0x30 [ 1035.684162] Code: 54 c7 47 54 ff ff ff ff 44 0f 49 ce 48 8b 35 48 2f 9c 00 48 89 77 58 e9 fe fe ff ff 0f 1f 80 00 00 00 00 41 89 d1 e9 ef fe ff ff <0f> 0b 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 55 8d 42 ff 48 [ 1035.684162] RIP [<ffffffffba3a40d0>] dql_completed+0x180/0x190 [ 1035.684162] RSP <ffff8f5a75483e50>
It's not the same as in 7fe0ee09 patch described. As 8139cp uses shared irq mode, other device irq will trigger cp_interrupt to execute.
cp_change_mtu
-> cp_close
-> cp_open
In cp_close routine just before free_irq(), some interrupt may occur. In my environment, cp_interrupt exectutes and IntrStatus is 0x4, exactly TxOk. That will cause cp_tx to wake device queue.
As device queue is started, cp_start_xmit and cp_open will run at same time which will cause kernel BUG.
For example:
[#] for tx descriptor
At start:
[#][#][#]
num_queued=3
After cp_init_hw->cp_start_hw->netdev_reset_queue:
[#][#][#]
num_queued=0
When 8139cp starts to work then cp_tx will checknum_queued mismatchs the complete_bytes.
The patch will check IntrMask before check IntrStatus in cp_interrupt. When 8139cp interrupt is disabled, just return.
--- drivers/net/ethernet/realtek/8139cp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/realtek/8139cp.c +5 -0
@@ -571,6 +571,7 @@ static irqreturn_t cp_interrupt (int irqstruct cp_private *cp;int handled =0 ;u16 status; +u16 mask;if (unlikely (dev ==NULL ))return IRQ_NONE ;
@@ -578,6 +579,10 @@ static irqreturn_t cp_interrupt (int irqspin_lock (&cp->lock); + mask =cpr16 (IntrMask); +if (!mask) + goto out_unlock; + status =cpr16 (IntrStatus);if (!status || (status ==0xFFFF )) goto out_unlock;
Greg Kroah-Hartman
maintainerPATCH 6/142 net/mlx4_core: Correctly set PFC param if global pause is turned off.
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tarick Bedeir <[email protected]>
[ Upstream commit bd5122cd1e0644d8bd8dd84517c932773e999766 ]
rx_ppp and tx_ppp can be set between 0 and 255, so don't clamp to 1.
--- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +2 -2
@@ -1084,8 +1084,8 @@ static int mlx4_en_set_pauseparam(struct tx_pause = !!(pause->tx_pause); rx_pause = !!(pause->rx_pause); - rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause); - tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause); + rx_ppp = (tx_pause || rx_pause) ?0 : priv->prof->rx_ppp; + tx_ppp = (tx_pause || rx_pause) ?0 : priv->prof->tx_ppp; err = mlx4_SET_PORT_general(mdev->dev, priv->port, priv->rx_skb_size + ETH_FCS_LEN,
Greg Kroah-Hartman
maintainerPATCH 7/142 net/mlx4_en: Change min MTU size to ETH_MIN_MTU
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eran Ben Elisha <[email protected]>
[ Upstream commit 24be19e47779d604d1492c114459dca9a92acf78 ]
NIC driver minimal MTU size shall be set to ETH_MIN_MTU, as defined in the RFC791 and in the network stack. Remove old mlx4_en only define for it, which was set to wrong value.
--- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 4 ++-- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +2 -2
@@ -3494,8 +3494,8 @@ int mlx4_en_init_netdev(struct mlx4_en_d dev->gso_partial_features =NETIF_F_GSO_UDP_TUNNEL_CSUM ; } -/* MTU range: 46 - hw-specific max */ - dev->min_mtu =MLX4_EN_MIN_MTU ; +/* MTU range: 68 - hw-specific max */ + dev->min_mtu =ETH_MIN_MTU ; dev->max_mtu = priv->max_mtu; mdev->pndev[port] = dev;
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +0 -1
@@ -161,7 +161,6 @@#define MLX4_SELFTEST_LB_MIN_MTU (MLX4_LOOPBACK_TEST_PAYLOAD + NET_IP_ALIGN + \ ETH_HLEN + PREAMBLE_LEN) -#define MLX4_EN_MIN_MTU 46/* VLAN_HLEN is added twice,to support skb vlan tagged with multiple * headers. (For example: ETH_P_8021Q and ETH_P_8021AD). */
Greg Kroah-Hartman
maintainerPATCH 9/142 net: Prevent invalid access to skb->prev in __qdisc_drop_all
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Paasch <[email protected]>
[ Upstream commit 9410d386d0a829ace9558336263086c2fbbe8aed ]
__qdisc_drop_all() accesses skb->prev to get to the tail of the segment-list.
With commit 68d2f84a1368 ("net: gro: properly remove skb from list") the skb-list handling has been changed to set skb->next to NULL and set the list-poison on skb->prev.
With that change, __qdisc_drop_all() will panic when it tries to dereference skb->prev.
Since commit 992cba7e276d ("net: Add and use skb_list_del_init().") __list_del_entry is used, leaving skb->prev unchanged (thus, pointing to the list-head if it's the first skb of the list). This will make __qdisc_drop_all modify the next-pointer of the list-head and result in a panic later on:
[ 34.501053] general protection fault: 0000 [#1] SMP KASAN PTI [ 34.501968] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.20.0-rc2.mptcp #108 [ 34.502887] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 0.5.1 01/01/2011 [ 34.504074] RIP: 0010:dev_gro_receive+0x343/0x1f90 [ 34.504751] Code: e0 48 c1 e8 03 42 80 3c 30 00 0f 85 4a 1c 00 00 4d 8b 24 24 4c 39 65 d0 0f 84 0a 04 00 00 49 8d 7c 24 38 48 89 f8 48 c1 e8 03 <42> 0f b6 04 30 84 c0 74 08 3c 04 [ 34.507060] RSP: 0018:ffff8883af507930 EFLAGS: 00010202 [ 34.507761] RAX: 0000000000000007 RBX: ffff8883970b2c80 RCX: 1ffff11072e165a6 [ 34.508640] RDX: 1ffff11075867008 RSI: ffff8883ac338040 RDI: 0000000000000038 [ 34.509493] RBP: ffff8883af5079d0 R08: ffff8883970b2d40 R09: 0000000000000062 [ 34.510346] R10: 0000000000000034 R11: 0000000000000000 R12: 0000000000000000 [ 34.511215] R13: 0000000000000000 R14: dffffc0000000000 R15: ffff8883ac338008 [ 34.512082] FS: 0000000000000000(0000) GS:ffff8883af500000(0000) knlGS:0000000000000000 [ 34.513036] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 34.513741] CR2: 000055ccc3e9d020 CR3: 00000003abf32000 CR4: 00000000000006e0 [ 34.514593] Call Trace: [ 34.514893] <IRQ> [ 34.515157] napi_gro_receive+0x93/0x150 [ 34.515632] receive_buf+0x893/0x3700 [ 34.516094] ? __netif_receive_skb+0x1f/0x1a0 [ 34.516629] ? virtnet_probe+0x1b40/0x1b40 [ 34.517153] ? __stable_node_chain+0x4d0/0x850 [ 34.517684] ? kfree+0x9a/0x180 [ 34.518067] ? __kasan_slab_free+0x171/0x190 [ 34.518582] ? detach_buf+0x1df/0x650 [ 34.519061] ? lapic_next_event+0x5a/0x90 [ 34.519539] ? virtqueue_get_buf_ctx+0x280/0x7f0 [ 34.520093] virtnet_poll+0x2df/0xd60 [ 34.520533] ? receive_buf+0x3700/0x3700 [ 34.521027] ? qdisc_watchdog_schedule_ns+0xd5/0x140 [ 34.521631] ? htb_dequeue+0x1817/0x25f0 [ 34.522107] ? sch_direct_xmit+0x142/0xf30 [ 34.522595] ? virtqueue_napi_schedule+0x26/0x30 [ 34.523155] net_rx_action+0x2f6/0xc50 [ 34.523601] ? napi_complete_done+0x2f0/0x2f0 [ 34.524126] ? kasan_check_read+0x11/0x20 [ 34.524608] ? _raw_spin_lock+0x7d/0xd0 [ 34.525070] ? _raw_spin_lock_bh+0xd0/0xd0 [ 34.525563] ? kvm_guest_apic_eoi_write+0x6b/0x80 [ 34.526130] ? apic_ack_irq+0x9e/0xe0 [ 34.526567] __do_softirq+0x188/0x4b5 [ 34.527015] irq_exit+0x151/0x180 [ 34.527417] do_IRQ+0xdb/0x150 [ 34.527783] common_interrupt+0xf/0xf [ 34.528223] </IRQ>
This patch makes sure that skb->prev is set to NULL when entering netem_enqueue.
--- net/sched/sch_netem.c | 3 +++ 1 file changed, 3 insertions(+)
net/sched/sch_netem.c +3 -0
@@ -441,6 +441,9 @@ static int netem_enqueue(struct sk_buffint count =1 ;int rc =NET_XMIT_SUCCESS ; +/* Do not fool qdisc_drop_all() */ + skb->prev =NULL ; +/* Random duplication */ if (q->duplicate && q->duplicate >=get_crandom (&q->dup_cor)) ++count;
Greg Kroah-Hartman
maintainerPATCH 18/142 net: phy: sfp: correct store of detected link modes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baruch Siach <[email protected]>
[ Upstream commit d7f7e0018b96fd1a30a968faa9464eb57372c1ec ]
The link modes that sfp_parse_support() detects are stored in the 'modes' bitmap. There is no reason to make an exception for 1000Base-PX or 1000Base-BX10.
--- drivers/net/phy/sfp-bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/phy/sfp-bus.c +1 -1
@@ -162,7 +162,7 @@ void sfp_parse_support(struct sfp_bus *b/* 1000Base-PX or 1000Base-BX10 */ if ((id->base.e_base_px || id->base.e_base_bx10) && br_min <=1300 && br_max >=1200 ) - phylink_set(support, 1000baseX_Full); + phylink_set(modes, 1000baseX_Full);/* For active or passive cables, select the link modes * based on the bit rates and the cable compliance bytes.
Greg Kroah-Hartman
maintainerPATCH 20/142 net: restore call to netdev_queue_numa_node_write when resetting XPS
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sabrina Dubroca <[email protected]>
[ Upstream commit f28c020fb488e1a8b87469812017044bef88aa2b ]
Before commit 80d19669ecd3 ("net: Refactor XPS for CPUs and Rx queues"), netif_reset_xps_queues() did netdev_queue_numa_node_write() for all the queues being reset. Now, this is only done when the "active" variable in clean_xps_maps() is false, ie when on all the CPUs, there's no active XPS mapping left.
--- net/core/dev.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
net/core/dev.c +9 -7
@@ -2173,17 +2173,19 @@ static void clean_xps_maps(struct net_de active |=remove_xps_queue_cpu (dev, dev_maps, j, offset, count);if (!active) { -if (is_rxqs_map) { +if (is_rxqs_map)RCU_INIT_POINTER (dev->xps_rxqs_map,NULL ); - }else { +else RCU_INIT_POINTER (dev->xps_cpus_map,NULL ); +kfree_rcu (dev_maps, rcu); + } -for (i = offset + (count -1 ); count--; i--) -netdev_queue_numa_node_write ( -netdev_get_tx_queue (dev, i), -NUMA_NO_NODE ); +if (!is_rxqs_map) { +for (i = offset + (count -1 ); count--; i--) { +netdev_queue_numa_node_write ( +netdev_get_tx_queue (dev, i), +NUMA_NO_NODE ); } -kfree_rcu (dev_maps, rcu); } }
Greg Kroah-Hartman
maintainerPATCH 21/142 net: fix XPS static_key accounting
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sabrina Dubroca <[email protected]>
[ Upstream commit 867d0ad476db89a1e8af3f297af402399a54eea5 ]
Commit 04157469b7b8 ("net: Use static_key for XPS maps") introduced a static key for XPS, but the increments/decrements don't match.
First, the static key's counter is incremented once for each queue, but only decremented once for a whole batch of queues, leading to large unbalances.
Second, the xps_rxqs_needed key is decremented whenever we reset a batch of queues, whether they had any rxqs mapping or not, so that if we setup cpu-XPS on em1 and RXQS-XPS on em2, resetting the queues on em1 would decrement the xps_rxqs_needed key.
This reworks the accounting scheme so that the xps_needed key is incremented only once for each type of XPS for all the queues on a device, and the xps_rxqs_needed key is incremented only once for all queues. This is sufficient to let us retrieve queues via get_xps_queue().
This patch introduces a new reset_xps_maps(), which reinitializes and frees the appropriate map (xps_rxqs_map or xps_cpus_map), and drops a reference to the needed keys:
- both xps_needed and xps_rxqs_needed, in case of rxqs maps,
- only xps_needed, in case of CPU maps.
Now, we also need to call reset_xps_maps() at the end of __netif_set_xps_queue() when there's no active map left, for example when writing '00000000,00000000' to all queues' xps_rxqs setting.
--- net/core/dev.c | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-)
net/core/dev.c +24 -21
@@ -2161,6 +2161,20 @@ static bool remove_xps_queue_cpu(structreturn active; } +static void reset_xps_maps (struct net_device *dev, +struct xps_dev_maps *dev_maps, +bool is_rxqs_map) +{ +if (is_rxqs_map) { +static_key_slow_dec_cpuslocked (&xps_rxqs_needed); +RCU_INIT_POINTER (dev->xps_rxqs_map,NULL ); + }else { +RCU_INIT_POINTER (dev->xps_cpus_map,NULL ); + } +static_key_slow_dec_cpuslocked (&xps_needed); +kfree_rcu (dev_maps, rcu); +} +static void clean_xps_maps (struct net_device *dev,const unsigned long *mask,struct xps_dev_maps *dev_maps,unsigned int nr_ids,u16 offset,u16 count,bool is_rxqs_map)
@@ -2172,13 +2186,8 @@ static void clean_xps_maps(struct net_de j < nr_ids;) active |=remove_xps_queue_cpu (dev, dev_maps, j, offset, count); -if (!active) { -if (is_rxqs_map) -RCU_INIT_POINTER (dev->xps_rxqs_map,NULL ); -else -RCU_INIT_POINTER (dev->xps_cpus_map,NULL ); -kfree_rcu (dev_maps, rcu); - } +if (!active) +reset_xps_maps (dev, dev_maps, is_rxqs_map);if (!is_rxqs_map) {for (i = offset + (count -1 ); count--; i--) {
@@ -2222,10 +2231,6 @@ static void netif_reset_xps_queues(struc false); out_no_maps: -if (static_key_enabled (&xps_rxqs_needed)) -static_key_slow_dec_cpuslocked (&xps_rxqs_needed); - -static_key_slow_dec_cpuslocked (&xps_needed);mutex_unlock (&xps_map_mutex);cpus_read_unlock (); }
@@ -2343,9 +2348,12 @@ int __netif_set_xps_queue(struct net_devif (!new_dev_maps) goto out_no_new_maps; -static_key_slow_inc_cpuslocked (&xps_needed); -if (is_rxqs_map) -static_key_slow_inc_cpuslocked (&xps_rxqs_needed); +if (!dev_maps) { +/* Increment static keys at most once per type */ +static_key_slow_inc_cpuslocked (&xps_needed); +if (is_rxqs_map) +static_key_slow_inc_cpuslocked (&xps_rxqs_needed); + }for (j =-1 ; j =netif_attrmask_next (j, possible_mask, nr_ids), j < nr_ids;) {
@@ -2443,13 +2451,8 @@ out_no_new_maps: }/* free map if not active */ -if (!active) { -if (is_rxqs_map) -RCU_INIT_POINTER (dev->xps_rxqs_map,NULL ); -else -RCU_INIT_POINTER (dev->xps_cpus_map,NULL ); -kfree_rcu (dev_maps, rcu); - } +if (!active) +reset_xps_maps (dev, dev_maps, is_rxqs_map); out_no_maps:mutex_unlock (&xps_map_mutex);
Greg Kroah-Hartman
maintainerPATCH 133/142 flexfiles: enforce per-mirror stateid only for v4 DSes
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tigran Mkrtchyan <[email protected]>
commit 320f35b7bf8cccf1997ca3126843535e1b95e9c4 upstream.
Since commit bb21ce0ad227 we always enforce per-mirror stateid. However, this makes sense only for v4+ servers.
--- fs/nfs/flexfilelayout/flexfilelayout.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nfs/flexfilelayout/flexfilelayout.c +4 -2
@@ -1733,7 +1733,8 @@ ff_layout_read_pagelist(struct nfs_pgio_if (fh) hdr->args.fh = fh; -if (!nfs4_ff_layout_select_ds_stateid (lseg, idx, &hdr->args.stateid)) +if (vers ==4 && + !nfs4_ff_layout_select_ds_stateid (lseg, idx, &hdr->args.stateid)) goto out_failed;/*
@@ -1798,7 +1799,8 @@ ff_layout_write_pagelist(struct nfs_pgioif (fh) hdr->args.fh = fh; -if (!nfs4_ff_layout_select_ds_stateid (lseg, idx, &hdr->args.stateid)) +if (vers ==4 && + !nfs4_ff_layout_select_ds_stateid (lseg, idx, &hdr->args.stateid)) goto out_failed;/*
Greg Kroah-Hartman
maintainerPATCH 134/142 dax: Check page->mapping isnt NULL
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox <[email protected]>
commit c93db7bb6ef3251e0ea48ade311d3e9942748e1c upstream.
If we race with inode destroy, it's possible for page->mapping to be NULL before we even enter this routine, as well as after having slept waiting for the dax entry to become unlocked.
--- fs/dax.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/dax.c +1 -1
@@ -423,7 +423,7 @@ bool dax_lock_mapping_entry(struct pagefor (;;) { mapping =READ_ONCE (page->mapping); -if (!dax_mapping (mapping)) +if (!mapping || !dax_mapping (mapping))break ;/*
Greg Kroah-Hartman
maintainerPATCH 136/142 ALSA: hda/realtek - Fixed headphone issue for ALC700
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
commit bde1a7459623a66c2abec4d0a841e4b06cc88d9a upstream.
If it plugged headphone or headset into the jack, then do the reboot, it will have a chance to cause headphone no sound. It just need to run the headphone mode procedure after boot time. The issue will be fixed.
It also suitable for ALC234 ALC274 and ALC294.
--- sound/pci/hda/patch_realtek.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
sound/pci/hda/patch_realtek.c +33 -0
@@ -7227,6 +7227,37 @@ static void alc269_fill_coef(struct hda_alc_update_coef_idx (codec,0x4 ,0 ,1 <<11 ); } +static void alc294_hp_init (struct hda_codec *codec) +{ +struct alc_spec *spec = codec->spec; +hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0 ]; +int i, val; + +if (!hp_pin) +return ; + +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_AMP_GAIN_MUTE ,AMP_OUT_MUTE ); + +msleep (100 ); + +snd_hda_codec_write (codec, hp_pin,0 , +AC_VERB_SET_PIN_WIDGET_CONTROL ,0x0 ); + +alc_update_coef_idx (codec,0x6f ,0x000f ,0 );/* Set HP depop to manual mode */ +alc_update_coefex_idx (codec,0x58 ,0x00 ,0x8000 ,0x8000 );/* HP depop procedure start */ + +/* Wait for depop procedure finish */ + val =alc_read_coefex_idx (codec,0x58 ,0x01 ); +for (i =0 ; i <20 && val &0x0080 ; i++) { +msleep (50 ); + val =alc_read_coefex_idx (codec,0x58 ,0x01 ); + } +/* Set HP depop to auto mode */ +alc_update_coef_idx (codec,0x6f ,0x000f ,0x000b ); +msleep (50 ); +} +/* */ static int patch_alc269 (struct hda_codec *codec)
@@ -7352,6 +7383,7 @@ static int patch_alc269(struct hda_codec spec->codec_variant =ALC269_TYPE_ALC294 ; spec->gen.mixer_nid =0 ;/* ALC2x4 does not have any loopback mixer path */ alc_update_coef_idx (codec,0x6b ,0x0018 , (1 <<4 ) | (1 <<3 ));/* UAJ MIC Vref control by verb */ +alc294_hp_init (codec);break ;case 0x10ec0300 : spec->codec_variant =ALC269_TYPE_ALC300 ;
@@ -7363,6 +7395,7 @@ static int patch_alc269(struct hda_codec spec->codec_variant =ALC269_TYPE_ALC700 ; spec->gen.mixer_nid =0 ;/* ALC700 does not have any loopback mixer path */ alc_update_coef_idx (codec,0x4a ,1 <<15 ,0 );/* Combo jack auto trigger control */ +alc294_hp_init (codec);break ; }
Greg Kroah-Hartman
maintainerPATCH 137/142 ALSA: hda/realtek: ALC294 mic and headset-mode fixups for ASUS X542UN
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Chiu <[email protected]>
commit d8ae458eeca9ed686e09a1b894867cb91fc4c1cb upstream.
The known ALC256_FIXUP_ASUS_MIC fixup can fix the headphone jack sensing and enable use of the internal microphone on this laptop X542UN. However, it's ALC294 so create a new fixup named ALC294_FIXUP_ASUS_MIC to avoid confusion.
--- sound/pci/hda/patch_realtek.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
sound/pci/hda/patch_realtek.c +15 -0
@@ -5520,6 +5520,7 @@ enum {ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ,ALC295_FIXUP_HP_AUTO_MUTE ,ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE , + ALC294_FIXUP_ASUS_MIC, }; static const struct hda_fixup alc269_fixups[] = {
@@ -6406,6 +6407,16 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MIC }, + [ALC294_FIXUP_ASUS_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x13 ,0x90a60160 },/* use as internal mic */ + {0x19 ,0x04a11120 },/* use as headset mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7155,6 +7166,10 @@ static const struct snd_hda_pin_quirk al SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, ALC292_STANDARD_PINS, {0x13, 0x90a60140}), + SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC, + {0x14, 0x90170110}, + {0x1b, 0x90a70130}, + {0x21, 0x04211020}), SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, ALC295_STANDARD_PINS, {0x17, 0x21014020},
Greg Kroah-Hartman
maintainerPATCH 138/142 ALSA: hda/realtek: Enable audio jacks of ASUS UX533FD with ALC294
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian-Hong Pan <[email protected]>
commit 4e051106730dfc640a8b49db88440af304726f4d upstream.
The ASUS UX533FD with ALC294 cannot detect the headset MIC and outputs through the internal speaker and the headphone until ALC294_FIXUP_ASUS_SPK and ALC294_FIXUP_ASUS_HEADSET_MIC quirk applied.
--- sound/pci/hda/patch_realtek.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
sound/pci/hda/patch_realtek.c +23 -0
@@ -5521,6 +5521,8 @@ enum {ALC295_FIXUP_HP_AUTO_MUTE ,ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ,ALC294_FIXUP_ASUS_MIC , +ALC294_FIXUP_ASUS_HEADSET_MIC , + ALC294_FIXUP_ASUS_SPK, }; static const struct hda_fixup alc269_fixups[] = {
@@ -6417,6 +6419,26 @@ static const struct hda_fixup alc269_fix .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC }, + [ALC294_FIXUP_ASUS_HEADSET_MIC] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x01a1113c },/* use as headset mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC + }, + [ALC294_FIXUP_ASUS_SPK] = { + .type = HDA_FIXUP_VERBS, + .v.verbs = (const struct hda_verb []) { +/* Set EAPD high */ + {0x20 ,AC_VERB_SET_COEF_INDEX ,0x40 }, + {0x20 ,AC_VERB_SET_PROC_COEF ,0x8800 }, + { } + }, + .chained = true, + .chain_id =ALC294_FIXUP_ASUS_HEADSET_MIC + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -6559,6 +6581,7 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x1043 ,0x12e0 ,"ASUS X541SA" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x1427 ,"Asus Zenbook UX31E" ,ALC269VB_FIXUP_ASUS_ZENBOOK ), +SND_PCI_QUIRK (0x1043 ,0x14a1 ,"ASUS UX533FD" ,ALC294_FIXUP_ASUS_SPK ),SND_PCI_QUIRK (0x1043 ,0x1517 ,"Asus Zenbook UX31A" ,ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A ),SND_PCI_QUIRK (0x1043 ,0x16e3 ,"ASUS UX50" ,ALC269_FIXUP_STEREO_DMIC ), SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
Greg Kroah-Hartman
maintainerPATCH 139/142 ALSA: hda/realtek: Enable audio jacks of ASUS UX433FN/UX333FA with ALC294
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian-Hong Pan <[email protected]>
commit 0bea4cc8383519f78f3f74caca7bdebdfb346d3b upstream.
The ASUS UX433FN and UX333FA with ALC294 cannot detect the headset MIC and output through the internal speaker and the headphone until ALC294_FIXUP_ASUS_SPK and ALC294_FIXUP_ASUS_HEADSET_MIC quirk applied.
--- sound/pci/hda/patch_realtek.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/pci/hda/patch_realtek.c +4 -0
@@ -7193,6 +7193,10 @@ static const struct snd_hda_pin_quirk al {0x14, 0x90170110}, {0x1b, 0x90a70130}, {0x21, 0x04211020}), + SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK, + {0x12, 0x90a60130}, + {0x17, 0x90170110}, + {0x21, 0x04211020}), SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, ALC295_STANDARD_PINS, {0x17, 0x21014020},
Greg Kroah-Hartman
maintainerPATCH 141/142 IB/hfi1: Fix an out-of-bounds access in get_hw_stats
In reply to Greg Kroah-Hartman4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Piotr Stankiewicz <[email protected]>
commit 36d842194a57f1b21fbc6a6875f2fa2f9a7f8679 upstream.
When running with KASAN, the following trace is produced:
[ 62.535888]
==================================================================
[ 62.544930] BUG: KASAN: slab-out-of-bounds in gut_hw_stats+0x122/0x230 [hfi1] [ 62.553856] Write of size 8 at addr ffff88080e8d6330 by task
kworker/0:1/14
[ 62.565333] CPU: 0 PID: 14 Comm: kworker/0:1 Not tainted 4.19.0-test-build-kasan+ #8 [ 62.575087] Hardware name: Intel Corporation S2600KPR/S2600KPR, BIOS SE5C610.86B.01.01.0019.101220160604 10/12/2016 [ 62.587951] Workqueue: events work_for_cpu_fn [ 62.594050] Call Trace: [ 62.598023] dump_stack+0xc6/0x14c [ 62.603089] ? dump_stack_print_info.cold.1+0x2f/0x2f [ 62.610041] ? kmsg_dump_rewind_nolock+0x59/0x59 [ 62.616615] ? get_hw_stats+0x122/0x230 [hfi1] [ 62.622985] print_address_description+0x6c/0x23c [ 62.629744] ? get_hw_stats+0x122/0x230 [hfi1] [ 62.636108] kasan_report.cold.6+0x241/0x308 [ 62.642365] get_hw_stats+0x122/0x230 [hfi1] [ 62.648703] ? hfi1_alloc_rn+0x40/0x40 [hfi1] [ 62.655088] ? __kmalloc+0x110/0x240 [ 62.660695] ? hfi1_alloc_rn+0x40/0x40 [hfi1] [ 62.667142] setup_hw_stats+0xd8/0x430 [ib_core] [ 62.673972] ? show_hfi+0x50/0x50 [hfi1] [ 62.680026] ib_device_register_sysfs+0x165/0x180 [ib_core] [ 62.687995] ib_register_device+0x5a2/0xa10 [ib_core] [ 62.695340] ? show_hfi+0x50/0x50 [hfi1] [ 62.701421] ? ib_unregister_device+0x2e0/0x2e0 [ib_core] [ 62.709222] ? __vmalloc_node_range+0x2d0/0x380 [ 62.716131] ? rvt_driver_mr_init+0x11f/0x2d0 [rdmavt] [ 62.723735] ? vmalloc_node+0x5c/0x70 [ 62.729697] ? rvt_driver_mr_init+0x11f/0x2d0 [rdmavt] [ 62.737347] ? rvt_driver_mr_init+0x1f5/0x2d0 [rdmavt] [ 62.744998] ? __rvt_alloc_mr+0x110/0x110 [rdmavt] [ 62.752315] ? rvt_rc_error+0x140/0x140 [rdmavt] [ 62.759434] ? rvt_vma_open+0x30/0x30 [rdmavt] [ 62.766364] ? mutex_unlock+0x1d/0x40 [ 62.772445] ? kmem_cache_create_usercopy+0x15d/0x230 [ 62.780115] rvt_register_device+0x1f6/0x360 [rdmavt] [ 62.787823] ? rvt_get_port_immutable+0x180/0x180 [rdmavt] [ 62.796058] ? __get_txreq+0x400/0x400 [hfi1] [ 62.802969] ? memcpy+0x34/0x50 [ 62.808611] hfi1_register_ib_device+0xde6/0xeb0 [hfi1] [ 62.816601] ? hfi1_get_npkeys+0x10/0x10 [hfi1] [ 62.823760] ? hfi1_init+0x89f/0x9a0 [hfi1] [ 62.830469] ? hfi1_setup_eagerbufs+0xad0/0xad0 [hfi1] [ 62.838204] ? pcie_capability_clear_and_set_word+0xcd/0xe0 [ 62.846429] ? pcie_capability_read_word+0xd0/0xd0 [ 62.853791] ? hfi1_pcie_init+0x187/0x4b0 [hfi1] [ 62.860958] init_one+0x67f/0xae0 [hfi1] [ 62.867301] ? hfi1_init+0x9a0/0x9a0 [hfi1] [ 62.873876] ? wait_woken+0x130/0x130 [ 62.879860] ? read_word_at_a_time+0xe/0x20 [ 62.886329] ? strscpy+0x14b/0x280 [ 62.891998] ? hfi1_init+0x9a0/0x9a0 [hfi1] [ 62.898405] local_pci_probe+0x70/0xd0 [ 62.904295] ? pci_device_shutdown+0x90/0x90 [ 62.910833] work_for_cpu_fn+0x29/0x40 [ 62.916750] process_one_work+0x584/0x960 [ 62.922974] ? rcu_work_rcufn+0x40/0x40 [ 62.928991] ? __schedule+0x396/0xdc0 [ 62.934806] ? __sched_text_start+0x8/0x8 [ 62.941020] ? pick_next_task_fair+0x68b/0xc60 [ 62.947674] ? run_rebalance_domains+0x260/0x260 [ 62.954471] ? __list_add_valid+0x29/0xa0 [ 62.960607] ? move_linked_works+0x1c7/0x230 [ 62.967077] ? trace_event_raw_event_workqueue_execute_start+0x140/0x140 [ 62.976248] ? mutex_lock+0xa6/0x100 [ 62.982029] ? __mutex_lock_slowpath+0x10/0x10 [ 62.988795] ? __switch_to+0x37a/0x710 [ 62.994731] worker_thread+0x62e/0x9d0 [ 63.000602] ? max_active_store+0xf0/0xf0 [ 63.006828] ? __switch_to_asm+0x40/0x70 [ 63.012932] ? __switch_to_asm+0x34/0x70 [ 63.019013] ? __switch_to_asm+0x40/0x70 [ 63.025042] ? __switch_to_asm+0x34/0x70 [ 63.031030] ? __switch_to_asm+0x40/0x70 [ 63.037006] ? __schedule+0x396/0xdc0 [ 63.042660] ? kmem_cache_alloc_trace+0xf3/0x1f0 [ 63.049323] ? kthread+0x59/0x1d0 [ 63.054594] ? ret_from_fork+0x35/0x40 [ 63.060257] ? __sched_text_start+0x8/0x8 [ 63.066212] ? schedule+0xcf/0x250 [ 63.071529] ? __wake_up_common+0x110/0x350 [ 63.077794] ? __schedule+0xdc0/0xdc0 [ 63.083348] ? wait_woken+0x130/0x130 [ 63.088963] ? finish_task_switch+0x1f1/0x520 [ 63.095258] ? kasan_unpoison_shadow+0x30/0x40 [ 63.101792] ? __init_waitqueue_head+0xa0/0xd0 [ 63.108183] ? replenish_dl_entity.cold.60+0x18/0x18 [ 63.115151] ? _raw_spin_lock_irqsave+0x25/0x50 [ 63.121754] ? max_active_store+0xf0/0xf0 [ 63.127753] kthread+0x1ae/0x1d0 [ 63.132894] ? kthread_bind+0x30/0x30 [ 63.138422] ret_from_fork+0x35/0x40
[ 63.146973] Allocated by task 14: [ 63.152077] kasan_kmalloc+0xbf/0xe0 [ 63.157471] __kmalloc+0x110/0x240 [ 63.162804] init_cntrs+0x34d/0xdf0 [hfi1] [ 63.168883] hfi1_init_dd+0x29a3/0x2f90 [hfi1] [ 63.175244] init_one+0x551/0xae0 [hfi1] [ 63.181065] local_pci_probe+0x70/0xd0 [ 63.186759] work_for_cpu_fn+0x29/0x40 [ 63.192310] process_one_work+0x584/0x960 [ 63.198163] worker_thread+0x62e/0x9d0 [ 63.203843] kthread+0x1ae/0x1d0 [ 63.208874] ret_from_fork+0x35/0x40
[ 63.217203] Freed by task 1: [ 63.221844] __kasan_slab_free+0x12e/0x180 [ 63.227844] kfree+0x92/0x1a0 [ 63.232570] single_release+0x3a/0x60 [ 63.238024] __fput+0x1d9/0x480 [ 63.242911] task_work_run+0x139/0x190 [ 63.248440] exit_to_usermode_loop+0x191/0x1a0 [ 63.254814] do_syscall_64+0x301/0x330 [ 63.260283] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 63.270199] The buggy address belongs to the object at ffff88080e8d5500 which belongs to the cache kmalloc-4096 of size 4096 [ 63.287247] The buggy address is located 3632 bytes inside of 4096-byte region [ffff88080e8d5500, ffff88080e8d6500) [ 63.303564] The buggy address belongs to the page: [ 63.310447] page:ffffea00203a3400 count:1 mapcount:0 mapping:ffff88081380e840 index:0x0 compound_mapcount: 0 [ 63.323102] flags: 0x2fffff80008100(slab|head) [ 63.329775] raw: 002fffff80008100 0000000000000000 0000000100000001 ffff88081380e840 [ 63.340175] raw: 0000000000000000 0000000000070007 00000001ffffffff 0000000000000000 [ 63.350564] page dumped because: kasan: bad access detected
[ 63.361974] Memory state around the buggy address: [ 63.369137] ffff88080e8d6200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 63.379082] ffff88080e8d6280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 63.389032] >ffff88080e8d6300: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc [ 63.398944] ^ [ 63.406141] ffff88080e8d6380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 63.416109] ffff88080e8d6400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 63.426099]
==================================================================
The trace happens because get_hw_stats() assumes there is room in the memory allocated in init_cntrs() to accommodate the driver counters. Unfortunately, that routine only allocated space for the device counters.
Fix by insuring the allocation has room for the additional driver counters.
--- drivers/infiniband/hw/hfi1/chip.c | 3 ++- drivers/infiniband/hw/hfi1/hfi.h | 2 ++ drivers/infiniband/hw/hfi1/verbs.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hfi1/chip.c +2 -1
@@ -12485,7 +12485,8 @@ static int init_cntrs(struct hfi1_devdat }/* allocate space for the counter values */ - dd->cntrs =kcalloc (dd->ndevcntrs,sizeof (u64),GFP_KERNEL ); + dd->cntrs =kcalloc (dd->ndevcntrs + num_driver_cntrs,sizeof (u64), +GFP_KERNEL );if (!dd->cntrs) goto bail;
drivers/infiniband/hw/hfi1/hfi.h +2 -0
@@ -154,6 +154,8 @@ struct hfi1_ib_stats {extern struct hfi1_ib_stats hfi1_stats;extern const struct pci_error_handlers hfi1_pci_err_handler; +extern int num_driver_cntrs; +/* * First-cut criterion for "device is active" is * two thousand dwords combined Tx, Rx traffic per
drivers/infiniband/hw/hfi1/verbs.c +1 -1
@@ -1701,7 +1701,7 @@ static const char * const driver_cntr_nastatic DEFINE_MUTEX (cntr_names_lock);/* protects the *_cntr_names bufers */ static const char **dev_cntr_names;static const char **port_cntr_names; -static int num_driver_cntrs =ARRAY_SIZE (driver_cntr_names); +int num_driver_cntrs =ARRAY_SIZE (driver_cntr_names);static int num_dev_cntrs;static int num_port_cntrs;static int cntr_names_initialized;
stable-rc/linux-4.19.y boot: 117 boots: 0 failed, 116 passed with 1 offline (v4.19.9-143-g4875bf1f86d7)
stable-rc/linux-4.19.y boot: 117 boots: 0 failed, 116 passed with 1 offline (v4.19.9-143-g4875bf1f86d7)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.19.y/kernel/v4.19.9-143-g4875bf1f86d7/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.19.y/kernel/v4.19.9-143-g4875bf1f86d7/
Tree: stable-rc
Branch: linux-4.19.y
Git Describe: v4.19.9-143-g4875bf1f86d7
Git Commit: 4875bf1f86d7bdc8dbf3222ab4028239446fab3f
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 62 unique boards, 23 SoC families, 12 builds out of 202
Offline Platforms:
arm:
multi_v7_defconfig:
stih410-b2120: 1 offline lab---
For more info write to <[email protected]>
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. 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.10-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 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Build results:
total: 155 pass: 155 fail: 0 Qemu test results: total: 337 pass: 337 fail: 0
Details are available at https://kerneltests.org/builders/.
Guenter
Greg Kroah-Hartman
maintainerQuoted 15 lines · shuah
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. 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.10-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.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all of these and letting me know.
greg k-h
Greg Kroah-Hartman
maintainerQuoted 10 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 155 pass: 155 fail: 0 Qemu test results: total: 337 pass: 337 fail: 0Details are available at https://kerneltests.org/builders/.
Thanks for testing all of these and letting me know. I'll work on the 4.4 tree later today...
greg k-h
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. 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.10-rc1.gz
Quoted 8 lines
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
Built and booted on the Lenovo IdeaPad 330-15ARR, no dmesg regressions.
Signature · 2 lines
Harsh Shandilya PRJKT Development LLC
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Results from Linaro’s test farm.
Regressions detected.
Summary
------------------------------------------------------------------------
kernel: 4.19.10-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit: 4875bf1f86d7bdc8dbf3222ab4028239446fab3f
git describe: v4.19.9-143-g4875bf1f86d7
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.9-143-g4875bf1f86d7
No regressions (compared to build v4.19.9)
No fixes (compared to build v4.19.9)
Ran 18346 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c - arm64
- hi6220-hikey - arm64
- i386
- juno-r2 - arm64
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* boot
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* ltp-containers-tests
* ltp-cve-tests
* ltp-fs-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* spectre-meltdown-checker-test
* ltp-cap_bounds-tests
* ltp-cpuhotplug-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-timers-tests
* ltp-open-posix-tests
* ltp-syscalls-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 11 lines · Dan Rue
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Results from Linaro’s test farm.
Regressions detected.
They were?
Quoted 11 lines
Summary
------------------------------------------------------------------------kernel: 4.19.10-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit:4875bf1f86d7bdc8dbf3222ab4028239446fab3f
git describe: v4.19.9-143-g4875bf1f86d7
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.9-143-g4875bf1f86d7
Quoted 5 lines
No regressions (compared to build v4.19.9)
No fixes (compared to build v4.19.9)
Ran 18346 total tests in the following environments and test suites.
This said there were no regressions.
confused,
greg k-h
Re: [PATCH 4.19 001/142] ipv4: ipv6: netfilter: Adjust the frag mem limit when truesize changes
In reply to Greg Kroah-HartmanQuoted 7 lines · Greg Kroah-Hartman
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Wiesner <[email protected]>
[ Upstream commit
ebaf39e6032faf77218220707fc3fa22487784e0]
The patch under review should to be applied to 4.19-stable.
Greg Kroah-Hartman
maintainerQuoted 16 lines · Harsh Shandilya
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. 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.10-rc1.gzor 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.
Quoted 4 lines
Quoted 3 lines
thanks,
greg k-h
Built and booted on the Lenovo IdeaPad 330-15ARR, no dmesg regressions.
Thanks for testing and letting me know.
greg k-h
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Dan Rue
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 7 lines
Quoted 5 lines
Quoted 2 lines
Responses should be made by Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Results from Linaro’s test farm.
Regressions detected.They were?
My mistake. There were some false regressions that showed up and I was a bit distracted when sending the reports and missed that.
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Quoted 23 lines
Quoted 12 lines
Summary
------------------------------------------------------------------------kernel: 4.19.10-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.19.y
git commit:4875bf1f86d7bdc8dbf3222ab4028239446fab3f
git describe: v4.19.9-143-g4875bf1f86d7
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.19-oe/build/v4.19.9-143-g4875bf1f86d7Quoted 5 lines
No regressions (compared to build v4.19.9)
No fixes (compared to build v4.19.9)
Ran 18346 total tests in the following environments and test suites.
This said there were no regressions.
confused,
greg k-h
Greg Kroah-Hartman
maintainerQuoted 14 lines · Dan Rue
Quoted 13 lines · Greg Kroah-Hartman
Quoted 11 lines · Dan Rue
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.10 release. There are 142 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 Sun Dec 16 11:57:12 UTC 2018. Anything received after that time might be too late.
Results from Linaro’s test farm.
Regressions detected.
Quoted 7 lines
Quoted 1 line
They were?
My mistake. There were some false regressions that showed up and I was a bit distracted when sending the reports and missed that.
Results from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Ok, good, thanks for confirming, I was confused :)
greg k-h