4.18.10-stable review
Subsystems (15)
Greg Kroah-Hartman
maintainercover 4.18.10-stable review
This is the start of the stable review cycle for the 4.18.10 release. There are 235 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed Sep 26 11:30:01 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.18.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.18.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.18.10-rc1
Brijesh Singh <[email protected]>
crypto: ccp - add timeout support in the SEV command
Dan Carpenter <[email protected]>
mei: bus: type promotion bug in mei_nfc_if_version()
Mikko Perttunen <[email protected]>
clk: tegra: bpmp: Don't crash when a clock fails to register
Douglas Anderson <[email protected]>
pinctrl: qcom: spmi-gpio: Fix pmic_gpio_config_get() to be compliant
Douglas Anderson <[email protected]>
pinctrl: msm: Fix msm_config_group_get() to be compliant
Andy Shevchenko <[email protected]>
gpiolib: Respect error code of ->get_direction()
Ming Lei <[email protected]>
blk-mq: avoid to synchronize rcu inside blk_cleanup_queue()
Ming Lei <[email protected]>
blk-mq: only attempt to merge bio if there is rq in sw queue
Jann Horn <[email protected]>
IB/mlx5: fix uaccess beyond "count" in debugfs read/write handlers
Randy Dunlap <[email protected]>
block/DAC960.c: fix defined but not used build warnings
Bart Van Assche <[email protected]>
IB/nes: Fix a compiler warning
Ioana Radulescu <[email protected]>
staging: fsl-dpaa2/eth: Fix DMA mapping direction
Yoshihiro Shimoda <[email protected]>
dmaengine: sh: rcar-dmac: avoid to write CHCR.TE to 1 if TCR is set to 0
Harry Wentland <[email protected]>
drm/amd/pp: Send khz clock values to DC for smu7/8
Suzuki K Poulose <[email protected]>
arm64: perf: Disable PMU while processing counter overflows
Dan Carpenter <[email protected]>
drm/panel: type promotion bug in s6e8aa0_read_mtp_id()
Hans de Goede <[email protected]>
ASoC: rt5651: Fix workqueue cancel vs irq free race on remove
John Stultz <[email protected]>
selftest: timers: Tweak raw_skew to SKIP when ADJ_OFFSET/other clock adjustments are in progress
Sibi Sankar <[email protected]>
remoteproc: qcom: q6v5-pil: fix modem hang on SDM845 after axis2 clk unvote
James Smart <[email protected]>
scsi: lpfc: Fix panic if driver unloaded when port is offline
James Smart <[email protected]>
scsi: lpfc: Fix NVME Target crash in defer rcv logic
Hannes Reinecke <[email protected]>
scsi: libfc: fixup 'sleeping function called from invalid context'
Timo Wischer <[email protected]>
ALSA: pcm: Fix snd_interval_refine first/last with open min/max
Li Zhijian <[email protected]>
selftests/android: initialize heap_type to avoid compiling warning
Shuah Khan (Samsung OSG) <[email protected]>
selftests: vDSO - fix to return KSFT_SKIP when test couldn't be run
Zhouyang Jia <[email protected]>
rtc: bq4802: add error handling for devm_ioremap
Wei Lu <[email protected]>
drm/amdkfd: Fix error codes in kfd_get_process
Shaoyun Liu <[email protected]>
drm/amdkfd: Fix kernel queue 64 bit doorbell offset calculation
Paul E. McKenney <[email protected]>
rcu: Fix grace-period hangs due to race with CPU offline
Peter Rosin <[email protected]>
input: rohm_bu21023: switch to i2c_lock_bus(..., I2C_LOCK_SEGMENT)
Peter Rosin <[email protected]>
mfd: 88pm860x-i2c: switch to i2c_lock_bus(..., I2C_LOCK_SEGMENT)
Arnd Bergmann <[email protected]>
rcutorture: Use monotonic timestamp for stall detection
Maxime Chevallier <[email protected]>
net: mvpp2: make sure we use single queue mode on PPv2.1
Linus Walleij <[email protected]>
net: gemini: Allow multiple ports to instantiate
Andy Shevchenko <[email protected]>
gpiolib: Mark gpio_suffixes array with __maybe_unused
Wei Yongjun <[email protected]>
gpio: pxa: Fix potential NULL dereference
Tuomas Tynkkynen <[email protected]>
staging: bcm2835-audio: Don't leak workqueue if open fails
Matias Bjørling <[email protected]>
lightnvm: pblk: enable line minor version detection
Hans Holmberg <[email protected]>
lightnvm: pblk: assume that chunks are closed on 1.2 devices
Dan Carpenter <[email protected]>
ASoC: qdsp6: q6afe-dai: fix a range check in of_q6afe_parse_dai_data()
Eric Yang <[email protected]>
drm/amd/display: support access ddc for mst branch
Dan Williams <[email protected]>
tools/testing/nvdimm: Fix support for emulating controller temperature
Jaegeuk Kim <[email protected]>
f2fs: do checkpoint in kill_sb
Suzuki K Poulose <[email protected]>
coresight: ETM: Add support for Arm Cortex-A73 and Cortex-A35
Robin Murphy <[email protected]>
coresight: tpiu: Fix disabling timeouts
Suzuki K Poulose <[email protected]>
coresight: Handle errors in finding input/output ports
Quentin Perret <[email protected]>
sched/fair: Fix util_avg of new tasks for asymmetric systems
Julia Lawall <[email protected]>
parport: sunbpp: fix error return code
Boris Pismenny <[email protected]>
tls: Fix zerocopy_from_iter iov handling
Thierry Reding <[email protected]>
drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping
Karol Herbst <[email protected]>
drm/nouveau/debugfs: Wake up GPU before doing any reclocking
Lyude Paul <[email protected]>
drm/nouveau: Fix runtime PM leak in drm_open()
Stefan Agner <[email protected]>
mmc: sdhci: do not try to use 3.3V signaling if not supported
Stefan Agner <[email protected]>
mmc: tegra: prevent HS200 on Tegra 3
Laurentiu Tudor <[email protected]>
mmc: sdhci-of-esdhc: set proper dma mask for ls104x chips
Johan Hovold <[email protected]>
tty: fix termios input-speed encoding
Johan Hovold <[email protected]>
tty: fix termios input-speed encoding when using BOTHER
Alexander Sverdlin <[email protected]>
serial: 8250: of: Correct of_platform_serial_setup() error handling
Bartosz Golaszewski <[email protected]>
gpiolib: don't allow userspace to set values of input lines
Russell King <[email protected]>
ASoC: hdmi-codec: fix routing
Enrico Scholz <[email protected]>
gpu: ipu-v3: csi: pass back mbus_code_to_bus_cfg error codes
Rick Farrington <[email protected]>
liquidio: fix hang when re-binding VF host drv after running DPDK VF driver
Nicholas Mc Guire <[email protected]>
ARM: hisi: check of_iomap and fix missing of_node_put
Huazhong Tan <[email protected]>
net: hns3: Fix return value error in hns3_reset_notify_down_enet
Nicholas Mc Guire <[email protected]>
ARM: hisi: fix error handling and missing of_node_put
Nicholas Mc Guire <[email protected]>
ARM: hisi: handle of_iomap and fix missing of_node_put
Yunsheng Lin <[email protected]>
net: hns3: Fix for reset_level default assignment probelm
Huazhong Tan <[email protected]>
net: hns3: Reset net device with rtnl_lock
Ard Biesheuvel <[email protected]>
efi/esrt: Only call efi_mem_reserve() for boot services memory
Andrea Parri <[email protected]>
sched/core: Use smp_mb() in wake_woken_function()
Ryder Lee <[email protected]>
arm64: dts: mt7622: update a clock property for UART0
Tony Lindgren <[email protected]>
pinctrl: pinmux: Return selector to the pinctrl driver
Tony Lindgren <[email protected]>
pinctrl: rza1: Fix selector use for groups and functions
Sean Wang <[email protected]>
pinctrl: mt7622: Fix probe fail by misuse the selector
Mike Christie <[email protected]>
configfs: fix registered group removal
Paul Burton <[email protected]>
MIPS: loongson64: cs5536: Fix PCI_OHCI_INT_REG reads
Alexey Kardashevskiy <[email protected]>
KVM: PPC: Book3S: Fix matching of hardware and emulated TCE tables
Arvind Yadav <[email protected]>
PM / devfreq: use put_device() instead of kfree()
Eric Biggers <[email protected]>
security: check for kstrdup() failure in lsm_append()
Nicholas Mc Guire <[email protected]>
KVM: PPC: Book3S HV: Add of_node_put() in success path
Matthew Garrett <[email protected]>
evm: Don't deadlock if a crypto algorithm is unavailable
Philipp Puschmann <[email protected]>
Bluetooth: Use lock_sock_nested in bt_accept_enqueue
Alexandre Belloni <[email protected]>
spi: dw: fix possible race condition
Roman Gushchin <[email protected]>
bpf: fix rcu annotations in compute_effective_progs()
Miklos Szeredi <[email protected]>
vfs: fix freeze protection in mnt_want_write_file() for overlayfs
Jann Horn <[email protected]>
mtdchar: fix overflows in adjustment of count
Ronny Chevalier <[email protected]>
audit: fix use-after-free in audit_add_watch
Viresh Kumar <[email protected]>
arm64: dts: uniphier: Add missing cooling device properties for CPUs
Noa Osherovich <[email protected]>
net/mlx5: Add missing SET_DRIVER_VERSION command translation
Maciej W. Rozycki <[email protected]>
binfmt_elf: Respect error return from `regset->active'
Johan Hovold <[email protected]>
mmc: meson-mx-sdio: fix OF child-node lookup
Johan Hovold <[email protected]>
of: add helper to lookup compatible child node
Trond Myklebust <[email protected]>
NFSv4.1 fix infinite loop on I/O.
Trond Myklebust <[email protected]>
NFSv4: Fix a tracepoint Oops in initiate_file_draining()
Boris Ostrovsky <[email protected]>
x86/EISA: Don't probe EISA bus for Xen PV guests
Rob Herring <[email protected]>
of: fix phandle cache creation for DTs with no phandles
Adrian Hunter <[email protected]>
perf tools: Fix maps__find_symbol_by_name()
Yabin Cui <[email protected]>
perf/core: Force USER_DS when recording user stack data
Max Filippov <[email protected]>
xtensa: ISS: don't allocate memory in platform_setup
Dan Carpenter <[email protected]>
cifs: integer overflow in in SMB2_ioctl()
Dan Carpenter <[email protected]>
CIFS: fix wrapping bugs in num_entries()
Dan Carpenter <[email protected]>
cifs: prevent integer overflow in nxt_dir_entry()
Oliver Neukum <[email protected]>
Revert "cdc-acm: implement put_char() and flush_chars()"
Jia-Ju Bai <[email protected]>
usb: cdc-wdm: Fix a sleep-in-atomic-context bug in service_outstanding_interrupt()
Ben Hutchings <[email protected]>
USB: yurex: Fix buffer over-read in yurex_write()
Johan Hovold <[email protected]>
USB: serial: ti_usb_3410_5052: fix array underflow in completion handler
Jia-Ju Bai <[email protected]>
usb: misc: uss720: Fix two sleep-in-atomic-context bugs
Johan Hovold <[email protected]>
USB: serial: io_ti: fix array underflow in completion handler
Alan Stern <[email protected]>
USB: net2280: Fix erroneous synchronization change
Yoshihiro Shimoda <[email protected]>
usb: gadget: udc: renesas_usb3: fix maxpacket size of ep0
Maxence Duprès <[email protected]>
USB: add quirk for WORLDE Controller KS49 or Prodipe MIDI 49C USB controller
Jia-Ju Bai <[email protected]>
usb: host: u132-hcd: Fix a sleep-in-atomic-context bug in u132_get_frame()
Mathias Nyman <[email protected]>
usb: Avoid use-after-free by flushing endpoints early in usb_set_interface()
Oliver Neukum <[email protected]>
usb: uas: add support for more quirk flags
Tim Anderson <[email protected]>
USB: Add quirk to support DJI CineSSD
Mikulas Patocka <[email protected]>
dm verity: fix crash on bufio buffer that was allocated with vmalloc
Tomas Winkler <[email protected]>
mei: bus: need to unlink client before freeing
Tomas Winkler <[email protected]>
mei: bus: fix hw module get/put balance
Alexander Usyskin <[email protected]>
mei: ignore not found client in the enumeration
Chunfeng Yun <[email protected]>
usb: mtu3: fix error of xhci port id when enable U3 dual role
Chunfeng Yun <[email protected]>
usb: xhci: fix interrupt transfer error happened on MTK platforms
Mathias Nyman <[email protected]>
usb: Don't die twice if PCI xhci host is not responding in resume
Mathias Nyman <[email protected]>
xhci: Fix use after free for URB cancellation on a reallocated endpoint
Gustavo A. R. Silva <[email protected]>
misc: hmc6352: fix potential Spectre v1
Bryant G. Ly <[email protected]>
misc: ibmvsm: Fix wrong assignment of return code
K. Y. Srinivasan <[email protected]>
Tools: hv: Fix a bug in the key delete code
Stephen Hemminger <[email protected]>
vmbus: don't return values for uninitalized channels
Miklos Szeredi <[email protected]>
ovl: fix oopses in ovl_fill_super() failure paths
Corey Minyard <[email protected]>
ipmi: Fix I2C client removal in the SSIF driver
Corey Minyard <[email protected]>
ipmi: Move BT capabilities detection to the detect call
Corey Minyard <[email protected]>
ipmi: Rework SMI registration failure
Andreas Kemnade <[email protected]>
mmc: omap_hsmmc: fix wakeirq handling on removal
Ingo Franzki <[email protected]>
s390/crypto: Fix return code checking in cbc_paes_crypt()
Aaron Knister <[email protected]>
IB/ipoib: Avoid a race condition between start_xmit and cm_rep_handler
Juergen Gross <[email protected]>
xen/netfront: fix waiting for xenbus state change
Bin Yang <[email protected]>
pstore: Fix incorrect persistent ram buffer mapping
Parav Pandit <[email protected]>
RDMA/cma: Protect cma dev list with lock
Xiao Liang <[email protected]>
xen-netfront: fix warn message as irq device name has '/'
Alexandru Gagniuc <[email protected]>
PCI/AER: Honor "pcie_ports=native" even if HEST sets FIRMWARE_FIRST
Joerg Roedel <[email protected]>
x86/mm/pti: Add an overflow check to pti_clone_pmds()
Jiang Biao <[email protected]>
x86/pti: Check the return value of pti_user_pagetable_walk_pmd()
Jiang Biao <[email protected]>
x86/pti: Check the return value of pti_user_pagetable_walk_p4d()
Michael Müller <[email protected]>
crypto: sharah - Unregister correct algorithms for SAHARA 3
Hanna Hawa <[email protected]>
dmaengine: mv_xor_v2: kill the tasklets upon exit
Yoshihiro Shimoda <[email protected]>
iommu/ipmmu-vmsa: IMUCTRn.TTSEL needs a special usage on R-Car Gen3
Niklas Cassel <[email protected]>
regulator: qcom_spmi: Fix warning Bad of_node_put()
Niklas Cassel <[email protected]>
regulator: qcom_spmi: Use correct regmap when checking for error
Rex Zhu <[email protected]>
drm/amd/pp: Set Max clock level to display by default
Jae Hyun Yoo <[email protected]>
i2c: aspeed: Fix initial values of master and slave state
Pingfan Liu <[email protected]>
drivers/base: stop new probing during shutdown
Christoffer Dall <[email protected]>
KVM: arm/arm64: Fix vgic init race
Randy Dunlap <[email protected]>
platform/x86: toshiba_acpi: Fix defined but not used build warnings
Julian Wiedmann <[email protected]>
s390/qeth: reset layer2 attribute on layer switch
Julian Wiedmann <[email protected]>
s390/qeth: fix race in used-buffer accounting
Bjorn Andersson <[email protected]>
soc: qcom: smem: Correct check for global partition
Bhushan Shah <[email protected]>
ARM: dts: qcom: msm8974-hammerhead: increase load on l20 for sdhci
Loic Poulain <[email protected]>
arm64: dts: qcom: db410c: Fix Bluetooth LED trigger
Vitaly Kuznetsov <[email protected]>
xen-netfront: fix queue name setting
Jakub Kicinski <[email protected]>
nfp: avoid buffer leak when FW communication fails
Yue Wang <[email protected]>
ALSA: usb-audio: Generic DSD detection for Thesycon-based implementations
Ard Biesheuvel <[email protected]>
efi/arm: preserve early mapping of UEFI memory map longer for BGRT
Leonard Crestez <[email protected]>
reset: imx7: Fix always writing bits as 0
Mark Rutland <[email protected]>
arm64: fix possible spectre-v1 write in ptrace_hbp_set_event()
YueHaibing <[email protected]>
wan/fsl_ucc_hdlc: use IS_ERR_VALUE() to check return value of qe_muram_alloc
Piotr Sawicki <[email protected]>
Smack: Fix handling of IPv4 traffic received by PF_INET6 sockets
Manikanta Pubbisetty <[email protected]>
mac80211: restrict delayed tailroom needed decrement
Paul Cercueil <[email protected]>
MIPS: jz4740: Bump zload address
Oder Chiou <[email protected]>
ASoC: rt5514: Fix the issue of the delay volume applied
Nicholas Mc Guire <[email protected]>
staging: bcm2835-camera: handle wait_for_completion_timeout return properly
Nicholas Mc Guire <[email protected]>
staging: bcm2835-camera: fix timeout handling in wait_for_completion_timeout
Sandipan Das <[email protected]>
perf script: Show correct offsets for DWARF-based unwinding
Nicholas Piggin <[email protected]>
powerpc/powernv: opal_put_chars partial write fix
Mark Rutland <[email protected]>
KVM: arm/arm64: vgic: Fix possible spectre-v1 write in vgic_mmio_write_apr()
Sagi Grimberg <[email protected]>
nvme-rdma: unquiesce queues when deleting the controller
Sagi Grimberg <[email protected]>
nvmet: fix file discard return status
Sandipan Das <[email protected]>
perf powerpc: Fix callchain ip filtering
Krzysztof Kozlowski <[email protected]>
ARM: exynos: Clear global variable on init error path
Arnd Bergmann <[email protected]>
omapfb: rename omap2 module to omap2fb.ko
Fredrik Noring <[email protected]>
fbdev: Distinguish between interlaced and progressive modes
Daniel Mack <[email protected]>
video: fbdev: pxafb: clear allocated memory for video modes
Sandipan Das <[email protected]>
perf powerpc: Fix callchain ip filtering when return address is in a register
Randy Dunlap <[email protected]>
fbdev/via: fix defined but not used warning
Anton Vasilyev <[email protected]>
video: goldfishfb: fix memory leak on driver remove
Jiri Olsa <[email protected]>
perf tools: Fix struct comm_str removal crash
Dan Carpenter <[email protected]>
fbdev: omapfb: off by one in omapfb_register_client()
Sandipan Das <[email protected]>
perf tests: Fix record+probe_libc_inet_pton.sh to ensure cleanups
Sandipan Das <[email protected]>
perf tests: Fix record+probe_libc_inet_pton.sh when event exists
Sandipan Das <[email protected]>
perf tests: Fix record+probe_libc_inet_pton.sh for powerpc64
Jiri Olsa <[email protected]>
perf tools: Synthesize GROUP_DESC feature in pipe mode
Bob Peterson <[email protected]>
gfs2: Don't reject a supposedly full bitmap if we have blocks reserved
Thomas Richter <[email protected]>
perf test: Fix subtest number when showing results
Todor Tomov <[email protected]>
media: ov5645: Supported external clock is 24MHz
Randy Dunlap <[email protected]>
mtd/maps: fix solutionengine.c printk format warnings
Wei Yongjun <[email protected]>
IB/ipoib: Fix error return code in ipoib_dev_init()
Mike Snitzer <[email protected]>
block: allow max_discard_segments to be stacked
Zhu Yanjun <[email protected]>
IB/rxe: Drop QP0 silently
Hans Verkuil <[email protected]>
media: videobuf2-core: check for q->error in vb2_core_qbuf()
Felix Fietkau <[email protected]>
MIPS: ath79: fix system restart
John Keeping <[email protected]>
dmaengine: pl330: fix irq race with terminate_all
Krzysztof Ha?asa <[email protected]>
media: tw686x: Fix oops on buffer alloc failure
Masahiro Yamada <[email protected]>
kbuild: do not update config when running install targets
Masahiro Yamada <[email protected]>
kbuild: add .DELETE_ON_ERROR special target
Rajan Vaja <[email protected]>
clk: clk-fixed-factor: Clear OF_POPULATED flag in case of failure
Mikko Perttunen <[email protected]>
clk: core: Potentially free connection id
Dmitry Torokhov <[email protected]>
Input: pxrc - fix freeing URB on device teardown
Gregory CLEMENT <[email protected]>
clk: mvebu: armada-37xx-periph: Fix wrong return value in get_parent
Nicholas Mc Guire <[email protected]>
clk: imx6sll: fix missing of_node_put()
Nicholas Mc Guire <[email protected]>
clk: imx6ul: fix missing of_node_put()
Andreas Gruenbacher <[email protected]>
gfs2: Special-case rindex for gfs2_grow
Golan Ben Ami <[email protected]>
iwlwifi: cancel the injective function between hw pointers to tfd entry index
Jakub Kicinski <[email protected]>
nfp: don't fail probe on pci_sriov_set_totalvfs() errors
YueHaibing <[email protected]>
amd-xgbe: use dma_mapping_error to check map errors
YueHaibing <[email protected]>
xfrm: fix 'passing zero to ERR_PTR()' warning
Takashi Iwai <[email protected]>
ALSA: usb-audio: Fix multiple definitions in AU0828_DEVICE() macro
Jeff Crukley <[email protected]>
ALSA: usb-audio: Add support for Encore mDSD USB DAC
Takashi Iwai <[email protected]>
ALSA: msnd: Fix the default sample sizes
Jean-Philippe Brucker <[email protected]>
iommu/io-pgtable-arm: Fix pgtable allocation in selftest
Jean-Philippe Brucker <[email protected]>
iommu/io-pgtable-arm-v7s: Abort allocation when table address overflows the PTE
Miao Zhong <[email protected]>
iommu/arm-smmu-v3: sync the OVACKFLG to PRIQ consumer register
Erich E. Hoover <[email protected]>
usb: dwc3: change stream event enable bit back to 13
Tariq Toukan <[email protected]>
net/mlx5: Use u16 for Work Queue buffer fragment size
Roi Dayan <[email protected]>
net/mlx5: Fix possible deadlock from lockdep when adding fte to fg
Roi Dayan <[email protected]>
net/mlx5: Fix not releasing read lock when adding flow rules
Vincent Whitchurch <[email protected]>
tcp: really ignore MSG_ZEROCOPY if no SO_ZEROCOPY
Haishuang Yan <[email protected]>
erspan: return PACKET_REJECT when the appropriate tunnel is not found
Haishuang Yan <[email protected]>
erspan: fix error handling for erspan tunnel
Jack Morgenstein <[email protected]>
net/mlx5: Fix debugfs cleanup in the device init/remove flow
Huy Nguyen <[email protected]>
net/mlx5: Check for error in mlx5_attach_interface
Vakul Garg <[email protected]>
net/tls: Set count of SG entries if sk_alloc_sg returns -ENOSPC
Raed Salem <[email protected]>
net/mlx5: E-Switch, Fix memory leak when creating switchdev mode FDB tables
Cong Wang <[email protected]>
tipc: orphan sock in tipc_release()
Cong Wang <[email protected]>
rds: fix two RCU related problems
Stefan Wahren <[email protected]>
net: qca_spi: Fix race condition in spi transfers
Jack Morgenstein <[email protected]>
net/mlx5: Fix use-after-free in self-healing flow
Petr Oros <[email protected]>
be2net: Fix memory leak in be_cmd_get_profile_config()
-------------
Diffstat:
Makefile | 31 ++++-- .../dts/qcom-msm8974-lge-nexus5-hammerhead.dts | 2 + arch/arm/mach-exynos/suspend.c | 1 + arch/arm/mach-hisi/hotplug.c | 41 +++++--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 2 +- arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 +- arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi | 2 + arch/arm64/kernel/perf_event.c | 50 +++++----- arch/arm64/kernel/ptrace.c | 19 ++-- arch/mips/ath79/setup.c | 1 + arch/mips/include/asm/mach-ath79/ath79.h | 1 + arch/mips/jz4740/Platform | 2 +- arch/mips/loongson64/common/cs5536/cs5536_ohci.c | 2 +- arch/powerpc/kvm/book3s_64_vio.c | 5 +- arch/powerpc/kvm/book3s_hv.c | 2 + arch/powerpc/platforms/powernv/opal.c | 2 +- arch/s390/crypto/paes_s390.c | 2 +- arch/x86/kernel/eisa.c | 10 +- arch/x86/mm/pti.c | 25 ++++- arch/xtensa/platforms/iss/setup.c | 25 +++-- block/blk-core.c | 8 +- block/blk-mq-sched.c | 3 +- block/blk-settings.c | 2 +- crypto/api.c | 2 +- drivers/base/core.c | 3 + drivers/block/DAC960.c | 9 +- drivers/char/ipmi/ipmi_bt_sm.c | 92 ++++++++--------- drivers/char/ipmi/ipmi_msghandler.c | 53 +++++----- drivers/char/ipmi/ipmi_si_intf.c | 17 +--- drivers/char/ipmi/ipmi_ssif.c | 30 ++---- drivers/clk/clk-fixed-factor.c | 9 +- drivers/clk/clk.c | 3 + drivers/clk/imx/clk-imx6sll.c | 1 + drivers/clk/imx/clk-imx6ul.c | 1 + drivers/clk/mvebu/armada-37xx-periph.c | 3 - drivers/clk/tegra/clk-bpmp.c | 12 ++- drivers/crypto/ccp/psp-dev.c | 46 ++++++++- drivers/crypto/sahara.c | 4 +- drivers/devfreq/devfreq.c | 4 +- drivers/dma/mv_xor_v2.c | 2 + drivers/dma/pl330.c | 5 +- drivers/dma/sh/rcar-dmac.c | 5 +- drivers/firmware/efi/arm-init.c | 1 - drivers/firmware/efi/arm-runtime.c | 4 +- drivers/firmware/efi/esrt.c | 3 +- drivers/gpio/gpio-pxa.c | 2 + drivers/gpio/gpiolib.c | 14 ++- drivers/gpio/gpiolib.h | 2 +- drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c | 9 +- drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 + drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 9 +- drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 8 +- drivers/gpu/drm/amd/powerplay/hwmgr/smu8_hwmgr.c | 6 +- drivers/gpu/drm/nouveau/nouveau_debugfs.c | 4 + drivers/gpu/drm/nouveau/nouveau_drm.c | 6 +- drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 13 +++ drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c | 2 +- drivers/gpu/ipu-v3/ipu-csi.c | 20 +++- drivers/hv/vmbus_drv.c | 3 + drivers/hwtracing/coresight/coresight-etm4x.c | 31 +++--- drivers/hwtracing/coresight/coresight-tpiu.c | 7 +- drivers/hwtracing/coresight/coresight.c | 7 +- drivers/i2c/busses/i2c-aspeed.c | 4 +- drivers/infiniband/core/cma.c | 12 ++- drivers/infiniband/hw/mlx5/cong.c | 9 +- drivers/infiniband/hw/mlx5/mr.c | 32 ++---- drivers/infiniband/hw/nes/nes.h | 2 +- drivers/infiniband/sw/rxe/rxe_recv.c | 9 +- drivers/infiniband/ulp/ipoib/ipoib_cm.c | 2 + drivers/infiniband/ulp/ipoib/ipoib_main.c | 3 +- drivers/input/joystick/pxrc.c | 66 ++++++------- drivers/input/touchscreen/rohm_bu21023.c | 4 +- drivers/iommu/arm-smmu-v3.c | 1 + drivers/iommu/io-pgtable-arm-v7s.c | 7 +- drivers/iommu/io-pgtable-arm.c | 3 +- drivers/iommu/ipmmu-vmsa.c | 8 ++ drivers/lightnvm/pblk-init.c | 5 +- drivers/lightnvm/pblk-recovery.c | 5 +- drivers/md/dm-verity-target.c | 24 ++++- drivers/media/common/videobuf2/videobuf2-core.c | 5 + drivers/media/i2c/ov5645.c | 13 +-- drivers/media/pci/tw686x/tw686x-video.c | 11 ++- drivers/mfd/88pm860x-i2c.c | 8 +- drivers/misc/hmc6352.c | 2 + drivers/misc/ibmvmc.c | 2 +- drivers/misc/mei/bus-fixup.c | 2 +- drivers/misc/mei/bus.c | 12 +-- drivers/misc/mei/hbm.c | 9 +- drivers/mmc/host/meson-mx-sdio.c | 8 +- drivers/mmc/host/omap_hsmmc.c | 1 + drivers/mmc/host/sdhci-of-esdhc.c | 6 ++ drivers/mmc/host/sdhci-tegra.c | 3 +- drivers/mmc/host/sdhci.c | 9 +- drivers/mtd/maps/solutionengine.c | 6 +- drivers/mtd/mtdchar.c | 10 +- drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 7 +- .../ethernet/cavium/liquidio/cn23xx_pf_device.c | 3 + .../ethernet/cavium/liquidio/cn23xx_vf_device.c | 3 + drivers/net/ethernet/cortina/gemini.c | 5 +- drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 8 +- .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 +- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 6 ++ drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/dev.c | 15 ++- .../ethernet/mellanox/mlx5/core/eswitch_offloads.c | 1 + drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 76 +++++++------- drivers/net/ethernet/mellanox/mlx5/core/health.c | 10 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 12 ++- drivers/net/ethernet/mellanox/mlx5/core/wq.c | 4 +- drivers/net/ethernet/mellanox/mlx5/core/wq.h | 2 +- drivers/net/ethernet/netronome/nfp/nfp_main.c | 20 ++-- .../net/ethernet/netronome/nfp/nfp_net_common.c | 13 ++- drivers/net/ethernet/qualcomm/qca_7k.c | 76 +++++++------- drivers/net/ethernet/qualcomm/qca_spi.c | 110 +++++++++++---------- drivers/net/ethernet/qualcomm/qca_spi.h | 5 - drivers/net/wan/fsl_ucc_hdlc.c | 6 +- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 12 ++- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 11 ++- drivers/net/xen-netfront.c | 30 +++--- drivers/nvme/host/rdma.c | 2 + drivers/nvme/target/io-cmd-file.c | 18 ++-- drivers/of/base.c | 28 ++++++ drivers/parport/parport_sunbpp.c | 8 +- drivers/pci/pcie/aer.c | 6 ++ drivers/pinctrl/mediatek/pinctrl-mt7622.c | 4 +- drivers/pinctrl/pinctrl-rza1.c | 24 ++--- drivers/pinctrl/pinmux.c | 16 ++- drivers/pinctrl/qcom/pinctrl-msm.c | 14 ++- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 32 ++++-- drivers/platform/x86/toshiba_acpi.c | 3 +- drivers/regulator/qcom_spmi-regulator.c | 34 ++++--- drivers/remoteproc/qcom_q6v5_pil.c | 1 - drivers/reset/reset-imx7.c | 2 +- drivers/rtc/rtc-bq4802.c | 4 + drivers/s390/net/qeth_core_main.c | 3 +- drivers/s390/net/qeth_core_sys.c | 1 + drivers/scsi/libfc/fc_disc.c | 7 +- drivers/scsi/lpfc/lpfc_nvme.c | 5 +- drivers/scsi/lpfc/lpfc_nvmet.c | 12 ++- drivers/soc/qcom/smem.c | 10 +- drivers/spi/spi-dw.c | 3 +- drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c | 2 +- .../vc04_services/bcm2835-audio/bcm2835-vchiq.c | 16 +-- .../vc04_services/bcm2835-camera/bcm2835-camera.c | 7 +- .../vc04_services/bcm2835-camera/mmal-vchiq.c | 11 ++- drivers/tty/serial/8250/8250_of.c | 2 +- drivers/tty/tty_baudrate.c | 13 ++- drivers/usb/class/cdc-acm.c | 73 -------------- drivers/usb/class/cdc-acm.h | 1 - drivers/usb/class/cdc-wdm.c | 2 +- drivers/usb/core/hcd-pci.c | 2 - drivers/usb/core/message.c | 11 +++ drivers/usb/core/quirks.c | 7 ++ drivers/usb/dwc3/gadget.h | 2 +- drivers/usb/gadget/udc/net2280.c | 16 ++- drivers/usb/gadget/udc/renesas_usb3.c | 5 +- drivers/usb/host/u132-hcd.c | 2 +- drivers/usb/host/xhci-mem.c | 4 + drivers/usb/host/xhci.c | 30 ++++++ drivers/usb/misc/uss720.c | 4 +- drivers/usb/misc/yurex.c | 5 +- drivers/usb/mtu3/mtu3_core.c | 6 +- drivers/usb/mtu3/mtu3_hw_regs.h | 1 + drivers/usb/serial/io_ti.h | 2 +- drivers/usb/serial/ti_usb_3410_5052.c | 2 +- drivers/usb/storage/scsiglue.c | 9 ++ drivers/usb/storage/uas.c | 21 ++++ drivers/usb/storage/unusual_devs.h | 7 ++ drivers/video/fbdev/core/modedb.c | 41 +++++--- drivers/video/fbdev/goldfishfb.c | 1 + drivers/video/fbdev/omap/omapfb_main.c | 2 +- drivers/video/fbdev/omap2/omapfb/Makefile | 4 +- drivers/video/fbdev/pxafb.c | 4 +- drivers/video/fbdev/via/viafbdev.c | 3 +- fs/binfmt_elf.c | 2 +- fs/cifs/readdir.c | 11 ++- fs/cifs/smb2pdu.c | 29 +++--- fs/configfs/dir.c | 11 +++ fs/f2fs/super.c | 16 ++- fs/gfs2/bmap.c | 2 +- fs/gfs2/rgrp.c | 3 +- fs/namespace.c | 7 +- fs/nfs/nfs4proc.c | 10 +- fs/nfs/nfs4state.c | 2 + fs/nfs/nfs4trace.h | 2 +- fs/overlayfs/super.c | 26 ++--- fs/pstore/ram_core.c | 17 +++- include/linux/crypto.h | 5 + include/linux/mlx5/driver.h | 4 +- include/linux/of.h | 8 ++ kernel/audit_watch.c | 12 ++- kernel/bpf/cgroup.c | 7 +- kernel/events/core.c | 4 + kernel/rcu/rcutorture.c | 5 +- kernel/rcu/tree.c | 6 ++ kernel/rcu/tree.h | 4 + kernel/sched/fair.c | 10 +- kernel/sched/wait.c | 47 ++++----- net/bluetooth/af_bluetooth.c | 2 +- net/core/skbuff.c | 3 - net/ipv4/ip_gre.c | 5 + net/ipv4/tcp.c | 2 +- net/mac80211/cfg.c | 2 +- net/mac80211/key.c | 24 +++-- net/rds/bind.c | 5 +- net/tipc/socket.c | 1 + net/tls/tls_sw.c | 14 ++- net/xfrm/xfrm_policy.c | 5 +- scripts/Kbuild.include | 3 + security/integrity/evm/evm_crypto.c | 3 +- security/security.c | 2 + security/smack/smack_lsm.c | 14 ++- sound/core/pcm_lib.c | 14 ++- sound/isa/msnd/msnd_pinnacle.c | 4 +- sound/soc/codecs/hdmi-codec.c | 21 ++-- sound/soc/codecs/rt5514.c | 8 +- sound/soc/codecs/rt5651.c | 22 +++-- sound/soc/qcom/qdsp6/q6afe-dai.c | 2 +- sound/usb/quirks-table.h | 3 +- sound/usb/quirks.c | 2 + tools/hv/hv_kvp_daemon.c | 2 +- tools/perf/arch/powerpc/util/skip-callchain-idx.c | 10 +- tools/perf/tests/builtin-test.c | 2 +- .../tests/shell/record+probe_libc_inet_pton.sh | 36 ++++++- tools/perf/util/comm.c | 16 ++- tools/perf/util/header.c | 2 +- tools/perf/util/machine.c | 9 +- tools/perf/util/map.c | 11 +++ tools/perf/util/unwind-libdw.c | 2 +- tools/perf/util/unwind-libunwind-local.c | 2 +- tools/testing/nvdimm/test/nfit.c | 3 +- .../testing/selftests/android/ion/ionapp_export.c | 1 + tools/testing/selftests/timers/raw_skew.c | 5 + tools/testing/selftests/vDSO/vdso_test.c | 7 +- virt/kvm/arm/vgic/vgic-init.c | 4 + virt/kvm/arm/vgic/vgic-mmio-v2.c | 3 + 238 files changed, 1599 insertions(+), 926 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/235 be2net: Fix memory leak in be_cmd_get_profile_config()
4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Oros <[email protected]>
[ Upstream commit 9d7f19dc4673fbafebfcbf30eb90e09fa7d1c037 ]
DMA allocated memory is lost in be_cmd_get_profile_config() when we call it with non-NULL port_res parameter.
--- drivers/net/ethernet/emulex/benet/be_cmds.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/emulex/benet/be_cmds.c +1 -1
@@ -4500,7 +4500,7 @@ int be_cmd_get_profile_config(struct be_ port_res->max_vfs +=le16_to_cpu (pcie->num_vfs); } } -return status; + goto err; } pcie = be_get_pcie_desc(resp->func_param, desc_count,
Greg Kroah-Hartman
maintainerPATCH 2/235 net/mlx5: Fix use-after-free in self-healing flow
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Morgenstein <[email protected]>
[ Upstream commit 76d5581c870454be5f1f1a106c57985902e7ea20 ]
When the mlx5 health mechanism detects a problem while the driver is in the middle of init_one or remove_one, the driver needs to prevent the health mechanism from scheduling future work; if future work is scheduled, there is a problem with use-after-free: the system WQ tries to run the work item (which has been freed) at the scheduled future time.
Prevent this by disabling work item scheduling in the health mechanism when the driver is in the middle of init_one() or remove_one().
--- drivers/net/ethernet/mellanox/mlx5/core/health.c | 10 +++++++++- drivers/net/ethernet/mellanox/mlx5/core/main.c | 6 +++--- include/linux/mlx5/driver.h | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/health.c +9 -1
@@ -331,9 +331,17 @@ void mlx5_start_health_poll(struct mlx5_add_timer (&health->timer); } -void mlx5_stop_health_poll (struct mlx5_core_dev *dev) +void mlx5_stop_health_poll (struct mlx5_core_dev *dev,bool disable_health) {struct mlx5_core_health *health = &dev->priv.health; +unsigned long flags; + +if (disable_health) { +spin_lock_irqsave (&health->wq_lock, flags); +set_bit (MLX5_DROP_NEW_HEALTH_WORK , &health->flags); +set_bit (MLX5_DROP_NEW_RECOVERY_WORK , &health->flags); +spin_unlock_irqrestore (&health->wq_lock, flags); + }del_timer_sync (&health->timer); }
drivers/net/ethernet/mellanox/mlx5/core/main.c +3 -3
@@ -1266,7 +1266,7 @@ err_cleanup_once:mlx5_cleanup_once (dev); err_stop_poll: -mlx5_stop_health_poll (dev); +mlx5_stop_health_poll (dev, boot);if (mlx5_cmd_teardown_hca (dev)) {dev_err (&dev->pdev->dev,"tear_down_hca failed, skip cleanup\n" ); goto out_err;
@@ -1325,7 +1325,7 @@ static int mlx5_unload_one(struct mlx5_cmlx5_free_irq_vectors (dev);if (cleanup)mlx5_cleanup_once (dev); -mlx5_stop_health_poll (dev); +mlx5_stop_health_poll (dev, cleanup); err =mlx5_cmd_teardown_hca (dev);if (err) {dev_err (&dev->pdev->dev,"tear_down_hca failed, skip cleanup\n" );
@@ -1587,7 +1587,7 @@ static int mlx5_try_fast_unload(struct m* with the HCA, so the health polll is no longer needed. */ mlx5_drain_health_wq (dev); -mlx5_stop_health_poll (dev); +mlx5_stop_health_poll (dev, false); ret =mlx5_cmd_force_teardown_hca (dev);if (ret) {
include/linux/mlx5/driver.h +1 -1
@@ -1042,7 +1042,7 @@ int mlx5_cmd_free_uar(struct mlx5_core_dvoid mlx5_health_cleanup (struct mlx5_core_dev *dev);int mlx5_health_init (struct mlx5_core_dev *dev);void mlx5_start_health_poll (struct mlx5_core_dev *dev); -void mlx5_stop_health_poll (struct mlx5_core_dev *dev); +void mlx5_stop_health_poll (struct mlx5_core_dev *dev,bool disable_health);void mlx5_drain_health_wq (struct mlx5_core_dev *dev);void mlx5_trigger_health_work (struct mlx5_core_dev *dev);void mlx5_drain_health_recovery (struct mlx5_core_dev *dev);
Greg Kroah-Hartman
maintainerPATCH 3/235 net: qca_spi: Fix race condition in spi transfers
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Wahren <[email protected]>
[ Upstream commit e65a9e480e91ddf9e15155454d370cead64689c8 ]
With performance optimization the spi transfer and messages of basic register operations like qcaspi_read_register moved into the private driver structure. But they weren't protected against mutual access (e.g. between driver kthread and ethtool). So dumping the QCA7000 registers via ethtool during network traffic could make spi_sync hang forever, because the completion in spi_message is overwritten.
So revert the optimization completely.
--- drivers/net/ethernet/qualcomm/qca_7k.c | 76 ++++++++++----------- drivers/net/ethernet/qualcomm/qca_spi.c | 114 ++++++++++++++++---------------- drivers/net/ethernet/qualcomm/qca_spi.h | 5 - 3 files changed, 95 insertions(+), 100 deletions(-)
drivers/net/ethernet/qualcomm/qca_7k.c +36 -40
@@ -45,34 +45,33 @@ qcaspi_read_register(struct qcaspi *qca, {__be16 rx_data;__be16 tx_data; -struct spi_transfer *transfer; -struct spi_message *msg; +struct spi_transfer transfer[2 ]; +struct spi_message msg;int ret; +memset (transfer,0 ,sizeof (transfer)); + +spi_message_init (&msg); + tx_data =cpu_to_be16 (QCA7K_SPI_READ |QCA7K_SPI_INTERNAL | reg); + *result =0 ; + + transfer[0 ].tx_buf = &tx_data; + transfer[0 ].len =QCASPI_CMD_LEN ; + transfer[1 ].rx_buf = &rx_data; + transfer[1 ].len =QCASPI_CMD_LEN ; + +spi_message_add_tail (&transfer[0 ], &msg);if (qca->legacy_mode) { - msg = &qca->spi_msg1; - transfer = &qca->spi_xfer1; - transfer->tx_buf = &tx_data; - transfer->rx_buf =NULL ; - transfer->len =QCASPI_CMD_LEN ; -spi_sync (qca->spi_dev, msg); - }else { - msg = &qca->spi_msg2; - transfer = &qca->spi_xfer2[0 ]; - transfer->tx_buf = &tx_data; - transfer->rx_buf =NULL ; - transfer->len =QCASPI_CMD_LEN ; - transfer = &qca->spi_xfer2[1 ]; +spi_sync (qca->spi_dev, &msg); +spi_message_init (&msg); } - transfer->tx_buf =NULL ; - transfer->rx_buf = &rx_data; - transfer->len =QCASPI_CMD_LEN ; - ret =spi_sync (qca->spi_dev, msg); +spi_message_add_tail (&transfer[1 ], &msg); + ret =spi_sync (qca->spi_dev, &msg);if (!ret) - ret = msg->status; + ret = msg.status;if (ret)qcaspi_spi_error (qca);
@@ -86,35 +85,32 @@ int qcaspi_write_register(struct qcaspi *qca, u16 reg, u16 value) { __be16 tx_data[2]; -struct spi_transfer *transfer; -struct spi_message *msg; +struct spi_transfer transfer[2 ]; +struct spi_message msg;int ret; +memset (&transfer,0 ,sizeof (transfer)); + +spi_message_init (&msg); + tx_data[0 ] =cpu_to_be16 (QCA7K_SPI_WRITE |QCA7K_SPI_INTERNAL | reg); tx_data[1 ] =cpu_to_be16 (value); + transfer[0 ].tx_buf = &tx_data[0 ]; + transfer[0 ].len =QCASPI_CMD_LEN ; + transfer[1 ].tx_buf = &tx_data[1 ]; + transfer[1 ].len =QCASPI_CMD_LEN ; + +spi_message_add_tail (&transfer[0 ], &msg);if (qca->legacy_mode) { - msg = &qca->spi_msg1; - transfer = &qca->spi_xfer1; - transfer->tx_buf = &tx_data[0 ]; - transfer->rx_buf =NULL ; - transfer->len =QCASPI_CMD_LEN ; -spi_sync (qca->spi_dev, msg); - }else { - msg = &qca->spi_msg2; - transfer = &qca->spi_xfer2[0 ]; - transfer->tx_buf = &tx_data[0 ]; - transfer->rx_buf =NULL ; - transfer->len =QCASPI_CMD_LEN ; - transfer = &qca->spi_xfer2[1 ]; +spi_sync (qca->spi_dev, &msg); +spi_message_init (&msg); } - transfer->tx_buf = &tx_data[1 ]; - transfer->rx_buf =NULL ; - transfer->len =QCASPI_CMD_LEN ; - ret =spi_sync (qca->spi_dev, msg); +spi_message_add_tail (&transfer[1 ], &msg); + ret =spi_sync (qca->spi_dev, &msg);if (!ret) - ret = msg->status; + ret = msg.status;if (ret)qcaspi_spi_error (qca);
drivers/net/ethernet/qualcomm/qca_spi.c +59 -55
173 lines not on this page · raw message
drivers/net/ethernet/qualcomm/qca_spi.h +0 -5
@@ -83,11 +83,6 @@ struct qcaspi {struct tx_ring txr;struct qcaspi_stats stats; -struct spi_message spi_msg1; -struct spi_message spi_msg2; -struct spi_transfer spi_xfer1; -struct spi_transfer spi_xfer2[2 ]; -u8 *rx_buffer;u32 buffer_size;u8 sync;
Greg Kroah-Hartman
maintainerPATCH 4/235 rds: fix two RCU related problems
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit cc4dfb7f70a344f24c1c71e298deea0771dadcb2 ]
When a rds sock is bound, it is inserted into the bind_hash_table which is protected by RCU. But when releasing rds sock, after it is removed from this hash table, it is freed immediately without respecting RCU grace period. This could cause some use-after-free as reported by syzbot.
Mark the rds sock with SOCK_RCU_FREE before inserting it into the bind_hash_table, so that it would be always freed after a RCU grace period.
The other problem is in rds_find_bound(), the rds sock could be freed in between rhashtable_lookup_fast() and rds_sock_addref(), so we need to extend RCU read lock protection in rds_find_bound() to close this race condition.
--- net/rds/bind.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/rds/bind.c +4 -1
@@ -60,11 +60,13 @@ struct rds_sock *rds_find_bound(__be32 au64 key = ((u64 )addr <<32 ) | port;struct rds_sock *rs; - rs =rhashtable_lookup_fast (&bind_hash_table, &key, ht_parms); +rcu_read_lock (); + rs =rhashtable_lookup (&bind_hash_table, &key, ht_parms);if (rs && !sock_flag (rds_rs_to_sk (rs),SOCK_DEAD ))rds_sock_addref (rs);else rs =NULL ; +rcu_read_unlock ();rdsdebug ("returning rs %p for %pI4:%u\n" , rs, &addr,ntohs (port));
@@ -157,6 +159,7 @@ int rds_bind(struct socket *sock, struct goto out; } +sock_set_flag (sk,SOCK_RCU_FREE ); ret =rds_add_bound (rs, sin->sin_addr.s_addr, &sin->sin_port);if (ret) goto out;
Greg Kroah-Hartman
maintainerPATCH 5/235 tipc: orphan sock in tipc_release()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit 0a3b8b2b215f9e84b82ae97df71292ccfd92b1e7 ]
Before we unlock the sock in tipc_release(), we have to detach sk->sk_socket from sk, otherwise a parallel tipc_sk_fill_sock_diag() could stil read it after we free this socket.
--- net/tipc/socket.c | 1 + 1 file changed, 1 insertion(+)
net/tipc/socket.c +1 -0
@@ -578,6 +578,7 @@ static int tipc_release(struct socket *ssk_stop_timer (sk, &sk->sk_timer);tipc_sk_remove (tsk); +sock_orphan (sk);/* Reject any messages that accumulated in backlog queue */ release_sock (sk);tipc_dest_list_purge (&tsk->cong_links);
Greg Kroah-Hartman
maintainerPATCH 6/235 net/mlx5: E-Switch, Fix memory leak when creating switchdev mode FDB tables
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raed Salem <[email protected]>
[ Upstream commit c88a026e01219488e745f4f0267fd76c2bb68421 ]
The memory allocated for the slow path table flow group input structure was not freed upon successful return, fix that.
--- drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +1 -0
@@ -658,6 +658,7 @@ static int esw_create_offloads_fdb_tableif (err) goto miss_rule_err; +kvfree (flow_group_in);return 0 ; miss_rule_err:
Greg Kroah-Hartman
maintainerPATCH 7/235 net/tls: Set count of SG entries if sk_alloc_sg returns -ENOSPC
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vakul Garg <[email protected]>
[ Upstream commit 52ea992cfac357b73180d5c051dca43bc8d20c2a ]
tls_sw_sendmsg() allocates plaintext and encrypted SG entries using function sk_alloc_sg(). In case the number of SG entries hit MAX_SKB_FRAGS, sk_alloc_sg() returns -ENOSPC and sets the variable for current SG index to '0'. This leads to calling of function tls_push_record() with 'sg_encrypted_num_elem = 0' and later causes kernel crash. To fix this, set the number of SG elements to the number of elements in plaintext/encrypted SG arrays in case sk_alloc_sg() returns -ENOSPC.
--- net/tls/tls_sw.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/tls/tls_sw.c +6 -0
@@ -149,6 +149,9 @@ static int alloc_encrypted_sg(struct soc &ctx->sg_encrypted_num_elem, &ctx->sg_encrypted_size, 0); +if (rc == -ENOSPC ) + ctx->sg_encrypted_num_elem =ARRAY_SIZE (ctx->sg_encrypted_data); +return rc; }
@@ -162,6 +165,9 @@ static int alloc_plaintext_sg(struct soc &ctx->sg_plaintext_num_elem, &ctx->sg_plaintext_size, tls_ctx->pending_open_record_frags); +if (rc == -ENOSPC ) + ctx->sg_plaintext_num_elem =ARRAY_SIZE (ctx->sg_plaintext_data); +return rc; }
Greg Kroah-Hartman
maintainerPATCH 8/235 net/mlx5: Check for error in mlx5_attach_interface
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huy Nguyen <[email protected]>
[ Upstream commit 47bc94b82291e007da61ee1b3d18c77871f3e158 ]
Currently, mlx5_attach_interface does not check for error
after calling intf->attach or intf->add. When these two calls fails, the client is not initialized and will cause issues such as kernel panic on invalid address in the teardown path (mlx5_detach_interface)
--- drivers/net/ethernet/mellanox/mlx5/core/dev.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/dev.c +10 -5
@@ -132,11 +132,11 @@ void mlx5_add_device(struct mlx5_interfadelayed_event_start (priv); dev_ctx->context = intf->add (dev); -set_bit (MLX5_INTERFACE_ADDED , &dev_ctx->state); -if (intf->attach) -set_bit (MLX5_INTERFACE_ATTACHED , &dev_ctx->state); -if (dev_ctx->context) { +set_bit (MLX5_INTERFACE_ADDED , &dev_ctx->state); +if (intf->attach) +set_bit (MLX5_INTERFACE_ATTACHED , &dev_ctx->state); +spin_lock_irq (&priv->ctx_lock);list_add_tail (&dev_ctx->list, &priv->ctx_list);
@@ -211,12 +211,17 @@ static void mlx5_attach_interface(structif (intf->attach) {if (test_bit (MLX5_INTERFACE_ATTACHED , &dev_ctx->state)) goto out; - intf->attach (dev, dev_ctx->context); +if (intf->attach (dev, dev_ctx->context)) + goto out; +set_bit (MLX5_INTERFACE_ATTACHED , &dev_ctx->state); }else {if (test_bit (MLX5_INTERFACE_ADDED , &dev_ctx->state)) goto out; dev_ctx->context = intf->add (dev); +if (!dev_ctx->context) + goto out; +set_bit (MLX5_INTERFACE_ADDED , &dev_ctx->state); }
Greg Kroah-Hartman
maintainerPATCH 9/235 net/mlx5: Fix debugfs cleanup in the device init/remove flow
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Morgenstein <[email protected]>
[ Upstream commit 5df816e7f43f1297c40021ef17ec6e722b45c82f ]
When initializing the device (procedure init_one), the driver calls mlx5_pci_init to perform pci initialization. As part of this initialization, mlx5_pci_init creates a debugfs directory. If this creation fails, init_one aborts, returning failure to the caller (which is the probe method caller).
The main reason for such a failure to occur is if the debugfs directory already exists. This can happen if the last time mlx5_pci_close was called, debugfs_remove (silently) failed due to the debugfs directory not being empty.
Guarantee that such a debugfs_remove failure will not occur by instead calling debugfs_remove_recursive in procedure mlx5_pci_close.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +4 -2
@@ -874,8 +874,10 @@ static int mlx5_pci_init(struct mlx5_cor priv->numa_node =dev_to_node (&dev->pdev->dev); priv->dbg_root =debugfs_create_dir (dev_name (&pdev->dev), mlx5_debugfs_root); -if (!priv->dbg_root) +if (!priv->dbg_root) { +dev_err (&pdev->dev,"Cannot create debugfs dir, aborting\n" );return -ENOMEM ; + } err =mlx5_pci_enable_device (dev);if (err) {
@@ -924,7 +926,7 @@ static void mlx5_pci_close(struct mlx5_cpci_clear_master (dev->pdev);release_bar (dev->pdev);mlx5_pci_disable_device (dev); -debugfs_remove (priv->dbg_root); +debugfs_remove_recursive (priv->dbg_root); }static int mlx5_init_once (struct mlx5_core_dev *dev,struct mlx5_priv *priv)
Greg Kroah-Hartman
maintainerPATCH 10/235 erspan: fix error handling for erspan tunnel
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haishuang Yan <[email protected]>
[ Upstream commit 51dc63e3911fbb1f0a7a32da2fe56253e2040ea4 ]
When processing icmp unreachable message for erspan tunnel, tunnel id should be erspan_net_id instead of ipgre_net_id.
--- net/ipv4/ip_gre.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv4/ip_gre.c +3 -0
@@ -178,6 +178,9 @@ static void ipgre_err(struct sk_buff *skif (tpi->proto ==htons (ETH_P_TEB )) itn =net_generic (net, gre_tap_net_id); +else if (tpi->proto ==htons (ETH_P_ERSPAN ) || + tpi->proto ==htons (ETH_P_ERSPAN2 )) + itn =net_generic (net, erspan_net_id);else itn =net_generic (net, ipgre_net_id);
Greg Kroah-Hartman
maintainerPATCH 11/235 erspan: return PACKET_REJECT when the appropriate tunnel is not found
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haishuang Yan <[email protected]>
[ Upstream commit 5a64506b5c2c3cdb29d817723205330378075448 ]
If erspan tunnel hasn't been established, we'd better send icmp port unreachable message after receive erspan packets.
--- net/ipv4/ip_gre.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/ip_gre.c +2 -0
@@ -331,6 +331,8 @@ static int erspan_rcv(struct sk_buff *skip_tunnel_rcv (tunnel, skb, tpi, tun_dst, log_ecn_error);return PACKET_RCVD ; } +return PACKET_REJECT ; + drop:kfree_skb (skb);return PACKET_RCVD ;
Greg Kroah-Hartman
maintainerPATCH 12/235 tcp: really ignore MSG_ZEROCOPY if no SO_ZEROCOPY
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vincent Whitchurch <[email protected]>
[ Upstream commit 5cf4a8532c992bb22a9ecd5f6d93f873f4eaccc2 ]
According to the documentation in msg_zerocopy.rst, the SO_ZEROCOPY flag was introduced because send(2) ignores unknown message flags and any legacy application which was accidentally passing the equivalent of MSG_ZEROCOPY earlier should not see any new behaviour.
Before commit f214f915e7db ("tcp: enable MSG_ZEROCOPY"), a send(2) call which passed the equivalent of MSG_ZEROCOPY without setting SO_ZEROCOPY would succeed. However, after that commit, it fails with -ENOBUFS. So it appears that the SO_ZEROCOPY flag fails to fulfill its intended purpose. Fix it.
--- net/core/skbuff.c | 3 --- net/ipv4/tcp.c | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-)
net/core/skbuff.c +0 -3
@@ -939,9 +939,6 @@ struct ubuf_info *sock_zerocopy_alloc(stWARN_ON_ONCE (!in_task ()); -if (!sock_flag (sk,SOCK_ZEROCOPY )) -return NULL ; - skb =sock_omalloc (sk,0 ,GFP_KERNEL );if (!skb)return NULL ;
net/ipv4/tcp.c +1 -1
@@ -1186,7 +1186,7 @@ int tcp_sendmsg_locked(struct sock *sk, flags = msg->msg_flags; -if (flags &MSG_ZEROCOPY && size) { +if (flags &MSG_ZEROCOPY && size &&sock_flag (sk,SOCK_ZEROCOPY )) {if (sk->sk_state !=TCP_ESTABLISHED ) { err = -EINVAL ; goto out_err;
Greg Kroah-Hartman
maintainerPATCH 13/235 net/mlx5: Fix not releasing read lock when adding flow rules
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roi Dayan <[email protected]>
[ Upstream commit 071304772fc747d5df13c51f1cf48a4b922a5e0d ]
If building match list fg fails and we never jumped to search_again_locked label then the function returned without unlocking the read lock.
--- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +2 -0
@@ -1797,6 +1797,8 @@ search_again_locked:if (err) {if (take_write)up_write_ref_node (&ft->node); +else +up_read_ref_node (&ft->node);return ERR_PTR (err); }
Greg Kroah-Hartman
maintainerPATCH 14/235 net/mlx5: Fix possible deadlock from lockdep when adding fte to fg
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roi Dayan <[email protected]>
[ Upstream commit ad9421e36a77056a4f095d49b9605e80b4d216ed ]
This is a false positive report due to incorrect nested lock annotations as we lock multiple fgs with the same subclass. Instead of locking all fgs only lock the one being used as was done before.
--- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 74 +++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +37 -37
@@ -1649,6 +1649,33 @@ static u64 matched_fgs_get_version(strucreturn version; } +static struct fs_fte * +lookup_fte_locked (struct mlx5_flow_group *g, +u32 *match_value, +bool take_write) +{ +struct fs_fte *fte_tmp; + +if (take_write) +nested_down_write_ref_node (&g->node,FS_LOCK_PARENT ); +else +nested_down_read_ref_node (&g->node,FS_LOCK_PARENT ); + fte_tmp =rhashtable_lookup_fast (&g->ftes_hash, match_value, + rhash_fte); +if (!fte_tmp || !tree_get_node (&fte_tmp->node)) { + fte_tmp =NULL ; + goto out; + } + +nested_down_write_ref_node (&fte_tmp->node,FS_LOCK_CHILD ); +out: +if (take_write) +up_write_ref_node (&g->node); +else +up_read_ref_node (&g->node); +return fte_tmp; +} +static struct mlx5_flow_handle * try_add_to_existing_fg(struct mlx5_flow_table *ft, struct list_head *match_head,
@@ -1671,10 +1698,6 @@ try_add_to_existing_fg(struct mlx5_flow_if (IS_ERR (fte))return ERR_PTR (-ENOMEM ); -list_for_each_entry (iter, match_head, list) { -nested_down_read_ref_node (&iter->g->node,FS_LOCK_PARENT ); - } - search_again_locked: version =matched_fgs_get_version (match_head);/* Try to find a fg that already contains a matching fte */
@@ -1682,20 +1705,9 @@ search_again_locked:struct fs_fte *fte_tmp; g = iter->g; - fte_tmp =rhashtable_lookup_fast (&g->ftes_hash, spec->match_value, - rhash_fte); -if (!fte_tmp || !tree_get_node (&fte_tmp->node)) + fte_tmp =lookup_fte_locked (g, spec->match_value, take_write); +if (!fte_tmp)continue ; - -nested_down_write_ref_node (&fte_tmp->node,FS_LOCK_CHILD ); -if (!take_write) { -list_for_each_entry (iter, match_head, list) -up_read_ref_node (&iter->g->node); - }else { -list_for_each_entry (iter, match_head, list) -up_write_ref_node (&iter->g->node); - } - rule =add_rule_fg (g, spec->match_value, flow_act, dest, dest_num, fte_tmp);up_write_ref_node (&fte_tmp->node);
@@ -1704,19 +1716,6 @@ search_again_locked:return rule; } -/* No group with matching fte found. Try to add a new fte to any -* matching fg. -*/ - -if (!take_write) { -list_for_each_entry (iter, match_head, list) -up_read_ref_node (&iter->g->node); -list_for_each_entry (iter, match_head, list) -nested_down_write_ref_node (&iter->g->node, -FS_LOCK_PARENT ); - take_write = true; - } -/* Check the ft version, for case that new flow group * was added while the fgs weren't locked */
@@ -1728,27 +1727,30 @@ search_again_locked:/* Check the fgs version, for case the new FTE with the * same values was added while the fgs weren't locked */ -if (version !=matched_fgs_get_version (match_head)) +if (version !=matched_fgs_get_version (match_head)) { + take_write = true; goto search_again_locked; + }list_for_each_entry (iter, match_head, list) { g = iter->g;if (!g->node.active)continue ; + +nested_down_write_ref_node (&g->node,FS_LOCK_PARENT ); + err =insert_fte (g, fte);if (err) { +up_write_ref_node (&g->node);if (err == -ENOSPC )continue ; -list_for_each_entry (iter, match_head, list) -up_write_ref_node (&iter->g->node);kmem_cache_free (steering->ftes_cache, fte);return ERR_PTR (err); }nested_down_write_ref_node (&fte->node,FS_LOCK_CHILD ); -list_for_each_entry (iter, match_head, list) -up_write_ref_node (&iter->g->node); +up_write_ref_node (&g->node); rule =add_rule_fg (g, spec->match_value, flow_act, dest, dest_num, fte);up_write_ref_node (&fte->node);
@@ -1757,8 +1759,6 @@ search_again_locked: } rule =ERR_PTR (-ENOENT ); out: -list_for_each_entry (iter, match_head, list) -up_write_ref_node (&iter->g->node);kmem_cache_free (steering->ftes_cache, fte);return rule; }
Greg Kroah-Hartman
maintainerPATCH 15/235 net/mlx5: Use u16 for Work Queue buffer fragment size
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tariq Toukan <[email protected]>
[ Upstream commit 8d71e818506718e8d7032ce824b5c74a17d4f7a5 ]
Minimal stride size is 16.
Hence, the number of strides in a fragment (of PAGE_SIZE) is <= PAGE_SIZE / 16 <= 4K.
u16 is sufficient to represent this.
--- drivers/net/ethernet/mellanox/mlx5/core/wq.c | 4 ++-- drivers/net/ethernet/mellanox/mlx5/core/wq.h | 2 +- include/linux/mlx5/driver.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/wq.c +2 -2
@@ -39,9 +39,9 @@ u32 mlx5_wq_cyc_get_size(struct mlx5_wq_return (u32 )wq->fbc.sz_m1 +1 ; } -u32 mlx5_wq_cyc_get_frag_size (struct mlx5_wq_cyc *wq) +u16 mlx5_wq_cyc_get_frag_size (struct mlx5_wq_cyc *wq) { -return (u32 )wq->fbc.frag_sz_m1 +1 ; +return wq->fbc.frag_sz_m1 +1 ; }u32 mlx5_cqwq_get_size (struct mlx5_cqwq *wq)
drivers/net/ethernet/mellanox/mlx5/core/wq.h +1 -1
@@ -80,7 +80,7 @@ int mlx5_wq_cyc_create(struct mlx5_core_ void *wqc, struct mlx5_wq_cyc *wq, struct mlx5_wq_ctrl *wq_ctrl);u32 mlx5_wq_cyc_get_size (struct mlx5_wq_cyc *wq); -u32 mlx5_wq_cyc_get_frag_size (struct mlx5_wq_cyc *wq); +u16 mlx5_wq_cyc_get_frag_size (struct mlx5_wq_cyc *wq); int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, void *qpc, struct mlx5_wq_qp *wq,
include/linux/mlx5/driver.h +1 -1
@@ -357,7 +357,7 @@ struct mlx5_frag_buf {struct mlx5_frag_buf_ctrl {struct mlx5_frag_buf frag_buf;u32 sz_m1; -u32 frag_sz_m1; +u16 frag_sz_m1;u32 strides_offset;u8 log_sz;u8 log_stride;
Greg Kroah-Hartman
maintainerPATCH 16/235 usb: dwc3: change stream event enable bit back to 13
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Erich E. Hoover" <[email protected]>
[ Upstream commit 9a7faac3650216112e034b157289bf1a48a99e2d ]
Commit ff3f0789b3dc ("usb: dwc3: use BIT() macro where possible") changed DWC3_DEPCFG_STREAM_EVENT_EN from bit 13 to bit 12.
Spotted this cleanup typo while looking at diffs between 4.9.35 and 4.14.16 for a separate issue.
--- drivers/usb/dwc3/gadget.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc3/gadget.h +1 -1
@@ -25,7 +25,7 @@ struct dwc3;#define DWC3_DEPCFG_XFER_IN_PROGRESS_EN BIT(9)#define DWC3_DEPCFG_XFER_NOT_READY_EN BIT(10)#define DWC3_DEPCFG_FIFO_ERROR_EN BIT(11) -#define DWC3_DEPCFG_STREAM_EVENT_EN BIT(12) +#define DWC3_DEPCFG_STREAM_EVENT_EN BIT(13)#define DWC3_DEPCFG_BINTERVAL_M1 (n) (((n) & 0xff) << 16)#define DWC3_DEPCFG_STREAM_CAPABLE BIT(24)#define DWC3_DEPCFG_EP_NUMBER (n) (((n) & 0x1f) << 25)
Greg Kroah-Hartman
maintainerPATCH 17/235 iommu/arm-smmu-v3: sync the OVACKFLG to PRIQ consumer register
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miao Zhong <[email protected]>
[ Upstream commit 0d535967ac658966c6ade8f82b5799092f7d5441 ]
When PRI queue occurs overflow, driver should update the OVACKFLG to the PRIQ consumer register, otherwise subsequent PRI requests will not be processed.
--- drivers/iommu/arm-smmu-v3.c | 1 + 1 file changed, 1 insertion(+)
drivers/iommu/arm-smmu-v3.c +1 -0
@@ -1302,6 +1302,7 @@ static irqreturn_t arm_smmu_priq_thread(/* Sync our overflow flag, as we believe we're up to speed */ q->cons =Q_OVF (q, q->prod) |Q_WRP (q, q->cons) |Q_IDX (q, q->cons); +writel (q->cons, q->cons_reg);return IRQ_HANDLED ; }
Greg Kroah-Hartman
maintainerPATCH 18/235 iommu/io-pgtable-arm-v7s: Abort allocation when table address overflows the PTE
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Philippe Brucker <[email protected]>
[ Upstream commit 29859aeb8a6ea17ba207933a81b6b77b4d4df81a ]
When run on a 64-bit system in selftest, the v7s driver may obtain page table with physical addresses larger than 32-bit. Level-2 tables are 1KB and are are allocated with slab, which doesn't accept the GFP_DMA32 flag. Currently map() truncates the address written in the PTE, causing iova_to_phys() or unmap() to access invalid memory. Kasan reports it as a use-after-free. To avoid any nasty surprise, test if the physical address fits in a PTE before returning a new table. 32-bit systems, which are the main users of this page table format, shouldn't see any difference.
--- drivers/iommu/io-pgtable-arm-v7s.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/iommu/io-pgtable-arm-v7s.c +6 -1
@@ -192,6 +192,7 @@ static void *__arm_v7s_alloc_table(int l {struct io_pgtable_cfg *cfg = &data->iop.cfg;struct device *dev = cfg->iommu_dev; +phys_addr_t phys;dma_addr_t dma;size_t size =ARM_V7S_TABLE_SIZE (lvl);void *table =NULL ;
@@ -200,6 +201,10 @@ static void *__arm_v7s_alloc_table(int l table = (void *)__get_dma_pages (__GFP_ZERO,get_order (size)); else if (lvl == 2) table =kmem_cache_zalloc (data->l2_tables, gfp |GFP_DMA ); + phys =virt_to_phys (table); +if (phys != (arm_v7s_iopte )phys) +/* Doesn't fit in PTE */ + goto out_free;if (table && !(cfg->quirks &IO_PGTABLE_QUIRK_NO_DMA )) { dma =dma_map_single (dev, table, size,DMA_TO_DEVICE );if (dma_mapping_error (dev, dma))
@@ -209,7 +214,7 @@ static void *__arm_v7s_alloc_table(int l* address directly, so if the DMA layer suggests otherwise by * translating or truncating them, that bodes very badly... */ -if (dma !=virt_to_phys (table)) +if (dma != phys) goto out_unmap; }kmemleak_ignore (table);
Greg Kroah-Hartman
maintainerPATCH 19/235 iommu/io-pgtable-arm: Fix pgtable allocation in selftest
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jean-Philippe Brucker <[email protected]>
[ Upstream commit fac83d29d95471ad6a104f8c0d21669a3d59097b ]
Commit 4b123757eeaa ("iommu/io-pgtable-arm: Make allocations NUMA-aware") added a NUMA hint to page table allocation, but the pgtable selftest doesn't provide an SMMU device parameter. Since dev_to_node doesn't accept a NULL argument, add a special case for selftest.
--- drivers/iommu/io-pgtable-arm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/iommu/io-pgtable-arm.c +2 -1
@@ -237,7 +237,8 @@ static void *__arm_lpae_alloc_pages(sizevoid *pages;VM_BUG_ON ((gfp & __GFP_HIGHMEM)); - p =alloc_pages_node (dev_to_node (dev), gfp | __GFP_ZERO, order); + p =alloc_pages_node (dev ?dev_to_node (dev) :NUMA_NO_NODE , + gfp | __GFP_ZERO, order);if (!p)return NULL ;
Greg Kroah-Hartman
maintainerPATCH 20/235 ALSA: msnd: Fix the default sample sizes
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 7c500f9ea139d0c9b80fdea5a9c911db3166ea54 ]
The default sample sizes set by msnd driver are bogus; it sets ALSA PCM format, not the actual bit width.
--- sound/isa/msnd/msnd_pinnacle.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/isa/msnd/msnd_pinnacle.c +2 -2
@@ -82,10 +82,10 @@static void set_default_audio_parameters (struct snd_msnd *chip) { - chip->play_sample_size =DEFSAMPLESIZE ; + chip->play_sample_size =snd_pcm_format_width (DEFSAMPLESIZE ); chip->play_sample_rate =DEFSAMPLERATE ; chip->play_channels =DEFCHANNELS ; - chip->capture_sample_size =DEFSAMPLESIZE ; + chip->capture_sample_size =snd_pcm_format_width (DEFSAMPLESIZE ); chip->capture_sample_rate =DEFSAMPLERATE ; chip->capture_channels =DEFCHANNELS ; }
Greg Kroah-Hartman
maintainerPATCH 21/235 ALSA: usb-audio: Add support for Encore mDSD USB DAC
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Crukley <[email protected]>
[ Upstream commit b080dc5bd0dfc0b33c6cfc31f909c93d5e63c186 ]
This patch adds native DSD playback support for the Encore mDSD USB DAC by specifying the vendor and product ID's
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1373,6 +1373,7 @@ u64 snd_usb_interface_dsd_format_quirks(return SNDRV_PCM_FMTBIT_DSD_U32_BE ;break ; +case USB_ID (0x16d0 ,0x09dd ):/* Encore mDSD */ case USB_ID (0x0d8c ,0x0316 ):/* Hegel HD12 DSD */ case USB_ID (0x16b0 ,0x06b2 ):/* NuPrime DAC-10 */ case USB_ID (0x16d0 ,0x0733 ):/* Furutech ADL Stratos */
Greg Kroah-Hartman
maintainerPATCH 22/235 ALSA: usb-audio: Fix multiple definitions in AU0828_DEVICE() macro
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit bd1cd0eb2ce9141100628d476ead4de485501b29 ]
AU0828_DEVICE() macro in quirks-table.h uses USB_DEVICE_VENDOR_SPEC() for expanding idVendor and idProduct fields. However, the latter macro adds also match_flags and bInterfaceClass, which are different from the values AU0828_DEVICE() macro sets after that.
For fixing them, just expand idVendor and idProduct fields manually in AU0828_DEVICE().
This fixes sparse warnings like:
sound/usb/quirks-table.h:2892:1: warning: Initializer entry defined twice
--- sound/usb/quirks-table.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/usb/quirks-table.h +2 -1
@@ -2875,7 +2875,8 @@ YAMAHA_DEVICE(0x7010, "UB99"),*/ #define AU0828_DEVICE (vid, pid, vname, pname) { \ - USB_DEVICE_VENDOR_SPEC(vid, pid), \ + .idVendor = vid, \ + .idProduct = pid, \ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ USB_DEVICE_ID_MATCH_INT_CLASS | \ USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
Greg Kroah-Hartman
maintainerPATCH 23/235 xfrm: fix passing zero to ERR_PTR() warning
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: YueHaibing <[email protected]>
[ Upstream commit 934ffce1343f22ed5e2d0bd6da4440f4848074de ]
Fix a static code checker warning:
net/xfrm/xfrm_policy.c:1836 xfrm_resolve_and_create_bundle() warn: passing zero to 'ERR_PTR'
xfrm_tmpl_resolve return 0 just means no xdst found, return NULL instead of passing zero to ERR_PTR.
--- net/xfrm/xfrm_policy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/xfrm/xfrm_policy.c +4 -1
@@ -1831,7 +1831,10 @@ xfrm_resolve_and_create_bundle(struct xf/* Try to instantiate a bundle */ err =xfrm_tmpl_resolve (pols, num_pols, fl, xfrm, family);if (err <=0 ) { -if (err !=0 && err != -EAGAIN ) +if (err ==0 ) +return NULL ; + +if (err != -EAGAIN )XFRM_INC_STATS (net,LINUX_MIB_XFRMOUTPOLERROR );return ERR_PTR (err); }
Greg Kroah-Hartman
maintainerPATCH 24/235 amd-xgbe: use dma_mapping_error to check map errors
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: YueHaibing <[email protected]>
[ Upstream commit b24dbfe9ce03d9f83306616f22fb0e04e8960abe ]
The dma_mapping_error() returns true or false, but we want to return -ENOMEM if there was an error.
--- drivers/net/ethernet/amd/xgbe/xgbe-desc.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/ethernet/amd/xgbe/xgbe-desc.c +3 -4
@@ -289,7 +289,7 @@ static int xgbe_alloc_pages(struct xgbe_struct page *pages =NULL ;dma_addr_t pages_dma;gfp_t gfp; -int order, ret; +int order; again: order = alloc_order;
@@ -316,10 +316,9 @@ again:/* Map the pages */ pages_dma =dma_map_page (pdata->dev, pages,0 ,PAGE_SIZE << order,DMA_FROM_DEVICE ); - ret =dma_mapping_error (pdata->dev, pages_dma); -if (ret) { +if (dma_mapping_error (pdata->dev, pages_dma)) {put_page (pages); -return ret; +return -ENOMEM ; } pa->pages = pages;
Greg Kroah-Hartman
maintainerPATCH 25/235 nfp: dont fail probe on pci_sriov_set_totalvfs() errors
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 5b0ced17edc5710d4e946392d0f2934a9e07b37f ]
On machines with buggy ACPI tables or when SR-IOV is already enabled we may not be able to set the SR-IOV VF limit in sysfs, it's not fatal because the limit is imposed by the driver anyway. Only the sysfs 'sriov_totalvfs' attribute will be too high. Print an error to inform user about the failure but allow probe to continue.
--- drivers/net/ethernet/netronome/nfp/nfp_main.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
drivers/net/ethernet/netronome/nfp/nfp_main.c +12 -8
@@ -236,16 +236,20 @@ static int nfp_pcie_sriov_read_nfd_limitint err; pf->limit_vfs =nfp_rtsym_read_le (pf->rtbl,"nfd_vf_cfg_max_vfs" , &err); -if (!err) -return pci_sriov_set_totalvfs (pf->pdev, pf->limit_vfs); +if (err) { +/* For backwards compatibility if symbol not found allow all */ + pf->limit_vfs = ~0 ; +if (err == -ENOENT ) +return 0 ; - pf->limit_vfs = ~0 ; -/* Allow any setting for backwards compatibility if symbol not found */ -if (err == -ENOENT ) -return 0 ; +nfp_warn (pf->cpp,"Warning: VF limit read failed: %d\n" , err); +return err; + } -nfp_warn (pf->cpp,"Warning: VF limit read failed: %d\n" , err); -return err; + err =pci_sriov_set_totalvfs (pf->pdev, pf->limit_vfs); +if (err) +nfp_warn (pf->cpp,"Failed to set VF count in sysfs: %d\n" , err); +return 0 ; }static int nfp_pcie_sriov_enable (struct pci_dev *pdev,int num_vfs)
Greg Kroah-Hartman
maintainerPATCH 26/235 iwlwifi: cancel the injective function between hw pointers to tfd entry index
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Golan Ben Ami <[email protected]>
[ Upstream commit f5955a6cc3862a02d46f50b723c3172d24d749a5 ]
Nowadays, the tfd queue max size is 2^8, and the reserved size in the command header sequence field for the tfd entry index is 8 bits, allowing an injective function from the hw pointers to the tfd entry index in the sequence field.
In 22560 devices the tfd queue max size is 2^16, meaning that the hw pointers are 16 bit long (allowing to point to each entry in the tfd queue). However, the reserved space in the sequence field for the tfd entry doesn't change, and we are limited to 8 bit. This requires cancelling the injective function from hw pointer to tfd entry in the sequence number.
Use iwl_pcie_get_cmd_index to wrap the hw pointer's to the n_window size, which is maximum 256 in tx queues, and so, keep the injective function between the window wrapped hw pointers to tfd entry index in the sequence.
--- drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 12 ++++++++---- drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 11 ++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-)
drivers/net/wireless/intel/iwlwifi/pcie/internal.h +8 -4
@@ -660,7 +660,7 @@ static inline void iwl_enable_fw_load_in } } -static inline u8 iwl_pcie_get_cmd_index (struct iwl_txq *q,u32 index) +static inline u8 iwl_pcie_get_cmd_index (const struct iwl_txq *q,u32 index) {return index & (q->n_window -1 ); }
@@ -730,9 +730,13 @@ static inline void iwl_stop_queue(structstatic inline bool iwl_queue_used (const struct iwl_txq *q,int i) { -return q->write_ptr >= q->read_ptr ? - (i >= q->read_ptr && i < q->write_ptr) : - !(i < q->read_ptr && i >= q->write_ptr); +int index =iwl_pcie_get_cmd_index (q, i); +int r =iwl_pcie_get_cmd_index (q, q->read_ptr); +int w =iwl_pcie_get_cmd_index (q, q->write_ptr); + +return w >= r ? + (index >= r && index < w) : + !(index < r && index >= w); }static inline bool iwl_is_rfkill_set (struct iwl_trans *trans)
drivers/net/wireless/intel/iwlwifi/pcie/tx.c +8 -3
@@ -1225,9 +1225,13 @@ static void iwl_pcie_cmdq_reclaim(structstruct iwl_txq *txq = trans_pcie->txq[txq_id];unsigned long flags;int nfreed =0 ; +u16 r;lockdep_assert_held (&txq->lock); + idx =iwl_pcie_get_cmd_index (txq, idx); + r =iwl_pcie_get_cmd_index (txq, txq->read_ptr); +if ((idx >=TFD_QUEUE_SIZE_MAX ) || (!iwl_queue_used (txq, idx))) { IWL_ERR(trans, "%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n",
@@ -1236,12 +1240,13 @@ static void iwl_pcie_cmdq_reclaim(structreturn ; } -for (idx =iwl_queue_inc_wrap (idx); txq->read_ptr != idx; - txq->read_ptr =iwl_queue_inc_wrap (txq->read_ptr)) { +for (idx =iwl_queue_inc_wrap (idx); r != idx; + r =iwl_queue_inc_wrap (r)) { + txq->read_ptr =iwl_queue_inc_wrap (txq->read_ptr);if (nfreed++ >0 ) {IWL_ERR (trans,"HCMD skipped: index (%d) %d %d\n" , - idx, txq->write_ptr, txq->read_ptr); + idx, txq->write_ptr, r);iwl_force_nmi (trans); } }
Greg Kroah-Hartman
maintainerPATCH 27/235 gfs2: Special-case rindex for gfs2_grow
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Gruenbacher <[email protected]>
[ Upstream commit 776125785a87ff05d49938bd5b9f336f2a05bff6 ]
To speed up the common case of appending to a file, gfs2_write_alloc_required presumes that writing beyond the end of a file will always require additional blocks to be allocated. This assumption is incorrect for preallocates files, but there are no negative consequences as long as *some* space is still left on the filesystem.
One special file that always has some space preallocated beyond the end of the file is the rindex: when growing a filesystem, gfs2_grow adds one or more new resource groups and appends records describing those resource groups to the rindex; the preallocated space ensures that this is always possible.
However, when a filesystem is completely full, gfs2_write_alloc_required will indicate that an additional allocation is required, and appending the next record to the rindex will fail even though space for that record has already been preallocated. To fix that, skip the incorrect optimization in gfs2_write_alloc_required, but for the rindex only. Other writes to preallocated space beyond the end of the file are still allowed to fail on completely full filesystems.
--- fs/gfs2/bmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/gfs2/bmap.c +1 -1
@@ -2060,7 +2060,7 @@ int gfs2_write_alloc_required(struct gfs end_of_file = (i_size_read (&ip->i_inode) + sdp->sd_sb.sb_bsize -1 ) >> shift; lblock = offset >> shift; lblock_stop = (offset + len + sdp->sd_sb.sb_bsize -1 ) >> shift; -if (lblock_stop > end_of_file) +if (lblock_stop > end_of_file && ip !=GFS2_I (sdp->sd_rindex))return 1 ; size = (lblock_stop - lblock) << shift;
Greg Kroah-Hartman
maintainerPATCH 28/235 clk: imx6ul: fix missing of_node_put()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
[ Upstream commit 11177e7a7aaef95935592072985526ebf0a3df43 ]
of_find_compatible_node() is returning a device node with refcount incremented and must be explicitly decremented after the last use which is right after the us in of_iomap() here.
--- drivers/clk/imx/clk-imx6ul.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/imx/clk-imx6ul.c +1 -0
@@ -142,6 +142,7 @@ static void __init imx6ul_clocks_init(st np =of_find_compatible_node (NULL ,NULL ,"fsl,imx6ul-anatop" ); base =of_iomap (np,0 ); +of_node_put (np);WARN_ON (!base); clks[IMX6UL_PLL1_BYPASS_SRC ] =imx_clk_mux ("pll1_bypass_src" , base +0x00 ,14 ,1 , pll_bypass_src_sels,ARRAY_SIZE (pll_bypass_src_sels));
Greg Kroah-Hartman
maintainerPATCH 29/235 clk: imx6sll: fix missing of_node_put()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
[ Upstream commit 7f5eac5934d747535f9ffc997792a0a6eb289374 ]
of_find_compatible_node() is returning a device node with refcount incremented and must be explicitly decremented after the last use which is right after the us in of_iomap() here.
--- drivers/clk/imx/clk-imx6sll.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/imx/clk-imx6sll.c +1 -0
@@ -92,6 +92,7 @@ static void __init imx6sll_clocks_init(s np =of_find_compatible_node (NULL ,NULL ,"fsl,imx6sll-anatop" ); base =of_iomap (np,0 ); +of_node_put (np);WARN_ON (!base);/* Do not bypass PLLs initially */
Greg Kroah-Hartman
maintainerPATCH 30/235 clk: mvebu: armada-37xx-periph: Fix wrong return value in get_parent
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregory CLEMENT <[email protected]>
[ Upstream commit 616bf80d381da13fbb392ebff06f46f946e3ee84 ]
The return value of the get_parent operation is a u8, whereas a -EINVAL was returned. This wrong value was return if the value was bigger that the number of parent but this case was already handled by the core.
So we can just remove this chunk of code to fix the issue.
be used with DVFS")
--- drivers/clk/mvebu/armada-37xx-periph.c | 3 --- 1 file changed, 3 deletions(-)
drivers/clk/mvebu/armada-37xx-periph.c +0 -3
@@ -429,9 +429,6 @@ static u8 clk_pm_cpu_get_parent(struct c val &= pm_cpu->mask_mux; } -if (val >= num_parents) -return -EINVAL ; -return val; }
Greg Kroah-Hartman
maintainerPATCH 31/235 Input: pxrc - fix freeing URB on device teardown
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit 34dad2cf1104869ce2db2bddb34f8e6780c2ddaa ]
URB is the only resource that is not managed, and thus is destroyed too early, before we unregister input device and stop URB in pxrc_close(). To fix it let's install custom devm handler to free the URB at the right time in devm unwind sequence.
--- drivers/input/joystick/pxrc.c | 68 +++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 37 deletions(-)
drivers/input/joystick/pxrc.c +31 -37
@@ -120,48 +120,51 @@ static void pxrc_close(struct input_devmutex_unlock (&pxrc->pm_mutex); } +static void pxrc_free_urb (void *_pxrc) +{ +struct pxrc *pxrc = _pxrc; + +usb_free_urb (pxrc->urb); +} +static int pxrc_usb_init (struct pxrc *pxrc) {struct usb_endpoint_descriptor *epirq;unsigned int pipe; -int retval; +int error;/* Set up the endpoint information */ /* This device only has an interrupt endpoint */ - retval =usb_find_common_endpoints (pxrc->intf->cur_altsetting, -NULL ,NULL , &epirq,NULL ); -if (retval) { -dev_err (&pxrc->intf->dev, -"Could not find endpoint\n" ); - goto error; + error =usb_find_common_endpoints (pxrc->intf->cur_altsetting, +NULL ,NULL , &epirq,NULL ); +if (error) { +dev_err (&pxrc->intf->dev,"Could not find endpoint\n" ); +return error; } pxrc->bsize =usb_endpoint_maxp (epirq); pxrc->epaddr = epirq->bEndpointAddress; pxrc->data =devm_kmalloc (&pxrc->intf->dev, pxrc->bsize,GFP_KERNEL ); -if (!pxrc->data) { - retval = -ENOMEM ; - goto error; - } +if (!pxrc->data) +return -ENOMEM ;usb_set_intfdata (pxrc->intf, pxrc);usb_make_path (pxrc->udev, pxrc->phys,sizeof (pxrc->phys));strlcat (pxrc->phys,"/input0" ,sizeof (pxrc->phys)); pxrc->urb =usb_alloc_urb (0 ,GFP_KERNEL ); -if (!pxrc->urb) { - retval = -ENOMEM ; - goto error; - } +if (!pxrc->urb) +return -ENOMEM ; + + error =devm_add_action_or_reset (&pxrc->intf->dev, pxrc_free_urb, pxrc); +if (error) +return error; pipe =usb_rcvintpipe (pxrc->udev, pxrc->epaddr),usb_fill_int_urb (pxrc->urb, pxrc->udev, pipe, pxrc->data, pxrc->bsize, pxrc_usb_irq, pxrc,1 ); -error: -return retval; - - +return 0 ; }static int pxrc_input_init (struct pxrc *pxrc)
@@ -197,7 +200,7 @@ static int pxrc_probe(struct usb_interfa const struct usb_device_id *id) {struct pxrc *pxrc; -int retval; +int error; pxrc =devm_kzalloc (&intf->dev,sizeof (*pxrc),GFP_KERNEL );if (!pxrc)
@@ -207,29 +210,20 @@ static int pxrc_probe(struct usb_interfa pxrc->udev =usb_get_dev (interface_to_usbdev (intf)); pxrc->intf = intf; - retval =pxrc_usb_init (pxrc); -if (retval) - goto error; - - retval =pxrc_input_init (pxrc); -if (retval) - goto err_free_urb; + error =pxrc_usb_init (pxrc); +if (error) +return error; + + error =pxrc_input_init (pxrc); +if (error) +return error;return 0 ; - -err_free_urb: -usb_free_urb (pxrc->urb); - -error: -return retval; }static void pxrc_disconnect (struct usb_interface *intf) { -struct pxrc *pxrc =usb_get_intfdata (intf); - -usb_free_urb (pxrc->urb); -usb_set_intfdata (intf,NULL ); +/* All driver resources are devm-managed. */ }static int pxrc_suspend (struct usb_interface *intf,pm_message_t message)
Greg Kroah-Hartman
maintainerPATCH 32/235 clk: core: Potentially free connection id
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikko Perttunen <[email protected]>
[ Upstream commit 365f7a89c881e84f1ebc925f65f899d5d7ce547e ]
Patch "clk: core: Copy connection id" made it so that the connector id 'con_id' is kstrdup_const()ed to cater to drivers that pass non-constant connection ids. The patch added the corresponding kfree_const to __clk_free_clk(), but struct clk's can be freed also via __clk_put(). Add the kfree_const call to __clk_put() and add comments to both functions to remind that the logic in them should be kept in sync.
--- drivers/clk/clk.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/clk.c +3 -0
@@ -2933,6 +2933,7 @@ struct clk *__clk_create_clk(struct clk_return clk; } +/* keep in sync with __clk_put */ void __clk_free_clk (struct clk *clk) {clk_prepare_lock ();
@@ -3312,6 +3313,7 @@ int __clk_get(struct clk *clk)return 1 ; } +/* keep in sync with __clk_free_clk */ void __clk_put (struct clk *clk) {struct module *owner;
@@ -3345,6 +3347,7 @@ void __clk_put(struct clk *clk)module_put (owner); +kfree_const (clk->con_id);kfree (clk); }
Greg Kroah-Hartman
maintainerPATCH 33/235 clk: clk-fixed-factor: Clear OF_POPULATED flag in case of failure
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rajan Vaja <[email protected]>
[ Upstream commit f6dab4233d6b64d719109040503b567f71fbfa01 ]
Fixed factor clock has two initializations at of_clk_init() time and during platform driver probe. Before of_clk_init() call, node is marked as populated and so its probe never gets called.
During of_clk_init() fixed factor clock registration may fail if any of its parent clock is not registered. In this case, it doesn't get chance to retry registration from probe. Clear OF_POPULATED flag if fixed factor clock registration fails so that clock registration is attempted again from probe.
--- drivers/clk/clk-fixed-factor.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/clk/clk-fixed-factor.c +8 -1
@@ -177,8 +177,15 @@ static struct clk *_of_fixed_factor_clk_ clk =clk_register_fixed_factor (NULL , clk_name, parent_name, flags, mult, div); -if (IS_ERR (clk)) +if (IS_ERR (clk)) { +/* +* If parent clock is not registered, registration would fail. +* Clear OF_POPULATED flag so that clock registration can be +* attempted again from probe function. +*/ +of_node_clear_flag (node,OF_POPULATED );return clk; + } ret =of_clk_add_provider (node, of_clk_src_simple_get, clk);if (ret) {
Greg Kroah-Hartman
maintainerPATCH 34/235 kbuild: add .DELETE_ON_ERROR special target
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit 9c2af1c7377a8a6ef86e5cabf80978f3dbbb25c0 ]
If Make gets a fatal signal while a shell is executing, it may delete the target file that the recipe was supposed to update. This is needed to make sure that it is remade from scratch when Make is next run; if Make is interrupted after the recipe has begun to write the target file, it results in an incomplete file whose time stamp is newer than that of the prerequisites files. Make automatically deletes the incomplete file on interrupt unless the target is marked .PRECIOUS.
The situation is just the same as when the shell fails for some reasons. Usually when a recipe line fails, if it has changed the target file at all, the file is corrupted, or at least it is not completely updated. Yet the file’s time stamp says that it is now up to date, so the next time Make runs, it will not try to update that file.
However, Make does not cater to delete the incomplete target file in this case. We need to add .DELETE_ON_ERROR somewhere in the Makefile to request it.
scripts/Kbuild.include seems a suitable place to add it because it is included from almost all sub-makes.
Please note .DELETE_ON_ERROR is not effective for phony targets.
The external module building should never ever touch the kernel tree. The following recipe fails if include/generated/autoconf.h is missing. However, include/config/auto.conf is not deleted since it is a phony target.
PHONY += include/config/auto.conf
include/config/auto.conf:
$(Q)test -e include/generated/autoconf.h -a -e $@ || ( \
echo >&2; \
echo >&2 " ERROR: Kernel configuration is invalid."; \
echo >&2 " include/generated/autoconf.h or $@ are missing.";\
echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo >&2 ; \
/bin/false)--- scripts/Kbuild.include | 3 +++ 1 file changed, 3 insertions(+)
scripts/Kbuild.include +3 -0
@@ -400,3 +400,6 @@ endif endef # ############################################################################### + +# delete partially updated (i.e. corrupted) files on error +.DELETE_ON_ERROR:
Greg Kroah-Hartman
maintainerPATCH 35/235 kbuild: do not update config when running install targets
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit d79424137a7312d381d131d707a462440c0e8df9 ]
"make syncconfig" is automatically invoked when any of the following happens:
- .config is updated
- any of Kconfig files is updated
- any of environment variables referenced in Kconfig is changed
Then, it updates configuration files such as include/config/auto.conf include/generated/autoconf.h, etc.
Even install targets (install, modules_install, etc.) are no exception. However, they should never ever modify the source tree. Install targets are often run with root privileges. Once those configuration files are owned by root, "make mrproper" would end up with permission error.
Install targets should just copy things blindly. They should not care whether the configuration is up-to-date or not. This makes more sense because we are interested in the configuration that was used in the previous kernel building.
This issue has existed since before, but rarely happened. I expect more chance where people are hit by this; with the new Kconfig syntax extension, the .config now contains the compiler information. If you cross-compile the kernel with CROSS_COMPILE, but forget to pass it for "make install", you meet "any of environment variables referenced in Kconfig is changed" because $(CC) is referenced in Kconfig. Another scenario is the compiler upgrade before the installation.
Install targets need the configuration. "make modules_install" refer to CONFIG_MODULES etc. "make dtbs_install" also needs CONFIG_ARCH_* to decide which dtb files to install. However, the auto-update of the configuration files should be avoided. We already do this for external modules.
Now, Make targets are categorized into 3 groups:
[1] Do not need the kernel configuration at all
help, coccicheck, headers_install etc.
[2] Need the latest kernel configuration
If new config options are added, Kconfig will show prompt to ask user's selection.
Build targets such as vmlinux, in-kernel modules are the cases.
[3] Need the kernel configuration, but do not want to update it
Install targets except headers_install, and external modules are the cases.
--- Makefile | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-)
Makefile +20 -7
@@ -225,10 +225,12 @@ no-dot-config-targets := $(clean-targets cscope gtags TAGS tags help% %docs check% coccicheck \ $(version_h) headers_% archheaders archscripts \ kernelversion %src-pkg +no-sync-config-targets := $(no-dot-config-targets) install %install -config-targets := 0 -mixed-targets := 0 -dot-config := 1 +config-targets := 0 +mixed-targets := 0 +dot-config := 1 +may-sync-config := 1 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
@@ -236,6 +238,16 @@ ifneq ($(filter $(no-dot-config-targets) endif endif +ifneq ($(filter $(no-sync-config-targets), $(MAKECMDGOALS)),) + ifeq ($(filter-out $(no-sync-config-targets), $(MAKECMDGOALS)),) + may-sync-config := 0 + endif +endif + +ifneq ($(KBUILD_EXTMOD),) + may-sync-config := 0 +endif + ifeq ($(KBUILD_EXTMOD),) ifneq ($(filter config %config,$(MAKECMDGOALS)),) config-targets := 1
@@ -610,7 +622,7 @@ ARCH_CFLAGS := include arch/$(SRCARCH)/Makefile ifeq ($(dot-config),1) -ifeq ($(KBUILD_EXTMOD),) +ifeq ($(may-sync-config),1) # Read in dependencies to all Kconfig* files, make sure to run syncconfig if # changes are detected. This should be included after arch/$(SRCARCH)/Makefile # because some architectures define CROSS_COMPILE there.
@@ -625,8 +637,9 @@ $(KCONFIG_CONFIG) include/config/auto.co include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig else -# external modules needs include/generated/autoconf.h and include/config/auto.conf -# but do not care if they are up-to-date. Use auto.conf to trigger the test +# External modules and some install targets need include/generated/autoconf.h +# and include/config/auto.conf but do not care if they are up-to-date. +# Use auto.conf to trigger the test PHONY += include/config/auto.conf include/config/auto.conf:
@@ -638,7 +651,7 @@ include/config/auto.conf: echo >&2 ; \ /bin/false) -endif # KBUILD_EXTMOD +endif # may-sync-config else # Dummy target needed, because used as prerequisite
Greg Kroah-Hartman
maintainerPATCH 36/235 media: tw686x: Fix oops on buffer alloc failure
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Ha?asa <[email protected]>
[ Upstream commit 5a1a2f63d840dc2631505b607e11ff65ac1b7d3c ]
The error path currently calls tw686x_video_free() which requires vc->dev to be initialized, causing a NULL dereference on uninitizalized channels.
Fix this by setting the vc->dev fields for all the channels first.
--- drivers/media/pci/tw686x/tw686x-video.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/media/pci/tw686x/tw686x-video.c +8 -3
@@ -1190,6 +1190,14 @@ int tw686x_video_init(struct tw686x_devreturn err; } +/* Initialize vc->dev and vc->ch for the error path */ +for (ch =0 ; ch <max_channels (dev); ch++) { +struct tw686x_video_channel *vc = &dev->video_channels[ch]; + + vc->dev = dev; + vc->ch = ch; + } +for (ch =0 ; ch <max_channels (dev); ch++) {struct tw686x_video_channel *vc = &dev->video_channels[ch];struct video_device *vdev;
@@ -1198,9 +1206,6 @@ int tw686x_video_init(struct tw686x_devspin_lock_init (&vc->qlock);INIT_LIST_HEAD (&vc->vidq_queued); - vc->dev = dev; - vc->ch = ch; -/* default settings */ err =tw686x_set_standard (vc,V4L2_STD_NTSC );if (err)
Greg Kroah-Hartman
maintainerPATCH 37/235 dmaengine: pl330: fix irq race with terminate_all
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Keeping <[email protected]>
[ Upstream commit e49756544a21f5625b379b3871d27d8500764670 ]
In pl330_update() when checking if a channel has been aborted, the channel's lock is not taken, only the overall pl330_dmac lock. But in pl330_terminate_all() the aborted flag (req_running==-1) is set under the channel lock and not the pl330_dmac lock.
With threaded interrupts, this leads to a potential race:
pl330_terminate_all pl330_update
------------------- ------------
lock channel
entry
lock pl330
_stop channel
unlock pl330
lock pl330
check req_running != -1
req_running = -1
_start channel--- drivers/dma/pl330.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/dma/pl330.c +3 -2
@@ -2257,13 +2257,14 @@ static int pl330_terminate_all(struct dmpm_runtime_get_sync (pl330->ddma.dev);spin_lock_irqsave (&pch->lock, flags); +spin_lock (&pl330->lock);_stop (pch->thread); -spin_unlock (&pl330->lock); - pch->thread->req[0 ].desc =NULL ; pch->thread->req[1 ].desc =NULL ; pch->thread->req_running =-1 ; +spin_unlock (&pl330->lock); + power_down = pch->active; pch->active = false;
Greg Kroah-Hartman
maintainerPATCH 38/235 MIPS: ath79: fix system restart
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
[ Upstream commit f8a7bfe1cb2c1ebfa07775c9c8ac0ad3ba8e5ff5 ]
This patch disables irq on reboot to fix hang issues that were observed due to pending interrupts.
Patchwork: https://patchwork.linux-mips.org/patch/19913/
--- arch/mips/ath79/setup.c | 1 + arch/mips/include/asm/mach-ath79/ath79.h | 1 + 2 files changed, 2 insertions(+)
arch/mips/ath79/setup.c +1 -0
@@ -40,6 +40,7 @@ static char ath79_sys_type[ATH79_SYS_TYPstatic void ath79_restart (char *command) { +local_irq_disable ();ath79_device_reset_set (AR71XX_RESET_FULL_CHIP );for (;;)if (cpu_wait)
arch/mips/include/asm/mach-ath79/ath79.h +1 -0
@@ -134,6 +134,7 @@ static inline u32 ath79_pll_rr(unsignedstatic inline void ath79_reset_wr (unsigned reg,u32 val) {__raw_writel (val, ath79_reset_base + reg); + (void )__raw_readl (ath79_reset_base + reg);/* flush */ }static inline u32 ath79_reset_rr (unsigned reg)
Greg Kroah-Hartman
maintainerPATCH 39/235 media: videobuf2-core: check for q->error in vb2_core_qbuf()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
[ Upstream commit b509d733d337417bcb7fa4a35be3b9a49332b724 ]
The vb2_core_qbuf() function didn't check if q->error was set. It is checked in __buf_prepare(), but that function isn't called if the buffer was already prepared before with VIDIOC_PREPARE_BUF.
So check it at the start of vb2_core_qbuf() as well.
--- drivers/media/common/videobuf2/videobuf2-core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/media/common/videobuf2/videobuf2-core.c +5 -0
@@ -1377,6 +1377,11 @@ int vb2_core_qbuf(struct vb2_queue *q, ustruct vb2_buffer *vb;int ret; +if (q->error) { +dprintk (1 ,"fatal error occurred on queue\n" ); +return -EIO ; + } + vb = q->bufs[index];switch (vb->state) {
Greg Kroah-Hartman
maintainerPATCH 40/235 IB/rxe: Drop QP0 silently
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhu Yanjun <[email protected]>
[ Upstream commit 536ca245c512aedfd84cde072d7b3ca14b6e1792 ]
According to "Annex A16: RDMA over Converged Ethernet (RoCE)":
A16.4.3 MANAGEMENT INTERFACES
As defined in the base specification, a special Queue Pair, QP0 is defined solely for communication between subnet manager(s) and subnet management agents. Since such an IB-defined subnet management architecture is outside the scope of this annex, it follows that there is also no requirement that a port which conforms to this annex be associated with a QP0. Thus, for end nodes designed to conform to this annex, the concept of QP0 is undefined and unused for any port connected to an Ethernet network.
CA16-8: A packet arriving at a RoCE port containing a BTH with the destination QP field set to QP0 shall be silently dropped.
--- drivers/infiniband/sw/rxe/rxe_recv.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/infiniband/sw/rxe/rxe_recv.c +7 -2
@@ -225,9 +225,14 @@ static int hdr_check(struct rxe_pkt_info goto err1; } +if (unlikely (qpn ==0 )) { +pr_warn_once ("QP 0 not supported" ); + goto err1; + } +if (qpn !=IB_MULTICAST_QPN ) { - index = (qpn ==0 ) ? port->qp_smi_index : - ((qpn ==1 ) ? port->qp_gsi_index : qpn); + index = (qpn ==1 ) ? port->qp_gsi_index : qpn; + qp =rxe_pool_get_index (&rxe->qp_pool, index);if (unlikely (!qp)) {pr_warn_ratelimited ("no qp matches qpn 0x%x\n" , qpn);
Greg Kroah-Hartman
maintainerPATCH 41/235 block: allow max_discard_segments to be stacked
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
[ Upstream commit 42c9cdfe1e11e083dceb0f0c4977b758cf7403b9 ]
Set max_discard_segments to USHRT_MAX in blk_set_stacking_limits() so that blk_stack_limits() can stack up this limit for stacked devices.
before:
$ cat /sys/block/nvme0n1/queue/max_discard_segments 256 $ cat /sys/block/dm-0/queue/max_discard_segments 1
after:
$ cat /sys/block/nvme0n1/queue/max_discard_segments 256 $ cat /sys/block/dm-0/queue/max_discard_segments 256
--- block/blk-settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-settings.c +1 -1
@@ -128,7 +128,7 @@ void blk_set_stacking_limits(struct queu/* Inherit limits from component devices */ lim->max_segments =USHRT_MAX ; - lim->max_discard_segments =1 ; + lim->max_discard_segments =USHRT_MAX ; lim->max_hw_sectors =UINT_MAX ; lim->max_segment_size =UINT_MAX ; lim->max_sectors =UINT_MAX ;
Greg Kroah-Hartman
maintainerPATCH 42/235 IB/ipoib: Fix error return code in ipoib_dev_init()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
[ Upstream commit 99a7e2bf704d64c966dfacede1ba2d9b47cb676e ]
Fix to return a negative error code from the ipoib_neigh_hash_init() error handling case instead of 0, as done elsewhere in this function.
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/ipoib/ipoib_main.c +2 -1
@@ -1787,7 +1787,8 @@ int ipoib_dev_init(struct net_device *de goto out_free_pd; } -if (ipoib_neigh_hash_init (priv) <0 ) { + ret =ipoib_neigh_hash_init (priv); +if (ret) {pr_warn ("%s failed to init neigh hash\n" , dev->name); goto out_dev_uninit; }
Greg Kroah-Hartman
maintainerPATCH 43/235 mtd/maps: fix solutionengine.c printk format warnings
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 1d25e3eeed1d987404e2d2e451eebac8c15cecc1 ]
Fix 2 printk format warnings (this driver is currently only used by arch/sh/) by using "%pap" instead of "%lx".
Fixes these build warnings:
../drivers/mtd/maps/solutionengine.c: In function 'init_soleng_maps':../include/linux/kern_levels.h:5:18: warning: format '%lx' expects argument of type 'long unsigned int', but argument 2 has type 'resource_size_t' {aka 'unsigned int'} [-Wformat=] ../drivers/mtd/maps/solutionengine.c:62:54: note: format string is defined here
printk(KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lx\n",
~~~~^
%08x
../include/linux/kern_levels.h:5:18: warning: format '%lx' expects argument of type 'long unsigned int', but argument 3 has type 'resource_size_t' {aka 'unsigned int'} [-Wformat=]
../drivers/mtd/maps/solutionengine.c:62:72: note: format string is defined here
printk(KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lx\n",
~~~~^
%08x--- drivers/mtd/maps/solutionengine.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mtd/maps/solutionengine.c +3 -3
@@ -59,9 +59,9 @@ static int __init init_soleng_maps(void)return -ENXIO ; } } -printk (KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lx\n" , - soleng_flash_map.phys &0x1fffffff , - soleng_eprom_map.phys &0x1fffffff ); +printk (KERN_NOTICE "Solution Engine: Flash at 0x%pap, EPROM at 0x%pap\n" , + &soleng_flash_map.phys, + &soleng_eprom_map.phys); flash_mtd->owner =THIS_MODULE ; eprom_mtd =do_map_probe ("map_rom" , &soleng_eprom_map);
Greg Kroah-Hartman
maintainerPATCH 44/235 media: ov5645: Supported external clock is 24MHz
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Todor Tomov <[email protected]>
[ Upstream commit 4adb0a0432f489c5eb802b33dae7737f69e6fd7a ]
The external clock frequency was set to 23.88MHz by mistake because of a platform which cannot get closer to 24MHz. The supported by the driver external clock is 24MHz so set it correctly and also fix the values of the pixel clock and link clock.
However allow 1% tolerance to the external clock as this difference is small enough to be insignificant.
--- drivers/media/i2c/ov5645.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/media/i2c/ov5645.c +7 -6
@@ -510,8 +510,8 @@ static const struct reg_value ov5645_set };static const s64 link_freq[] = { -222880000 , -334320000 +224000000 , +336000000 };static const struct ov5645_mode_info ov5645_mode_info_data[] = {
@@ -520,7 +520,7 @@ static const struct ov5645_mode_info ov5 .height = 960, .data = ov5645_setting_sxga, .data_size = ARRAY_SIZE(ov5645_setting_sxga), - .pixel_clock = 111440000, + .pixel_clock = 112000000, .link_freq =0 /* an index in link_freq[] */ }, {
@@ -528,7 +528,7 @@ static const struct ov5645_mode_info ov5 .height = 1080, .data = ov5645_setting_1080p, .data_size = ARRAY_SIZE(ov5645_setting_1080p), - .pixel_clock = 167160000, + .pixel_clock = 168000000, .link_freq =1 /* an index in link_freq[] */ }, {
@@ -536,7 +536,7 @@ static const struct ov5645_mode_info ov5 .height = 1944, .data = ov5645_setting_full, .data_size = ARRAY_SIZE(ov5645_setting_full), - .pixel_clock = 167160000, + .pixel_clock = 168000000, .link_freq =1 /* an index in link_freq[] */ }, };
@@ -1145,7 +1145,8 @@ static int ov5645_probe(struct i2c_clienreturn ret; } -if (xclk_freq !=23880000 ) { +/* external clock must be 24MHz, allow 1% tolerance */ +if (xclk_freq <23760000 || xclk_freq >24240000 ) {dev_err (dev,"external clock frequency %u is not supported\n" , xclk_freq);return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 45/235 perf test: Fix subtest number when showing results
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Richter <[email protected]>
[ Upstream commit 9ef0112442bdddef5fb55adf20b3a5464b33de75 ]
Perf test 40 for example has several subtests numbered 1-4 when displaying the start of the subtest. When the subtest results are displayed the subtests are numbered 0-3.
Use this command to generate trace output:
[root@s35lp76 perf]# ./perf test -Fv 40 2>/tmp/bpf1
Fix this by adjusting the subtest number when show the subtest result.
Output before:
[root@s35lp76 perf]# egrep '(^40\.[0-4]| subtest [0-4]:)' /tmp/bpf1
40.1: Basic BPF filtering :
BPF filter subtest 0: Ok
40.2: BPF pinning :
BPF filter subtest 1: Ok
40.3: BPF prologue generation :
BPF filter subtest 2: Ok
40.4: BPF relocation checker :
BPF filter subtest 3: Ok
[root@s35lp76 perf]#
Output after:
root@s35lp76 ~]# egrep '(^40\.[0-4]| subtest [0-4]:)' /tmp/bpf1
40.1: Basic BPF filtering :
BPF filter subtest 1: Ok
40.2: BPF pinning :
BPF filter subtest 2: Ok
40.3: BPF prologue generation :
BPF filter subtest 3: Ok
40.4: BPF relocation checker :
BPF filter subtest 4: Ok
[root@s35lp76 ~]#
--- tools/perf/tests/builtin-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/builtin-test.c +1 -1
@@ -599,7 +599,7 @@ static int __cmd_test(int argc, const chfor (subi =0 ; subi < subn; subi++) {pr_info ("%2d.%1d: %-*s:" , i, subi +1 , subw, t->subtest.get_desc (subi)); - err =test_and_print (t, skip, subi); + err =test_and_print (t, skip, subi +1 );if (err !=TEST_OK && t->subtest.skip_if_fail) skip = true; }
Greg Kroah-Hartman
maintainerPATCH 46/235 gfs2: Dont reject a supposedly full bitmap if we have blocks reserved
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bob Peterson <[email protected]>
[ Upstream commit e79e0e1428188b24c3b57309ffa54a33c4ae40c4 ]
Before this patch, you could get into situations like this:
1. Process 1 searches for X free blocks, finds them, makes a reservation
2. Process 2 searches for free blocks in the same rgrp, but now the bitmap is full because process 1's reservation is skipped over. So it marks the bitmap as GBF_FULL.
3. Process 1 tries to allocate blocks from its own reservation, but since the GBF_FULL bit is set, it skips over the rgrp and searches elsewhere, thus not using its own reservation.
This patch adds an additional check to allow processes to use their own reservations.
--- fs/gfs2/rgrp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/gfs2/rgrp.c +2 -1
@@ -1686,7 +1686,8 @@ static int gfs2_rbm_find(struct gfs2_rbmwhile (1 ) { bi =rbm_bi (rbm); -if (test_bit (GBF_FULL , &bi->bi_flags) && +if ((ip ==NULL || !gfs2_rs_active (&ip->i_res)) && +test_bit (GBF_FULL , &bi->bi_flags) && (state ==GFS2_BLKST_FREE )) goto next_bitmap;
Greg Kroah-Hartman
maintainerPATCH 47/235 perf tools: Synthesize GROUP_DESC feature in pipe mode
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit e8fedff1cc729fd227924305152ccc6f580e8c83 ]
Stephan reported, that pipe mode does not carry the group information and thus the piped report won't display the grouped output for following command:
# perf record -e '{cycles,instructions,branches}' -a sleep 4 | perf reportIt has no idea about the group setup, so it will display events separately:
# Overhead Command Shared Object ...
# ........ ............... .......................
#
6.71% swapper [kernel.kallsyms]
2.28% offlineimap libpython2.7.so.1.0
0.78% perf [kernel.kallsyms]...
Fix GROUP_DESC feature record to be synthesized in pipe mode, so the report output is grouped if there are groups defined in record:
# Overhead Command Shared ...
# ........................ ............... .......
#
7.57% 0.16% 0.30% swapper [kernel
1.87% 3.15% 2.46% offlineimap libpyth
1.33% 0.00% 0.00% perf [kernel...
--- tools/perf/util/header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/header.c +1 -1
@@ -2587,7 +2587,7 @@ static const struct feature_ops feat_opsFEAT_OPR (NUMA_TOPOLOGY , numa_topology, true),FEAT_OPN (BRANCH_STACK , branch_stack, false),FEAT_OPR (PMU_MAPPINGS , pmu_mappings, false), -FEAT_OPN (GROUP_DESC , group_desc, false), +FEAT_OPR (GROUP_DESC , group_desc, false),FEAT_OPN (AUXTRACE , auxtrace, false),FEAT_OPN (STAT , stat, false), FEAT_OPN(CACHE, cache, true),
Greg Kroah-Hartman
maintainerPATCH 48/235 perf tests: Fix record+probe_libc_inet_pton.sh for powerpc64
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit 3eae52f842329a95f8549124079518231c0daba8 ]
For powerpc64, this test currently fails due to a mismatch in the expected output.
This can be observed on a powerpc64le system running Fedora 27 as shown below.
# perf test -v "probe libc's inet_pton & backtrace it with ping"
Before:
62: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 23948
ping 23965 [003] 71136.075084: probe_libc:inet_pton: (7fff996aaf28)
7fff996aaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
7fff9965fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
FAIL: expected backtrace entry 2 "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\(/usr/lib64/libc-2.26.so\)$" got "7fff9965fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)" test child finished with -1
---- end ----
probe libc's inet_pton & backtrace it with ping: FAILED!
After:
62: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 24638
ping 24655 [001] 71208.525396: probe_libc:inet_pton: (7fffa245af28) 7fffa245af28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so) 7fffa240fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so) 7fffa24105b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so) 138d52d70 main+0x3e0 (/usr/bin/ping)
test child finished with 0
---- end ----
probe libc's inet_pton & backtrace it with ping: Ok
--- tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/tests/shell/record+probe_libc_inet_pton.sh +6 -0
@@ -26,6 +26,12 @@ trace_libc_inet_pton_backtrace() { echo "(__GI_)?getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected echo "main\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected ;; + ppc64|ppc64le) + eventattr='max-stack=4' + echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected + echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected + echo ".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected + ;; *) eventattr='max-stack=3' echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
Greg Kroah-Hartman
maintainerPATCH 49/235 perf tests: Fix record+probe_libc_inet_pton.sh when event exists
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit 60089e42d38438772e2f83334e3e5b7497009366 ]
If the event 'probe_libc:inet_pton' already exists, this test fails and deletes the existing event before exiting. This will then pass for any subsequent executions.
Instead of skipping to deleting the existing event because of failing to add a new event, a duplicate event is now created and the script continues with the usual checks. Only the new duplicate event that is created at the beginning of the test is deleted as a part of the cleanups in the end. All existing events remain as it is.
This can be observed on a powerpc64 system running Fedora 27 as shown below.
# perf probe -x /usr/lib64/power8/libc-2.26.so -a inet_pton
Added new event:
probe_libc:inet_pton (on inet_pton in /usr/lib64/power8/libc-2.26.so)
Before:
# perf test -v "probe libc's inet_pton & backtrace it with ping"
62: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 21302
test child finished with -1
---- end ----
probe libc's inet_pton & backtrace it with ping: FAILED!
# perf probe --list
After:
# perf test -v "probe libc's inet_pton & backtrace it with ping"
62: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 21490
ping 21513 [035] 39357.565561: probe_libc:inet_pton_1: (7fffa4c623b0) 7fffa4c623b0 __GI___inet_pton+0x0 (/usr/lib64/power8/libc-2.26.so) 7fffa4c190dc gaih_inet.constprop.7+0xf4c (/usr/lib64/power8/libc-2.26.so) 7fffa4c19c4c getaddrinfo+0x15c (/usr/lib64/power8/libc-2.26.so) 111d93c20 main+0x3e0 (/usr/bin/ping)
test child finished with 0
---- end ----
probe libc's inet_pton & backtrace it with ping: Ok
# perf probe --list
probe_libc:inet_pton (on __inet_pton@resolv/inet_pton.c in /usr/lib64/power8/libc-2.26.so)
--- tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 28 +++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-)
tools/perf/tests/shell/record+probe_libc_inet_pton.sh +24 -4
@@ -13,11 +13,24 @@ libc=$(grep -w libc /proc/self/maps | head -1 | sed -r 's/.*[[:space:]](\/.*)/\1/g') nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254 +event_pattern='probe_libc:inet_pton(\_[[:digit:]]+)?' + +add_libc_inet_pton_event() { + + event_name=$(perf probe -f -x $libc -a inet_pton 2>&1 | tail -n +2 | head -n -5 | \ + grep -P -o "$event_pattern(?=[[:space:]]\(on inet_pton in $libc\))") + + if [ $? -ne 0 -o -z "$event_name" ] ; then + printf "FAIL: could not add event\n" + return 1 + fi +} + trace_libc_inet_pton_backtrace() { expected=`mktemp -u /tmp/expected.XXX` - echo "ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)" > $expected + echo "ping[][0-9 \.:]+$event_name: \([[:xdigit:]]+\)" > $expected echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected case "$(uname -m)" in s390x)
@@ -41,7 +54,7 @@ trace_libc_inet_pton_backtrace() { perf_data=`mktemp -u /tmp/perf.data.XXX` perf_script=`mktemp -u /tmp/perf.script.XXX` - perf record -e probe_libc:inet_pton/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1 + perf record -e $event_name/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1 perf script -i $perf_data > $perf_script exec 3<$perf_script
@@ -62,13 +75,20 @@ trace_libc_inet_pton_backtrace() { # even if the perf script output does not match. } +delete_libc_inet_pton_event() { + + if [ -n "$event_name" ] ; then + perf probe -q -d $event_name + fi +} + # Check for IPv6 interface existence ip a sh lo | fgrep -q inet6 || exit 2 skip_if_no_perf_probe && \ -perf probe -q $libc inet_pton && \ +add_libc_inet_pton_event && \ trace_libc_inet_pton_backtrace err=$? rm -f ${perf_data} ${perf_script} ${expected} -perf probe -q -d probe_libc:inet_pton +delete_libc_inet_pton_event exit $err
Greg Kroah-Hartman
maintainerPATCH 50/235 perf tests: Fix record+probe_libc_inet_pton.sh to ensure cleanups
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit 83e3b6d73e66a10088f362b08b99c36fec3a14e7 ]
If there is a mismatch in the perf script output, this test fails and exits before the event and temporary files created during its execution are cleaned up.
This can be observed on a powerpc64 system running Fedora 27 as shown below.
# perf test -v "probe libc's inet_pton & backtrace it with ping"
62: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 18655
ping 18674 [013] 24511.496995: probe_libc:inet_pton: (7fffa6b423b0)
7fffa6b423b0 __GI___inet_pton+0x0 (/usr/lib64/power8/libc-2.26.so)
7fffa6af90dc gaih_inet.constprop.7+0xf4c (/usr/lib64/power8/libc-2.26.so)
FAIL: expected backtrace entry "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\(/usr/lib64/power8/libc-2.26.so\)$" got "7fffa6af90dc gaih_inet.constprop.7+0xf4c (/usr/lib64/power8/libc-2.26.so)" test child finished with -1
---- end ----
probe libc's inet_pton & backtrace it with ping: FAILED!
# ls /tmp/expected.* /tmp/perf.data.* /tmp/perf.script.*
/tmp/expected.u31 /tmp/perf.data.Pki /tmp/perf.script.Bhs
# perf probe --list
probe_libc:inet_pton (on __inet_pton@resolv/inet_pton.c in /usr/lib64/power8/libc-2.26.so)
Cleanup of the event and the temporary files are now ensured by allowing the cleanup code to be executed even if the lines from the backtrace do not match their expected patterns instead of simply exiting from the point of failure.
--- tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/shell/record+probe_libc_inet_pton.sh +1 -1
@@ -65,7 +65,7 @@ trace_libc_inet_pton_backtrace() { echo "$line" | egrep -q "$pattern" if [ $? -ne 0 ] ; then printf "FAIL: expected backtrace entry \"%s\" got \"%s\"\n" "$pattern" "$line" - exit 1 + return 1 fi done
Greg Kroah-Hartman
maintainerPATCH 51/235 fbdev: omapfb: off by one in omapfb_register_client()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 5ec1ec35b2979b59d0b33381e7c9aac17e159d16 ]
The omapfb_register_client[] array has OMAPFB_PLANE_NUM elements so the
Quoted 1 line
should be >= or we are one element beyond the end of the array.
--- drivers/video/fbdev/omap/omapfb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/omap/omapfb_main.c +1 -1
@@ -958,7 +958,7 @@ int omapfb_register_client(struct omapfb {int r; -if ((unsigned )omapfb_nb->plane_idx >OMAPFB_PLANE_NUM ) +if ((unsigned )omapfb_nb->plane_idx >=OMAPFB_PLANE_NUM )return -EINVAL ;if (!notifier_inited) {
Greg Kroah-Hartman
maintainerPATCH 52/235 perf tools: Fix struct comm_str removal crash
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 46b3722cc7765582354488da633aafffcb138458 ]
We occasionaly hit following assert failure in 'perf top', when processing the /proc info in multiple threads.
perf: ...include/linux/refcount.h:109: refcount_inc:
Assertion `!(!refcount_inc_not_zero(r))' failed.
The gdb backtrace looks like this:
[Switching to Thread 0x7ffff11ba700 (LWP 13749)] 0x00007ffff50839fb in raise () from /lib64/libc.so.6 (gdb)
#0 0x00007ffff50839fb in raise () from /lib64/libc.so.6
#1 0x00007ffff5085800 in abort () from /lib64/libc.so.6
#2 0x00007ffff507c0da in __assert_fail_base () from /lib64/libc.so.6
#3 0x00007ffff507c152 in __assert_fail () from /lib64/libc.so.6
#4 0x0000000000535373 in refcount_inc (r=0x7fffdc009be0)
at ...include/linux/refcount.h:109
#5 0x00000000005354f1 in comm_str__get (cs=0x7fffdc009bc0)
at util/comm.c:24
#6 0x00000000005356bd in __comm_str__findnew (str=0x7fffd000b260 ":2",
root=0xbed5c0 <comm_str_root>) at util/comm.c:72
#7 0x000000000053579e in comm_str__findnew (str=0x7fffd000b260 ":2",
root=0xbed5c0 <comm_str_root>) at util/comm.c:95
#8 0x000000000053582e in comm__new (str=0x7fffd000b260 ":2",
timestamp=0, exec=false) at util/comm.c:111
#9 0x00000000005363bc in thread__new (pid=2, tid=2) at util/thread.c:57
#10 0x0000000000523da0 in ____machine__findnew_thread (machine=0xbfde38,
threads=0xbfdf28, pid=2, tid=2, create=true) at util/machine.c:457
#11 0x0000000000523eb4 in __machine__findnew_thread (machine=0xbfde38,
...The failing assertion is this one:
REFCOUNT_WARN(!refcount_inc_not_zero(r), ...
The problem is that we keep global comm_str_root list, which is accessed by multiple threads during the 'perf top' startup and following 2 paths can race:
thread 1:
...
thread__new
comm__new
comm_str__findnew
down_write(&comm_str_lock);
__comm_str__findnew
comm_str__get
thread 2:
...
comm__override or comm__free
comm_str__put
refcount_dec_and_test
down_write(&comm_str_lock);
rb_erase(&cs->rb_node, &comm_str_root);Because thread 2 first decrements the refcnt and only after then it removes the struct comm_str from the list, the thread 1 can find this object on the list with refcnt equls to 0 and hit the assert.
This patch fixes the thread 1 __comm_str__findnew path, by ignoring objects that already dropped the refcnt to 0. For the rest of the objects we take the refcnt before comparing its name and release it afterwards with comm_str__put, which can also release the object completely.
--- tools/perf/util/comm.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
tools/perf/util/comm.c +11 -5
@@ -20,9 +20,10 @@ static struct rw_semaphore comm_str_lockstatic struct comm_str *comm_str__get (struct comm_str *cs) { -if (cs) -refcount_inc (&cs->refcnt); -return cs; +if (cs &&refcount_inc_not_zero (&cs->refcnt)) +return cs; + +return NULL ; }static void comm_str__put (struct comm_str *cs)
@@ -67,9 +68,14 @@ struct comm_str *__comm_str__findnew(con parent = *p; iter = rb_entry(parent, struct comm_str, rb_node); +/* +* If we race with comm_str__put, iter->refcnt is 0 +* and it will be removed within comm_str__put call +* shortly, ignore it in this search. +*/ cmp =strcmp (str, iter->str); -if (!cmp) -return comm_str__get (iter); +if (!cmp &&comm_str__get (iter)) +return iter;if (cmp <0 ) p = &(*p)->rb_left;
Greg Kroah-Hartman
maintainerPATCH 53/235 video: goldfishfb: fix memory leak on driver remove
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Vasilyev <[email protected]>
[ Upstream commit 5958fde72d04e7b8c6de3669d1f794a90997e3eb ]
goldfish_fb_probe() allocates memory for fb, but goldfish_fb_remove() does not have deallocation of fb, which leads to memory leak on probe/remove.
The patch adds deallocation into goldfish_fb_remove().
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/video/fbdev/goldfishfb.c | 1 + 1 file changed, 1 insertion(+)
drivers/video/fbdev/goldfishfb.c +1 -0
@@ -301,6 +301,7 @@ static int goldfish_fb_remove(struct pladma_free_coherent (&pdev->dev, framesize, (void *)fb->fb.screen_base, fb->fb.fix.smem_start);iounmap (fb->reg_base); +kfree (fb);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 54/235 fbdev/via: fix defined but not used warning
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit b6566b47a67e07fdca44cf51abb14e2fbe17d3eb ]
Fix a build warning in viafbdev.c when CONFIG_PROC_FS is not enabled by marking the unused function as __maybe_unused.
../drivers/video/fbdev/via/viafbdev.c:1471:12: warning: 'viafb_sup_odev_proc_show' defined but not used [-Wunused-function]
--- drivers/video/fbdev/via/viafbdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/fbdev/via/viafbdev.c +2 -1
@@ -19,6 +19,7 @@* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <linux/compiler.h> #include <linux/module.h> #include <linux/seq_file.h> #include <linux/slab.h>
@@ -1468,7 +1469,7 @@ static const struct file_operations viaf#endif /* CONFIG_FB_VIA_DIRECT_PROCFS */ -static int viafb_sup_odev_proc_show (struct seq_file *m,void *v) +static int __maybe_unused viafb_sup_odev_proc_show (struct seq_file *m,void *v) {via_odev_to_seq (m, supported_odev_map[ viaparinfo->shared->chip_info.gfx_chip_name]);
Greg Kroah-Hartman
maintainerPATCH 55/235 perf powerpc: Fix callchain ip filtering when return address is in a register
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit 9068533e4f470daf2b0f29c71d865990acd8826e ]
For powerpc64, perf will filter out the second entry in the callchain, i.e. the LR value, if the return address of the function corresponding to the probed location has already been saved on its caller's stack.
The state of the return address is determined using debug information. At any point within a function, if the return address is already saved somewhere, a DWARF expression can tell us about its location. If the return address in still in LR only, no DWARF expression would exist.
Typically, the instructions in a function's prologue first copy the LR value to R0 and then pushes R0 on to the stack. If LR has already been copied to R0 but R0 is yet to be pushed to the stack, we can still get a DWARF expression that says that the return address is in R0. This is indicating that getting a DWARF expression for the return address does not guarantee the fact that it has already been saved on the stack.
This can be observed on a powerpc64le system running Fedora 27 as shown below.
# objdump -d /usr/lib64/libc-2.26.so | less
...
000000000015af20 <inet_pton>:
15af20: 0b 00 4c 3c addis r2,r12,11
15af24: e0 c1 42 38 addi r2,r2,-15904
15af28: a6 02 08 7c mflr r0
15af2c: f0 ff c1 fb std r30,-16(r1)
15af30: f8 ff e1 fb std r31,-8(r1)
15af34: 78 1b 7f 7c mr r31,r3
15af38: 78 23 83 7c mr r3,r4
15af3c: 78 2b be 7c mr r30,r5
15af40: 10 00 01 f8 std r0,16(r1)
15af44: c1 ff 21 f8 stdu r1,-64(r1)
15af48: 28 00 81 f8 std r4,40(r1)
... # readelf --debug-dump=frames-interp /usr/lib64/libc-2.26.so | less
...
00027024 0000000000000024 00027028 FDE cie=00000000 pc=000000000015af20..000000000015af88
LOC CFA r30 r31 ra
000000000015af20 r1+0 u u u
000000000015af34 r1+0 c-16 c-8 r0
000000000015af48 r1+64 c-16 c-8 c+16
000000000015af5c r1+0 c-16 c-8 c+16
000000000015af78 r1+0 u u
...# perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x18 # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1 # perf script
Before:
ping 2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
12f152d70 _init+0xbfc (/usr/bin/ping)
7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])After:
ping 2829 [005] 512917.460174: probe_libc:inet_pton: (7fff7e2baf38)
7fff7e2baf38 __GI___inet_pton+0x18 (/usr/lib64/libc-2.26.so)
7fff7e26fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
7fff7e2705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
12f152d70 _init+0xbfc (/usr/bin/ping)
7fff7e1836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fff7e183898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])--- tools/perf/arch/powerpc/util/skip-callchain-idx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
tools/perf/arch/powerpc/util/skip-callchain-idx.c +6 -2
@@ -58,9 +58,13 @@ static int check_return_reg(int ra_regno }/* -* Check if return address is on the stack. +* Check if return address is on the stack. If return address +* is in a register (typically R0), it is yet to be saved on +* the stack. */ -if (nops !=0 || ops !=NULL ) +if ((nops !=0 || ops !=NULL ) && + !(nops ==1 && ops[0 ].atom == DW_OP_regx && + ops[0 ].number2 ==0 && ops[0 ].offset ==0 ))return 0 ;/*
Greg Kroah-Hartman
maintainerPATCH 56/235 video: fbdev: pxafb: clear allocated memory for video modes
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Mack <[email protected]>
[ Upstream commit b951d80aaf224b1f774e10def672f5e37488e4ee ]
When parsing the video modes from DT properties, make sure to zero out memory before using it. This is important because not all fields in the mode struct are explicitly initialized, even though they are used later on.
--- drivers/video/fbdev/pxafb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/pxafb.c +2 -2
@@ -2128,8 +2128,8 @@ static int of_get_pxafb_display(struct dreturn -EINVAL ; ret = -ENOMEM ; - info->modes =kmalloc_array (timings->num_timings, -sizeof (info->modes[0 ]),GFP_KERNEL ); + info->modes =kcalloc (timings->num_timings,sizeof (info->modes[0 ]), +GFP_KERNEL );if (!info->modes) goto out; info->num_modes = timings->num_timings;
Greg Kroah-Hartman
maintainerPATCH 57/235 fbdev: Distinguish between interlaced and progressive modes
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fredrik Noring <[email protected]>
[ Upstream commit 1ba0a59cea41ea05fda92daaf2a2958a2246b9cf ]
I discovered the problem when developing a frame buffer driver for the PlayStation 2 (not yet merged), using the following video modes for the PlayStation 3 in drivers/video/fbdev/ps3fb.c:
}, {
/* 1080if */
"1080if", 50, 1920, 1080, 13468, 148, 484, 36, 4, 88, 5,
FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
}, {
/* 1080pf */
"1080pf", 50, 1920, 1080, 6734, 148, 484, 36, 4, 88, 5,
FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
},In ps3fb_probe, the mode_option module parameter is used with fb_find_mode but it can only select the interlaced variant of 1920x1080 since the loop matching the modes does not take the difference between interlaced and progressive modes into account.
In short, without the patch, progressive 1920x1080 cannot be chosen as a mode_option parameter since fb_find_mode (falsely) thinks interlace is a perfect match.
--- drivers/video/fbdev/core/modedb.c | 41 +++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-)
drivers/video/fbdev/core/modedb.c +30 -11
@@ -644,7 +644,7 @@ static int fb_try_mode(struct fb_var_scr* * Valid mode specifiers for @mode_option: * -* <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or +* <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][p][m] or * <name>[-<bpp>][@<refresh>] * * with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
@@ -653,10 +653,10 @@ static int fb_try_mode(struct fb_var_scr* If 'M' is present after yres (and before refresh/bpp if present), * the function will compute the timings using VESA(tm) Coordinated * Video Timings (CVT). If 'R' is present after 'M', will compute with -* reduced blanking (for flatpanels). If 'i' is present, compute -* interlaced mode. If 'm' is present, add margins equal to 1.8% -* of xres rounded down to 8 pixels, and 1.8% of yres. The char -* 'i' and 'm' must be after 'M' and 'R'. Example: +* reduced blanking (for flatpanels). If 'i' or 'p' are present, compute +* interlaced or progressive mode. If 'm' is present, add margins equal +* to 1.8% of xres rounded down to 8 pixels, and 1.8% of yres. The chars +* 'i', 'p' and 'm' must be after 'M' and 'R'. Example: * * 1024x768MR-8@60m - Reduced blank with margins at 60Hz. *
@@ -697,7 +697,8 @@ int fb_find_mode(struct fb_var_screeninfunsigned int namelen =strlen (name);int res_specified =0 , bpp_specified =0 , refresh_specified =0 ;unsigned int xres =0 , yres =0 , bpp = default_bpp, refresh =0 ; -int yres_specified =0 , cvt =0 , rb =0 , interlace =0 ; +int yres_specified =0 , cvt =0 , rb =0 ; +int interlace_specified =0 , interlace =0 ;int margins =0 ;u32 best, diff, tdiff;
@@ -748,9 +749,17 @@ int fb_find_mode(struct fb_var_screeninfif (!cvt) margins =1 ;break ; +case 'p' : +if (!cvt) { + interlace =0 ; + interlace_specified =1 ; + } +break ;case 'i' : -if (!cvt) +if (!cvt) { interlace =1 ; + interlace_specified =1 ; + }break ;default : goto done;
@@ -819,11 +828,21 @@ done:if ((name_matches (db[i], name, namelen) || (res_specified &&res_matches (db[i], xres, yres))) && !fb_try_mode (var, info, &db[i], bpp)) { -if (refresh_specified && db[i].refresh == refresh) -return 1 ; +const int db_interlace = (db[i].vmode & +FB_VMODE_INTERLACED ?1 :0 ); +int score =abs (db[i].refresh - refresh); + +if (interlace_specified) + score +=abs (db_interlace - interlace); + +if (!interlace_specified || + db_interlace == interlace) +if (refresh_specified && + db[i].refresh == refresh) +return 1 ; -if (abs (db[i].refresh - refresh) < diff) { - diff =abs (db[i].refresh - refresh); +if (score < diff) { + diff = score; best = i; } }
Greg Kroah-Hartman
maintainerPATCH 58/235 omapfb: rename omap2 module to omap2fb.ko
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 4bcd8c90ac0f27d3d76fcfc50582ff3685059de9 ]
In a kernel configuration with both CONFIG_FB_OMAP=m and CONFIG_FB_OMAP2=m, Kbuild fails to point out that we have two modules with the same name (omapfb.ko), but instead fails with a cryptic error message like:
ERROR: "omapfb_register_panel" [drivers/video/fbdev/omap/lcd_osk.ko] undefined!
This can now happen when building a randconfig kernel with CONFIG_ARCH_OMAP1, as the omap1 fbdev driver depends on that, whiel the omap2 fbdev driver can now be built anywhere with CONFIG_COMPILE_TEST.
The solution is to rename one of the two modules, so for consistency with the directory naming I decided to rename the omap2 version to omap2fb.ko.
--- drivers/video/fbdev/omap2/omapfb/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/omap2/omapfb/Makefile +2 -2
@@ -2,5 +2,5 @@ obj-$(CONFIG_OMAP2_VRFB) += vrfb.o obj-y += dss/ obj-y += displays/ -obj-$(CONFIG_FB_OMAP2) += omapfb.o -omapfb-y := omapfb-main.o omapfb-sysfs.o omapfb-ioctl.o +obj-$(CONFIG_FB_OMAP2) += omap2fb.o +omap2fb-y := omapfb-main.o omapfb-sysfs.o omapfb-ioctl.o
Greg Kroah-Hartman
maintainerPATCH 59/235 ARM: exynos: Clear global variable on init error path
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Kozlowski <[email protected]>
[ Upstream commit cd4806911cee3901bc2b5eb95603cf1958720b57 ]
For most of Exynos SoCs, Power Management Unit (PMU) address space is mapped into global variable 'pmu_base_addr' very early when initializing PMU interrupt controller. A lot of other machine code depends on it so when doing iounmap() on this address, clear the global as well to avoid usage of invalid value (pointing to unmapped memory region).
Properly mapped PMU address space is a requirement for all other machine code so this fix is purely theoretical. Boot will fail immediately in many other places after following this error path.
--- arch/arm/mach-exynos/suspend.c | 1 + 1 file changed, 1 insertion(+)
arch/arm/mach-exynos/suspend.c +1 -0
@@ -203,6 +203,7 @@ static int __init exynos_pmu_irq_init(st NULL);if (!domain) {iounmap (pmu_base_addr); + pmu_base_addr =NULL ;return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 60/235 perf powerpc: Fix callchain ip filtering
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit c715fcfda5a08edabaa15508742be926b7ee51db ]
For powerpc64, redundant entries in the callchain are filtered out by determining the state of the return address and the stack frame using DWARF debug information.
For making these filtering decisions we must analyze the debug information for the location corresponding to the program counter value, i.e. the first entry in the callchain, and not the LR value; otherwise, perf may filter out either the second or the third entry in the callchain incorrectly.
This can be observed on a powerpc64le system running Fedora 27 as shown below.
Case 1 - Attaching a probe at inet_pton+0x8 (binary offset 0x15af28).
Return address is still in LR and a new stack frame is not yet allocated. The LR value, i.e. the second entry, should not be filtered out.
# objdump -d /usr/lib64/libc-2.26.so | less
...
000000000010eb10 <gaih_inet.constprop.7>:
...
10fa48: 78 bb e4 7e mr r4,r23
10fa4c: 0a 00 60 38 li r3,10
10fa50: d9 b4 04 48 bl 15af28 <inet_pton+0x8>
10fa54: 00 00 00 60 nop
10fa58: ac f4 ff 4b b 10ef04 <gaih_inet.constprop.7+0x3f4>
...
0000000000110450 <getaddrinfo>:
...
1105a8: 54 00 ff 38 addi r7,r31,84
1105ac: 58 00 df 38 addi r6,r31,88
1105b0: 69 e5 ff 4b bl 10eb18 <gaih_inet.constprop.7+0x8>
1105b4: 78 1b 71 7c mr r17,r3
1105b8: 50 01 7f e8 ld r3,336(r31)
...
000000000015af20 <inet_pton>:
15af20: 0b 00 4c 3c addis r2,r12,11
15af24: e0 c1 42 38 addi r2,r2,-15904
15af28: a6 02 08 7c mflr r0
15af2c: f0 ff c1 fb std r30,-16(r1)
15af30: f8 ff e1 fb std r31,-8(r1)
...# perf probe -x /usr/lib64/libc-2.26.so -a inet_pton+0x8 # perf record -e probe_libc:inet_pton -g ping -6 -c 1 ::1 # perf script
Before:
ping 4507 [002] 514985.546540: probe_libc:inet_pton: (7fffa7dbaf28)
7fffa7dbaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
7fffa7d705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
13fb52d70 _init+0xbfc (/usr/bin/ping)
7fffa7c836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fffa7c83898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])After:
ping 4507 [002] 514985.546540: probe_libc:inet_pton: (7fffa7dbaf28)
7fffa7dbaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
7fffa7d6fa54 gaih_inet.constprop.7+0xf44 (/usr/lib64/libc-2.26.so)
7fffa7d705b4 getaddrinfo+0x164 (/usr/lib64/libc-2.26.so)
13fb52d70 _init+0xbfc (/usr/bin/ping)
7fffa7c836a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fffa7c83898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])Case 2 - Attaching a probe at _int_malloc+0x180 (binary offset 0x9cf10).
Return address in still in LR and a new stack frame has already been allocated but not used. The caller's caller, i.e. the third entry, is invalid and should be filtered out and not the second one.
# objdump -d /usr/lib64/libc-2.26.so | less
...
000000000009cd90 <_int_malloc>:
9cd90: 17 00 4c 3c addis r2,r12,23
9cd94: 70 a3 42 38 addi r2,r2,-23696
9cd98: 26 00 80 7d mfcr r12
9cd9c: f8 ff e1 fb std r31,-8(r1)
9cda0: 17 00 e4 3b addi r31,r4,23
9cda4: d8 ff 61 fb std r27,-40(r1)
9cda8: 78 23 9b 7c mr r27,r4
9cdac: 1f 00 bf 2b cmpldi cr7,r31,31
9cdb0: f0 ff c1 fb std r30,-16(r1)
9cdb4: b0 ff c1 fa std r22,-80(r1)
9cdb8: 78 1b 7e 7c mr r30,r3
9cdbc: 08 00 81 91 stw r12,8(r1)
9cdc0: 11 ff 21 f8 stdu r1,-240(r1)
9cdc4: 4c 01 9d 41 bgt cr7,9cf10 <_int_malloc+0x180>
9cdc8: 20 00 a4 2b cmpldi cr7,r4,32
...
9cf08: 00 00 00 60 nop
9cf0c: 00 00 42 60 ori r2,r2,0
9cf10: e4 06 ff 7b rldicr r31,r31,0,59
9cf14: 40 f8 a4 7f cmpld cr7,r4,r31
9cf18: 68 05 9d 41 bgt cr7,9d480 <_int_malloc+0x6f0>
...
000000000009e3c0 <tcache_init.part.4>:
...
9e420: 40 02 80 38 li r4,576
9e424: 78 fb e3 7f mr r3,r31
9e428: 71 e9 ff 4b bl 9cd98 <_int_malloc+0x8>
9e42c: 00 00 a3 2f cmpdi cr7,r3,0
9e430: 78 1b 7e 7c mr r30,r3
...
000000000009f7a0 <__libc_malloc>:
...
9f8f8: 00 00 89 2f cmpwi cr7,r9,0
9f8fc: 1c ff 9e 40 bne cr7,9f818 <__libc_malloc+0x78>
9f900: c9 ea ff 4b bl 9e3c8 <tcache_init.part.4+0x8>
9f904: 00 00 00 60 nop
9f908: e8 90 22 e9 ld r9,-28440(r2)
...# perf probe -x /usr/lib64/libc-2.26.so -a _int_malloc+0x180 # perf record -e probe_libc:_int_malloc -g ./test-malloc # perf script
Before:
test-malloc 6554 [009] 515975.797403: probe_libc:_int_malloc: (7fffa6e6cf10)
7fffa6e6cf10 _int_malloc+0x180 (/usr/lib64/libc-2.26.so)
7fffa6dd0000 [unknown] (/usr/lib64/libc-2.26.so)
7fffa6e6f904 malloc+0x164 (/usr/lib64/libc-2.26.so)
7fffa6e6f9fc malloc+0x25c (/usr/lib64/libc-2.26.so)
100006b4 main+0x38 (/home/testuser/test-malloc)
7fffa6df36a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fffa6df3898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])After:
test-malloc 6554 [009] 515975.797403: probe_libc:_int_malloc: (7fffa6e6cf10)
7fffa6e6cf10 _int_malloc+0x180 (/usr/lib64/libc-2.26.so)
7fffa6e6e42c tcache_init.part.4+0x6c (/usr/lib64/libc-2.26.so)
7fffa6e6f904 malloc+0x164 (/usr/lib64/libc-2.26.so)
7fffa6e6f9fc malloc+0x25c (/usr/lib64/libc-2.26.so)
100006b4 main+0x38 (/home/sandipan/test-malloc)
7fffa6df36a0 generic_start_main.isra.0+0x140 (/usr/lib64/libc-2.26.so)
7fffa6df3898 __libc_start_main+0xb8 (/usr/lib64/libc-2.26.so)
0 [unknown] ([unknown])--- tools/perf/arch/powerpc/util/skip-callchain-idx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/arch/powerpc/util/skip-callchain-idx.c +1 -1
@@ -250,7 +250,7 @@ int arch_skip_callchain_idx(struct threaif (!chain || chain->nr <3 )return skip_slot; - ip = chain->ips[2 ]; + ip = chain->ips[1 ];thread__find_symbol (thread,PERF_RECORD_MISC_USER , ip, &al);
Greg Kroah-Hartman
maintainerPATCH 61/235 nvmet: fix file discard return status
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Grimberg <[email protected]>
[ Upstream commit 1b72b71faccee986e2128a271125177dfe91f7b7 ]
If nvmet_copy_from_sgl failed, we falsly return successful completion status.
--- drivers/nvme/target/io-cmd-file.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/nvme/target/io-cmd-file.c +10 -8
@@ -209,22 +209,24 @@ static void nvmet_file_execute_discard(s {int mode =FALLOC_FL_PUNCH_HOLE |FALLOC_FL_KEEP_SIZE ;struct nvme_dsm_range range; -loff_t offset; -loff_t len; -int i, ret; +loff_t offset, len; +u16 ret; +int i;for (i =0 ; i <=le32_to_cpu (req->cmd->dsm.nr); i++) { -if (nvmet_copy_from_sgl (req, i *sizeof (range), &range, -sizeof (range))) + ret =nvmet_copy_from_sgl (req, i *sizeof (range), &range, +sizeof (range)); +if (ret)break ; offset =le64_to_cpu (range.slba) << req->ns->blksize_shift; len =le32_to_cpu (range.nlb) << req->ns->blksize_shift; - ret =vfs_fallocate (req->ns->file, mode, offset, len); -if (ret) +if (vfs_fallocate (req->ns->file, mode, offset, len)) { + ret =NVME_SC_INTERNAL |NVME_SC_DNR ;break ; + } } -nvmet_req_complete (req, ret <0 ?NVME_SC_INTERNAL |NVME_SC_DNR :0 ); +nvmet_req_complete (req, ret); }static void nvmet_file_dsm_work (struct work_struct *w)
Greg Kroah-Hartman
maintainerPATCH 62/235 nvme-rdma: unquiesce queues when deleting the controller
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sagi Grimberg <[email protected]>
[ Upstream commit 90140624e8face94207003ac9a9d2a329b309d68 ]
If the controller is going away, we need to unquiesce the IO queues so that all pending request can fail gracefully before moving forward with controller deletion. Do that before we destroy the IO queues so blk_cleanup_queue won't block in freeze.
--- drivers/nvme/host/rdma.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/nvme/host/rdma.c +2 -0
@@ -1741,6 +1741,8 @@ static void nvme_rdma_shutdown_ctrl(strunvme_rdma_stop_io_queues (ctrl);blk_mq_tagset_busy_iter (&ctrl->tag_set, nvme_cancel_request, &ctrl->ctrl); +if (shutdown) +nvme_start_queues (&ctrl->ctrl);nvme_rdma_destroy_io_queues (ctrl, shutdown); }
Greg Kroah-Hartman
maintainerPATCH 63/235 KVM: arm/arm64: vgic: Fix possible spectre-v1 write in vgic_mmio_write_apr()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 6b8b9a48545e08345b8ff77c9fd51b1aebdbefb3 ]
It's possible for userspace to control n. Sanitize n when using it as an array index, to inhibit the potential spectre-v1 write gadget.
Note that while it appears that n must be bound to the interval [0,3] due to the way it is extracted from addr, we cannot guarantee that compiler transformations (and/or future refactoring) will ensure this is the case, and given this is a slow path it's better to always perform the masking.
Found by smatch.
--- virt/kvm/arm/vgic/vgic-mmio-v2.c | 3 +++ 1 file changed, 3 insertions(+)
virt/kvm/arm/vgic/vgic-mmio-v2.c +3 -0
@@ -352,6 +352,9 @@ static void vgic_mmio_write_apr(struct kif (n >vgic_v3_max_apr_idx (vcpu))return ; + + n =array_index_nospec (n,4 ); +/* GICv3 only uses ICH_AP1Rn for memory mapped (GICv2) guests */ vgicv3->vgic_ap1r[n] = val; }
Greg Kroah-Hartman
maintainerPATCH 64/235 powerpc/powernv: opal_put_chars partial write fix
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Piggin <[email protected]>
[ Upstream commit bd90284cc6c1c9e8e48c8eadd0c79574fcce0b81 ]
The intention here is to consume and discard the remaining buffer upon error. This works if there has not been a previous partial write. If there has been, then total_len is no longer total number of bytes to copy. total_len is always "bytes left to copy", so it should be added to written bytes.
This code may not be exercised any more if partial writes will not be hit, but this is a small bugfix before a larger change.
--- arch/powerpc/platforms/powernv/opal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powernv/opal.c +1 -1
@@ -388,7 +388,7 @@ int opal_put_chars(uint32_t vtermno, con/* Closed or other error drop */ if (rc !=OPAL_SUCCESS && rc !=OPAL_BUSY && rc !=OPAL_BUSY_EVENT ) { - written = total_len; + written += total_len;break ; }if (rc ==OPAL_SUCCESS ) {
Greg Kroah-Hartman
maintainerPATCH 65/235 perf script: Show correct offsets for DWARF-based unwinding
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sandipan Das <[email protected]>
[ Upstream commit 2a9d5050dc84fa2060f08a52f632976923e0fa7e ]
When perf/data is recorded with the dwarf call-graph option, the callchain shown by 'perf script' still shows the binary offsets of the userspace symbols instead of their virtual addresses. Since the symbol offset calculation is based on using virtual address as the ip, we see incorrect offsets as well.
The use of virtual addresses affects the ability to find out the line number in the corresponding source file to which an address maps to as described in commit 67540759151a ("perf unwind: Use addr_location::addr instead of ip for entries").
This has also been addressed by temporarily converting the virtual address to the correponding binary offset so that it can be mapped to the source line number correctly.
This is a follow-up for commit 19610184693c ("perf script: Show virtual addresses instead of offsets").
This can be verified on a powerpc64le system running Fedora 27 as shown below:
# perf probe -x /usr/lib64/libc-2.26.so -a inet_pton # perf record -e probe_libc:inet_pton --call-graph=dwarf ping -6 -c 1 ::1
Before:
# perf report --stdio --no-children -s sym,srcline -g address
# Samples: 1 of event 'probe_libc:inet_pton'
# Event count (approx.): 1
#
# Overhead Symbol Source:Line
# ........ .................... ...........
#
100.00% [.] __GI___inet_pton inet_pton.c
|
---gaih_inet getaddrinfo.c:537 (inlined)
__GI_getaddrinfo getaddrinfo.c:2304 (inlined)
main ping.c:519
generic_start_main libc-start.c:308 (inlined)
__libc_start_main libc-start.c:102...
# perf script -F comm,ip,sym,symoff,srcline,dso
ping
15af28 __GI___inet_pton+0xffff000099160008 (/usr/lib64/libc-2.26.so)
libc-2.26.so[ffff80004ca0af28]
10fa53 gaih_inet+0xffff000099160f43
libc-2.26.so[ffff80004c9bfa53] (inlined)
1105b3 __GI_getaddrinfo+0xffff000099160163
libc-2.26.so[ffff80004c9c05b3] (inlined)
2d6f main+0xfffffffd9f1003df (/usr/bin/ping)
ping[fffffffecf882d6f]
2369f generic_start_main+0xffff00009916013f
libc-2.26.so[ffff80004c8d369f] (inlined)
23897 __libc_start_main+0xffff0000991600b7 (/usr/lib64/libc-2.26.so)
libc-2.26.so[ffff80004c8d3897]After:
# perf report --stdio --no-children -s sym,srcline -g address
# Samples: 1 of event 'probe_libc:inet_pton'
# Event count (approx.): 1
#
# Overhead Symbol Source:Line
# ........ .................... ...........
#
100.00% [.] __GI___inet_pton inet_pton.c
|
---gaih_inet.constprop.7 getaddrinfo.c:537
getaddrinfo getaddrinfo.c:2304
main ping.c:519
generic_start_main.isra.0 libc-start.c:308
__libc_start_main libc-start.c:102...
# perf script -F comm,ip,sym,symoff,srcline,dso
ping
7fffb38aaf28 __GI___inet_pton+0x8 (/usr/lib64/libc-2.26.so)
inet_pton.c:68
7fffb385fa53 gaih_inet.constprop.7+0xf43 (/usr/lib64/libc-2.26.so)
getaddrinfo.c:537
7fffb38605b3 getaddrinfo+0x163 (/usr/lib64/libc-2.26.so)
getaddrinfo.c:2304
130782d6f main+0x3df (/usr/bin/ping)
ping.c:519
7fffb377369f generic_start_main.isra.0+0x13f (/usr/lib64/libc-2.26.so)
libc-start.c:308
7fffb3773897 __libc_start_main+0xb7 (/usr/lib64/libc-2.26.so)
libc-start.c:102--- tools/perf/util/machine.c | 9 ++++++++- tools/perf/util/unwind-libdw.c | 2 +- tools/perf/util/unwind-libunwind-local.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-)
tools/perf/util/machine.c +8 -1
@@ -2272,6 +2272,7 @@ static int unwind_entry(struct unwind_en {struct callchain_cursor *cursor = arg;const char *srcline =NULL ; +u64 addr;if (symbol_conf.hide_unresolved && entry->sym ==NULL )return 0 ;
@@ -2279,7 +2280,13 @@ static int unwind_entry(struct unwind_enif (append_inlines (cursor, entry->map, entry->sym, entry->ip) ==0 )return 0 ; - srcline =callchain_srcline (entry->map, entry->sym, entry->ip); +/* +* Convert entry->ip from a virtual address to an offset in +* its corresponding binary. +*/ + addr =map__map_ip (entry->map, entry->ip); + + srcline =callchain_srcline (entry->map, entry->sym, addr);return callchain_cursor_append (cursor, entry->ip, entry->map, entry->sym, false,NULL ,0 ,0 ,0 , srcline);
tools/perf/util/unwind-libdw.c +1 -1
@@ -77,7 +77,7 @@ static int entry(u64 ip, struct unwind_iif (__report_module (&al, ip, ui))return -1 ; - e->ip = al.addr; + e->ip = ip; e->map = al.map; e->sym = al.sym;
tools/perf/util/unwind-libunwind-local.c +1 -1
@@ -575,7 +575,7 @@ static int entry(u64 ip, struct thread *struct addr_location al; e.sym =thread__find_symbol (thread,PERF_RECORD_MISC_USER , ip, &al); - e.ip = al.addr; + e.ip = ip; e.map = al.map; pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
Greg Kroah-Hartman
maintainerPATCH 66/235 staging: bcm2835-camera: fix timeout handling in wait_for_completion_timeout
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
[ Upstream commit b7afce51d95726a619743aaad8870db66dfa1479 ]
wait_for_completion_timeout returns unsigned long not int so a variable of proper type is introduced. Further the check for <= 0 is ambiguous and should be == 0 here indicating timeout which is the only error case so no additional check needed here.
--- drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c +6 -5
@@ -630,6 +630,7 @@ static int send_synchronous_mmal_msg(str {struct mmal_msg_context *msg_context;int ret; +unsigned long timeout;/* payload size must not cause message to exceed max size */ if (payload_len >
@@ -668,11 +669,11 @@ static int send_synchronous_mmal_msg(strreturn ret; } - ret =wait_for_completion_timeout (&msg_context->u.sync.cmplt,3 *HZ ); -if (ret <=0 ) { -pr_err ("error %d waiting for sync completion\n" , ret); -if (ret ==0 ) - ret = -ETIME ; + timeout =wait_for_completion_timeout (&msg_context->u.sync.cmplt, +3 *HZ ); +if (timeout ==0 ) { +pr_err ("timed out waiting for sync completion\n" ); + ret = -ETIME ;/* todo: what happens if the message arrives after aborting */ release_msg_context (msg_context);return ret;
Greg Kroah-Hartman
maintainerPATCH 67/235 staging: bcm2835-camera: handle wait_for_completion_timeout return properly
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
[ Upstream commit 5b70084f6cbcd53f615433f9d216e01bd71de0bb ]
wait_for_completion_timeout returns unsigned long not int so a variable of proper type is introduced. Further the check for <= 0 is ambiguous and should be == 0 here indicating timeout.
--- drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +4 -3
@@ -580,6 +580,7 @@ static int start_streaming(struct vb2_qustatic void stop_streaming (struct vb2_queue *vq) {int ret; +unsigned long timeout;struct bm2835_mmal_dev *dev =vb2_get_drv_priv (vq); v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n",
@@ -605,10 +606,10 @@ static void stop_streaming(struct vb2_qu sizeof(dev->capture.frame_count));/* wait for last frame to complete */ - ret =wait_for_completion_timeout (&dev->capture.frame_cmplt,HZ ); -if (ret <=0 ) + timeout =wait_for_completion_timeout (&dev->capture.frame_cmplt,HZ ); +if (timeout ==0 )v4l2_err (&dev->v4l2_dev, -"error %d waiting for frame completion\n" , ret); +"timed out waiting for frame completion\n" );v4l2_dbg (1 , bcm2835_v4l2_debug, &dev->v4l2_dev,"disabling connection\n" );
Greg Kroah-Hartman
maintainerPATCH 68/235 ASoC: rt5514: Fix the issue of the delay volume applied
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oder Chiou <[email protected]>
[ Upstream commit d96f8bd28cd0bae3e6702ae90df593628ef6906f ]
The patch fixes the issue of the delay volume applied.
--- sound/soc/codecs/rt5514.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
sound/soc/codecs/rt5514.c +4 -4
@@ -64,8 +64,8 @@ static const struct reg_sequence rt5514_ {RT5514_ANA_CTRL_LDO10, 0x00028604}, {RT5514_ANA_CTRL_ADCFED, 0x00000800}, {RT5514_ASRC_IN_CTRL1, 0x00000003}, - {RT5514_DOWNFILTER0_CTRL3, 0x10000362}, - {RT5514_DOWNFILTER1_CTRL3, 0x10000362}, + {RT5514_DOWNFILTER0_CTRL3, 0x10000352}, + {RT5514_DOWNFILTER1_CTRL3, 0x10000352}, }; static const struct reg_default rt5514_reg[] = {
@@ -92,10 +92,10 @@ static const struct reg_default rt5514_r {RT5514_ASRC_IN_CTRL1, 0x00000003}, {RT5514_DOWNFILTER0_CTRL1, 0x00020c2f}, {RT5514_DOWNFILTER0_CTRL2, 0x00020c2f}, - {RT5514_DOWNFILTER0_CTRL3, 0x10000362}, + {RT5514_DOWNFILTER0_CTRL3, 0x10000352}, {RT5514_DOWNFILTER1_CTRL1, 0x00020c2f}, {RT5514_DOWNFILTER1_CTRL2, 0x00020c2f}, - {RT5514_DOWNFILTER1_CTRL3, 0x10000362}, + {RT5514_DOWNFILTER1_CTRL3, 0x10000352}, {RT5514_ANA_CTRL_LDO10, 0x00028604}, {RT5514_ANA_CTRL_LDO18_16, 0x02000345}, {RT5514_ANA_CTRL_ADC12, 0x0000a2a8},
Greg Kroah-Hartman
maintainerPATCH 69/235 MIPS: jz4740: Bump zload address
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Cercueil <[email protected]>
[ Upstream commit c6ea7e9747318e5a6774995f4f8e3e0f7c0fa8ba ]
Having the zload address at 0x8060.0000 means the size of the uncompressed kernel cannot be bigger than around 6 MiB, as it is deflated at address 0x8001.0000.
This limit is too small; a kernel with some built-in drivers and things like debugfs enabled will already be over 6 MiB in size, and so will fail to extract properly.
To fix this, we bump the zload address from 0x8060.0000 to 0x8100.0000.
This is fine, as all the boards featuring Ingenic JZ SoCs have at least 32 MiB of RAM, and use u-boot or compatible bootloaders which won't hardcode the load address but read it from the uImage's header.
Patchwork: https://patchwork.linux-mips.org/patch/19787/
--- arch/mips/jz4740/Platform | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/jz4740/Platform +1 -1
@@ -1,4 +1,4 @@ platform-$(CONFIG_MACH_INGENIC) += jz4740/ cflags-$(CONFIG_MACH_INGENIC) += -I$(srctree)/arch/mips/include/asm/mach-jz4740 load-$(CONFIG_MACH_INGENIC) += 0xffffffff80010000 -zload-$(CONFIG_MACH_INGENIC) += 0xffffffff80600000 +zload-$(CONFIG_MACH_INGENIC) += 0xffffffff81000000
Greg Kroah-Hartman
maintainerPATCH 70/235 mac80211: restrict delayed tailroom needed decrement
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manikanta Pubbisetty <[email protected]>
[ Upstream commit 133bf90dbb8b873286f8ec2e81ba26e863114b8c ]
As explained in ieee80211_delayed_tailroom_dec(), during roam, keys of the old AP will be destroyed and new keys will be installed. Deletion of the old key causes crypto_tx_tailroom_needed_cnt to go from 1 to 0 and the new key installation causes a transition from 0 to 1.
Whenever crypto_tx_tailroom_needed_cnt transitions from 0 to 1, we invoke synchronize_net(); the reason for doing this is to avoid a race in the TX path as explained in increment_tailroom_need_count(). This synchronize_net() operation can be slow and can affect the station roam time. To avoid this, decrementing the crypto_tx_tailroom_needed_cnt is delayed for a while so that upon installation of new key the transition would be from 1 to 2 instead of 0 to 1 and thereby improving the roam time.
This is all correct for a STA iftype, but deferring the tailroom_needed decrement for other iftypes may be unnecessary.
For example, let's consider the case of a 4-addr client connecting to an AP for which AP_VLAN interface is also created, let the initial value for tailroom_needed on the AP be 1.
* 4-addr client connects to the AP (AP: tailroom_needed = 1)
* AP will clear old keys, delay decrement of tailroom_needed count
* AP_VLAN is created, it takes the tailroom count from master (AP_VLAN: tailroom_needed = 1, AP: tailroom_needed = 1)
* Install new key for the station, assume key is plumbed in the HW, there won't be any change in tailroom_needed count on AP iface
* Delayed decrement of tailroom_needed count on AP
(AP: tailroom_needed = 0, AP_VLAN: tailroom_needed = 1)
Because of the delayed decrement on AP iface, tailroom_needed count goes out of sync between AP(master iface) and AP_VLAN(slave iface) and there would be unnecessary tailroom created for the packets going through AP_VLAN iface.
Also, WARN_ONs were observed while trying to bring down the AP_VLAN interface:
(warn_slowpath_common) (warn_slowpath_null+0x18/0x20) (warn_slowpath_null) (ieee80211_free_keys+0x114/0x1e4) (ieee80211_free_keys) (ieee80211_del_virtual_monitor+0x51c/0x850) (ieee80211_del_virtual_monitor) (ieee80211_stop+0x30/0x3c) (ieee80211_stop) (__dev_close_many+0x94/0xb8) (__dev_close_many) (dev_close_many+0x5c/0xc8)
Restricting delayed decrement to station interface alone fixes the problem and it makes sense to do so because delayed decrement is done to improve roam time which is applicable only for client devices.
--- net/mac80211/cfg.c | 2 +- net/mac80211/key.c | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-)
net/mac80211/cfg.c +1 -1
@@ -495,7 +495,7 @@ static int ieee80211_del_key(struct wiph goto out_unlock; } -ieee80211_key_free (key, true); +ieee80211_key_free (key, sdata->vif.type ==NL80211_IFTYPE_STATION ); ret =0 ; out_unlock:
net/mac80211/key.c +15 -9
@@ -656,11 +656,15 @@ int ieee80211_key_link(struct ieee80211_ {struct ieee80211_local *local = sdata->local;struct ieee80211_key *old_key; -int idx, ret; -bool pairwise; - - pairwise = key->conf.flags &IEEE80211_KEY_FLAG_PAIRWISE ; - idx = key->conf.keyidx; +int idx = key->conf.keyidx; +bool pairwise = key->conf.flags &IEEE80211_KEY_FLAG_PAIRWISE ; +/* +* We want to delay tailroom updates only for station - in that +* case it helps roaming speed, but in other cases it hurts and +* can cause warnings to appear. +*/ +bool delay_tailroom = sdata->vif.type ==NL80211_IFTYPE_STATION ; +int ret;mutex_lock (&sdata->local->key_mtx);
@@ -688,14 +692,14 @@ int ieee80211_key_link(struct ieee80211_increment_tailroom_need_count (sdata);ieee80211_key_replace (sdata, sta, pairwise, old_key, key); -ieee80211_key_destroy (old_key, true); +ieee80211_key_destroy (old_key, delay_tailroom);ieee80211_debugfs_key_add (key);if (!local->wowlan) { ret =ieee80211_key_enable_hw_accel (key);if (ret) -ieee80211_key_free (key, true); +ieee80211_key_free (key, delay_tailroom); }else { ret =0 ; }
@@ -930,7 +934,8 @@ void ieee80211_free_sta_keys(struct ieeeieee80211_key_replace (key->sdata, key->sta, key->conf.flags &IEEE80211_KEY_FLAG_PAIRWISE , key,NULL ); -__ieee80211_key_destroy (key, true); +__ieee80211_key_destroy (key, key->sdata->vif.type == +NL80211_IFTYPE_STATION ); }for (i =0 ; i <NUM_DEFAULT_KEYS ; i++) {
@@ -940,7 +945,8 @@ void ieee80211_free_sta_keys(struct ieeeieee80211_key_replace (key->sdata, key->sta, key->conf.flags &IEEE80211_KEY_FLAG_PAIRWISE , key,NULL ); -__ieee80211_key_destroy (key, true); +__ieee80211_key_destroy (key, key->sdata->vif.type == +NL80211_IFTYPE_STATION ); }mutex_unlock (&local->key_mtx);
Greg Kroah-Hartman
maintainerPATCH 71/235 Smack: Fix handling of IPv4 traffic received by PF_INET6 sockets
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Piotr Sawicki <[email protected]>
[ Upstream commit 129a99890936766f4b69b9da7ed88366313a9210 ]
A socket which has sk_family set to PF_INET6 is able to receive not only IPv6 but also IPv4 traffic (IPv4-mapped IPv6 addresses).
Prior to this patch, the smk_skb_to_addr_ipv6() could have been called for socket buffers containing IPv4 packets, in result such traffic was allowed.
--- security/smack/smack_lsm.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
security/smack/smack_lsm.c +9 -5
@@ -3924,15 +3924,19 @@ static int smack_socket_sock_rcv_skb(strstruct smack_known *skp =NULL ;int rc =0 ;struct smk_audit_info ad; +u16 family = sk->sk_family;#ifdef CONFIG_AUDIT struct lsm_network_audit net;#endif #if IS_ENABLED (CONFIG_IPV6 )struct sockaddr_in6 sadd;int proto; + +if (family ==PF_INET6 && skb->protocol ==htons (ETH_P_IP )) + family =PF_INET ;#endif /* CONFIG_IPV6 */ -switch (sk->sk_family) { +switch (family) {case PF_INET :#ifdef CONFIG_SECURITY_SMACK_NETFILTER /*
@@ -3950,7 +3954,7 @@ static int smack_socket_sock_rcv_skb(str*/ netlbl_secattr_init (&secattr); - rc =netlbl_skbuff_getattr (skb, sk->sk_family, &secattr); + rc =netlbl_skbuff_getattr (skb, family, &secattr);if (rc ==0 ) skp =smack_from_secattr (&secattr, ssp);else
@@ -3963,7 +3967,7 @@ access_check:#endif #ifdef CONFIG_AUDIT smk_ad_init_net (&ad, __func__,LSM_AUDIT_DATA_NET , &net); - ad.a.u.net->family = sk->sk_family; + ad.a.u.net->family = family; ad.a.u.net->netif = skb->skb_iif;ipv4_skb_to_auditdata (skb, &ad.a,NULL );#endif
@@ -3977,7 +3981,7 @@ access_check: rc =smk_bu_note ("IPv4 delivery" , skp, ssp->smk_in,MAY_WRITE , rc);if (rc !=0 ) -netlbl_skbuff_err (skb, sk->sk_family, rc,0 ); +netlbl_skbuff_err (skb, family, rc,0 );break ;#if IS_ENABLED (CONFIG_IPV6 )case PF_INET6 :
@@ -3993,7 +3997,7 @@ access_check: skp = smack_net_ambient;#ifdef CONFIG_AUDIT smk_ad_init_net (&ad, __func__,LSM_AUDIT_DATA_NET , &net); - ad.a.u.net->family = sk->sk_family; + ad.a.u.net->family = family; ad.a.u.net->netif = skb->skb_iif;ipv6_skb_to_auditdata (skb, &ad.a,NULL );#endif /* CONFIG_AUDIT */
Greg Kroah-Hartman
maintainerPATCH 72/235 wan/fsl_ucc_hdlc: use IS_ERR_VALUE() to check return value of qe_muram_alloc
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: YueHaibing <[email protected]>
[ Upstream commit fd800f646402c0f85547166b59ca065175928b7b ]
qe_muram_alloc return a unsigned long integer,which should not compared with zero. check it using IS_ERR_VALUE() to fix this.
--- drivers/net/wan/fsl_ucc_hdlc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/wan/fsl_ucc_hdlc.c +3 -3
@@ -192,7 +192,7 @@ static int uhdlc_init(struct ucc_hdlc_pr priv->ucc_pram_offset =qe_muram_alloc (sizeof (struct ucc_hdlc_param ),ALIGNMENT_OF_UCC_HDLC_PRAM ); -if (priv->ucc_pram_offset <0 ) { +if (IS_ERR_VALUE (priv->ucc_pram_offset)) {dev_err (priv->dev,"Can not allocate MURAM for hdlc parameter.\n" ); ret = -ENOMEM ; goto free_tx_bd;
@@ -230,14 +230,14 @@ static int uhdlc_init(struct ucc_hdlc_pr/* Alloc riptr, tiptr */ riptr =qe_muram_alloc (32 ,32 ); -if (riptr <0 ) { +if (IS_ERR_VALUE (riptr)) {dev_err (priv->dev,"Cannot allocate MURAM mem for Receive internal temp data pointer\n" ); ret = -ENOMEM ; goto free_tx_skbuff; } tiptr =qe_muram_alloc (32 ,32 ); -if (tiptr <0 ) { +if (IS_ERR_VALUE (tiptr)) {dev_err (priv->dev,"Cannot allocate MURAM mem for Transmit internal temp data pointer\n" ); ret = -ENOMEM ; goto free_riptr;
Greg Kroah-Hartman
maintainerPATCH 73/235 arm64: fix possible spectre-v1 write in ptrace_hbp_set_event()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit 14d6e289a89780377f8bb09de8926d3c62d763cd ]
It's possible for userspace to control idx. Sanitize idx when using it as an array index, to inhibit the potential spectre-v1 write gadget.
Found by smatch.
--- arch/arm64/kernel/ptrace.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
arch/arm64/kernel/ptrace.c +11 -8
@@ -277,19 +277,22 @@ static int ptrace_hbp_set_event(unsignedswitch (note_type) {case NT_ARM_HW_BREAK : -if (idx <ARM_MAX_BRP ) { - tsk->thread.debug.hbp_break[idx] = bp; - err =0 ; - } +if (idx >=ARM_MAX_BRP ) + goto out; + idx =array_index_nospec (idx,ARM_MAX_BRP ); + tsk->thread.debug.hbp_break[idx] = bp; + err =0 ;break ;case NT_ARM_HW_WATCH : -if (idx <ARM_MAX_WRP ) { - tsk->thread.debug.hbp_watch[idx] = bp; - err =0 ; - } +if (idx >=ARM_MAX_WRP ) + goto out; + idx =array_index_nospec (idx,ARM_MAX_WRP ); + tsk->thread.debug.hbp_watch[idx] = bp; + err =0 ;break ; } +out:return err; }
Greg Kroah-Hartman
maintainerPATCH 74/235 reset: imx7: Fix always writing bits as 0
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leonard Crestez <[email protected]>
[ Upstream commit 26fce0557fa639fb7bbc33e31a57cff7df25c3a0 ]
Right now the only user of reset-imx7 is pci-imx6 and the reset_control_assert and deassert calls on pciephy_reset don't toggle the PCIEPHY_BTN and PCIEPHY_G_RST bits as expected. Fix this by writing 1 or 0 respectively.
The reference manual is not very clear regarding SRC_PCIEPHY_RCR but for other registers like MIPIPHY and HSICPHY the bits are explicitly documented as "1 means assert, 0 means deassert".
The values are still reversed for IMX7_RESET_PCIE_CTRL_APPS_EN.
--- drivers/reset/reset-imx7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/reset/reset-imx7.c +1 -1
@@ -80,7 +80,7 @@ static int imx7_reset_set(struct reset_c {struct imx7_src *imx7src =to_imx7_src (rcdev);const struct imx7_src_signal *signal = &imx7_src_signals[id]; -unsigned int value =0 ; +unsigned int value = assert ? signal->bit :0 ;switch (id) {case IMX7_RESET_PCIEPHY :
Greg Kroah-Hartman
maintainerPATCH 75/235 efi/arm: preserve early mapping of UEFI memory map longer for BGRT
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
[ Upstream commit 3ea86495aef2f6de26b7cb1599ba350dd6a0c521 ]
The BGRT code validates the contents of the table against the UEFI memory map, and so it expects it to be mapped when the code runs.
On ARM, this is currently not the case, since we tear down the early mapping after efi_init() completes, and only create the permanent mapping in arm_enable_runtime_services(), which executes as an early initcall, but still leaves a window where the UEFI memory map is not mapped.
So move the call to efi_memmap_unmap() from efi_init() to arm_enable_runtime_services().
--- drivers/firmware/efi/arm-init.c | 1 - drivers/firmware/efi/arm-runtime.c | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/firmware/efi/arm-init.c +0 -1
@@ -259,7 +259,6 @@ void __init efi_init(void)reserve_regions ();efi_esrt_init (); -efi_memmap_unmap (); memblock_reserve(params.mmap & PAGE_MASK, PAGE_ALIGN(params.mmap_size +
drivers/firmware/efi/arm-runtime.c +3 -1
@@ -110,11 +110,13 @@ static int __init arm_enable_runtime_ser {u64 mapsize; -if (!efi_enabled (EFI_BOOT )) { +if (!efi_enabled (EFI_BOOT ) || !efi_enabled (EFI_MEMMAP )) {pr_info ("EFI services will not be available.\n" );return 0 ; } +efi_memmap_unmap (); +if (efi_runtime_disabled ()) {pr_info ("EFI runtime services will be disabled.\n" );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 76/235 ALSA: usb-audio: Generic DSD detection for Thesycon-based implementations
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yue Wang <[email protected]>
[ Upstream commit 1ea0358ecb848058b35b6da13d7f4c08610a73a8 ]
Thesycon provides solutions to XMOS chips, and has its own device vendor id.
In this patch, we use generic method to detect DSD capability of Thesycon-based UAC2 implementations in order to support a wide range of current and future devices.
The patch will enable the SNDRV_PCM_FMTBIT_DSD_U32_BE bit for the DAC hence enable native DSD playback up to DSD512 format.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1444,6 +1444,7 @@ u64 snd_usb_interface_dsd_format_quirks(*/ switch (USB_ID_VENDOR (chip->usb_id)) {case 0x20b1 :/* XMOS based devices */ +case 0x152a :/* Thesycon devices */ case 0x25ce :/* Mytek devices */ if (fp->dsd_raw)return SNDRV_PCM_FMTBIT_DSD_U32_BE ;
Greg Kroah-Hartman
maintainerPATCH 77/235 nfp: avoid buffer leak when FW communication fails
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 07300f774fec9519663a597987a4083225588be4 ]
After device is stopped we reset the rings by moving all free buffers to positions [0, cnt - 2], and clear the position cnt - 1 in the ring. We then proceed to clear the read/write pointers. This means that if we try to reset the ring again the code will assume that the next to fill buffer is at position 0 and swap it with cnt - 1. Since we previously cleared position cnt - 1 it will lead to leaking the first buffer and leaving ring in a bad state.
This scenario can only happen if FW communication fails, in which case the ring will never be used again, so the fact it's in a bad state will not be noticed. Buffer leak is the only problem. Don't try to move buffers in the ring if the read/write pointers indicate the ring was never used or have already been reset.
nfp_net_clear_config_and_disable() is now fully idempotent.
Found by code inspection, FW communication failures are very rare, and reconfiguring a live device is not common either, so it's unlikely anyone has ever noticed the leak.
--- drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/net/ethernet/netronome/nfp/nfp_net_common.c +10 -3
@@ -1093,7 +1093,7 @@ static bool nfp_net_xdp_complete(struct* @dp: NFP Net data path struct * @tx_ring: TX ring structure * -* Assumes that the device is stopped +* Assumes that the device is stopped, must be idempotent. */ static void nfp_net_tx_ring_reset (struct nfp_net_dp *dp,struct nfp_net_tx_ring *tx_ring)
@@ -1295,13 +1295,18 @@ static void nfp_net_rx_give_one(const st* nfp_net_rx_ring_reset() - Reflect in SW state of freelist after disable * @rx_ring: RX ring structure * -* Warning: Do *not* call if ring buffers were never put on the FW freelist -* (i.e. device was not enabled)! +* Assumes that the device is stopped, must be idempotent. */ static void nfp_net_rx_ring_reset (struct nfp_net_rx_ring *rx_ring) {unsigned int wr_idx, last_idx; +/* wr_p == rd_p means ring was never fed FL bufs. RX rings are always +* kept at cnt - 1 FL bufs. +*/ +if (rx_ring->wr_p ==0 && rx_ring->rd_p ==0 ) +return ; +/* Move the empty entry to the end of the list */ wr_idx =D_IDX (rx_ring, rx_ring->wr_p); last_idx = rx_ring->cnt -1 ;
@@ -2524,6 +2529,8 @@ static void nfp_net_vec_clear_ring_data(/** * nfp_net_clear_config_and_disable() - Clear control BAR and disable NFP * @nn: NFP Net device to reconfigure +* +* Warning: must be fully idempotent. */ static void nfp_net_clear_config_and_disable (struct nfp_net *nn) {
Greg Kroah-Hartman
maintainerPATCH 78/235 xen-netfront: fix queue name setting
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vitaly Kuznetsov <[email protected]>
[ Upstream commit 2d408c0d4574b01b9ed45e02516888bf925e11a9 ]
Commit f599c64fdf7d ("xen-netfront: Fix race between device setup and open") changed the initialization order: xennet_create_queues() now happens before we do register_netdev() so using netdev->name in xennet_init_queue() is incorrect, we end up with the following in /proc/interrupts:
60: 139 0 xen-dyn -event eth%d-q0-tx 61: 265 0 xen-dyn -event eth%d-q0-rx 62: 234 0 xen-dyn -event eth%d-q1-tx 63: 1 0 xen-dyn -event eth%d-q1-rx
and this looks ugly. Actually, using early netdev name (even when it's already set) is also not ideal: nowadays we tend to rename eth devices and queue name may end up not corresponding to the netdev name.
Use nodename from xenbus device for queue naming: this can't change in VM's lifetime. Now /proc/interrupts looks like
62: 202 0 xen-dyn -event device/vif/0-q0-tx 63: 317 0 xen-dyn -event device/vif/0-q0-rx 64: 262 0 xen-dyn -event device/vif/0-q1-tx 65: 17 0 xen-dyn -event device/vif/0-q1-rx
--- drivers/net/xen-netfront.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/xen-netfront.c +1 -1
@@ -1610,7 +1610,7 @@ static int xennet_init_queue(struct netftimer_setup (&queue->rx_refill_timer, rx_refill_timeout,0 );snprintf (queue->name,sizeof (queue->name),"%s-q%u" , - queue->info->netdev->name, queue->id); + queue->info->xbdev->nodename, queue->id);/* Initialise tx_skbs as a free chain containing every entry. */ queue->tx_skb_freelist =0 ;
Greg Kroah-Hartman
maintainerPATCH 79/235 arm64: dts: qcom: db410c: Fix Bluetooth LED trigger
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Loic Poulain <[email protected]>
[ Upstream commit e53db018315b7660bb7000a29e79faff2496c2c2 ]
Current LED trigger, 'bt', is not known/used by any existing driver. Fix this by renaming it to 'bluetooth-power' trigger which is controlled by the Bluetooth subsystem.
--- arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi +1 -1
@@ -338,7 +338,7 @@ led@6 { label = "apq8016-sbc:blue:bt"; gpios = <&pm8916_mpps 3 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "bt"; + linux,default-trigger = "bluetooth-power"; default-state = "off"; }; };
Greg Kroah-Hartman
maintainerPATCH 80/235 ARM: dts: qcom: msm8974-hammerhead: increase load on l20 for sdhci
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bhushan Shah <[email protected]>
[ Upstream commit 03864e57770a9541e7ff3990bacf2d9a2fffcd5d ]
The kernel would not boot on the hammerhead hardware due to the following error:
mmc0: Timeout waiting for hardware interrupt.
mmc0: sdhci: ============ SDHCI REGISTER DUMP ===========
mmc0: sdhci: Sys addr: 0x00000200 | Version: 0x00003802
mmc0: sdhci: Blk size: 0x00000200 | Blk cnt: 0x00000200
mmc0: sdhci: Argument: 0x00000000 | Trn mode: 0x00000023
mmc0: sdhci: Present: 0x03e80000 | Host ctl: 0x00000034
mmc0: sdhci: Power: 0x00000001 | Blk gap: 0x00000000
mmc0: sdhci: Wake-up: 0x00000000 | Clock: 0x00000007
mmc0: sdhci: Timeout: 0x0000000e | Int stat: 0x00000000
mmc0: sdhci: Int enab: 0x02ff900b | Sig enab: 0x02ff100b
mmc0: sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
mmc0: sdhci: Caps: 0x642dc8b2 | Caps_1: 0x00008007
mmc0: sdhci: Cmd: 0x00000c1b | Max curr: 0x00000000
mmc0: sdhci: Resp[0]: 0x00000c00 | Resp[1]: 0x00000000
mmc0: sdhci: Resp[2]: 0x00000000 | Resp[3]: 0x00000000
mmc0: sdhci: Host ctl2: 0x00000008
mmc0: sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x70040220
mmc0: sdhci: ============================================
mmc0: Card stuck in wrong state! mmcblk0 card_busy_detect status: 0xe00
mmc0: cache flush error -110
mmc0: Reset 0x1 never completed.
This patch increases the load on l20 to 0.2 amps for the sdhci and allows the device to boot normally.
--- arch/arm/boot/dts/qcom-msm8974-lge-nexus5-hammerhead.dts | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/qcom-msm8974-lge-nexus5-hammerhead.dts +2 -0
@@ -189,6 +189,8 @@ regulator-max-microvolt = <2950000>; regulator-boot-on; + regulator-system-load = <200000>; + regulator-allow-set-load; }; l21 {
Greg Kroah-Hartman
maintainerPATCH 81/235 soc: qcom: smem: Correct check for global partition
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Andersson <[email protected]>
[ Upstream commit 0b65c59e3a5475895c93ea5f130597db16b8abf6 ]
The moved check for the global partition ended up in the wrong place and I failed to spot this in my review. This moves it to the correct place.
--- drivers/soc/qcom/smem.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/soc/qcom/smem.c +5 -5
@@ -364,11 +364,6 @@ static int qcom_smem_alloc_private(struc end =phdr_to_last_uncached_entry (phdr); cached =phdr_to_last_cached_entry (phdr); -if (smem->global_partition) { -dev_err (smem->dev,"Already found the global partition\n" ); -return -EINVAL ; - } -while (hdr < end) {if (hdr->canary !=SMEM_PRIVATE_CANARY ) goto bad_canary;
@@ -736,6 +731,11 @@ static int qcom_smem_set_global_partitiobool found = false;int i; +if (smem->global_partition) { +dev_err (smem->dev,"Already found the global partition\n" ); +return -EINVAL ; + } + ptable =qcom_smem_get_ptable (smem);if (IS_ERR (ptable))return PTR_ERR (ptable);
Greg Kroah-Hartman
maintainerPATCH 82/235 s390/qeth: fix race in used-buffer accounting
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julian Wiedmann <[email protected]>
[ Upstream commit a702349a4099cd5a7bab0904689d8e0bf8dcd622 ]
By updating q->used_buffers only _after_ do_QDIO() has completed, there is a potential race against the buffer's TX completion. In the unlikely case that the TX completion path wins, qeth_qdio_output_handler() would decrement the counter before qeth_flush_buffers() even incremented it.
--- drivers/s390/net/qeth_core_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/s390/net/qeth_core_main.c +2 -1
@@ -3530,13 +3530,14 @@ static void qeth_flush_buffers(struct qe qdio_flags =QDIO_FLAG_SYNC_OUTPUT ;if (atomic_read (&queue->set_pci_flags_count)) qdio_flags |=QDIO_FLAG_PCI_OUT ; +atomic_add (count, &queue->used_buffers); + rc =do_QDIO (CARD_DDEV (queue->card), qdio_flags, queue->queue_no, index, count);if (queue->card->options.performance_stats) queue->card->perf_stats.outbound_do_qdio_time +=qeth_get_micros () - queue->card->perf_stats.outbound_do_qdio_start_time; -atomic_add (count, &queue->used_buffers);if (rc) { queue->card->stats.tx_errors += count;/* ignore temporary SIGA errors without busy condition */
Greg Kroah-Hartman
maintainerPATCH 83/235 s390/qeth: reset layer2 attribute on layer switch
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julian Wiedmann <[email protected]>
[ Upstream commit 70551dc46ffa3555a0b5f3545b0cd87ab67fd002 ]
After the subdriver's remove() routine has completed, the card's layer mode is undetermined again. Reflect this in the layer2 field.
If qeth_dev_layer2_store() hits an error after remove() was called, the card _always_ requires a setup(), even if the previous layer mode is requested again.
But qeth_dev_layer2_store() bails out early if the requested layer mode still matches the current one. So unless we reset the layer2 field, re-probing the card back to its previous mode is currently not possible.
--- drivers/s390/net/qeth_core_sys.c | 1 + 1 file changed, 1 insertion(+)
drivers/s390/net/qeth_core_sys.c +1 -0
@@ -426,6 +426,7 @@ static ssize_t qeth_dev_layer2_store(strif (card->discipline) { card->discipline->remove (card->gdev);qeth_core_free_discipline (card); + card->options.layer2 =-1 ; } rc =qeth_core_load_discipline (card, newdis);
Greg Kroah-Hartman
maintainerPATCH 84/235 platform/x86: toshiba_acpi: Fix defined but not used build warnings
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit c2e2a618eb7104e18fdcf739d4d911563812a81c ]
Fix a build warning in toshiba_acpi.c when CONFIG_PROC_FS is not enabled by marking the unused function as __maybe_unused.
../drivers/platform/x86/toshiba_acpi.c:1685:12: warning: 'version_proc_show' defined but not used [-Wunused-function]
--- drivers/platform/x86/toshiba_acpi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/platform/x86/toshiba_acpi.c +2 -1
@@ -34,6 +34,7 @@#define TOSHIBA_ACPI_VERSION "0.24"#define PROC_INTERFACE_VERSION 1 +#include <linux/compiler.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h>
@@ -1682,7 +1683,7 @@ static const struct file_operations keys .write = keys_proc_write, }; -static int version_proc_show (struct seq_file *m,void *v) +static int __maybe_unused version_proc_show (struct seq_file *m,void *v) {seq_printf (m,"driver: %s\n" ,TOSHIBA_ACPI_VERSION );seq_printf (m,"proc_interface: %d\n" ,PROC_INTERFACE_VERSION );
Greg Kroah-Hartman
maintainerPATCH 85/235 KVM: arm/arm64: Fix vgic init race
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoffer Dall <[email protected]>
[ Upstream commit 1d47191de7e15900f8fbfe7cccd7c6e1c2d7c31a ]
The vgic_init function can race with kvm_arch_vcpu_create() which does not hold kvm_lock() and we therefore have no synchronization primitives to ensure we're doing the right thing.
As the user is trying to initialize or run the VM while at the same time creating more VCPUs, we just have to refuse to initialize the VGIC in this case rather than silently failing with a broken VCPU.
--- virt/kvm/arm/vgic/vgic-init.c | 4 ++++ 1 file changed, 4 insertions(+)
virt/kvm/arm/vgic/vgic-init.c +4 -0
@@ -271,6 +271,10 @@ int vgic_init(struct kvm *kvm)if (vgic_initialized (kvm))return 0 ; +/* Are we also in the middle of creating a VCPU? */ +if (kvm->created_vcpus !=atomic_read (&kvm->online_vcpus)) +return -EBUSY ; +/* freeze the number of spis */ if (!dist->nr_spis) dist->nr_spis =VGIC_NR_IRQS_LEGACY -VGIC_NR_PRIVATE_IRQS ;
Greg Kroah-Hartman
maintainerPATCH 86/235 drivers/base: stop new probing during shutdown
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pingfan Liu <[email protected]>
[ Upstream commit 3297c8fc65af5d40501ea7cddff1b195cae57e4e ]
There is a race window in device_shutdown(), which may cause -1. parent device shut down before child or
-2. no shutdown on a new probing device.
For 1st, taking the following scenario:
device_shutdown new plugin device
list_del_init(parent_dev);
spin_unlock(list_lock);
device_add(child) probe child
shutdown parent_dev
--> now child is on the tail of devices_kset
For 2nd, taking the following scenario:
device_shutdown new plugin device
device_add(dev)
device_lock(dev);
...
device_unlock(dev);
probe dev
--> now, the new occurred dev has no opportunity to shutdownTo fix this race issue, just prevent the new probing request. With this logic, device_shutdown() is more similar to dpm_prepare().
--- drivers/base/core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/base/core.c +3 -0
@@ -2809,6 +2809,9 @@ void device_shutdown(void) {struct device *dev, *parent; +wait_for_device_probe (); +device_block_probing (); +spin_lock (&devices_kset->list_lock);/* * Walk the devices list backward, shutting down each in turn.
Greg Kroah-Hartman
maintainerPATCH 87/235 i2c: aspeed: Fix initial values of master and slave state
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jae Hyun Yoo <[email protected]>
[ Upstream commit 517fde0eb5a8f46c54ba6e2c36e32563b23cb14f ]
This patch changes the order of enum aspeed_i2c_master_state and enum aspeed_i2c_slave_state defines to make their initial value to ASPEED_I2C_MASTER_INACTIVE and ASPEED_I2C_SLAVE_STOP respectively. In case of multi-master use, if a slave data comes ahead of the first master xfer, master_state starts from an invalid state so this change fixes the issue.
--- drivers/i2c/busses/i2c-aspeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-aspeed.c +2 -2
@@ -111,22 +111,22 @@#define ASPEED_I2CD_DEV_ADDR_MASK GENMASK(6, 0)enum aspeed_i2c_master_state { +ASPEED_I2C_MASTER_INACTIVE ,ASPEED_I2C_MASTER_START ,ASPEED_I2C_MASTER_TX_FIRST ,ASPEED_I2C_MASTER_TX ,ASPEED_I2C_MASTER_RX_FIRST ,ASPEED_I2C_MASTER_RX ,ASPEED_I2C_MASTER_STOP , -ASPEED_I2C_MASTER_INACTIVE , };enum aspeed_i2c_slave_state { +ASPEED_I2C_SLAVE_STOP ,ASPEED_I2C_SLAVE_START ,ASPEED_I2C_SLAVE_READ_REQUESTED ,ASPEED_I2C_SLAVE_READ_PROCESSED ,ASPEED_I2C_SLAVE_WRITE_REQUESTED ,ASPEED_I2C_SLAVE_WRITE_RECEIVED , -ASPEED_I2C_SLAVE_STOP , };struct aspeed_i2c_bus {
Greg Kroah-Hartman
maintainerPATCH 88/235 drm/amd/pp: Set Max clock level to display by default
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rex Zhu <[email protected]>
[ Upstream commit 97e8f102f5a9123d30258e196c6c1ea29cf52e83 ]
avoid the error in dmesg:
[drm:dm_pp_get_static_clocks]
*ERROR* DM_PPLIB: invalid powerlevel state: 0!
--- drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/powerplay/amd_powerplay.c +7 -2
@@ -1020,7 +1020,7 @@ static int pp_get_display_power_level(vostatic int pp_get_current_clocks (void *handle,struct amd_pp_clock_info *clocks) { -struct amd_pp_simple_clock_info simple_clocks; +struct amd_pp_simple_clock_info simple_clocks = {0 };struct pp_clock_info hw_clocks;struct pp_hwmgr *hwmgr = handle;int ret =0 ;
@@ -1056,7 +1056,10 @@ static int pp_get_current_clocks(void *h clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk; clocks->min_engine_clock_in_sr = hw_clocks.min_eng_clk; - clocks->max_clocks_state = simple_clocks.level; +if (simple_clocks.level ==0 ) + clocks->max_clocks_state =PP_DAL_POWERLEVEL_7 ; +else + clocks->max_clocks_state = simple_clocks.level;if (0 ==phm_get_current_shallow_sleep_clocks (hwmgr, &hwmgr->current_ps->hardware, &hw_clocks)) { clocks->max_engine_clock_in_sr = hw_clocks.max_eng_clk;
@@ -1159,6 +1162,8 @@ static int pp_get_display_mode_validatioif (!hwmgr || !hwmgr->pm_en ||!clocks)return -EINVAL ; + clocks->level =PP_DAL_POWERLEVEL_7 ; +mutex_lock (&hwmgr->smu_lock);if (phm_cap_enabled (hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_DynamicPatchPowerState))
Greg Kroah-Hartman
maintainerPATCH 89/235 regulator: qcom_spmi: Use correct regmap when checking for error
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Cassel <[email protected]>
[ Upstream commit 85046a15529606466bc778e1205f4cab8e3724d1 ]
Since we have just assigned saw_regmap, and since the error message refers to saw_regmap, it feels safe to assume that it is saw_regmap, and not regmap, that should be checked for errors.
--- drivers/regulator/qcom_spmi-regulator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/regulator/qcom_spmi-regulator.c +1 -1
@@ -1774,7 +1774,7 @@ static int qcom_spmi_regulator_probe(str syscon =of_parse_phandle (node,"qcom,saw-reg" ,0 ); saw_regmap =syscon_node_to_regmap (syscon);of_node_put (syscon); -if (IS_ERR (regmap)) +if (IS_ERR (saw_regmap))dev_err (dev,"ERROR reading SAW regmap\n" ); }
Greg Kroah-Hartman
maintainerPATCH 90/235 regulator: qcom_spmi: Fix warning Bad of_node_put()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Cassel <[email protected]>
[ Upstream commit fffe7f52eb5db41eedadba9a8038e982dcfaee0c ]
For of_find_node_by_name(), you typically pass what the previous call returned. Therefore, of_find_node_by_name() increases the refcount of the returned node, and decreases the refcount of the node passed as the first argument.
of_find_node_by_name() is incorrectly used, and produces a warning. Fix the warning by using the more suitable function of_get_child_by_name().
Also add a missing of_node_put() for the returned value, since this was previously being leaked.
OF: ERROR: Bad of_node_put() on /soc/qcom,spmi@400f000/pmic@3/regulators
CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W 4.18.0-rc4-00223-gefd7b360b70e #12 Hardware name: Qualcomm Technologies, Inc. DB820c (DT) Call trace: dump_backtrace+0x0/0x1a8 show_stack+0x14/0x20 dump_stack+0x90/0xb4 of_node_release+0x74/0x78 kobject_put+0x90/0x1f0 of_node_put+0x14/0x20 of_find_node_by_name+0x80/0xd8 qcom_spmi_regulator_probe+0x30c/0x508
--- drivers/regulator/qcom_spmi-regulator.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-)
drivers/regulator/qcom_spmi-regulator.c +20 -12
@@ -1752,7 +1752,8 @@ static int qcom_spmi_regulator_probe(strconst char *name;struct device *dev = &pdev->dev;struct device_node *node = pdev->dev.of_node; -struct device_node *syscon; +struct device_node *syscon, *reg_node; +struct property *reg_prop;int ret, lenp;struct list_head *vreg_list;
@@ -1780,10 +1781,13 @@ static int qcom_spmi_regulator_probe(strfor (reg = match->data; reg->name; reg++) { -if (saw_regmap && \ -of_find_property (of_find_node_by_name (node, reg->name), \ -"qcom,saw-slave" , &lenp)) { -continue ; +if (saw_regmap) { + reg_node =of_get_child_by_name (node, reg->name); + reg_prop =of_find_property (reg_node,"qcom,saw-slave" , + &lenp); +of_node_put (reg_node); +if (reg_prop) +continue ; } vreg =devm_kzalloc (dev,sizeof (*vreg),GFP_KERNEL );
@@ -1816,13 +1820,17 @@ static int qcom_spmi_regulator_probe(strif (ret)continue ; -if (saw_regmap && \ -of_find_property (of_find_node_by_name (node, reg->name), \ -"qcom,saw-leader" , &lenp)) { - spmi_saw_ops = *(vreg->desc.ops); - spmi_saw_ops.set_voltage_sel = \ - spmi_regulator_saw_set_voltage; - vreg->desc.ops = &spmi_saw_ops; +if (saw_regmap) { + reg_node =of_get_child_by_name (node, reg->name); + reg_prop =of_find_property (reg_node,"qcom,saw-leader" , + &lenp); +of_node_put (reg_node); +if (reg_prop) { + spmi_saw_ops = *(vreg->desc.ops); + spmi_saw_ops.set_voltage_sel = + spmi_regulator_saw_set_voltage; + vreg->desc.ops = &spmi_saw_ops; + } } config.dev = dev;
Greg Kroah-Hartman
maintainerPATCH 91/235 iommu/ipmmu-vmsa: IMUCTRn.TTSEL needs a special usage on R-Car Gen3
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
[ Upstream commit 2ae86955703e9e6a119af4bbe27f6b6dd7a43131 ]
The TTSEL bit of IMUCTRn register of R-Car Gen3 needs to be set unused MMU context number even if uTLBs are disabled (The MMUEN bit of IMUCTRn register = 0).
Since initial values of IMUCTRn.TTSEL on all IPMMU-domains are 0, this patch adds a new feature "reserved_context" to reserve IPMMU context number 0 as the unused MMU context.
--- drivers/iommu/ipmmu-vmsa.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iommu/ipmmu-vmsa.c +8 -0
@@ -47,6 +47,7 @@ struct ipmmu_features {unsigned int number_of_contexts;bool setup_imbuscr;bool twobit_imttbcr_sl0; +bool reserved_context; };struct ipmmu_vmsa_device {
@@ -916,6 +917,7 @@ static const struct ipmmu_features ipmmu .number_of_contexts = 1, /* software only tested with one context */ .setup_imbuscr = true, .twobit_imttbcr_sl0 = false, + .reserved_context = false, };static const struct ipmmu_features ipmmu_features_r8a7795 = {
@@ -924,6 +926,7 @@ static const struct ipmmu_features ipmmu .number_of_contexts = 8, .setup_imbuscr = false, .twobit_imttbcr_sl0 = true, + .reserved_context = true, };static const struct of_device_id ipmmu_of_ids[] = {
@@ -1017,6 +1020,11 @@ static int ipmmu_probe(struct platform_d }ipmmu_device_reset (mmu); + +if (mmu->features->reserved_context) { +dev_info (&pdev->dev,"IPMMU context 0 is reserved\n" ); +set_bit (0 , mmu->ctx); + } }/*
Greg Kroah-Hartman
maintainerPATCH 92/235 dmaengine: mv_xor_v2: kill the tasklets upon exit
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hanna Hawa <[email protected]>
[ Upstream commit 8bbafed8dd5cfa81071b50ead5cb60367fdef3a9 ]
The mv_xor_v2 driver uses a tasklet, initialized during the probe() routine. However, it forgets to cleanup the tasklet using tasklet_kill() function during the remove() routine, which this patch fixes. This prevents the tasklet from potentially running after the module has been removed.
--- drivers/dma/mv_xor_v2.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma/mv_xor_v2.c +2 -0
@@ -899,6 +899,8 @@ static int mv_xor_v2_remove(struct platfplatform_msi_domain_free_irqs (&pdev->dev); +tasklet_kill (&xor_dev->irq_tasklet); +clk_disable_unprepare (xor_dev->clk);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 93/235 crypto: sharah - Unregister correct algorithms for SAHARA 3
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Müller <[email protected]>
[ Upstream commit 0e7d4d932ffc23f75efb31a8c2ac2396c1b81c55 ]
This patch fixes two typos related to unregistering algorithms supported by SAHARAH 3. In sahara_register_algs the wrong algorithms are unregistered in case of an error. In sahara_unregister_algs the wrong array is used to determine the iteration count.
--- drivers/crypto/sahara.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/sahara.c +2 -2
@@ -1351,7 +1351,7 @@ err_sha_v4_algs: err_sha_v3_algs:for (j =0 ; j < k; j++) -crypto_unregister_ahash (&sha_v4_algs[j]); +crypto_unregister_ahash (&sha_v3_algs[j]); err_aes_algs:for (j =0 ; j < i; j++)
@@ -1367,7 +1367,7 @@ static void sahara_unregister_algs(strucfor (i =0 ; i <ARRAY_SIZE (aes_algs); i++)crypto_unregister_alg (&aes_algs[i]); -for (i =0 ; i <ARRAY_SIZE (sha_v4_algs); i++) +for (i =0 ; i <ARRAY_SIZE (sha_v3_algs); i++)crypto_unregister_ahash (&sha_v3_algs[i]);if (dev->version >SAHARA_VERSION_3 )
Greg Kroah-Hartman
maintainerPATCH 94/235 x86/pti: Check the return value of pti_user_pagetable_walk_p4d()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiang Biao <[email protected]>
[ Upstream commit b2b7d986a89b6c94b1331a909de1217214fb08c1 ]
pti_user_pagetable_walk_p4d() can return NULL, so the return value should be checked to prevent a NULL pointer dereference.
Add the check and a warning when the P4D allocation fails.
--- arch/x86/mm/pti.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/x86/mm/pti.c +9 -2
@@ -177,7 +177,7 @@ static p4d_t *pti_user_pagetable_walk_p4if (pgd_none (*pgd)) {unsigned long new_p4d_page =__get_free_page (gfp); -if (!new_p4d_page) +if (WARN_ON_ONCE (!new_p4d_page))return NULL ;set_pgd (pgd,__pgd (_KERNPG_TABLE |__pa (new_p4d_page)));
@@ -196,9 +196,13 @@ static p4d_t *pti_user_pagetable_walk_p4static pmd_t *pti_user_pagetable_walk_pmd (unsigned long address) {gfp_t gfp = (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO); -p4d_t *p4d =pti_user_pagetable_walk_p4d (address); +p4d_t *p4d;pud_t *pud; + p4d =pti_user_pagetable_walk_p4d (address); +if (!p4d) +return NULL ; +BUILD_BUG_ON (p4d_large (*p4d) !=0 );if (p4d_none (*p4d)) {unsigned long new_pud_page =__get_free_page (gfp);
@@ -355,6 +359,9 @@ static void __init pti_clone_p4d(unsignepgd_t *kernel_pgd; user_p4d =pti_user_pagetable_walk_p4d (addr); +if (!user_p4d) +return ; + kernel_pgd =pgd_offset_k (addr); kernel_p4d =p4d_offset (kernel_pgd, addr); *user_p4d = *kernel_p4d;
Greg Kroah-Hartman
maintainerPATCH 95/235 x86/pti: Check the return value of pti_user_pagetable_walk_pmd()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiang Biao <[email protected]>
[ Upstream commit 8c934e01a7ce685d98e970880f5941d79272c654 ]
pti_user_pagetable_walk_pmd() can return NULL, so the return value should be checked to prevent a NULL pointer dereference.
Add the check and a warning when the PMD allocation fails.
--- arch/x86/mm/pti.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/x86/mm/pti.c +7 -3
@@ -206,7 +206,7 @@ static pmd_t *pti_user_pagetable_walk_pmBUILD_BUG_ON (p4d_large (*p4d) !=0 );if (p4d_none (*p4d)) {unsigned long new_pud_page =__get_free_page (gfp); -if (!new_pud_page) +if (WARN_ON_ONCE (!new_pud_page))return NULL ;set_p4d (p4d,__p4d (_KERNPG_TABLE |__pa (new_pud_page)));
@@ -220,7 +220,7 @@ static pmd_t *pti_user_pagetable_walk_pm }if (pud_none (*pud)) {unsigned long new_pmd_page =__get_free_page (gfp); -if (!new_pmd_page) +if (WARN_ON_ONCE (!new_pmd_page))return NULL ;set_pud (pud,__pud (_KERNPG_TABLE |__pa (new_pmd_page)));
@@ -242,9 +242,13 @@ static pmd_t *pti_user_pagetable_walk_pmstatic __init pte_t *pti_user_pagetable_walk_pte (unsigned long address) {gfp_t gfp = (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO); -pmd_t *pmd =pti_user_pagetable_walk_pmd (address); +pmd_t *pmd;pte_t *pte; + pmd =pti_user_pagetable_walk_pmd (address); +if (!pmd) +return NULL ; +/* We can't do anything sensible if we hit a large mapping. */ if (pmd_large (*pmd)) {WARN_ON (1 );
Greg Kroah-Hartman
maintainerPATCH 96/235 x86/mm/pti: Add an overflow check to pti_clone_pmds()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joerg Roedel <[email protected]>
[ Upstream commit 935232ce28dfabff1171e5a7113b2d865fa9ee63 ]
The addr counter will overflow if the last PMD of the address space is cloned, resulting in an endless loop.
Check for that and bail out of the loop when it happens.
--- arch/x86/mm/pti.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/mm/pti.c +4 -0
@@ -306,6 +306,10 @@ pti_clone_pmds(unsigned long start, unsip4d_t *p4d;pud_t *pud; +/* Overflow check */ +if (addr < start) +break ; + pgd =pgd_offset_k (addr);if (WARN_ON (pgd_none (*pgd)))return ;
Greg Kroah-Hartman
maintainerPATCH 97/235 PCI/AER: Honor "pcie_ports=native" even if HEST sets FIRMWARE_FIRST
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandru Gagniuc <[email protected]>
[ Upstream commit 7af02fcd84c16801958936f88b848944c726ca07 ]
According to the documentation, "pcie_ports=native", linux should use native AER and DPC services. While that is true for the _OSC method parsing, this is not the only place that is checked. Should the HEST list PCIe ports as firmware-first, linux will not use native services.
This happens because aer_acpi_firmware_first() doesn't take 'pcie_ports' into account. This is wrong. DPC uses the same logic when it decides whether to load or not, so fixing this also fixes DPC not loading.
--- drivers/pci/pcie/aer.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/pci/pcie/aer.c +6 -0
@@ -303,6 +303,9 @@ int pcie_aer_get_firmware_first(struct pif (!pci_is_pcie (dev))return 0 ; +if (pcie_ports_native) +return 0 ; +if (!dev->__aer_firmware_first_valid)aer_set_firmware_first (dev);return dev->__aer_firmware_first;
@@ -323,6 +326,9 @@ bool aer_acpi_firmware_first(void) .firmware_first = 0, }; +if (pcie_ports_native) +return false; +if (!parsed) {apei_hest_parse (aer_hest_parse, &info); aer_firmware_first = info.firmware_first;
Greg Kroah-Hartman
maintainerPATCH 98/235 xen-netfront: fix warn message as irq device name has /
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiao Liang <[email protected]>
[ Upstream commit 21f2706b20100bb3db378461ab9b8e2035309b5b ]
There is a call trace generated after commit 2d408c0d4574b01b9ed45e02516888bf925e11a9(
xen-netfront: fix queue name setting). There is no 'device/vif/xx-q0-tx' file found under /proc/irq/xx/.
This patch only picks up device type and id as its name.
With the patch, now /proc/interrupts looks like below and the warning message gone:
70: 21 0 0 0 xen-dyn -event vif0-q0-tx 71: 15 0 0 0 xen-dyn -event vif0-q0-rx 72: 14 0 0 0 xen-dyn -event vif0-q1-tx 73: 33 0 0 0 xen-dyn -event vif0-q1-rx 74: 12 0 0 0 xen-dyn -event vif0-q2-tx 75: 24 0 0 0 xen-dyn -event vif0-q2-rx 76: 19 0 0 0 xen-dyn -event vif0-q3-tx 77: 21 0 0 0 xen-dyn -event vif0-q3-rx
Below is call trace information without this patch:
name 'device/vif/0-q0-tx'
WARNING: CPU: 2 PID: 37 at fs/proc/generic.c:174 __xlate_proc_name+0x85/0xa0 RIP: 0010:__xlate_proc_name+0x85/0xa0 RSP: 0018:ffffb85c40473c18 EFLAGS: 00010286 RAX: 0000000000000000 RBX: 0000000000000006 RCX: 0000000000000006 RDX: 0000000000000007 RSI: 0000000000000096 RDI: ffff984c7f516930 RBP: ffffb85c40473cb8 R08: 000000000000002c R09: 0000000000000229 R10: 0000000000000000 R11: 0000000000000001 R12: ffffb85c40473c98 R13: ffffb85c40473cb8 R14: ffffb85c40473c50 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff984c7f500000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f69b6899038 CR3: 000000001c20a006 CR4: 00000000001606e0 Call Trace: __proc_create+0x45/0x230 ? snprintf+0x49/0x60 proc_mkdir_data+0x35/0x90 register_handler_proc+0xef/0x110 ? proc_register+0xfc/0x110 ? proc_create_data+0x70/0xb0 __setup_irq+0x39b/0x660 ? request_threaded_irq+0xad/0x160 request_threaded_irq+0xf5/0x160 ? xennet_tx_buf_gc+0x1d0/0x1d0 [xen_netfront] bind_evtchn_to_irqhandler+0x3d/0x70 ? xenbus_alloc_evtchn+0x41/0xa0 netback_changed+0xa46/0xcda [xen_netfront] ? find_watch+0x40/0x40 xenwatch_thread+0xc5/0x160 ? finish_wait+0x80/0x80 kthread+0x112/0x130 ? kthread_create_worker_on_cpu+0x70/0x70 ret_from_fork+0x35/0x40 Code: 81 5c 00 48 85 c0 75 cc 5b 49 89 2e 31 c0 5d 4d 89 3c 24 41 5c 41 5d 41 5e 41 5f c3 4c 89 ee 48 c7 c7 40 4f 0e b4 e8 65 ea d8 ff <0f> 0b b8 fe ff ff ff 5b 5d 41 5c 41 5d 41 5e 41 5f c3 66 0f 1f ---[ end trace 650e5561b0caab3a ]---
--- drivers/net/xen-netfront.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/xen-netfront.c +4 -2
@@ -1603,14 +1603,16 @@ static int xennet_init_queue(struct netf {unsigned short i;int err =0 ; +char *devid;spin_lock_init (&queue->tx_lock);spin_lock_init (&queue->rx_lock);timer_setup (&queue->rx_refill_timer, rx_refill_timeout,0 ); -snprintf (queue->name,sizeof (queue->name),"%s-q%u" , - queue->info->xbdev->nodename, queue->id); + devid =strrchr (queue->info->xbdev->nodename,'/' ) +1 ; +snprintf (queue->name,sizeof (queue->name),"vif%s-q%u" , + devid, queue->id);/* Initialise tx_skbs as a free chain containing every entry. */ queue->tx_skb_freelist =0 ;
Greg Kroah-Hartman
maintainerPATCH 99/235 RDMA/cma: Protect cma dev list with lock
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Parav Pandit <[email protected]>
commit 954a8e3aea87e896e320cf648c1a5bbe47de443e upstream.
When AF_IB addresses are used during rdma_resolve_addr() a lock is not held. A cma device can get removed while list traversal is in progress which may lead to crash. ie
CPU0 CPU1
==== ====
rdma_resolve_addr()
cma_resolve_ib_dev()
list_for_each() cma_remove_one()
cur_dev->device mutex_lock(&lock)
list_del();
mutex_unlock(&lock);
cma_process_remove();Therefore, hold a lock while traversing the list which avoids such situation.
--- drivers/infiniband/core/cma.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/infiniband/core/cma.c +7 -5
@@ -722,6 +722,7 @@ static int cma_resolve_ib_dev(struct rdm dgid = (union ib_gid *) &addr->sib_addr; pkey =ntohs (addr->sib_pkey); +mutex_lock (&lock);list_for_each_entry (cur_dev, &dev_list, list) {for (p =1 ; p <= cur_dev->device->phys_port_cnt; ++p) {if (!rdma_cap_af_ib (cur_dev->device, p))
@@ -748,18 +749,19 @@ static int cma_resolve_ib_dev(struct rdm cma_dev = cur_dev; sgid = gid; id_priv->id.port_num = p; + goto found; } } } } - -if (!cma_dev) -return -ENODEV ; +mutex_unlock (&lock); +return -ENODEV ; found:cma_attach_to_dev (id_priv, cma_dev); - addr = (struct sockaddr_ib *)cma_src_addr (id_priv); -memcpy (&addr->sib_addr, &sgid,sizeof sgid); +mutex_unlock (&lock); + addr = (struct sockaddr_ib *)cma_src_addr (id_priv); +memcpy (&addr->sib_addr, &sgid,sizeof (sgid));cma_translate_ib (addr, &id_priv->id.route.addr.dev_addr);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 100/235 pstore: Fix incorrect persistent ram buffer mapping
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bin Yang <[email protected]>
commit 831b624df1b420c8f9281ed1307a8db23afb72df upstream.
persistent_ram_vmap() returns the page start vaddr. persistent_ram_iomap() supports non-page-aligned mapping.
persistent_ram_buffer_map() always adds offset-in-page to the vaddr returned from these two functions, which causes incorrect mapping of non-page-aligned persistent ram buffer.
By default ftrace_size is 4096 and max_ftrace_cnt is nr_cpu_ids. Without this patch, the zone_sz in ramoops_init_przs() is 4096/nr_cpu_ids which might not be page aligned. If the offset-in-page > 2048, the vaddr will be in next page. If the next page is not mapped, it will cause kernel panic:
[ 0.074231] BUG: unable to handle kernel paging request at ffffa19e0081b000 ... [ 0.075000] RIP: 0010:persistent_ram_new+0x1f8/0x39f ... [ 0.075000] Call Trace: [ 0.075000] ramoops_init_przs.part.10.constprop.15+0x105/0x260 [ 0.075000] ramoops_probe+0x232/0x3a0 [ 0.075000] platform_drv_probe+0x3e/0xa0 [ 0.075000] driver_probe_device+0x2cd/0x400 [ 0.075000] __driver_attach+0xe4/0x110 [ 0.075000] ? driver_probe_device+0x400/0x400 [ 0.075000] bus_for_each_dev+0x70/0xa0 [ 0.075000] driver_attach+0x1e/0x20 [ 0.075000] bus_add_driver+0x159/0x230 [ 0.075000] ? do_early_param+0x95/0x95 [ 0.075000] driver_register+0x70/0xc0 [ 0.075000] ? init_pstore_fs+0x4d/0x4d [ 0.075000] __platform_driver_register+0x36/0x40 [ 0.075000] ramoops_init+0x12f/0x131 [ 0.075000] do_one_initcall+0x4d/0x12c [ 0.075000] ? do_early_param+0x95/0x95 [ 0.075000] kernel_init_freeable+0x19b/0x222 [ 0.075000] ? rest_init+0xbb/0xbb [ 0.075000] kernel_init+0xe/0xfc [ 0.075000] ret_from_fork+0x3a/0x50
--- fs/pstore/ram_core.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
fs/pstore/ram_core.c +14 -3
@@ -429,7 +429,12 @@ static void *persistent_ram_vmap(phys_ad vaddr =vmap (pages, page_count,VM_MAP , prot);kfree (pages); -return vaddr; +/* +* Since vmap() uses page granularity, we must add the offset +* into the page here, to get the byte granularity address +* into the mapping to represent the actual "start" location. +*/ +return vaddr +offset_in_page (start); } static void *persistent_ram_iomap(phys_addr_t start, size_t size,
@@ -448,6 +453,11 @@ static void *persistent_ram_iomap(phys_aelse va =ioremap_wc (start, size); +/* +* Since request_mem_region() and ioremap() are byte-granularity +* there is no need handle anything special like we do when the +* vmap() case in persistent_ram_vmap() above. +*/ return va; }
@@ -468,7 +478,7 @@ static int persistent_ram_buffer_map(phyreturn -ENOMEM ; } - prz->buffer = prz->vaddr +offset_in_page (start); + prz->buffer = prz->vaddr; prz->buffer_size = size -sizeof (struct persistent_ram_buffer );return 0 ;
@@ -515,7 +525,8 @@ void persistent_ram_free(struct persisteif (prz->vaddr) {if (pfn_valid (prz->paddr >>PAGE_SHIFT )) { -vunmap (prz->vaddr); +/* We must vunmap() at page-granularity. */ +vunmap (prz->vaddr -offset_in_page (prz->paddr)); }else {iounmap (prz->vaddr);release_mem_region (prz->paddr, prz->size);
Greg Kroah-Hartman
maintainerPATCH 101/235 xen/netfront: fix waiting for xenbus state change
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit 8edfe2e992b75aee3da9316e9697c531194c2f53 upstream.
Commit 822fb18a82aba ("xen-netfront: wait xenbus state change when load module manually") added a new wait queue to wait on for a state change when the module is loaded manually. Unfortunately there is no wakeup anywhere to stop that waiting.
Instead of introducing a new wait queue rename the existing module_unload_q to module_wq and use it for both purposes (loading and unloading).
As any state change of the backend might be intended to stop waiting do the wake_up_all() in any case when netback_changed() is called.
--- drivers/net/xen-netfront.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-)
drivers/net/xen-netfront.c +10 -14
@@ -87,8 +87,7 @@ struct netfront_cb {/* IRQ name is queue name with "-tx" or "-rx" appended */ #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) -static DECLARE_WAIT_QUEUE_HEAD (module_load_q); -static DECLARE_WAIT_QUEUE_HEAD (module_unload_q); +static DECLARE_WAIT_QUEUE_HEAD (module_wq);struct netfront_stats {u64 packets;
@@ -1331,11 +1330,11 @@ static struct net_device *xennet_create_netif_carrier_off (netdev);xenbus_switch_state (dev, XenbusStateInitialising); -wait_event (module_load_q, -xenbus_read_driver_state (dev->otherend) != - XenbusStateClosed && -xenbus_read_driver_state (dev->otherend) != - XenbusStateUnknown); +wait_event (module_wq, +xenbus_read_driver_state (dev->otherend) != + XenbusStateClosed && +xenbus_read_driver_state (dev->otherend) != + XenbusStateUnknown);return netdev; exit:
@@ -2009,15 +2008,14 @@ static void netback_changed(struct xenbudev_dbg (&dev->dev,"%s\n" ,xenbus_strstate (backend_state)); +wake_up_all (&module_wq); +switch (backend_state) {case XenbusStateInitialising:case XenbusStateInitialised:case XenbusStateReconfiguring:case XenbusStateReconfigured: -break ; -case XenbusStateUnknown: -wake_up_all (&module_unload_q);break ;case XenbusStateInitWait:
@@ -2033,12 +2031,10 @@ static void netback_changed(struct xenbubreak ;case XenbusStateClosed: -wake_up_all (&module_unload_q);if (dev->state == XenbusStateClosed)break ;/* Missed the backend's CLOSING state -- fallthrough */ case XenbusStateClosing: -wake_up_all (&module_unload_q);xenbus_frontend_closed (dev);break ; }
@@ -2146,14 +2142,14 @@ static int xennet_remove(struct xenbus_d if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) { xenbus_switch_state(dev, XenbusStateClosing); - wait_event(module_unload_q, + wait_event(module_wq, xenbus_read_driver_state(dev->otherend) == XenbusStateClosing || xenbus_read_driver_state(dev->otherend) == XenbusStateUnknown); xenbus_switch_state(dev, XenbusStateClosed); - wait_event(module_unload_q, + wait_event(module_wq, xenbus_read_driver_state(dev->otherend) == XenbusStateClosed || xenbus_read_driver_state(dev->otherend) ==
Greg Kroah-Hartman
maintainerPATCH 102/235 IB/ipoib: Avoid a race condition between start_xmit and cm_rep_handler
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Knister <[email protected]>
commit 816e846c2eb9129a3e0afa5f920c8bbc71efecaa upstream.
Inside of start_xmit() the call to check if the connection is up and the queueing of the packets for later transmission is not atomic which leaves a window where cm_rep_handler can run, set the connection up, dequeue pending packets and leave the subsequently queued packets by start_xmit() sitting on neigh->queue until they're dropped when the connection is torn down. This only applies to connected mode. These dropped packets can really upset TCP, for example, and cause multi-minute delays in transmission for open connections.
Here's the code in start_xmit where we check to see if the connection is up:
if (ipoib_cm_get(neigh)) {
if (ipoib_cm_up(neigh)) {
ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
goto unref;
}
}The race occurs if cm_rep_handler execution occurs after the above connection check (specifically if it gets to the point where it acquires priv->lock to dequeue pending skb's) but before the below code snippet in start_xmit where packets are queued.
if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
push_pseudo_header(skb, phdr->hwaddr);
spin_lock_irqsave(&priv->lock, flags);
__skb_queue_tail(&neigh->queue, skb);
spin_unlock_irqrestore(&priv->lock, flags);
} else {
++dev->stats.tx_dropped;
dev_kfree_skb_any(skb);
}The patch acquires the netif tx lock in cm_rep_handler for the section where it sets the connection up and dequeues and retransmits deferred skb's.
--- drivers/infiniband/ulp/ipoib/ipoib_cm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/ulp/ipoib/ipoib_cm.c +2 -0
@@ -1028,12 +1028,14 @@ static int ipoib_cm_rep_handler(struct iskb_queue_head_init (&skqueue); +netif_tx_lock_bh (p->dev);spin_lock_irq (&priv->lock);set_bit (IPOIB_FLAG_OPER_UP , &p->flags);if (p->neigh)while ((skb =__skb_dequeue (&p->neigh->queue)))__skb_queue_tail (&skqueue, skb);spin_unlock_irq (&priv->lock); +netif_tx_unlock_bh (p->dev);while ((skb =__skb_dequeue (&skqueue))) { skb->dev = p->dev;
Greg Kroah-Hartman
maintainerPATCH 103/235 s390/crypto: Fix return code checking in cbc_paes_crypt()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ingo Franzki <[email protected]>
commit b81126e01a8c6048249955feea46c8217ebefa91 upstream.
The return code of cpacf_kmc() is less than the number of bytes to process in case of an error, not greater. The crypt routines for the other cipher modes already have this correctly.
--- arch/s390/crypto/paes_s390.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/crypto/paes_s390.c +1 -1
@@ -208,7 +208,7 @@ static int cbc_paes_crypt(struct blkciph walk->dst.virt.addr, walk->src.virt.addr, n);if (k) ret =blkcipher_walk_done (desc, walk, nbytes - k); -if (n < k) { +if (k < n) {if (__cbc_paes_set_key (ctx) !=0 )return blkcipher_walk_done (desc, walk, -EIO );memcpy (param.key, ctx->pk.protkey,MAXPROTKEYSIZE );
Greg Kroah-Hartman
maintainerPATCH 104/235 mmc: omap_hsmmc: fix wakeirq handling on removal
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andreas Kemnade <[email protected]>
commit 3c398f3c3bef21961eaaeb93227fa66d440dc83d upstream.
after unbinding mmc I get things like this:
[ 185.294067] mmc1: card 0001 removed [ 185.305206] omap_hsmmc 480b4000.mmc: wake IRQ with no resume: -13
The wakeirq stays in /proc-interrupts
rebinding shows this:
[ 289.795959] genirq: Flags mismatch irq 112. 0000200a (480b4000.mmc:wakeup) vs. 0000200a (480b4000.mmc:wakeup) [ 289.808959] omap_hsmmc 480b4000.mmc: Unable to request wake IRQ [ 289.815338] omap_hsmmc 480b4000.mmc: no SDIO IRQ support, falling back to polling
That bug seems to be introduced by switching from devm_request_irq() to generic wakeirq handling.
So let us cleanup at removal.
--- drivers/mmc/host/omap_hsmmc.c | 1 + 1 file changed, 1 insertion(+)
drivers/mmc/host/omap_hsmmc.c +1 -0
@@ -2177,6 +2177,7 @@ static int omap_hsmmc_remove(struct platdma_release_channel (host->tx_chan);dma_release_channel (host->rx_chan); +dev_pm_clear_wake_irq (host->dev);pm_runtime_dont_use_autosuspend (host->dev);pm_runtime_put_sync (host->dev);pm_runtime_disable (host->dev);
Greg Kroah-Hartman
maintainerPATCH 105/235 ipmi: Rework SMI registration failure
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corey Minyard <[email protected]>
commit 2512e40e48d21d8bac09f7e91d2c3ceb2d3b50b2 upstream.
There were certain situations where ipmi_register_smi() would return a failure, but the interface would still be registered and would need to be unregistered. This is obviously a bad design and resulted in an oops in certain failure cases.
If the interface is started up in ipmi_register_smi(), then an error occurs, shut down the interface there so the cleanup can be done properly.
Fix the various smi users, too.
--- drivers/char/ipmi/ipmi_msghandler.c | 53 ++++++++++++++++++++---------------- drivers/char/ipmi/ipmi_si_intf.c | 17 ++--------- drivers/char/ipmi/ipmi_ssif.c | 13 ++------ 3 files changed, 37 insertions(+), 46 deletions(-)
drivers/char/ipmi/ipmi_msghandler.c +30 -23
@@ -3381,39 +3381,45 @@ int ipmi_register_smi(const struct ipmi_ rv = handlers->start_processing (send_info, intf);if (rv) - goto out; + goto out_err; rv =__bmc_get_device_id (intf,NULL , &id,NULL ,NULL , i);if (rv) {dev_err (si_dev,"Unable to get the device id: %d\n" , rv); - goto out; + goto out_err_started; }mutex_lock (&intf->bmc_reg_mutex); rv =__scan_channels (intf, &id);mutex_unlock (&intf->bmc_reg_mutex); +if (rv) + goto out_err_bmc_reg; - out: -if (rv) { -ipmi_bmc_unregister (intf); -list_del_rcu (&intf->link); -mutex_unlock (&ipmi_interfaces_mutex); -synchronize_srcu (&ipmi_interfaces_srcu); -cleanup_srcu_struct (&intf->users_srcu); -kref_put (&intf->refcount, intf_free); - }else { -/* -* Keep memory order straight for RCU readers. Make -* sure everything else is committed to memory before -* setting intf_num to mark the interface valid. -*/ -smp_wmb (); - intf->intf_num = i; -mutex_unlock (&ipmi_interfaces_mutex); +/* +* Keep memory order straight for RCU readers. Make +* sure everything else is committed to memory before +* setting intf_num to mark the interface valid. +*/ +smp_wmb (); + intf->intf_num = i; +mutex_unlock (&ipmi_interfaces_mutex); -/* After this point the interface is legal to use. */ -call_smi_watchers (i, intf->si_dev); - } +/* After this point the interface is legal to use. */ +call_smi_watchers (i, intf->si_dev); + +return 0 ; + + out_err_bmc_reg: +ipmi_bmc_unregister (intf); + out_err_started: +if (intf->handlers->shutdown) + intf->handlers->shutdown (intf->send_info); + out_err: +list_del_rcu (&intf->link); +mutex_unlock (&ipmi_interfaces_mutex); +synchronize_srcu (&ipmi_interfaces_srcu); +cleanup_srcu_struct (&intf->users_srcu); +kref_put (&intf->refcount, intf_free);return rv; }
@@ -3504,7 +3510,8 @@ void ipmi_unregister_smi(struct ipmi_smi }srcu_read_unlock (&intf->users_srcu, index); - intf->handlers->shutdown (intf->send_info); +if (intf->handlers->shutdown) + intf->handlers->shutdown (intf->send_info);cleanup_smi_msgs (intf);
drivers/char/ipmi/ipmi_si_intf.c +4 -13
@@ -2083,18 +2083,9 @@ static int try_smi_init(struct smi_info si_to_str[new_smi->io.si_type]);WARN_ON (new_smi->io.dev->init_name !=NULL ); -kfree (init_name); - -return 0 ; - -out_err: -if (new_smi->intf) { -ipmi_unregister_smi (new_smi->intf); - new_smi->intf =NULL ; - } + out_err:kfree (init_name); -return rv; }
@@ -2227,6 +2218,8 @@ static void shutdown_smi(void *send_infokfree (smi_info->si_sm); smi_info->si_sm =NULL ; + + smi_info->intf =NULL ; }/*
@@ -2240,10 +2233,8 @@ static void cleanup_one_si(struct smi_inlist_del (&smi_info->link); -if (smi_info->intf) { +if (smi_info->intf)ipmi_unregister_smi (smi_info->intf); - smi_info->intf =NULL ; - }if (smi_info->pdev) {if (smi_info->pdev_registered)
drivers/char/ipmi/ipmi_ssif.c +3 -10
@@ -1214,18 +1214,11 @@ static void shutdown_ssif(void *send_infcomplete (&ssif_info->wake_thread);kthread_stop (ssif_info->thread); } - -/* -* No message can be outstanding now, we have removed the -* upper layer and it permitted us to do so. -*/ -kfree (ssif_info); }static int ssif_remove (struct i2c_client *client) {struct ssif_info *ssif_info =i2c_get_clientdata (client); -struct ipmi_smi *intf;struct ssif_addr_info *addr_info;if (!ssif_info)
@@ -1235,9 +1228,7 @@ static int ssif_remove(struct i2c_client* After this point, we won't deliver anything asychronously * to the message handler. We can unregister ourself. */ - intf = ssif_info->intf; - ssif_info->intf =NULL ; -ipmi_unregister_smi (intf); +ipmi_unregister_smi (ssif_info->intf);list_for_each_entry (addr_info, &ssif_infos, link) {if (addr_info->client == client) {
@@ -1246,6 +1237,8 @@ static int ssif_remove(struct i2c_client } } +kfree (ssif_info); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 106/235 ipmi: Move BT capabilities detection to the detect call
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corey Minyard <[email protected]>
commit c86ba91be75702c013bbf7379542920b6920e98f upstream.
The capabilities detection was being done as part of the normal state machine, but it was possible for it to be running while the upper layers of the IPMI driver were initializing the device, resulting in error and failure to initialize.
Move the capabilities detection to the the detect function, so it's done before anything else runs on the device. This also simplifies the state machine and removes some code, as a bonus.
--- drivers/char/ipmi/ipmi_bt_sm.c | 92 +++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 44 deletions(-)
drivers/char/ipmi/ipmi_bt_sm.c +48 -44
@@ -59,8 +59,6 @@ enum bt_states {BT_STATE_RESET3 ,BT_STATE_RESTART ,BT_STATE_PRINTME , -BT_STATE_CAPABILITIES_BEGIN , -BT_STATE_CAPABILITIES_END , BT_STATE_LONG_BUSY /* BT doesn't get hosed :-) */ };
@@ -86,7 +84,6 @@ struct si_sm_data {int error_retries;/* end of "common" fields */ int nonzero_status;/* hung BMCs stay all 0 */ enum bt_states complete;/* to divert the state machine */ -int BT_CAP_outreqs;long BT_CAP_req2rsp;int BT_CAP_retries;/* Recommended retries */ };
@@ -137,8 +134,6 @@ static char *state2txt(unsigned char stacase BT_STATE_RESET3 :return ("RESET3" );case BT_STATE_RESTART :return ("RESTART" );case BT_STATE_LONG_BUSY :return ("LONG_BUSY" ); -case BT_STATE_CAPABILITIES_BEGIN :return ("CAP_BEGIN" ); -case BT_STATE_CAPABILITIES_END :return ("CAP_END" ); }return ("BAD STATE" ); }
@@ -185,7 +180,6 @@ static unsigned int bt_init_data(struct bt->complete =BT_STATE_IDLE ;/* end here */ bt->BT_CAP_req2rsp =BT_NORMAL_TIMEOUT *USEC_PER_SEC ; bt->BT_CAP_retries =BT_NORMAL_RETRY_LIMIT ; -/* BT_CAP_outreqs == zero is a flag to read BT Capabilities */ return 3 ;/* We claim 3 bytes of space; ought to check SPMI table */ }
@@ -451,7 +445,7 @@ static enum si_sm_result error_recovery(static enum si_sm_result bt_event (struct si_sm_data *bt,long time) { -unsigned char status,BT_CAP [8 ]; +unsigned char status;static enum bt_states last_printed =BT_STATE_PRINTME ;int i;
@@ -504,12 +498,6 @@ static enum si_sm_result bt_event(structif (status &BT_H_BUSY )/* clear a leftover H_BUSY */ BT_CONTROL (BT_H_BUSY ); - bt->timeout = bt->BT_CAP_req2rsp; - -/* Read BT capabilities if it hasn't been done yet */ -if (!bt->BT_CAP_outreqs) -BT_STATE_CHANGE (BT_STATE_CAPABILITIES_BEGIN , -SI_SM_CALL_WITHOUT_DELAY );BT_SI_SM_RETURN (SI_SM_IDLE );case BT_STATE_XACTION_START :
@@ -614,37 +602,6 @@ static enum si_sm_result bt_event(structBT_STATE_CHANGE (BT_STATE_XACTION_START ,SI_SM_CALL_WITH_DELAY ); -/* -* Get BT Capabilities, using timing of upper level state machine. -* Set outreqs to prevent infinite loop on timeout. -*/ -case BT_STATE_CAPABILITIES_BEGIN : - bt->BT_CAP_outreqs =1 ; - { -unsigned char GetBT_CAP[] = {0x18 ,0x36 }; - bt->state =BT_STATE_IDLE ; -bt_start_transaction (bt, GetBT_CAP,sizeof (GetBT_CAP)); - } - bt->complete =BT_STATE_CAPABILITIES_END ; -BT_STATE_CHANGE (BT_STATE_XACTION_START , -SI_SM_CALL_WITH_DELAY ); - -case BT_STATE_CAPABILITIES_END : - i =bt_get_result (bt,BT_CAP ,sizeof (BT_CAP )); -bt_init_data (bt, bt->io); -if ((i ==8 ) && !BT_CAP [2 ]) { - bt->BT_CAP_outreqs =BT_CAP [3 ]; - bt->BT_CAP_req2rsp =BT_CAP [6 ] *USEC_PER_SEC ; - bt->BT_CAP_retries =BT_CAP [7 ]; - }else -printk (KERN_WARNING "IPMI BT: using default values\n" ); -if (!bt->BT_CAP_outreqs) - bt->BT_CAP_outreqs =1 ; -printk (KERN_WARNING "IPMI BT: req2rsp=%ld secs retries=%d\n" , - bt->BT_CAP_req2rsp /USEC_PER_SEC , bt->BT_CAP_retries); - bt->timeout = bt->BT_CAP_req2rsp; -return SI_SM_CALL_WITHOUT_DELAY ; -default :/* should never occur */ return error_recovery(bt, status,
@@ -655,6 +612,11 @@ static enum si_sm_result bt_event(structstatic int bt_detect (struct si_sm_data *bt) { +unsigned char GetBT_CAP[] = {0x18 ,0x36 }; +unsigned char BT_CAP [8 ]; +enum si_sm_result smi_result; +int rv; +/* * It's impossible for the BT status and interrupt registers to be * all 1's, (assuming a properly functioning, self-initialized BMC)
@@ -665,6 +627,48 @@ static int bt_detect(struct si_sm_data *if ((BT_STATUS ==0xFF ) && (BT_INTMASK_R ==0xFF ))return 1 ;reset_flags (bt); + +/* +* Try getting the BT capabilities here. +*/ + rv =bt_start_transaction (bt, GetBT_CAP,sizeof (GetBT_CAP)); +if (rv) { +dev_warn (bt->io->dev, +"Can't start capabilities transaction: %d\n" , rv); + goto out_no_bt_cap; + } + + smi_result =SI_SM_CALL_WITHOUT_DELAY ; +for (;;) { +if (smi_result ==SI_SM_CALL_WITH_DELAY || + smi_result ==SI_SM_CALL_WITH_TICK_DELAY ) { +schedule_timeout_uninterruptible (1 ); + smi_result =bt_event (bt,jiffies_to_usecs (1 )); + }else if (smi_result ==SI_SM_CALL_WITHOUT_DELAY ) { + smi_result =bt_event (bt,0 ); + }else +break ; + } + + rv =bt_get_result (bt,BT_CAP ,sizeof (BT_CAP )); +bt_init_data (bt, bt->io); +if (rv <8 ) { +dev_warn (bt->io->dev,"bt cap response too short: %d\n" , rv); + goto out_no_bt_cap; + } + +if (BT_CAP [2 ]) { +dev_warn (bt->io->dev,"Error fetching bt cap: %x\n" ,BT_CAP [2 ]); +out_no_bt_cap: +dev_warn (bt->io->dev,"using default values\n" ); + }else { + bt->BT_CAP_req2rsp =BT_CAP [6 ] *USEC_PER_SEC ; + bt->BT_CAP_retries =BT_CAP [7 ]; + } + +dev_info (bt->io->dev,"req2rsp=%ld secs retries=%d\n" , + bt->BT_CAP_req2rsp /USEC_PER_SEC , bt->BT_CAP_retries); +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 107/235 ipmi: Fix I2C client removal in the SSIF driver
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corey Minyard <[email protected]>
commit 0745dde62835be7e2afe62fcdb482fcad79cb743 upstream.
The SSIF driver was removing any client that came in through the platform interface, but it should only remove clients that it added. On a failure in the probe function, this could result in the following oops when the driver is removed and the client gets unregistered twice:
CPU: 107 PID: 30266 Comm: rmmod Not tainted 4.18.0+ #80 Hardware name: Cavium Inc. Saber/Saber, BIOS Cavium reference firmware version 7.0 08/04/2018 pstate: 60400009 (nZCv daif +PAN -UAO) pc : kernfs_find_ns+0x28/0x120 lr : kernfs_find_and_get_ns+0x40/0x60 sp : ffff00002310fb50 x29: ffff00002310fb50 x28: ffff800a8240f800 x27: 0000000000000000 x26: 0000000000000000 x25: 0000000056000000 x24: ffff000009073000 x23: ffff000008998b38 x22: 0000000000000000 x21: ffff800ed86de820 x20: 0000000000000000 x19: ffff00000913a1d8 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 5300737265766972 x13: 643d4d4554535953 x12: 0000000000000030 x11: 0000000000000030 x10: 0101010101010101 x9 : ffff800ea06cc3f9 x8 : 0000000000000000 x7 : 0000000000000141 x6 : ffff000009073000 x5 : ffff800adb706b00 x4 : 0000000000000000 x3 : 00000000ffffffff x2 : 0000000000000000 x1 : ffff000008998b38 x0 : ffff000008356760 Process rmmod (pid: 30266, stack limit = 0x00000000e218418d) Call trace: kernfs_find_ns+0x28/0x120 kernfs_find_and_get_ns+0x40/0x60 sysfs_unmerge_group+0x2c/0x6c dpm_sysfs_remove+0x34/0x70 device_del+0x58/0x30c device_unregister+0x30/0x7c i2c_unregister_device+0x84/0x90 [i2c_core] ssif_platform_remove+0x38/0x98 [ipmi_ssif] platform_drv_remove+0x2c/0x6c device_release_driver_internal+0x168/0x1f8 driver_detach+0x50/0xbc bus_remove_driver+0x74/0xe8 driver_unregister+0x34/0x5c platform_driver_unregister+0x20/0x2c cleanup_ipmi_ssif+0x50/0xd82c [ipmi_ssif] __arm64_sys_delete_module+0x1b4/0x220 el0_svc_handler+0x104/0x160 el0_svc+0x8/0xc Code: aa1e03e0 aa0203f6 aa0103f7 d503201f (7940e280) ---[ end trace 09f0e34cce8e2d8c ]--- Kernel panic - not syncing: Fatal exception SMP: stopping secondary CPUs Kernel Offset: disabled CPU features: 0x23800c38
So track the clients that the SSIF driver adds and only remove those.
--- drivers/char/ipmi/ipmi_ssif.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
drivers/char/ipmi/ipmi_ssif.c +6 -11
@@ -181,6 +181,8 @@ struct ssif_addr_info {struct device *dev;struct i2c_client *client; +struct i2c_client *added_client; +struct mutex clients_mutex;struct list_head clients;
@@ -1641,15 +1643,7 @@ static int ssif_probe(struct i2c_client out:if (rv) { -/* -* Note that if addr_info->client is assigned, we -* leave it. The i2c client hangs around even if we -* return a failure here, and the failure here is not -* propagated back to the i2c code. This seems to be -* design intent, strange as it may be. But if we -* don't leave it, ssif_platform_remove will not remove -* the client like it should. -*/ + addr_info->client =NULL ;dev_err (&client->dev,"Unable to start IPMI SSIF: %d\n" , rv);kfree (ssif_info); }
@@ -1669,7 +1663,8 @@ static int ssif_adapter_handler(struct dif (adev->type != &i2c_adapter_type)return 0 ; -i2c_new_device (to_i2c_adapter (adev), &addr_info->binfo); + addr_info->added_client =i2c_new_device (to_i2c_adapter (adev), + &addr_info->binfo);if (!addr_info->adapter_name)return 1 ;/* Only try the first I2C adapter by default. */
@@ -1842,7 +1837,7 @@ static int ssif_platform_remove(struct preturn 0 ;mutex_lock (&ssif_infos_mutex); -i2c_unregister_device (addr_info->client); +i2c_unregister_device (addr_info->added_client);list_del (&addr_info->link);kfree (addr_info);
Greg Kroah-Hartman
maintainerPATCH 108/235 ovl: fix oopses in ovl_fill_super() failure paths
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 8c25741aaad8be6fbe51510e917c740e0059cf83 upstream.
ovl_free_fs() dereferences ofs->workbasedir and ofs->upper_mnt in cases when those might not have been initialized yet.
Fix the initialization order for these fields.
--- fs/overlayfs/super.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
fs/overlayfs/super.c +14 -12
@@ -970,16 +970,6 @@ static int ovl_get_upper(struct ovl_fs *if (err) goto out; - err = -EBUSY ; -if (ovl_inuse_trylock (upperpath->dentry)) { - ofs->upperdir_locked = true; - }else if (ofs->config.index) { -pr_err ("overlayfs: upperdir is in-use by another mount, mount with '-o index=off' to override exclusive upperdir protection.\n" ); - goto out; - }else { -pr_warn ("overlayfs: upperdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n" ); - } - upper_mnt =clone_private_mount (upperpath); err =PTR_ERR (upper_mnt);if (IS_ERR (upper_mnt)) {
@@ -990,6 +980,17 @@ static int ovl_get_upper(struct ovl_fs */* Don't inherit atime flags */ upper_mnt->mnt_flags &= ~(MNT_NOATIME |MNT_NODIRATIME |MNT_RELATIME ); ofs->upper_mnt = upper_mnt; + + err = -EBUSY ; +if (ovl_inuse_trylock (ofs->upper_mnt->mnt_root)) { + ofs->upperdir_locked = true; + }else if (ofs->config.index) { +pr_err ("overlayfs: upperdir is in-use by another mount, mount with '-o index=off' to override exclusive upperdir protection.\n" ); + goto out; + }else { +pr_warn ("overlayfs: upperdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n" ); + } + err =0 ; out:return err;
@@ -1089,8 +1090,10 @@ static int ovl_get_workdir(struct ovl_fs goto out; } + ofs->workbasedir =dget (workpath.dentry); + err = -EBUSY ; -if (ovl_inuse_trylock (workpath.dentry)) { +if (ovl_inuse_trylock (ofs->workbasedir)) { ofs->workdir_locked = true; }else if (ofs->config.index) {pr_err ("overlayfs: workdir is in-use by another mount, mount with '-o index=off' to override exclusive workdir protection.\n" );
@@ -1099,7 +1102,6 @@ static int ovl_get_workdir(struct ovl_fspr_warn ("overlayfs: workdir is in-use by another mount, accessing files from both mounts will result in undefined behavior.\n" ); } - ofs->workbasedir =dget (workpath.dentry); err =ovl_make_workdir (ofs, &workpath);if (err) goto out;
Greg Kroah-Hartman
maintainerPATCH 109/235 vmbus: dont return values for uninitalized channels
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Hemminger <[email protected]>
commit 6712cc9c22117a8af9f3df272b4a44fd2e4201cd upstream.
For unsupported device types, the vmbus channel ringbuffer is never initialized, and therefore reading the sysfs files will return garbage or cause a kernel OOPS.
--- drivers/hv/vmbus_drv.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hv/vmbus_drv.c +3 -0
@@ -1178,6 +1178,9 @@ static ssize_t vmbus_chan_attr_show(struif (!attribute->show)return -EIO ; +if (chan->state !=CHANNEL_OPENED_STATE ) +return -EINVAL ; +return attribute->show (chan, buf); }
Greg Kroah-Hartman
maintainerPATCH 110/235 Tools: hv: Fix a bug in the key delete code
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: K. Y. Srinivasan <[email protected]>
commit 86503bd35dec0ce363e9fdbf5299927422ed3899 upstream.
Fix a bug in the key delete code - the num_records range from 0 to num_records-1.
--- tools/hv/hv_kvp_daemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/hv/hv_kvp_daemon.c +1 -1
@@ -286,7 +286,7 @@ static int kvp_key_delete(int pool, cons* Found a match; just move the remaining * entries up. */ -if (i == num_records) { +if (i == (num_records -1 )) { kvp_file_info[pool].num_records--;kvp_update_file (pool);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 111/235 misc: ibmvsm: Fix wrong assignment of return code
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryant G. Ly <[email protected]>
commit c55e9318871cd06e4aa10f5023cc2dcdfbb08577 upstream.
Currently the assignment is flipped and rc is always 0.
--- drivers/misc/ibmvmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/misc/ibmvmc.c +1 -1
@@ -2131,7 +2131,7 @@ static int ibmvmc_init_crq_queue(struct retrc =plpar_hcall_norets (H_REG_CRQ , vdev->unit_address, queue->msg_token,PAGE_SIZE ); - retrc = rc; + rc = retrc;if (rc ==H_RESOURCE ) rc =ibmvmc_reset_crq_queue (adapter);
Greg Kroah-Hartman
maintainerPATCH 112/235 misc: hmc6352: fix potential Spectre v1
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit de916736aaaadddbd6061472969f667b14204aa9 upstream.
val is indirectly controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability.
This issue was detected with the help of Smatch:
drivers/misc/hmc6352.c:54 compass_store() warn: potential spectre issue 'map' [r]
Fix this by sanitizing val before using it to index map
Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1].
[1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2
--- drivers/misc/hmc6352.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/hmc6352.c +2 -0
@@ -27,6 +27,7 @@#include <linux/err.h> #include <linux/delay.h> #include <linux/sysfs.h> +#include <linux/nospec.h> static DEFINE_MUTEX (compass_mutex);
@@ -50,6 +51,7 @@ static int compass_store(struct device *return ret;if (val >=strlen (map))return -EINVAL ; + val =array_index_nospec (val,strlen (map));mutex_lock (&compass_mutex); ret =compass_command (c, map[val]);mutex_unlock (&compass_mutex);
Greg Kroah-Hartman
maintainerPATCH 113/235 xhci: Fix use after free for URB cancellation on a reallocated endpoint
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 4937213ba7fafa13f30496b3965ffe93970d8b53 upstream.
Make sure the cancelled URB is on the current endpoint ring.
If the endpoint ring has been reallocated since the URB was enqueued then the URB may contain TD and TRB pointers to a already freed ring. In this the case return the URB without touching any of the freed ring structure data.
Don't try to stop the ring. It would be useless.
This can occur if endpoint is not flushed before it is dropped and re-added, which is the case in usb_set_interface() as xhci does things in an odd order.
--- drivers/usb/host/xhci.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/usb/host/xhci.c +30 -0
@@ -37,6 +37,21 @@ static unsigned long long quirks;module_param (quirks, ullong,S_IRUGO );MODULE_PARM_DESC (quirks,"Bit flags for quirks to be enabled as default" ); +static bool td_on_ring (struct xhci_td *td,struct xhci_ring *ring) +{ +struct xhci_segment *seg = ring->first_seg; + +if (!td || !td->start_seg) +return false; +do { +if (seg == td->start_seg) +return true; + seg = seg->next; + }while (seg && seg != ring->first_seg); + +return false; +} +/* TODO: copied from ehci-hcd.c - can this be refactored? */ /* * xhci_handshake - spin reading hc until handshake completes or fails
@@ -1571,6 +1586,21 @@ static int xhci_urb_dequeue(struct usb_h goto done; } +/* +* check ring is not re-allocated since URB was enqueued. If it is, then +* make sure none of the ring related pointers in this URB private data +* are touched, such as td_list, otherwise we overwrite freed data +*/ +if (!td_on_ring (&urb_priv->td[0 ], ep_ring)) { +xhci_err (xhci,"Canceled URB td not found on endpoint ring" ); +for (i = urb_priv->num_tds_done; i < urb_priv->num_tds; i++) { + td = &urb_priv->td[i]; +if (!list_empty (&td->cancelled_td_list)) +list_del_init (&td->cancelled_td_list); + } + goto err_giveback; + } +if (xhci->xhc_state &XHCI_STATE_HALTED ) {xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb,"HC halted, freeing TD manually." );
Greg Kroah-Hartman
maintainerPATCH 114/235 usb: Dont die twice if PCI xhci host is not responding in resume
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit f3dc41c5d22b2ca14a0802a65d8cdc33a3882d4e upstream.
usb_hc_died() should only be called once, and with the primary HCD as parameter. It will mark both primary and secondary hcd's dead.
Remove the extra call to usb_cd_died with the shared hcd as parameter.
--- drivers/usb/core/hcd-pci.c | 2 -- 1 file changed, 2 deletions(-)
drivers/usb/core/hcd-pci.c +0 -2
@@ -515,8 +515,6 @@ static int resume_common(struct device * event == PM_EVENT_RESTORE);if (retval) {dev_err (dev,"PCI post-resume error %d!\n" , retval); -if (hcd->shared_hcd) -usb_hc_died (hcd->shared_hcd);usb_hc_died (hcd); } }
Greg Kroah-Hartman
maintainerPATCH 115/235 usb: xhci: fix interrupt transfer error happened on MTK platforms
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunfeng Yun <[email protected]>
commit 0a3b53305c8ff427bbc1d9d5bd78524007f19600 upstream.
The MTK xHCI controller use some reserved bytes in endpoint context for bandwidth scheduling, so need keep them in xhci_endpoint_copy();
The issue is introduced by:
commit f5249461b504 ("xhci: Clear the host side toggle manually when endpoint is soft reset")
It resets endpoints and will drop bandwidth scheduling parameters used by interrupt or isochronous endpoints on MTK xHCI controller.
endpoint is soft reset")
--- drivers/usb/host/xhci-mem.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/host/xhci-mem.c +4 -0
@@ -1613,6 +1613,10 @@ void xhci_endpoint_copy(struct xhci_hcd in_ep_ctx->ep_info2 = out_ep_ctx->ep_info2; in_ep_ctx->deq = out_ep_ctx->deq; in_ep_ctx->tx_info = out_ep_ctx->tx_info; +if (xhci->quirks &XHCI_MTK_HOST ) { + in_ep_ctx->reserved[0 ] = out_ep_ctx->reserved[0 ]; + in_ep_ctx->reserved[1 ] = out_ep_ctx->reserved[1 ]; + } }/* Copy output xhci_slot_ctx to the input xhci_slot_ctx.
Greg Kroah-Hartman
maintainerPATCH 116/235 usb: mtu3: fix error of xhci port id when enable U3 dual role
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunfeng Yun <[email protected]>
commit 78af87b8bbbbcaa613f1a7d8f14472fe9a7dc622 upstream.
If dual role mode is enabled, when switch u3port0 to device mode, it will affect port id calculation of host(xHCI), specially when host supports multi U2 ports or U3 ports, so need enable its dual role mode, and fix it here.
--- drivers/usb/mtu3/mtu3_core.c | 6 +++++- drivers/usb/mtu3/mtu3_hw_regs.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-)
drivers/usb/mtu3/mtu3_core.c +5 -1
@@ -107,8 +107,12 @@ static int mtu3_device_enable(struct mtu (SSUSB_U2_PORT_DIS |SSUSB_U2_PORT_PDN | SSUSB_U2_PORT_HOST_SEL)); -if (mtu->ssusb->dr_mode ==USB_DR_MODE_OTG ) +if (mtu->ssusb->dr_mode ==USB_DR_MODE_OTG ) {mtu3_setbits (ibase,SSUSB_U2_CTRL (0 ),SSUSB_U2_PORT_OTG_SEL ); +if (mtu->is_u3_ip) +mtu3_setbits (ibase,SSUSB_U3_CTRL (0 ), +SSUSB_U3_PORT_DUAL_MODE ); + }return ssusb_check_clocks (mtu->ssusb, check_clk); }
drivers/usb/mtu3/mtu3_hw_regs.h +1 -0
@@ -459,6 +459,7 @@/* U3D_SSUSB_U3_CTRL_0P */ #define SSUSB_U3_PORT_SSP_SPEED BIT(9) +#define SSUSB_U3_PORT_DUAL_MODE BIT(7)#define SSUSB_U3_PORT_HOST_SEL BIT(2)#define SSUSB_U3_PORT_PDN BIT(1)#define SSUSB_U3_PORT_DIS BIT(0)
Greg Kroah-Hartman
maintainerPATCH 117/235 mei: ignore not found client in the enumeration
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Usyskin <[email protected]>
commit 8d2d8935d30cc2acc57a3196dc10dfa8d5cbcdab upstream.
Some of the ME clients are available only for BIOS operation and are removed during hand off to an OS. However the removal is not instant. A client may be visible on the client list when the mei driver requests for enumeration, while the subsequent request for properties will be answered with client not found error value. The default behavior for an error is to perform client reset while this error is harmless and the link reset should be prevented. This issue started to be visible due to suspend/resume timing changes. Currently reported only on the Haswell based system.
Fixes:
[33.564957] mei_me 0000:00:16.0: hbm: properties response: wrong status = 1 CLIENT_NOT_FOUND [33.564978] mei_me 0000:00:16.0: mei_irq_read_handler ret = -71. [33.565270] mei_me 0000:00:16.0: unexpected reset: dev_state = INIT_CLIENTS fw status = 1E000255 60002306 00000200 00004401 00000000 00000010
--- drivers/misc/mei/hbm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/misc/mei/hbm.c +6 -3
@@ -1140,15 +1140,18 @@ int mei_hbm_dispatch(struct mei_device * props_res = (struct hbm_props_response *)mei_msg; -if (props_res->status) { +if (props_res->status ==MEI_HBMS_CLIENT_NOT_FOUND ) { +dev_dbg (dev->dev,"hbm: properties response: %d CLIENT_NOT_FOUND\n" , + props_res->me_addr); + }else if (props_res->status) {dev_err (dev->dev,"hbm: properties response: wrong status = %d %s\n" , props_res->status,mei_hbm_status_str (props_res->status));return -EPROTO ; + }else { +mei_hbm_me_cl_add (dev, props_res); } -mei_hbm_me_cl_add (dev, props_res); -/* request property for the next client */ if (mei_hbm_prop_req (dev, props_res->me_addr +1 ))return -EIO ;
Greg Kroah-Hartman
maintainerPATCH 118/235 mei: bus: fix hw module get/put balance
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Winkler <[email protected]>
commit 69bf5313035926b0b6a6578de4f3168a8f5c19b8 upstream.
In case the device is not connected it doesn't 'get' hw module and hence should not 'put' it on disable.
Cc: <[email protected]> 4.16+
Fixes:'commit 257355a44b99 ("mei: make module referencing local to the bus.c")'
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=200455
--- drivers/misc/mei/bus.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/misc/mei/bus.c +1 -2
@@ -600,9 +600,8 @@ int mei_cldev_disable(struct mei_cl_deviif (err <0 )dev_err (bus->dev,"Could not disconnect from the ME client\n" ); -out:mei_cl_bus_module_put (cldev); - +out:/* Flush queues and remove any pending read */ mei_cl_flush_queues (cl,NULL );mei_cl_unlink (cl);
Greg Kroah-Hartman
maintainerPATCH 119/235 mei: bus: need to unlink client before freeing
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomas Winkler <[email protected]>
commit 34f1166afd67f9f48a08c52f36180048908506a4 upstream.
In case a client fails to connect in mei_cldev_enable(), the caller won't call the mei_cldev_disable leaving the client in a linked stated. Upon driver unload the client structure will be freed in mei_cl_bus_dev_release(), leaving a stale pointer on a fail_list. This will eventually end up in crash during power down flow in mei_cl_set_disonnected().
RIP: mei_cl_set_disconnected+0x5/0x260[mei] Call trace: mei_cl_all_disconnect+0x22/0x30 mei_reset+0x194/0x250 __synchronize_hardirq+0x43/0x50 _cond_resched+0x15/0x30 mei_me_intr_clear+0x20/0x100 mei_stop+0x76/0xb0 mei_me_shutdown+0x3f/0x80 pci_device_shutdown+0x34/0x60 kernel_restart+0x0e/0x30
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=200455
--- drivers/misc/mei/bus.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/misc/mei/bus.c +4 -5
@@ -505,17 +505,15 @@ int mei_cldev_enable(struct mei_cl_devic cl = cldev->cl; +mutex_lock (&bus->device_lock);if (cl->state ==MEI_FILE_UNINITIALIZED ) { -mutex_lock (&bus->device_lock); ret =mei_cl_link (cl); -mutex_unlock (&bus->device_lock);if (ret) -return ret; + goto out;/* update pointers */ cl->cldev = cldev; } -mutex_lock (&bus->device_lock);if (mei_cl_is_connected (cl)) { ret =0 ; goto out;
@@ -859,12 +857,13 @@ static void mei_cl_bus_dev_release(strucmei_me_cl_put (cldev->me_cl);mei_dev_bus_put (cldev->bus); +mei_cl_unlink (cldev->cl);kfree (cldev->cl);kfree (cldev); }static const struct device_type mei_cl_device_type = { - .release = mei_cl_bus_dev_release, + .release = mei_cl_bus_dev_release, };/**
Greg Kroah-Hartman
maintainerPATCH 120/235 dm verity: fix crash on bufio buffer that was allocated with vmalloc
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit e4b069e0945fa14c71cf8b5b89f8b1b2aa68dbc2 upstream.
Since commit d1ac3ff008fb ("dm verity: switch to using asynchronous hash crypto API") dm-verity uses asynchronous crypto calls for verification, so that it can use hardware with asynchronous processing of crypto operations.
These asynchronous calls don't support vmalloc memory, but the buffer data can be allocated with vmalloc if dm-bufio is short of memory and uses a reserved buffer that was preallocated in dm_bufio_client_create().
Fix verity_hash_update() so that it deals with vmalloc'd memory correctly.
--- drivers/md/dm-verity-target.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
drivers/md/dm-verity-target.c +20 -4
@@ -99,10 +99,26 @@ static int verity_hash_update(struct dm_ {struct scatterlist sg; -sg_init_one (&sg, data, len); -ahash_request_set_crypt (req, &sg,NULL , len); - -return crypto_wait_req (crypto_ahash_update (req), wait); +if (likely (!is_vmalloc_addr (data))) { +sg_init_one (&sg, data, len); +ahash_request_set_crypt (req, &sg,NULL , len); +return crypto_wait_req (crypto_ahash_update (req), wait); + }else { +do { +int r; +size_t this_step =min_t (size_t, len,PAGE_SIZE -offset_in_page (data)); +flush_kernel_vmap_range ((void *)data, this_step); +sg_init_table (&sg,1 ); +sg_set_page (&sg,vmalloc_to_page (data), this_step,offset_in_page (data)); +ahash_request_set_crypt (req, &sg,NULL , this_step); + r =crypto_wait_req (crypto_ahash_update (req), wait); +if (unlikely (r)) +return r; + data += this_step; + len -= this_step; + }while (len); +return 0 ; + } }/*
Greg Kroah-Hartman
maintainerPATCH 121/235 USB: Add quirk to support DJI CineSSD
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tim Anderson <[email protected]>
commit f45681f9becaa65111ed0a691ccf080a0cd5feb8 upstream.
This device does not correctly handle the LPM operations.
Also, the device cannot handle ATA pass-through commands and locks up when attempted while running in super speed.
This patch adds the equivalent quirk logic as found in uas.
--- drivers/usb/core/quirks.c | 3 +++ drivers/usb/storage/scsiglue.c | 9 +++++++++ drivers/usb/storage/unusual_devs.h | 7 +++++++ 3 files changed, 19 insertions(+)
drivers/usb/core/quirks.c +3 -0
@@ -406,6 +406,9 @@ static const struct usb_device_id usb_qu { USB_DEVICE(0x2040, 0x7200), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS }, + /* DJI CineSSD */ + { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, + /* INTEL VALUE SSD */ { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
drivers/usb/storage/scsiglue.c +9 -0
@@ -376,6 +376,15 @@ static int queuecommand_lck(struct scsi_return 0 ; } +if ((us->fflags &US_FL_NO_ATA_1X ) && + (srb->cmnd[0 ] ==ATA_12 || srb->cmnd[0 ] ==ATA_16 )) { +memcpy (srb->sense_buffer, usb_stor_sense_invalidCDB, +sizeof (usb_stor_sense_invalidCDB)); + srb->result =SAM_STAT_CHECK_CONDITION ; +done (srb); +return 0 ; + } +/* enqueue the command and wake up the control thread */ srb->scsi_done = done; us->srb = srb;
drivers/usb/storage/unusual_devs.h +7 -0
@@ -2288,6 +2288,13 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_GO_SLOW ), +/* Reported-by: Tim Anderson <[email protected]> */ +UNUSUAL_DEV (0x2ca3 ,0x0031 ,0x0000 ,0x9999 , +"DJI" , +"CineSSD" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , + US_FL_NO_ATA_1X), +/* * Reported by Frederic Marchal <[email protected]> * Mio Moov 330
Greg Kroah-Hartman
maintainerPATCH 122/235 usb: uas: add support for more quirk flags
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 42d1c6d4a06a77b3ab206a919b9050c3080f3a71 upstream.
The hope that UAS devices would be less broken than old style storage devices has turned out to be unfounded. Make UAS support more of the quirk flags of the old driver.
--- drivers/usb/storage/uas.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/usb/storage/uas.c +21 -0
@@ -842,6 +842,27 @@ static int uas_slave_configure(struct sc sdev->skip_ms_page_8 =1 ; sdev->wce_default_on =1 ; } + +/* +* Some disks return the total number of blocks in response +* to READ CAPACITY rather than the highest block number. +* If this device makes that mistake, tell the sd driver. +*/ +if (devinfo->flags &US_FL_FIX_CAPACITY ) + sdev->fix_capacity =1 ; + +/* +* Some devices don't like MODE SENSE with page=0x3f, +* which is the command used for checking if a device +* is write-protected. Now that we tell the sd driver +* to do a 192-byte transfer with this command the +* majority of devices work fine, but a few still can't +* handle it. The sd driver will simply assume those +* devices are write-enabled. +*/ +if (devinfo->flags &US_FL_NO_WP_DETECT ) + sdev->skip_ms_page_3f =1 ; +scsi_change_queue_depth (sdev, devinfo->qdepth -2 );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 123/235 usb: Avoid use-after-free by flushing endpoints early in usb_set_interface()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit f9a5b4f58b280c1d26255376713c132f93837621 upstream.
The steps taken by usb core to set a new interface is very different from what is done on the xHC host side.
xHC hardware will do everything in one go. One command is used to set up new endpoints, free old endpoints, check bandwidth, and run the new endpoints.
All this is done by xHC when usb core asks the hcd to check for available bandwidth. At this point usb core has not yet flushed the old endpoints, which will cause use-after-free issues in xhci driver as queued URBs are cancelled on a re-allocated endpoint.
To resolve this add a call to usb_disable_interface() which will flush the endpoints before calling usb_hcd_alloc_bandwidth()
Additional checks in xhci driver will also be implemented to gracefully handle stale URB cancel on freed and re-allocated endpoints
--- drivers/usb/core/message.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/usb/core/message.c +11 -0
@@ -1340,6 +1340,11 @@ void usb_enable_interface(struct usb_dev* is submitted that needs that bandwidth. Some other operating systems * allocate bandwidth early, when a configuration is chosen. * +* xHCI reserves bandwidth and configures the alternate setting in +* usb_hcd_alloc_bandwidth(). If it fails the original interface altsetting +* may be disabled. Drivers cannot rely on any particular alternate +* setting being in effect after a failure. +* * This call is synchronous, and may not be used in an interrupt context. * Also, drivers must not change altsettings while urbs are scheduled for * endpoints in that interface; all such urbs must first be completed
@@ -1375,6 +1380,12 @@ int usb_set_interface(struct usb_device alternate);return -EINVAL ; } +/* +* usb3 hosts configure the interface in usb_hcd_alloc_bandwidth, +* including freeing dropped endpoint ring buffers. +* Make sure the interface endpoints are flushed before that +*/ +usb_disable_interface (dev, iface, false);/* Make sure we have enough bandwidth for this alternate interface. * Remove the current alt setting and add the new alt setting.
Greg Kroah-Hartman
maintainerPATCH 124/235 usb: host: u132-hcd: Fix a sleep-in-atomic-context bug in u132_get_frame()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia-Ju Bai <[email protected]>
commit 6d4f268fa132742fe96dad22307c68d237356d88 upstream.
i_usX2Y_subs_startup in usbusx2yaudio.c is a completion handler function for the USB driver. So it should not sleep, but it is can sleep according to the function call paths (from bottom to top) in Linux-4.16.
[FUNC] msleepdrivers/usb/host/u132-hcd.c, 2558:
msleep in u132_get_framedrivers/usb/core/hcd.c, 2231:
[FUNC_PTR]u132_get_frame in usb_hcd_get_frame_numberdrivers/usb/core/usb.c, 822:
usb_hcd_get_frame_number in usb_get_current_frame_numbersound/usb/usx2y/usbusx2yaudio.c, 303:
usb_get_current_frame_number in i_usX2Y_urb_completesound/usb/usx2y/usbusx2yaudio.c, 366:
i_usX2Y_urb_complete in i_usX2Y_subs_startup
Note that [FUNC_PTR] means a function pointer call is used.
To fix this bug, msleep() is replaced with mdelay().
This bug is found by my static analysis tool DSAC.
--- drivers/usb/host/u132-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/u132-hcd.c +1 -1
@@ -2555,7 +2555,7 @@ static int u132_get_frame(struct usb_hcd }else {int frame =0 ;dev_err (&u132->platform_dev->dev,"TODO: u132_get_frame\n" ); -msleep (100 ); +mdelay (100 );return frame; } }
Greg Kroah-Hartman
maintainerPATCH 125/235 USB: add quirk for WORLDE Controller KS49 or Prodipe MIDI 49C USB controller
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxence Duprès <[email protected]>
commit 9b83a1c301ad6d24988a128c69b42cbaaf537d82 upstream.
WORLDE Controller KS49 or Prodipe MIDI 49C USB controller cause a -EPROTO error, a communication restart and loop again.
This issue has already been fixed for KS25.
https://lore.kernel.org/patchwork/patch/753077/
I just add device 201 for KS49 in quirks.c to get it works.
--- drivers/usb/core/quirks.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/core/quirks.c +4 -0
@@ -178,6 +178,10 @@ static const struct usb_device_id usb_qu/* CBM - Flash disk */ { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, + /* WORLDE Controller KS49 or Prodipe MIDI 49C USB controller */ + { USB_DEVICE(0x0218, 0x0201), .driver_info = + USB_QUIRK_CONFIG_INTF_STRINGS }, + /* WORLDE easy key (easykey.25) MIDI controller */ { USB_DEVICE(0x0218, 0x0401), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
Greg Kroah-Hartman
maintainerPATCH 126/235 usb: gadget: udc: renesas_usb3: fix maxpacket size of ep0
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit dfe1a51d2a36647f74cbad478801efa7cf394376 upstream.
This patch fixes an issue that maxpacket size of ep0 is incorrect for SuperSpeed. Otherwise, CDC NCM class with SuperSpeed doesn't work correctly on this driver because its control read data size is more than 64 bytes.
--- drivers/usb/gadget/udc/renesas_usb3.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/gadget/udc/renesas_usb3.c +4 -1
@@ -787,12 +787,15 @@ static void usb3_irq_epc_int_1_speed(strswitch (speed) {case USB_STA_SPEED_SS : usb3->gadget.speed =USB_SPEED_SUPER ; + usb3->gadget.ep0->maxpacket =USB3_EP0_SS_MAX_PACKET_SIZE ;break ;case USB_STA_SPEED_HS : usb3->gadget.speed =USB_SPEED_HIGH ; + usb3->gadget.ep0->maxpacket =USB3_EP0_HSFS_MAX_PACKET_SIZE ;break ;case USB_STA_SPEED_FS : usb3->gadget.speed =USB_SPEED_FULL ; + usb3->gadget.ep0->maxpacket =USB3_EP0_HSFS_MAX_PACKET_SIZE ;break ;default : usb3->gadget.speed =USB_SPEED_UNKNOWN ;
@@ -2451,7 +2454,7 @@ static int renesas_usb3_init_ep(struct r/* for control pipe */ usb3->gadget.ep0 = &usb3_ep->ep;usb_ep_set_maxpacket_limit (&usb3_ep->ep, -USB3_EP0_HSFS_MAX_PACKET_SIZE ); +USB3_EP0_SS_MAX_PACKET_SIZE ); usb3_ep->ep.caps.type_control = true; usb3_ep->ep.caps.dir_in = true; usb3_ep->ep.caps.dir_out = true;
Greg Kroah-Hartman
maintainerPATCH 127/235 USB: net2280: Fix erroneous synchronization change
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit dec3c23c9aa1815f07d98ae0375b4cbc10971e13 upstream.
Commit f16443a034c7 ("USB: gadgetfs, dummy-hcd, net2280: fix locking for callbacks") was based on a serious misunderstanding. It introduced regressions into both the dummy-hcd and net2280 drivers.
The problem in dummy-hcd was fixed by commit 7dbd8f4cabd9 ("USB:
dummy-hcd: Fix erroneous synchronization change"), but the problem in net2280 remains. Namely: the ->disconnect(), ->suspend(), ->resume(), and ->reset() callbacks must be invoked without the private lock held; otherwise a deadlock will occur when the callback routine tries to interact with the UDC driver.
This patch largely is a reversion of the relevant parts of f16443a034c7. It also drops the private lock around the calls to ->suspend() and ->resume() (something the earlier patch forgot to do). This is safe from races with device interrupts because it occurs within the interrupt handler.
Finally, the patch changes where the ->disconnect() callback is invoked when net2280_pullup() turns the pullup off. Rather than making the callback from within stop_activity() at a time when dropping the private lock could be unsafe, the callback is moved to a point after the lock has already been dropped.
--- drivers/usb/gadget/udc/net2280.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/usb/gadget/udc/net2280.c +14 -2
@@ -1545,11 +1545,14 @@ static int net2280_pullup(struct usb_gadwritel (tmp |BIT (USB_DETECT_ENABLE ), &dev->usb->usbctl); }else {writel (tmp & ~BIT (USB_DETECT_ENABLE ), &dev->usb->usbctl); -stop_activity (dev, dev->driver); +stop_activity (dev,NULL ); }spin_unlock_irqrestore (&dev->lock, flags); +if (!is_on && dev->driver) + dev->driver->disconnect (&dev->gadget); +return 0 ; }
@@ -2466,8 +2469,11 @@ static void stop_activity(struct net2280nuke (&dev->ep[i]);/* report disconnect; the driver is already quiesced */ -if (driver) +if (driver) { +spin_unlock (&dev->lock); driver->disconnect (&dev->gadget); +spin_lock (&dev->lock); + }usb_reinit (dev); }
@@ -3341,6 +3347,8 @@ next_endpoints: BIT(PCI_RETRY_ABORT_INTERRUPT))static void handle_stat1_irqs (struct net2280 *dev,u32 stat) +__releases(dev->lock) +__acquires(dev->lock) {struct net2280_ep *ep;u32 tmp, num, mask, scratch;
@@ -3381,12 +3389,14 @@ static void handle_stat1_irqs(struct netif (disconnect || reset) {stop_activity (dev, dev->driver);ep0_start (dev); +spin_unlock (&dev->lock);if (reset)usb_gadget_udc_reset (&dev->gadget, dev->driver);else (dev->driver->disconnect) (&dev->gadget); +spin_lock (&dev->lock);return ; } }
@@ -3405,6 +3415,7 @@ static void handle_stat1_irqs(struct net tmp =BIT (SUSPEND_REQUEST_CHANGE_INTERRUPT );if (stat & tmp) {writel (tmp, &dev->regs->irqstat1); +spin_unlock (&dev->lock);if (stat &BIT (SUSPEND_REQUEST_INTERRUPT )) {if (dev->driver->suspend) dev->driver->suspend (&dev->gadget);
@@ -3415,6 +3426,7 @@ static void handle_stat1_irqs(struct net dev->driver->resume (&dev->gadget);/* at high speed, note erratum 0133 */ } +spin_lock (&dev->lock); stat &= ~tmp; }
Greg Kroah-Hartman
maintainerPATCH 128/235 USB: serial: io_ti: fix array underflow in completion handler
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 691a03cfe8ca483f9c48153b869d354e4ae3abef upstream.
As reported by Dan Carpenter, a malicious USB device could set port_number to a negative value and we would underflow the port array in the interrupt completion handler.
As these devices only have one or two ports, fix this by making sure we only consider the seventh bit when determining the port number (and ignore bits 0xb0 which are typically set to 0x30).
--- drivers/usb/serial/io_ti.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/io_ti.h +1 -1
@@ -173,7 +173,7 @@ struct ump_interrupt { } __attribute__((packed)); -#define TIUMP_GET_PORT_FROM_CODE (c) (((c) >> 4) - 3) +#define TIUMP_GET_PORT_FROM_CODE (c) (((c) >> 6) & 0x01)#define TIUMP_GET_FUNC_FROM_CODE (c) ((c) & 0x0f)#define TIUMP_INTERRUPT_CODE_LSR 0x03#define TIUMP_INTERRUPT_CODE_MSR 0x04
Greg Kroah-Hartman
maintainerPATCH 129/235 usb: misc: uss720: Fix two sleep-in-atomic-context bugs
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia-Ju Bai <[email protected]>
commit bc8acc214d3f1cafebcbcd101a695bbac716595d upstream.
async_complete() in uss720.c is a completion handler function for the USB driver. So it should not sleep, but it is can sleep according to the function call paths (from bottom to top) in Linux-4.16.
[FUNC] set_1284_register(GFP_KERNEL) drivers/usb/misc/uss720.c, 372:
set_1284_register in parport_uss720_frob_controldrivers/parport/ieee1284.c, 560:
[FUNC_PTR]parport_uss720_frob_control in parport_ieee1284_ack_data_availdrivers/parport/ieee1284.c, 577:
parport_ieee1284_ack_data_avail in parport_ieee1284_interrupt./include/linux/parport.h, 474:
parport_ieee1284_interrupt in parport_generic_irqdrivers/usb/misc/uss720.c, 116:
parport_generic_irq in async_complete
[FUNC] get_1284_register(GFP_KERNEL) drivers/usb/misc/uss720.c, 382:
get_1284_register in parport_uss720_read_statusdrivers/parport/ieee1284.c, 555:
[FUNC_PTR]parport_uss720_read_status in parport_ieee1284_ack_data_availdrivers/parport/ieee1284.c, 577:
parport_ieee1284_ack_data_avail in parport_ieee1284_interrupt./include/linux/parport.h, 474:
parport_ieee1284_interrupt in parport_generic_irqdrivers/usb/misc/uss720.c, 116:
parport_generic_irq in async_complete
Note that [FUNC_PTR] means a function pointer call is used.
To fix these bugs, GFP_KERNEL is replaced with GFP_ATOMIC.
These bugs are found by my static analysis tool DSAC.
--- drivers/usb/misc/uss720.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/misc/uss720.c +2 -2
@@ -369,7 +369,7 @@ static unsigned char parport_uss720_frob mask &=0x0f ; val &=0x0f ; d = (priv->reg[1 ] & (~mask)) ^ val; -if (set_1284_register (pp,2 , d,GFP_KERNEL )) +if (set_1284_register (pp,2 , d,GFP_ATOMIC ))return 0 ; priv->reg[1 ] = d;return d &0xf ;
@@ -379,7 +379,7 @@ static unsigned char parport_uss720_read {unsigned char ret; -if (get_1284_register (pp,1 , &ret,GFP_KERNEL )) +if (get_1284_register (pp,1 , &ret,GFP_ATOMIC ))return 0 ;return ret &0xf8 ; }
Greg Kroah-Hartman
maintainerPATCH 130/235 USB: serial: ti_usb_3410_5052: fix array underflow in completion handler
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 5dfdd24eb3d39d815bc952ae98128e967c9bba49 upstream.
Similarly to a recently reported bug in io_ti, a malicious USB device could set port_number to a negative value and we would underflow the port array in the interrupt completion handler.
As these devices only have one or two ports, fix this by making sure we only consider the seventh bit when determining the port number (and ignore bits 0xb0 which are typically set to 0x30).
--- drivers/usb/serial/ti_usb_3410_5052.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/ti_usb_3410_5052.c +1 -1
@@ -1119,7 +1119,7 @@ static void ti_break(struct tty_struct *static int ti_get_port_from_code (unsigned char code) { -return (code >>4 ) -3 ; +return (code >>6 ) &0x01 ; }static int ti_get_func_from_code (unsigned char code)
Greg Kroah-Hartman
maintainerPATCH 131/235 USB: yurex: Fix buffer over-read in yurex_write()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 7e10f14ebface44a48275c8d6dc1caae3668d5a9 upstream.
If the written data starts with a digit, yurex_write() tries to parse it as an integer using simple_strtoull(). This requires a null- terminator, and currently there's no guarantee that there is one.
(The sample program at
https://github.com/NeoCat/YUREX-driver-for-Linux/blob/master/sample/yurex_clock.pl
writes an integer without a null terminator. It seems like it must have worked by chance!)
Always add a null byte after the written data. Enlarge the buffer to allow for this.
--- drivers/usb/misc/yurex.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/misc/yurex.c +3 -2
@@ -421,13 +421,13 @@ static ssize_t yurex_write(struct file * {struct usb_yurex *dev;int i, set =0 , retval =0 ; -char buffer[16 ]; +char buffer[16 +1 ];char *data = buffer;unsigned long long c, c2 =0 ;signed long timeout =0 ;DEFINE_WAIT (wait); - count =min (sizeof (buffer), count); + count =min (sizeof (buffer) -1 , count); dev = file->private_data;/* verify that we actually have some data to write */
@@ -446,6 +446,7 @@ static ssize_t yurex_write(struct file * retval = -EFAULT ; goto error; } + buffer[count] =0 ;memset (dev->cntl_buffer,CMD_PADDING ,YUREX_BUF_SIZE );switch (buffer[0 ]) {
Greg Kroah-Hartman
maintainerPATCH 132/235 usb: cdc-wdm: Fix a sleep-in-atomic-context bug in service_outstanding_interrupt()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jia-Ju Bai <[email protected]>
commit 6e22e3af7bb3a7b9dc53cb4687659f6e63fca427 upstream.
wdm_in_callback() is a completion handler function for the USB driver. So it should not sleep. But it calls service_outstanding_interrupt(), which calls usb_submit_urb() with GFP_KERNEL.
To fix this bug, GFP_KERNEL is replaced with GFP_ATOMIC.
This bug is found by my static analysis tool DSAC.
--- drivers/usb/class/cdc-wdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/class/cdc-wdm.c +1 -1
@@ -458,7 +458,7 @@ static int service_outstanding_interruptset_bit (WDM_RESPONDING , &desc->flags);spin_unlock_irq (&desc->iuspin); - rv =usb_submit_urb (desc->response,GFP_KERNEL ); + rv =usb_submit_urb (desc->response,GFP_ATOMIC );spin_lock_irq (&desc->iuspin);if (rv) { dev_err(&desc->intf->dev,
Greg Kroah-Hartman
maintainerPATCH 133/235 Revert "cdc-acm: implement put_char() and flush_chars()"
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit df3aa13c7bbb307e172c37f193f9a7aa058d4739 upstream.
This reverts commit a81cf9799ad7299b03a4dff020d9685f9ac5f3e0.
The patch causes a regression, which I cannot find the reason for. So let's revert for now, as a revert hurts only performance.
Original report:
I was trying to resolve the problem with Oliver but we don't get any conclusion for 5 months, so I am now sending this to mail list and cdc_acm authors.
I am using simple request-response protocol to obtain the boiller parameters in constant intervals.
A simple one transaction is:
1. opening the /dev/ttyACM0
2. sending the following 10-bytes request to the device:
unsigned char req[] = {0x02, 0xfe, 0x01, 0x05, 0x08, 0x02, 0x01, 0x69, 0xab, 0x03};
3. reading response (frame of 74 bytes length).
4. closing the descriptor
I am doing this transaction with 5 seconds intervals.
Before the bad commit everything was working correctly: I've got a requests and a responses in a timely manner.
After the bad commit more time I am using the kernel module, more problems I have. The graph [2] is showing the problem.
As you can see after module load all seems fine but after about 30 minutes I've got a plenty of EAGAINs when doing read()'s and trying to read back the data.
When I rmmod and insmod the cdc_acm module again, then the situation is starting over again: running ok shortly after load, and more time it is running, more EAGAINs I have when calling read().
As a bonus I can see the problem on the device itself:
The device is configured as you can see here on this screen [3]. It has two transmision LEDs: TX and RX. Blink duration is set for 100ms. This is a recording before the bad commit when all is working fine: [4] And this is with the bad commit: [5]
As you can see the TX led is blinking wrongly long (indicating transmission?) and I have problems doing read() calls (EAGAIN).
--- drivers/usb/class/cdc-acm.c | 73 -------------------------------------------- drivers/usb/class/cdc-acm.h | 1 2 files changed, 74 deletions(-)
drivers/usb/class/cdc-acm.c +0 -73
@@ -779,20 +779,9 @@ static int acm_tty_write(struct tty_stru }if (acm->susp_count) { -if (acm->putbuffer) { -/* now to preserve order */ -usb_anchor_urb (acm->putbuffer->urb, &acm->delayed); - acm->putbuffer =NULL ; - }usb_anchor_urb (wb->urb, &acm->delayed);spin_unlock_irqrestore (&acm->write_lock, flags);return count; - }else { -if (acm->putbuffer) { -/* at this point there is no good way to handle errors */ -acm_start_wb (acm, acm->putbuffer); - acm->putbuffer =NULL ; - } } stat =acm_start_wb (acm, wb);
@@ -803,66 +792,6 @@ static int acm_tty_write(struct tty_strureturn count; } -static void acm_tty_flush_chars (struct tty_struct *tty) -{ -struct acm *acm = tty->driver_data; -struct acm_wb *cur; -int err; -unsigned long flags; - -spin_lock_irqsave (&acm->write_lock, flags); - - cur = acm->putbuffer; -if (!cur)/* nothing to do */ - goto out; - - acm->putbuffer =NULL ; - err =usb_autopm_get_interface_async (acm->control); -if (err <0 ) { - cur->use =0 ; - acm->putbuffer = cur; - goto out; - } - -if (acm->susp_count) -usb_anchor_urb (cur->urb, &acm->delayed); -else -acm_start_wb (acm, cur); -out: -spin_unlock_irqrestore (&acm->write_lock, flags); -return ; -} - -static int acm_tty_put_char (struct tty_struct *tty,unsigned char ch) -{ -struct acm *acm = tty->driver_data; -struct acm_wb *cur; -int wbn; -unsigned long flags; - -overflow: - cur = acm->putbuffer; -if (!cur) { -spin_lock_irqsave (&acm->write_lock, flags); - wbn =acm_wb_alloc (acm); -if (wbn >=0 ) { - cur = &acm->wb[wbn]; - acm->putbuffer = cur; - } -spin_unlock_irqrestore (&acm->write_lock, flags); -if (!cur) -return 0 ; - } - -if (cur->len == acm->writesize) { -acm_tty_flush_chars (tty); - goto overflow; - } - - cur->buf[cur->len++] = ch; -return 1 ; -} -static int acm_tty_write_room (struct tty_struct *tty) {struct acm *acm = tty->driver_data;
@@ -1987,8 +1916,6 @@ static const struct tty_operations acm_o .cleanup = acm_tty_cleanup, .hangup = acm_tty_hangup, .write = acm_tty_write, - .put_char = acm_tty_put_char, - .flush_chars = acm_tty_flush_chars, .write_room = acm_tty_write_room, .ioctl = acm_tty_ioctl, .throttle = acm_tty_throttle,
drivers/usb/class/cdc-acm.h +0 -1
@@ -96,7 +96,6 @@ struct acm {unsigned long read_urbs_free;struct urb *read_urbs[ACM_NR ];struct acm_rb read_buffers[ACM_NR ]; -struct acm_wb *putbuffer;/* for acm_tty_put_char() */ int rx_buflimit;spinlock_t read_lock;u8 *notification_buffer;/* to reassemble fragmented notifications */
Greg Kroah-Hartman
maintainerPATCH 134/235 cifs: prevent integer overflow in nxt_dir_entry()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 8ad8aa353524d89fa2e09522f3078166ff78ec42 upstream.
The "old_entry + le32_to_cpu(pDirInfo->NextEntryOffset)" can wrap around so I have added a check for integer overflow.
--- fs/cifs/readdir.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/cifs/readdir.c +9 -2
@@ -376,8 +376,15 @@ static char *nxt_dir_entry(char *old_ent new_entry = old_entry +sizeof (FIND_FILE_STANDARD_INFO ) + pfData->FileNameLength; - }else - new_entry = old_entry +le32_to_cpu (pDirInfo->NextEntryOffset); + }else { +u32 next_offset =le32_to_cpu (pDirInfo->NextEntryOffset); + +if (old_entry + next_offset < old_entry) { +cifs_dbg (VFS ,"invalid offset %u\n" , next_offset); +return NULL ; + } + new_entry = old_entry + next_offset; + }cifs_dbg (FYI ,"new entry %p old entry %p\n" , new_entry, old_entry);/* validate that new_entry is not past end of SMB */ if (new_entry >= end_of_smb) {
Greg Kroah-Hartman
maintainerPATCH 135/235 CIFS: fix wrapping bugs in num_entries()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 56446f218af1133c802dad8e9e116f07f381846c upstream.
The problem is that "entryptr + next_offset" and "entryptr + len + size" can wrap. I ended up changing the type of "entryptr" because it makes the math easier when we don't have to do so much casting.
--- fs/cifs/smb2pdu.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
fs/cifs/smb2pdu.c +15 -10
@@ -3492,33 +3492,38 @@ num_entries(char *bufstart, char *end_ofint len;unsigned int entrycount =0 ;unsigned int next_offset =0 ; -FILE_DIRECTORY_INFO *entryptr; +char *entryptr; +FILE_DIRECTORY_INFO *dir_info;if (bufstart ==NULL )return 0 ; - entryptr = (FILE_DIRECTORY_INFO *)bufstart; + entryptr = bufstart;while (1 ) { - entryptr = (FILE_DIRECTORY_INFO *) - ((char *)entryptr + next_offset); - -if ((char *)entryptr + size > end_of_buf) { +if (entryptr + next_offset < entryptr || + entryptr + next_offset > end_of_buf || + entryptr + next_offset + size > end_of_buf) {cifs_dbg (VFS ,"malformed search entry would overflow\n" );break ; } - len =le32_to_cpu (entryptr->FileNameLength); -if ((char *)entryptr + len + size > end_of_buf) { + entryptr = entryptr + next_offset; + dir_info = (FILE_DIRECTORY_INFO *)entryptr; + + len =le32_to_cpu (dir_info->FileNameLength); +if (entryptr + len < entryptr || + entryptr + len > end_of_buf || + entryptr + len + size > end_of_buf) {cifs_dbg (VFS ,"directory entry name would overflow frame end of buf %p\n" , end_of_buf);break ; } - *lastentry = (char *)entryptr; + *lastentry = entryptr; entrycount++; - next_offset =le32_to_cpu (entryptr->NextEntryOffset); + next_offset =le32_to_cpu (dir_info->NextEntryOffset);if (!next_offset)break ; }
Greg Kroah-Hartman
maintainerPATCH 136/235 cifs: integer overflow in in SMB2_ioctl()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 2d204ee9d671327915260071c19350d84344e096 upstream.
The "le32_to_cpu(rsp->OutputOffset) + *plen" addition can overflow and wrap around to a smaller value which looks like it would lead to an information leak.
--- fs/cifs/smb2pdu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/cifs/smb2pdu.c +2 -2
@@ -2418,14 +2418,14 @@ SMB2_ioctl(const unsigned int xid, struc/* We check for obvious errors in the output buffer length and offset */ if (*plen ==0 ) goto ioctl_exit;/* server returned no data */ -else if (*plen >0xFF00 ) { +else if (*plen > rsp_iov.iov_len || *plen >0xFF00 ) {cifs_dbg (VFS ,"srv returned invalid ioctl length: %d\n" , *plen); *plen =0 ; rc = -EIO ; goto ioctl_exit; } -if (rsp_iov.iov_len <le32_to_cpu (rsp->OutputOffset) + *plen) { +if (rsp_iov.iov_len - *plen <le32_to_cpu (rsp->OutputOffset)) {cifs_dbg (VFS ,"Malformed ioctl resp: len %d offset %d\n" , *plen,le32_to_cpu (rsp->OutputOffset)); *plen =0 ;
Greg Kroah-Hartman
maintainerPATCH 137/235 xtensa: ISS: dont allocate memory in platform_setup
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit ef439d49e0bfb26cd5f03c88b4cb7cc9073ed30c upstream.
Memory allocator is not initialized at that point yet, use static array instead.
--- arch/xtensa/platforms/iss/setup.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
arch/xtensa/platforms/iss/setup.c +15 -10
@@ -78,23 +78,28 @@ static struct notifier_block iss_panic_bvoid __init platform_setup (char **p_cmdline) { +static void *argv[COMMAND_LINE_SIZE /sizeof (void *)]__initdata ; +static char cmdline[COMMAND_LINE_SIZE ]__initdata ;int argc =simc_argc ();int argv_size =simc_argv_size ();if (argc >1 ) { -void **argv =alloc_bootmem (argv_size); -char *cmdline =alloc_bootmem (argv_size); -int i; +if (argv_size >sizeof (argv)) { +pr_err ("%s: command line too long: argv_size = %d\n" , + __func__, argv_size); + }else { +int i; - cmdline[0 ] =0 ; -simc_argv ((void *)argv); + cmdline[0 ] =0 ; +simc_argv ((void *)argv); -for (i =1 ; i < argc; ++i) { -if (i >1 ) -strcat (cmdline," " ); -strcat (cmdline, argv[i]); +for (i =1 ; i < argc; ++i) { +if (i >1 ) +strcat (cmdline," " ); +strcat (cmdline, argv[i]); + } + *p_cmdline = cmdline; } - *p_cmdline = cmdline; }atomic_notifier_chain_register (&panic_notifier_list, &iss_panic_block);
Greg Kroah-Hartman
maintainerPATCH 138/235 perf/core: Force USER_DS when recording user stack data
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yabin Cui <[email protected]>
commit 02e184476eff848273826c1d6617bb37e5bcc7ad upstream.
Perf can record user stack data in response to a synchronous request, such as a tracepoint firing. If this happens under set_fs(KERNEL_DS), then we end up reading user stack data using __copy_from_user_inatomic() under set_fs(KERNEL_DS). I think this conflicts with the intention of using set_fs(KERNEL_DS). And it is explicitly forbidden by hardware on ARM64 when both CONFIG_ARM64_UAO and CONFIG_ARM64_PAN are used.
So fix this by forcing USER_DS when recording user stack data.
--- kernel/events/core.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/events/core.c +4 -0
@@ -5948,6 +5948,7 @@ perf_output_sample_ustack(struct perf_ouunsigned long sp;unsigned int rem;u64 dyn_size; +mm_segment_t fs;/* * We dump:
@@ -5965,7 +5966,10 @@ perf_output_sample_ustack(struct perf_ou/* Data. */ sp =perf_user_stack_pointer (regs); + fs =get_fs (); +set_fs (USER_DS ); rem =__output_copy_user (handle, (void *) sp, dump_size); +set_fs (fs); dyn_size = dump_size - rem;perf_output_skip (handle, rem);
Greg Kroah-Hartman
maintainerPATCH 139/235 perf tools: Fix maps__find_symbol_by_name()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit 03db8b583d1c3c84963e08e2abf6c79081da5c31 upstream.
Commit 1c5aae7710bb ("perf machine: Create maps for x86 PTI entry trampolines") revealed a problem with maps__find_symbol_by_name() that resulted in probes not being found e.g.
$ sudo perf probe xsk_mmap xsk_mmap is out of .text, skip it. Probe point 'xsk_mmap' not found. Error: Failed to add events.
maps__find_symbol_by_name() can optionally return the map of the found symbol. It can get the map wrong because, in fact, the symbol is found on the map's dso, not allowing for the possibility that the dso has more than one map. Fix by always checking the map contains the symbol.
--- tools/perf/util/map.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
tools/perf/util/map.c +11 -0
@@ -590,6 +590,13 @@ struct symbol *map_groups__find_symbol(sreturn NULL ; } +static bool map__contains_symbol (struct map *map,struct symbol *sym) +{ +u64 ip = map->unmap_ip (map, sym->start); + +return ip >= map->start && ip < map->end; +} +struct symbol *maps__find_symbol_by_name (struct maps *maps,const char *name,struct map **mapp) {
@@ -605,6 +612,10 @@ struct symbol *maps__find_symbol_by_nameif (sym ==NULL )continue ; +if (!map__contains_symbol (pos, sym)) { + sym =NULL ; +continue ; + }if (mapp !=NULL ) *mapp = pos; goto out;
Greg Kroah-Hartman
maintainerPATCH 140/235 of: fix phandle cache creation for DTs with no phandles
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Herring <[email protected]>
commit e54192b48da75f025ae4b277925eaf6aca1d13bd upstream.
With commit 0b3ce78e90fc ("of: cache phandle nodes to reduce cost of of_find_node_by_phandle()"), a G3 PowerMac fails to boot. The root cause is the DT for this system has no phandle properties when booted with BootX. of_populate_phandle_cache() does not handle the case of no phandles correctly. The problem is roundup_pow_of_two() for 0 is undefined. The implementation subtracts 1 underflowing and then things are in the weeds.
--- drivers/of/base.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/of/base.c +3 -0
@@ -118,6 +118,9 @@ void of_populate_phandle_cache(void)if (np->phandle && np->phandle !=OF_PHANDLE_ILLEGAL ) phandles++; +if (!phandles) + goto out; + cache_entries =roundup_pow_of_two (phandles); phandle_cache_mask = cache_entries -1 ;
Greg Kroah-Hartman
maintainerPATCH 141/235 x86/EISA: Dont probe EISA bus for Xen PV guests
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Ostrovsky <[email protected]>
commit 6a92b11169a65b3f8cc512c75a252cbd0d096ba0 upstream.
For unprivileged Xen PV guests this is normal memory and ioremap will not be able to properly map it.
While at it, since ioremap may return NULL, add a test for pointer's validity.
--- arch/x86/kernel/eisa.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/eisa.c +8 -2
@@ -7,11 +7,17 @@#include <linux/eisa.h> #include <linux/io.h> +#include <xen/xen.h> +static __init int eisa_bus_probe (void ) { -void __iomem *p =ioremap (0x0FFFD9 ,4 ); +void __iomem *p; + +if (xen_pv_domain () && !xen_initial_domain ()) +return 0 ; -if (readl (p) =='E' + ('I' <<8 ) + ('S' <<16 ) + ('A' <<24 )) + p =ioremap (0x0FFFD9 ,4 ); +if (p &&readl (p) =='E' + ('I' <<8 ) + ('S' <<16 ) + ('A' <<24 )) EISA_bus =1 ;iounmap (p);return 0 ;
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel
Greg Kroah-Hartman
maintainerPATCH 141/235 x86/EISA: Dont probe EISA bus for Xen PV guests
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Ostrovsky <[email protected]>
commit 6a92b11169a65b3f8cc512c75a252cbd0d096ba0 upstream.
For unprivileged Xen PV guests this is normal memory and ioremap will not be able to properly map it.
While at it, since ioremap may return NULL, add a test for pointer's validity.
--- arch/x86/kernel/eisa.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/x86/kernel/eisa.c +8 -2
@@ -7,11 +7,17 @@#include <linux/eisa.h> #include <linux/io.h> +#include <xen/xen.h> +static __init int eisa_bus_probe (void ) { -void __iomem *p =ioremap (0x0FFFD9 ,4 ); +void __iomem *p; + +if (xen_pv_domain () && !xen_initial_domain ()) +return 0 ; -if (readl (p) =='E' + ('I' <<8 ) + ('S' <<16 ) + ('A' <<24 )) + p =ioremap (0x0FFFD9 ,4 ); +if (p &&readl (p) =='E' + ('I' <<8 ) + ('S' <<16 ) + ('A' <<24 )) EISA_bus =1 ;iounmap (p);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 142/235 NFSv4: Fix a tracepoint Oops in initiate_file_draining()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 2a534a7473bf4e7f1c12805113f80c795fc8e89a upstream.
Now that the value of 'ino' can be NULL or an ERR_PTR(), we need to change the test in the tracepoint.
--- fs/nfs/nfs4trace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/nfs4trace.h +1 -1
@@ -1194,7 +1194,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_cTP_fast_assign ( __entry->error = error; __entry->fhandle =nfs_fhandle_hash (fhandle); -if (inode !=NULL ) { +if (!IS_ERR_OR_NULL (inode)) { __entry->fileid =NFS_FILEID (inode); __entry->dev = inode->i_sb->s_dev; }else {
Greg Kroah-Hartman
maintainerPATCH 143/235 NFSv4.1 fix infinite loop on I/O.
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 994b15b983a72e1148a173b61e5b279219bb45ae upstream.
The previous fix broke recovery of delegated stateids because it assumes that if we did not mark the delegation as suspect, then the delegation has effectively been revoked, and so it removes that delegation irrespectively of whether or not it is valid and still in use. While this is "mostly harmless" for ordinary I/O, we've seen pNFS fail with LAYOUTGET spinning in an infinite loop while complaining that we're using an invalid stateid (in this case the all-zero stateid).
What we rather want to do here is ensure that the delegation is always correctly marked as needing testing when that is the case. So we want to close the loophole offered by nfs4_schedule_stateid_recovery(), which marks the state as needing to be reclaimed, but not the delegation that may be backing it.
--- fs/nfs/nfs4proc.c | 10 +++++++--- fs/nfs/nfs4state.c | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-)
fs/nfs/nfs4proc.c +7 -3
@@ -2642,14 +2642,18 @@ static void nfs41_check_delegation_state }nfs4_stateid_copy (&stateid, &delegation->stateid); -if (test_bit (NFS_DELEGATION_REVOKED , &delegation->flags) || - !test_and_clear_bit (NFS_DELEGATION_TEST_EXPIRED , - &delegation->flags)) { +if (test_bit (NFS_DELEGATION_REVOKED , &delegation->flags)) {rcu_read_unlock ();nfs_finish_clear_delegation_stateid (state, &stateid);return ; } +if (!test_and_clear_bit (NFS_DELEGATION_TEST_EXPIRED , + &delegation->flags)) { +rcu_read_unlock (); +return ; + } + cred =get_rpccred (delegation->cred);rcu_read_unlock (); status =nfs41_test_and_free_expired_stateid (server, &stateid, cred);
fs/nfs/nfs4state.c +2 -0
@@ -1390,6 +1390,8 @@ int nfs4_schedule_stateid_recovery(constif (!nfs4_state_mark_reclaim_nograce (clp, state))return -EBADF ; +nfs_inode_find_delegation_state_and_recover (state->inode, + &state->stateid);dprintk ("%s: scheduling stateid recovery for server %s\n" , __func__, clp->cl_hostname);nfs4_schedule_state_manager (clp);
Greg Kroah-Hartman
maintainerPATCH 144/235 of: add helper to lookup compatible child node
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 36156f9241cb0f9e37d998052873ca7501ad4b36 upstream.
Add of_get_compatible_child() helper that can be used to lookup compatible child nodes.
Several drivers currently use of_find_compatible_node() to lookup child nodes while failing to notice that the of_find_ functions search the entire tree depth-first (from a given start node) and therefore can match unrelated nodes. The fact that these functions also drop a reference to the node they start searching from (e.g. the parent node) is typically also overlooked, something which can lead to use-after-free bugs.
--- drivers/of/base.c | 25 +++++++++++++++++++++++++ include/linux/of.h | 8 ++++++++ 2 files changed, 33 insertions(+)
drivers/of/base.c +25 -0
@@ -723,6 +723,31 @@ struct device_node *of_get_next_availablEXPORT_SYMBOL (of_get_next_available_child);/** +* of_get_compatible_child - Find compatible child node +* @parent: parent node +* @compatible: compatible string +* +* Lookup child node whose compatible property contains the given compatible +* string. +* +* Returns a node pointer with refcount incremented, use of_node_put() on it +* when done; or NULL if not found. +*/ +struct device_node *of_get_compatible_child (const struct device_node *parent, +const char *compatible) +{ +struct device_node *child; + +for_each_child_of_node (parent, child) { +if (of_device_is_compatible (child, compatible)) +break ; + } + +return child; +} +EXPORT_SYMBOL (of_get_compatible_child); + +/** * of_get_child_by_name - Find the child node by name for a given parent * @node: parent node * @name: child name to look for.
include/linux/of.h +8 -0
@@ -290,6 +290,8 @@ extern struct device_node *of_get_next_cextern struct device_node *of_get_next_available_child (const struct device_node *node,struct device_node *prev); +extern struct device_node *of_get_compatible_child (const struct device_node *parent, +const char *compatible);extern struct device_node *of_get_child_by_name (const struct device_node *node,const char *name);
@@ -632,6 +634,12 @@ static inline bool of_have_populated_dt(return false; } +static inline struct device_node *of_get_compatible_child (const struct device_node *parent, +const char *compatible) +{ +return NULL ; +} +static inline struct device_node *of_get_child_by_name (const struct device_node *node,const char *name)
Greg Kroah-Hartman
maintainerPATCH 145/235 mmc: meson-mx-sdio: fix OF child-node lookup
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit c483a5cc9d09f4ceaa9abb106f863cc89cb643d9 upstream.
Use the new of_get_compatible_child() helper to lookup the slot child node instead of using of_find_compatible_node(), which searches the entire tree from a given start node and thus can return an unrelated (i.e. non-child) node.
This also addresses a potential use-after-free (e.g. after probe deferral) as the tree-wide helper drops a reference to its first argument (i.e. the node of the device being probed).
While at it, also fix up the related slot-node reference leak.
--- drivers/mmc/host/meson-mx-sdio.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/mmc/host/meson-mx-sdio.c +6 -2
@@ -517,19 +517,23 @@ static struct mmc_host_ops meson_mx_mmc_static struct platform_device *meson_mx_mmc_slot_pdev (struct device *parent) {struct device_node *slot_node; +struct platform_device *pdev;/* * TODO: the MMC core framework currently does not support * controllers with multiple slots properly. So we only register * the first slot for now */ - slot_node =of_find_compatible_node (parent->of_node,NULL ,"mmc-slot" ); + slot_node =of_get_compatible_child (parent->of_node,"mmc-slot" );if (!slot_node) {dev_warn (parent,"no 'mmc-slot' sub-node found\n" );return ERR_PTR (-ENOENT ); } -return of_platform_device_create (slot_node,NULL , parent); + pdev =of_platform_device_create (slot_node,NULL , parent); +of_node_put (slot_node); + +return pdev; }static int meson_mx_mmc_add_host (struct meson_mx_mmc_host *host)
Greg Kroah-Hartman
maintainerPATCH 146/235 binfmt_elf: Respect error return from `regset->active
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Maciej W. Rozycki" <[email protected]>
[ Upstream commit 2f819db565e82e5f73cd42b39925098986693378 ]
The regset API documented in <linux/regset.h> defines -ENODEV as the result of the ->active' handler to be used where the feature requested is not available on the hardware found. However code handling core file note generation in fill_thread_core_info' interpretes any non-zero result from the `->active' handler as the regset requested being active. Consequently processing continues (and hopefully gracefully fails later on) rather than being abandoned right away for the regset requested.
Fix the problem then by making the code proceed only if a positive result is returned from the `->active' handler.
Patchwork: https://patchwork.linux-mips.org/patch/19332/
--- fs/binfmt_elf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/binfmt_elf.c +1 -1
@@ -1751,7 +1751,7 @@ static int fill_thread_core_info(structconst struct user_regset *regset = &view->regsets[i];do_thread_regset_writeback (t->task, regset);if (regset->core_note_type && regset->get && - (!regset->active || regset->active (t->task, regset))) { + (!regset->active || regset->active (t->task, regset) >0 )) {int ret;size_t size =regset_size (t->task, regset);void *data =kmalloc (size,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 147/235 net/mlx5: Add missing SET_DRIVER_VERSION command translation
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Noa Osherovich <[email protected]>
[ Upstream commit 0f4039104ee61e14ac4771a2181c2a20572f4ec9 ]
When translating command opcodes to a string, SET_DRIVER_VERSION command was missing.
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +1 -0
@@ -452,6 +452,7 @@ const char *mlx5_command_str(int commandMLX5_COMMAND_STR_CASE (SET_HCA_CAP );MLX5_COMMAND_STR_CASE (QUERY_ISSI );MLX5_COMMAND_STR_CASE (SET_ISSI ); +MLX5_COMMAND_STR_CASE (SET_DRIVER_VERSION );MLX5_COMMAND_STR_CASE (CREATE_MKEY );MLX5_COMMAND_STR_CASE (QUERY_MKEY );MLX5_COMMAND_STR_CASE (DESTROY_MKEY );
Greg Kroah-Hartman
maintainerPATCH 148/235 arm64: dts: uniphier: Add missing cooling device properties for CPUs
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
[ Upstream commit af0e09d0c6762e486b0eb5cc4737396964c34fad ]
The cooling device properties, like "#cooling-cells" and "dynamic-power-coefficient", should either be present for all the CPUs of a cluster or none. If these are present only for a subset of CPUs of a cluster then things will start falling apart as soon as the CPUs are brought online in a different order. For example, this will happen because the operating system looks for such properties in the CPU node it is trying to bring up, so that it can register a cooling device.
Add such missing properties.
--- arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi +2 -0
@@ -58,6 +58,7 @@ clocks = <&sys_clk 32>; enable-method = "psci"; operating-points-v2 = <&cluster0_opp>; + #cooling-cells = <2>; }; cpu2: cpu@100 {
@@ -77,6 +78,7 @@ clocks = <&sys_clk 33>; enable-method = "psci"; operating-points-v2 = <&cluster1_opp>; + #cooling-cells = <2>; }; };
Greg Kroah-Hartman
maintainerPATCH 149/235 audit: fix use-after-free in audit_add_watch
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ronny Chevalier <[email protected]>
[ Upstream commit baa2a4fdd525c8c4b0f704d20457195b29437839 ]
audit_add_watch stores locally krule->watch without taking a reference on watch. Then, it calls audit_add_to_parent, and uses the watch stored locally.
Unfortunately, it is possible that audit_add_to_parent updates krule->watch.
When it happens, it also drops a reference of watch which could free the watch.
How to reproduce (with KASAN enabled):
auditctl -w /etc/passwd -F success=0 -k test_passwd auditctl -w /etc/passwd -F success=1 -k test_passwd2
The second call to auditctl triggers the use-after-free, because audit_to_parent updates krule->watch to use a previous existing watch and drops the reference to the newly created watch.
To fix the issue, we grab a reference of watch and we release it at the end of the function.
--- kernel/audit_watch.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
kernel/audit_watch.c +11 -1
@@ -419,6 +419,13 @@ int audit_add_watch(struct audit_krule *struct path parent_path;int h, ret =0 ; +/* +* When we will be calling audit_add_to_parent, krule->watch might have +* been updated and watch might have been freed. +* So we need to keep a reference of watch. +*/ +audit_get_watch (watch); +mutex_unlock (&audit_filter_mutex);/* Avoid calling path_lookup under audit_filter_mutex. */
@@ -427,8 +434,10 @@ int audit_add_watch(struct audit_krule */* caller expects mutex locked */ mutex_lock (&audit_filter_mutex); -if (ret) +if (ret) { +audit_put_watch (watch);return ret; + }/* either find an old parent or attach a new one */ parent =audit_find_parent (d_backing_inode (parent_path.dentry));
@@ -446,6 +455,7 @@ int audit_add_watch(struct audit_krule * *list = &audit_inode_hash[h]; error:path_put (&parent_path); +audit_put_watch (watch);return ret; }
Greg Kroah-Hartman
maintainerPATCH 150/235 mtdchar: fix overflows in adjustment of `count`
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jann Horn <[email protected]>
[ Upstream commit 6c6bc9ea84d0008024606bf5ba10519e20d851bf ]
The first checks in mtdchar_read() and mtdchar_write() attempt to limit count such that *ppos + count <= mtd->size. However, they ignore the possibility of *ppos > mtd->size, allowing the calculation of count to wrap around. mtdchar_lseek() prevents seeking beyond mtd->size, but the pread/pwrite syscalls bypass this.
I haven't found any codepath on which this actually causes dangerous behavior, but it seems like a sensible change anyway.
--- drivers/mtd/mtdchar.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/mtd/mtdchar.c +7 -3
@@ -160,8 +160,12 @@ static ssize_t mtdchar_read(struct filepr_debug ("MTD_read\n" ); -if (*ppos + count > mtd->size) - count = mtd->size - *ppos; +if (*ppos + count > mtd->size) { +if (*ppos < mtd->size) + count = mtd->size - *ppos; +else + count =0 ; + }if (!count)return 0 ;
@@ -246,7 +250,7 @@ static ssize_t mtdchar_write(struct filepr_debug ("MTD_write\n" ); -if (*ppos == mtd->size) +if (*ppos >= mtd->size)return -ENOSPC ;if (*ppos + count > mtd->size)
Greg Kroah-Hartman
maintainerPATCH 151/235 vfs: fix freeze protection in mnt_want_write_file() for overlayfs
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
[ Upstream commit a6795a585929d94ca3e931bc8518f8deb8bbe627 ]
The underlying real file used by overlayfs still contains the overlay path. This results in mnt_want_write_file() calls by the filesystem getting freeze protection on the wrong inode (the overlayfs one instead of the real one).
Fix by using file_inode(file)->i_sb instead of file->f_path.mnt->mnt_sb.
--- fs/namespace.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/namespace.c +4 -3
@@ -446,10 +446,10 @@ int mnt_want_write_file_path(struct file {int ret; -sb_start_write (file->f_path.mnt->mnt_sb); +sb_start_write (file_inode (file)->i_sb); ret =__mnt_want_write_file (file);if (ret) -sb_end_write (file->f_path.mnt->mnt_sb); +sb_end_write (file_inode (file)->i_sb);return ret; }
@@ -540,7 +540,8 @@ void __mnt_drop_write_file(struct file *void mnt_drop_write_file_path (struct file *file) { -mnt_drop_write (file->f_path.mnt); +__mnt_drop_write_file (file); +sb_end_write (file_inode (file)->i_sb); }void mnt_drop_write_file (struct file *file)
Greg Kroah-Hartman
maintainerPATCH 152/235 bpf: fix rcu annotations in compute_effective_progs()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Gushchin <[email protected]>
[ Upstream commit 3960f4fd6585608e8cc285d9665821985494e147 ]
The progs local variable in compute_effective_progs() is marked as __rcu, which is not correct. This is a local pointer, which is initialized by bpf_prog_array_alloc(), which also now returns a generic non-rcu pointer.
The real rcu-protected pointer is *array (array is a pointer to an RCU-protected pointer), so the assignment should be performed using rcu_assign_pointer().
--- kernel/bpf/cgroup.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
kernel/bpf/cgroup.c +3 -4
@@ -95,7 +95,7 @@ static int compute_effective_progs(strucenum bpf_attach_type type, struct bpf_prog_array __rcu **array) { - struct bpf_prog_array __rcu *progs; + struct bpf_prog_array *progs;struct bpf_prog_list *pl;struct cgroup *p = cgrp;int cnt =0 ;
@@ -120,13 +120,12 @@ static int compute_effective_progs(struc &p->bpf.progs[type], node) {if (!pl->prog)continue ; -rcu_dereference_protected (progs,1 )-> - progs[cnt++] = pl->prog; + progs->progs[cnt++] = pl->prog; } p =cgroup_parent (p); }while (p); - *array = progs; +rcu_assign_pointer (*array, progs);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 153/235 spi: dw: fix possible race condition
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Belloni <[email protected]>
[ Upstream commit 66b19d762378785d1568b5650935205edfeb0503 ]
It is possible to get an interrupt as soon as it is requested. dw_spi_irq does spi_controller_get_devdata(master) and expects it to be different than NULL. However, spi_controller_set_devdata() is called after request_irq(), resulting in the following crash:
CPU 0 Unable to handle kernel paging request at virtual address 00000030, epc == 8058e09c, ra == 8018ff90 [...]
Call Trace: [<8058e09c>] dw_spi_irq+0x8/0x64 [<8018ff90>] __handle_irq_event_percpu+0x70/0x1d4 [<80190128>] handle_irq_event_percpu+0x34/0x8c [<801901c4>] handle_irq_event+0x44/0x80 [<801951a8>] handle_level_irq+0xdc/0x194 [<8018f580>] generic_handle_irq+0x38/0x50 [<804c6924>] ocelot_irq_handler+0x104/0x1c0
--- drivers/spi/spi-dw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spi-dw.c +2 -1
@@ -485,6 +485,8 @@ int dw_spi_add_host(struct device *dev, dws->dma_inited =0 ; dws->dma_addr = (dma_addr_t)(dws->paddr +DW_SPI_DR ); +spi_controller_set_devdata (master, dws); + ret =request_irq (dws->irq, dw_spi_irq,IRQF_SHARED ,dev_name (dev), master);if (ret <0 ) {
@@ -518,7 +520,6 @@ int dw_spi_add_host(struct device *dev, } } -spi_controller_set_devdata (master, dws); ret =devm_spi_register_controller (dev, master);if (ret) {dev_err (&master->dev,"problem registering spi master\n" );
Greg Kroah-Hartman
maintainerPATCH 154/235 Bluetooth: Use lock_sock_nested in bt_accept_enqueue
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Puschmann <[email protected]>
[ Upstream commit b71c69c26b4916d11b8d403d8e667bbd191f1b8f ]
Fixes this warning that was provoked by a pairing:
[60258.016221] WARNING: possible recursive locking detected
[60258.021558] 4.15.0-RD1812-BSP #1 Tainted: G O
[60258.027146] --------------------------------------------
[60258.032464] kworker/u5:0/70 is trying to acquire lock:
[60258.037609] (sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP){+.+.}, at: [<87759073>] bt_accept_enqueue+0x3c/0x74
[60258.046863]
[60258.046863] but task is already holding lock:
[60258.052704] (sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP){+.+.}, at: [<d22d7106>] l2cap_sock_new_connection_cb+0x1c/0x88
[60258.062905]
[60258.062905] other info that might help us debug this:
[60258.069441] Possible unsafe locking scenario:
[60258.069441]
[60258.075368] CPU0
[60258.077821] ----
[60258.080272] lock(sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP);
[60258.085510] lock(sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP);
[60258.090748]
[60258.090748] *** DEADLOCK ***
[60258.090748]
[60258.096676] May be due to missing lock nesting notation
[60258.096676]
[60258.103472] 5 locks held by kworker/u5:0/70:
[60258.107747] #0: ((wq_completion)%shdev->name#2){+.+.}, at: [<9460d092>] process_one_work+0x130/0x4fc
[60258.117263] #1: ((work_completion)(&hdev->rx_work)){+.+.}, at: [<9460d092>] process_one_work+0x130/0x4fc
[60258.126942] #2: (&conn->chan_lock){+.+.}, at: [<7877c8c3>] l2cap_connect+0x80/0x4f8
[60258.134806] #3: (&chan->lock/2){+.+.}, at: [<2e16c724>] l2cap_connect+0x8c/0x4f8
[60258.142410] #4: (sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP){+.+.}, at: [<d22d7106>] l2cap_sock_new_connection_cb+0x1c/0x88
[60258.153043]
[60258.153043] stack backtrace:
[60258.157413] CPU: 1 PID: 70 Comm: kworker/u5:0 Tainted: G O 4.15.0-RD1812-BSP #1
[60258.165945] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[60258.172485] Workqueue: hci0 hci_rx_work
[60258.176331] Backtrace:
[60258.178797] [<8010c9fc>] (dump_backtrace) from [<8010ccbc>] (show_stack+0x18/0x1c)
[60258.186379] r7:80e55fe4 r6:80e55fe4 r5:20050093 r4:00000000
[60258.192058] [<8010cca4>] (show_stack) from [<809864e8>] (dump_stack+0xb0/0xdc)
[60258.199301] [<80986438>] (dump_stack) from [<8016ecc8>] (__lock_acquire+0xffc/0x11d4)
[60258.207144] r9:5e2bb019 r8:630f974c r7:ba8a5940 r6:ba8a5ed8 r5:815b5220 r4:80fa081c
[60258.214901] [<8016dccc>] (__lock_acquire) from [<8016f620>] (lock_acquire+0x78/0x98)
[60258.222655] r10:00000040 r9:00000040 r8:808729f0 r7:00000001 r6:00000000 r5:60050013
[60258.230491] r4:00000000
[60258.233045] [<8016f5a8>] (lock_acquire) from [<806ee974>] (lock_sock_nested+0x64/0x88)
[60258.240970] r7:00000000 r6:b796e870 r5:00000001 r4:b796e800
[60258.246643] [<806ee910>] (lock_sock_nested) from [<808729f0>] (bt_accept_enqueue+0x3c/0x74)
[60258.255004] r8:00000001 r7:ba7d3c00 r6:ba7d3ea4 r5:ba7d2000 r4:b796e800
[60258.261717] [<808729b4>] (bt_accept_enqueue) from [<808aa39c>] (l2cap_sock_new_connection_cb+0x68/0x88)
[60258.271117] r5:b796e800 r4:ba7d2000
[60258.274708] [<808aa334>] (l2cap_sock_new_connection_cb) from [<808a294c>] (l2cap_connect+0x190/0x4f8)
[60258.283933] r5:00000001 r4:ba6dce00
[60258.287524] [<808a27bc>] (l2cap_connect) from [<808a4a14>] (l2cap_recv_frame+0x744/0x2cf8)
[60258.295800] r10:ba6dcf24 r9:00000004 r8:b78d8014 r7:00000004 r6:bb05d000 r5:00000004
[60258.303635] r4:bb05d008
[60258.306183] [<808a42d0>] (l2cap_recv_frame) from [<808a7808>] (l2cap_recv_acldata+0x210/0x214)
[60258.314805] r10:b78e7800 r9:bb05d960 r8:00000001 r7:bb05d000 r6:0000000c r5:b7957a80
[60258.322641] r4:ba6dce00
[60258.325188] [<808a75f8>] (l2cap_recv_acldata) from [<8087630c>] (hci_rx_work+0x35c/0x4e8)
[60258.333374] r6:80e5743c r5:bb05d7c8 r4:b7957a80
[60258.338004] [<80875fb0>] (hci_rx_work) from [<8013dc7c>] (process_one_work+0x1a4/0x4fc)
[60258.346018] r10:00000001 r9:00000000 r8:baabfef8 r7:ba997500 r6:baaba800 r5:baaa5d00
[60258.353853] r4:bb05d7c8
[60258.356401] [<8013dad8>] (process_one_work) from [<8013e028>] (worker_thread+0x54/0x5cc)
[60258.364503] r10:baabe038 r9:baaba834 r8:80e05900 r7:00000088 r6:baaa5d18 r5:baaba800
[60258.372338] r4:baaa5d00
[60258.374888] [<8013dfd4>] (worker_thread) from [<801448f8>] (kthread+0x134/0x160)
[60258.382295] r10:ba8310b8 r9:bb07dbfc r8:8013dfd4 r7:baaa5d00 r6:00000000 r5:baaa8ac0
[60258.390130] r4:ba831080
[60258.392682] [<801447c4>] (kthread) from [<801080b4>] (ret_from_fork+0x14/0x20)
[60258.399915] r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:801447c4
[60258.407751] r4:baaa8ac0 r3:baabe000--- net/bluetooth/af_bluetooth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/af_bluetooth.c +1 -1
@@ -159,7 +159,7 @@ void bt_accept_enqueue(struct sock *pareBT_DBG ("parent %p, sk %p" , parent, sk);sock_hold (sk); -lock_sock (sk); +lock_sock_nested (sk,SINGLE_DEPTH_NESTING );list_add_tail (&bt_sk (sk)->accept_q, &bt_sk (parent)->accept_q);bt_sk (sk)->parent = parent;release_sock (sk);
Greg Kroah-Hartman
maintainerPATCH 155/235 evm: Dont deadlock if a crypto algorithm is unavailable
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Garrett <[email protected]>
[ Upstream commit e2861fa71641c6414831d628a1f4f793b6562580 ]
When EVM attempts to appraise a file signed with a crypto algorithm the kernel doesn't have support for, it will cause the kernel to trigger a module load. If the EVM policy includes appraisal of kernel modules this will in turn call back into EVM - since EVM is holding a lock until the crypto initialisation is complete, this triggers a deadlock. Add a CRYPTO_NOLOAD flag and skip module loading if it's set, and add that flag in the EVM case in order to fail gracefully with an error message instead of deadlocking.
--- crypto/api.c | 2 +- include/linux/crypto.h | 5 +++++ security/integrity/evm/evm_crypto.c | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-)
crypto/api.c +1 -1
@@ -229,7 +229,7 @@ static struct crypto_alg *crypto_larval_ mask &= ~(CRYPTO_ALG_LARVAL |CRYPTO_ALG_DEAD ); alg =crypto_alg_lookup (name, type, mask); -if (!alg) { +if (!alg && !(mask &CRYPTO_NOLOAD )) {request_module ("crypto-%s" , name); if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask &
include/linux/crypto.h +5 -0
@@ -113,6 +113,11 @@#define CRYPTO_ALG_OPTIONAL_KEY 0x00004000/* +* Don't trigger module loading +*/ +#define CRYPTO_NOLOAD 0x00008000 + +/* * Transform masks and values (for crt_flags). */ #define CRYPTO_TFM_NEED_KEY 0x00000001
security/integrity/evm/evm_crypto.c +2 -1
@@ -97,7 +97,8 @@ static struct shash_desc *init_desc(charmutex_lock (&mutex);if (*tfm) goto out; - *tfm =crypto_alloc_shash (algo,0 ,CRYPTO_ALG_ASYNC ); + *tfm =crypto_alloc_shash (algo,0 , +CRYPTO_ALG_ASYNC |CRYPTO_NOLOAD );if (IS_ERR (*tfm)) { rc =PTR_ERR (*tfm);pr_err ("Can not allocate %s (reason: %ld)\n" , algo, rc);
Greg Kroah-Hartman
maintainerPATCH 156/235 KVM: PPC: Book3S HV: Add of_node_put() in success path
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Mc Guire <[email protected]>
[ Upstream commit 51eaa08f029c7343df846325d7cf047be8b96e81 ]
The call to of_find_compatible_node() is returning a pointer with incremented refcount so it must be explicitly decremented after the last use. As here it is only being used for checking of node presence but the result is not actually used in the success path it can be dropped immediately.
--- arch/powerpc/kvm/book3s_hv.c | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/kvm/book3s_hv.c +2 -0
@@ -4562,6 +4562,8 @@ static int kvmppc_book3s_init_hv(void)pr_err ("KVM-HV: Cannot determine method for accessing XICS\n" ); return -ENODEV; } +/* presence of intc confirmed - node can be dropped again */ +of_node_put (np); }#endif
Greg Kroah-Hartman
maintainerPATCH 157/235 security: check for kstrdup() failure in lsm_append()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
[ Upstream commit 87ea58433208d17295e200d56be5e2a4fe4ce7d6 ]
lsm_append() should return -ENOMEM if memory allocation failed.
--- security/security.c | 2 ++ 1 file changed, 2 insertions(+)
security/security.c +2 -0
@@ -118,6 +118,8 @@ static int lsm_append(char *new, char **if (*result ==NULL ) { *result =kstrdup (new,GFP_KERNEL ); +if (*result ==NULL ) +return -ENOMEM ; }else {/* Check if it is the last registered name */ if (match_last_lsm (*result, new))
Greg Kroah-Hartman
maintainerPATCH 158/235 PM / devfreq: use put_device() instead of kfree()
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arvind Yadav <[email protected]>
[ Upstream commit 2d803dc8f7a5f622ac47c3b650834ada3a2659b9 ]
Never directly free @dev after calling device_register() or device_unregister(), even if device_register() returned an error. Always use put_device() to give up the reference initialized.
--- drivers/devfreq/devfreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/devfreq/devfreq.c +3 -1
@@ -625,7 +625,8 @@ struct devfreq *devfreq_add_device(struc err =device_register (&devfreq->dev);if (err) {mutex_unlock (&devfreq->lock); - goto err_dev; +put_device (&devfreq->dev); + goto err_out; } devfreq->trans_table =
@@ -672,6 +673,7 @@ err_init:mutex_unlock (&devfreq_list_lock);device_unregister (&devfreq->dev); + devfreq =NULL ; err_dev:if (devfreq)kfree (devfreq);
Greg Kroah-Hartman
maintainerPATCH 159/235 KVM: PPC: Book3S: Fix matching of hardware and emulated TCE tables
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Kardashevskiy <[email protected]>
[ Upstream commit 76346cd93a5eca33700f82685d56172dd65d4c0a ]
When attaching a hardware table to LIOBN in KVM, we match table parameters such as page size, table offset and table size. However the tables are created via very different paths - VFIO and KVM - and the VFIO path goes through the platform code which has minimum TCE page size requirement (which is 4K but since we allocate memory by pages and cannot avoid alignment anyway, we align to 64k pages for powernv_defconfig).
So when we match the tables, one might be bigger that the other which means the hardware table cannot get attached to LIOBN and DMA mapping fails.
This removes the table size alignment from the guest visible table. This does not affect the memory allocation which is still aligned - kvmppc_tce_pages() takes care of this.
This relaxes the check we do when attaching tables to allow the hardware table be bigger than the guest visible table.
Ideally we want the KVM table to cover the same space as the hardware table does but since the hardware table may use multiple levels, and all levels must use the same table size (IODA2 design), the area it can actually cover might get very different from the window size which the guest requested, even though the guest won't map it all.
--- arch/powerpc/kvm/book3s_64_vio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/powerpc/kvm/book3s_64_vio.c +2 -3
@@ -180,7 +180,7 @@ extern long kvm_spapr_tce_attach_iommu_gif ((tbltmp->it_page_shift <= stt->page_shift) && (tbltmp->it_offset << tbltmp->it_page_shift == stt->offset << stt->page_shift) && - (tbltmp->it_size << tbltmp->it_page_shift == + (tbltmp->it_size << tbltmp->it_page_shift >= stt->size << stt->page_shift)) {/* * Reference the table to avoid races with
@@ -296,7 +296,7 @@ long kvm_vm_ioctl_create_spapr_tce(struc {struct kvmppc_spapr_tce_table *stt =NULL ;struct kvmppc_spapr_tce_table *siter; -unsigned long npages, size; +unsigned long npages, size = args->size;int ret = -ENOMEM ;int i;
@@ -304,7 +304,6 @@ long kvm_vm_ioctl_create_spapr_tce(struc (args->offset + args->size > (ULLONG_MAX >> args->page_shift)))return -EINVAL ; - size =_ALIGN_UP (args->size,PAGE_SIZE >>3 ); npages =kvmppc_tce_pages (size); ret =kvmppc_account_memlimit (kvmppc_stt_pages (npages), true);if (ret)
Greg Kroah-Hartman
maintainerPATCH 160/235 MIPS: loongson64: cs5536: Fix PCI_OHCI_INT_REG reads
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
[ Upstream commit cd87668d601f622e0ebcfea4f78d116d5f572f4d ]
The PCI_OHCI_INT_REG case in pci_ohci_read_reg() contains the following if statement:
if ((lo & 0x00000f00) == CS5536_USB_INTR)
CS5536_USB_INTR expands to the constant 11, which gives us the following condition which can never evaluate true:
if ((lo & 0xf00) == 11)
At least when using GCC 8.1.0 this falls foul of the tautoligcal-compare warning, and since the code is built with the -Werror flag the build fails.
Fix this by shifting lo right by 8 bits in order to match the corresponding PCI_OHCI_INT_REG case in pci_ohci_write_reg().
Patchwork: https://patchwork.linux-mips.org/patch/19861/
--- arch/mips/loongson64/common/cs5536/cs5536_ohci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/loongson64/common/cs5536/cs5536_ohci.c +1 -1
@@ -138,7 +138,7 @@ u32 pci_ohci_read_reg(int reg)break ;case PCI_OHCI_INT_REG :_rdmsr (DIVIL_MSR_REG (PIC_YSEL_LOW ), &hi, &lo); -if ((lo &0x00000f00 ) ==CS5536_USB_INTR ) +if (((lo >>PIC_YSEL_LOW_USB_SHIFT ) &0xf ) ==CS5536_USB_INTR ) conf_data =1 ;break ;default :
Greg Kroah-Hartman
maintainerPATCH 161/235 configfs: fix registered group removal
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Christie <[email protected]>
[ Upstream commit cc57c07343bd071cdf1915a91a24ab7d40c9b590 ]
This patch fixes a bug where configfs_register_group had added
a group in a tree, and userspace has done a rmdir on a dir somewhere above that group and we hit a kernel crash. The problem is configfs_rmdir will detach everything under it and unlink groups on the default_groups list. It will not unlink groups added with configfs_register_group so when configfs_unregister_group is called to drop its references to the group/items we crash when we try to access the freed dentrys.
The patch just adds a check for if a rmdir has been done above us and if so just does the unlink part of unregistration.
Sorry if you are getting this multiple times. I thouhgt I sent this to some of you and lkml, but I do not see it.
--- fs/configfs/dir.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
fs/configfs/dir.c +11 -0
@@ -1777,6 +1777,16 @@ void configfs_unregister_group(struct costruct dentry *dentry = group->cg_item.ci_dentry;struct dentry *parent = group->cg_item.ci_parent->ci_dentry; +mutex_lock (&subsys->su_mutex); +if (!group->cg_item.ci_parent->ci_group) { +/* +* The parent has already been unlinked and detached +* due to a rmdir. +*/ + goto unlink_group; + } +mutex_unlock (&subsys->su_mutex); +inode_lock_nested (d_inode (parent),I_MUTEX_PARENT );spin_lock (&configfs_dirent_lock);configfs_detach_prep (dentry,NULL );
@@ -1791,6 +1801,7 @@ void configfs_unregister_group(struct codput (dentry);mutex_lock (&subsys->su_mutex); +unlink_group:unlink_group (group);mutex_unlock (&subsys->su_mutex); }
Greg Kroah-Hartman
maintainerPATCH 162/235 pinctrl: mt7622: Fix probe fail by misuse the selector
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Wang <[email protected]>
[ Upstream commit 238262af08a20e5f1932fcf606b8b84370ac8b77 ]
After the commit acf137951367 ("pinctrl: core: Return selector to the pinctrl driver") and the commit 47f1242d19c3 ("pinctrl: pinmux: Return selector to the pinctrl driver"), it's necessary to add the fixes needed for the pin controller drivers to use the appropriate returned selector for a negative error number returned in case of the fail at these functions. Otherwise, the driver would have a failed probe and that causes boot message cannot correctly output and devices fail to acquire their own pins.
--- drivers/pinctrl/mediatek/pinctrl-mt7622.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pinctrl/mediatek/pinctrl-mt7622.c +2 -2
@@ -1537,7 +1537,7 @@ static int mtk_build_groups(struct mtk_p err =pinctrl_generic_add_group (hw->pctrl, group->name, group->pins, group->num_pins, group->data); -if (err) { +if (err <0 ) {dev_err (hw->dev,"Failed to register group %s\n" , group->name);return err;
@@ -1558,7 +1558,7 @@ static int mtk_build_functions(struct mt func->group_names, func->num_group_names, func->data); -if (err) { +if (err <0 ) {dev_err (hw->dev,"Failed to register function %s\n" , func->name);return err;
Greg Kroah-Hartman
maintainerPATCH 163/235 pinctrl: rza1: Fix selector use for groups and functions
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit dc4003d260594aa300028c3c5d040c5719abd19b ]
We must use a mutex around the generic_add functions and save the function and group selector in case we need to remove them. Otherwise the selector use will be racy for deferred probe at least.
--- drivers/pinctrl/pinctrl-rza1.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
drivers/pinctrl/pinctrl-rza1.c +13 -11
@@ -1006,6 +1006,7 @@ static int rza1_dt_node_to_map(struct piconst char *grpname;const char **fngrps;int ret, npins; +int gsel, fsel; npins =rza1_dt_node_pin_count (np);if (npins <0 ) {
@@ -1055,18 +1056,19 @@ static int rza1_dt_node_to_map(struct pi fngrps[0 ] = grpname;mutex_lock (&rza1_pctl->mutex); - ret =pinctrl_generic_add_group (pctldev, grpname, grpins, npins, -NULL ); -if (ret) { + gsel =pinctrl_generic_add_group (pctldev, grpname, grpins, npins, +NULL ); +if (gsel <0 ) {mutex_unlock (&rza1_pctl->mutex); -return ret; +return gsel; } - ret =pinmux_generic_add_function (pctldev, grpname, fngrps,1 , - mux_confs); -if (ret) + fsel =pinmux_generic_add_function (pctldev, grpname, fngrps,1 , + mux_confs); +if (fsel <0 ) { + ret = fsel; goto remove_group; -mutex_unlock (&rza1_pctl->mutex); + }dev_info (rza1_pctl->dev,"Parsed function and group %s with %d pins\n" , grpname, npins);
@@ -1083,15 +1085,15 @@ static int rza1_dt_node_to_map(struct pi (*map)->data.mux.group = np->name; (*map)->data.mux.function = np->name; *num_maps =1 ; +mutex_unlock (&rza1_pctl->mutex);return 0 ; remove_function: -mutex_lock (&rza1_pctl->mutex); -pinmux_generic_remove_last_function (pctldev); +pinmux_generic_remove_function (pctldev, fsel); remove_group: -pinctrl_generic_remove_last_group (pctldev); +pinctrl_generic_remove_group (pctldev, gsel);mutex_unlock (&rza1_pctl->mutex); dev_info(rza1_pctl->dev, "Unable to parse function and group %s\n",
Greg Kroah-Hartman
maintainerPATCH 164/235 pinctrl: pinmux: Return selector to the pinctrl driver
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit f913cfce4ee49a3382a9ff95696f49a46e56e974 ]
We must return the selector from pinmux_generic_add_function() so pin controller device drivers can remove the right group if needed for deferred probe for example. And we now must make sure that a proper name is passed so we can use it to check if the entry already exists.
Note that fixes are also needed for the pin controller drivers to use the selector value.
managing groups")
--- drivers/pinctrl/pinmux.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/pinctrl/pinmux.c +12 -4
@@ -308,7 +308,6 @@ static int pinmux_func_name_to_selector( selector++; } -dev_err (pctldev->dev,"function '%s' not supported\n" , function);return -EINVAL ; }
@@ -775,6 +774,16 @@ int pinmux_generic_add_function(struct p void *data) {struct function_desc *function; +int selector; + +if (!name) +return -EINVAL ; + + selector =pinmux_func_name_to_selector (pctldev, name); +if (selector >=0 ) +return selector; + + selector = pctldev->num_functions; function =devm_kzalloc (pctldev->dev,sizeof (*function),GFP_KERNEL );if (!function)
@@ -785,12 +794,11 @@ int pinmux_generic_add_function(struct p function->num_group_names = num_groups; function->data = data; -radix_tree_insert (&pctldev->pin_function_tree, pctldev->num_functions, - function); +radix_tree_insert (&pctldev->pin_function_tree, selector, function); pctldev->num_functions++; -return 0 ; +return selector; }EXPORT_SYMBOL_GPL (pinmux_generic_add_function);
Re: [PATCH 4.18 164/235] pinctrl: pinmux: Return selector to the pinctrl driver
Quoted 1 line · Greg Kroah-Hartman
4.18-stable review patch. If anyone has any objections, please let me know.
I bisected a boot failure on an x15 (arm) board to this commit on 4.18.10-rc1. I'm also seeing issues on 4.14 and 4.18 with arm64 boards hikey and dragonboard 410c, but I have not investigated them yet (they could be unrelated).
I see there are fixes to this commit that have not been backported. Namely:
823dd71f58eb ("pinctrl: ingenic: Fix group & function error checking") a203728ac6bb ("pinctrl: core: Return selector to the pinctrl driver")
However, I tried adding those two in but I still see the boot failure on x15.
Dan
Quoted 78 lines
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit
f913cfce4ee49a3382a9ff95696f49a46e56e974]We must return the selector from
pinmux_generic_add_function()so pin controller device drivers can remove the right group if needed for deferred probe for example. And we now must make sure that a proper name is passed so we can use it to check if the entry already exists.Note that fixes are also needed for the pin controller drivers to use the selector value.
Fixes a76edc89b100 ("pinctrl: core: Add generic pinctrl functions formanaging groups")
Reported-by H. Nikolaus Schaller <[email protected]>Cc Christ van Willegen <[email protected]>Cc Haojian Zhuang <[email protected]>Cc Jacopo Mondi <[email protected]>Cc Paul Cercueil <[email protected]>Cc Sean Wang <[email protected]>Signed-off-by Tony Lindgren <[email protected]>Tested-by H. Nikolaus Schaller <[email protected]>Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Linus Walleij <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/pinctrl/pinmux.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)drivers/pinctrl/pinmux.c +12
-4@@ -308,7 +308,6 @@ static int pinmux_func_name_to_selector( selector++; } -dev_err (pctldev->dev,"function '%s' not supported\n" , function);return -EINVAL ; }@@ -775,6 +774,16 @@ int pinmux_generic_add_function(struct p void *data) {struct function_desc *function; +int selector; + +if (!name) +return -EINVAL ; + + selector =pinmux_func_name_to_selector (pctldev, name); +if (selector >=0 ) +return selector; + + selector = pctldev->num_functions; function =devm_kzalloc (pctldev->dev,sizeof (*function),GFP_KERNEL );if (!function)@@ -785,12 +794,11 @@ int pinmux_generic_add_function(struct p function->num_group_names = num_groups; function->data = data; -radix_tree_insert (&pctldev->pin_function_tree, pctldev->num_functions, - function); +radix_tree_insert (&pctldev->pin_function_tree, selector, function); pctldev->num_functions++; -return 0 ; +return selector; }EXPORT_SYMBOL_GPL (pinmux_generic_add_function);
Re: [PATCH 4.18 164/235] pinctrl: pinmux: Return selector to the pinctrl driver
Quoted 8 lines · Dan Rue
Quoted 1 line · Greg Kroah-Hartman
4.18-stable review patch. If anyone has any objections, please let me know.
I bisected a boot failure on an x15 (arm) board to this commit on 4.18.10-rc1. I'm also seeing issues on 4.14 and 4.18 with arm64 boards hikey and dragonboard 410c, but I have not investigated them yet (they could be unrelated).
Quoted 8 lines
I see there are fixes to this commit that have not been backported. Namely:
823dd71f58eb("pinctrl: ingenic: Fix group & function error checking")a203728ac6bb("pinctrl: core: Return selector to the pinctrl driver")However, I tried adding those two in but I still see the boot failure on x15.
Dropping 9c5cd7b6ca4e ("pinctrl: pinmux: Return selector to the pinctrl driver") does appear to fix the boot issues I'm seeing on x15 and hikey.
Dan
Quoted 81 lines
Dan
Quoted 78 lines
------------------
From: Tony Lindgren <[email protected]>
[ Upstream commit
f913cfce4ee49a3382a9ff95696f49a46e56e974]We must return the selector from
pinmux_generic_add_function()so pin controller device drivers can remove the right group if needed for deferred probe for example. And we now must make sure that a proper name is passed so we can use it to check if the entry already exists.Note that fixes are also needed for the pin controller drivers to use the selector value.
Fixes a76edc89b100 ("pinctrl: core: Add generic pinctrl functions formanaging groups")
Reported-by H. Nikolaus Schaller <[email protected]>Cc Christ van Willegen <[email protected]>Cc Haojian Zhuang <[email protected]>Cc Jacopo Mondi <[email protected]>Cc Paul Cercueil <[email protected]>Cc Sean Wang <[email protected]>Signed-off-by Tony Lindgren <[email protected]>Tested-by H. Nikolaus Schaller <[email protected]>Reviewed-by Andy Shevchenko <[email protected]>Signed-off-by Linus Walleij <[email protected]>Signed-off-by Sasha Levin <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/pinctrl/pinmux.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)drivers/pinctrl/pinmux.c +12
-4@@ -308,7 +308,6 @@ static int pinmux_func_name_to_selector( selector++; } -dev_err (pctldev->dev,"function '%s' not supported\n" , function);return -EINVAL ; }@@ -775,6 +774,16 @@ int pinmux_generic_add_function(struct p void *data) {struct function_desc *function; +int selector; + +if (!name) +return -EINVAL ; + + selector =pinmux_func_name_to_selector (pctldev, name); +if (selector >=0 ) +return selector; + + selector = pctldev->num_functions; function =devm_kzalloc (pctldev->dev,sizeof (*function),GFP_KERNEL );if (!function)@@ -785,12 +794,11 @@ int pinmux_generic_add_function(struct p function->num_group_names = num_groups; function->data = data; -radix_tree_insert (&pctldev->pin_function_tree, pctldev->num_functions, - function); +radix_tree_insert (&pctldev->pin_function_tree, selector, function); pctldev->num_functions++; -return 0 ; +return selector; }EXPORT_SYMBOL_GPL (pinmux_generic_add_function);
Greg Kroah-Hartman
maintainerRe: [PATCH 4.18 164/235] pinctrl: pinmux: Return selector to the pinctrl driver
In reply to Dan RueQuoted 8 lines · Dan Rue
Quoted 1 line · Greg Kroah-Hartman
4.18-stable review patch. If anyone has any objections, please let me know.
I bisected a boot failure on an x15 (arm) board to this commit on 4.18.10-rc1. I'm also seeing issues on 4.14 and 4.18 with arm64 boards hikey and dragonboard 410c, but I have not investigated them yet (they could be unrelated).
Quoted 8 lines
I see there are fixes to this commit that have not been backported. Namely:
823dd71f58eb("pinctrl: ingenic: Fix group & function error checking")a203728ac6bb("pinctrl: core: Return selector to the pinctrl driver")However, I tried adding those two in but I still see the boot failure on x15.
Thanks for letting me know. I've dropped this patch from the 4.14.y and 4.18.y queues.
I'll push out -rc2 versions in a bit as all of these seem to have had problems...
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 165/235 arm64: dts: mt7622: update a clock property for UART0
In reply to Greg Kroah-Hartman4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryder Lee <[email protected]>
[ Upstream commit 2b519747ae4859e886c37834d766fe0c7d8d82e2 ]
The input clock of UART0 should be CLK_PERI_UART0_PD.
--- arch/arm64/boot/dts/mediatek/mt7622.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/mediatek/mt7622.dtsi +1 -1
@@ -331,7 +331,7 @@ reg = <0 0x11002000 0 0x400>; interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_LOW>; clocks = <&topckgen CLK_TOP_UART_SEL>, - <&pericfg CLK_PERI_UART1_PD>; + <&pericfg CLK_PERI_UART0_PD>; clock-names = "baud", "bus"; status = "disabled"; };