4.14.186-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 4.14.186-rc1 review
This is the start of the stable review cycle for the 4.14.186 release. There are 136 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 Thu, 25 Jun 2020 19:52:30 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.186-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.14.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.14.186-rc1
Ahmed S. Darwish <[email protected]>
net: core: device_rename: Use rwsem instead of a seqcount
Thomas Gleixner <[email protected]>
sched/rt, net: Use CONFIG_PREEMPTION.patch
Jiri Olsa <[email protected]>
kretprobe: Prevent triggering kretprobe from within kprobe_flush_task
Chen Yu <[email protected]>
e1000e: Do not wake up the system via WOL if device wakeup is disabled
Masami Hiramatsu <[email protected]>
kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex
Eric Biggers <[email protected]>
crypto: algboss - don't wait during notifier callback
Herbert Xu <[email protected]>
crypto: algif_skcipher - Cap recv SG list at ctx->used
Miquel Raynal <[email protected]>
mtd: rawnand: tmio: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: mtk: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: plat_nand: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: socrates: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: oxnas: Fix the probe error path
Nishka Dasgupta <[email protected]>
mtd: rawnand: oxnas: Add of_node_put()
Miquel Raynal <[email protected]>
mtd: rawnand: orion: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: xway: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: sharpsl: Fix the probe error path
Miquel Raynal <[email protected]>
mtd: rawnand: diskonchip: Fix the probe error path
Boris Brezillon <[email protected]>
mtd: rawnand: Pass a nand_chip object to nand_release()
Ahmed S. Darwish <[email protected]>
block: nr_sects_write(): Disable preemption on seqcount write
Ard Biesheuvel <[email protected]>
x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld
Lyude Paul <[email protected]>
drm/dp_mst: Increase ACT retry timeout to 3s
Jeffle Xu <[email protected]>
ext4: fix partial cluster initialization when splitting extent
Tom Rix <[email protected]>
selinux: fix double free
Huacai Chen <[email protected]>
drm/qxl: Use correct notify port address when creating cursor ring
Lyude Paul <[email protected]>
drm/dp_mst: Reformat drm_dp_check_act_status() a bit
Wolfram Sang <[email protected]>
drm: encoder_slave: fix refcouting error for modules
Kai-Heng Feng <[email protected]>
libata: Use per port sync for detach
Will Deacon <[email protected]>
arm64: hw_breakpoint: Don't invoke overflow handler on uaccess watchpoints
Jason Yan <[email protected]>
block: Fix use-after-free in blkdev_get()
Zhiqiang Liu <[email protected]>
bcache: fix potential deadlock problem in btree_gc_coalesce
Gaurav Singh <[email protected]>
perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events()
Qais Yousef <[email protected]>
usb/ehci-platform: Set PM runtime as active on resume
Qais Yousef <[email protected]>
usb/xhci-plat: Set PM runtime as active on resume
Christophe JAILLET <[email protected]>
scsi: acornscsi: Fix an error handling path in acornscsi_probe()
Jernej Skrabec <[email protected]>
drm/sun4i: hdmi ddc clk: Fix size of m divider
tannerlove <[email protected]>
selftests/net: in timestamping, strncpy needs to preserve null byte
Bob Peterson <[email protected]>
gfs2: fix use-after-free on transaction ail lists
Chaitanya Kulkarni <[email protected]>
blktrace: fix endianness for blk_log_remap()
Chaitanya Kulkarni <[email protected]>
blktrace: fix endianness in get_pdu_int()
Chaitanya Kulkarni <[email protected]>
blktrace: use errno instead of bi_status
Ram Pai <[email protected]>
selftests/vm/pkeys: fix alloc_random_pkey() to make it really random
Nick Desaulniers <[email protected]>
elfnote: mark all .note sections SHF_ALLOC
Arnd Bergmann <[email protected]>
include/linux/bitops.h: avoid clang shift-count-overflow warnings
Jann Horn <[email protected]>
lib/zlib: remove outdated and incorrect pre-increment optimization
Jiri Benc <[email protected]>
geneve: change from tx_error to tx_dropped on missing metadata
Tero Kristo <[email protected]>
crypto: omap-sham - add proper load balancing support for multicore
Christophe JAILLET <[email protected]>
pinctrl: freescale: imx: Fix an error handling path in 'imx_pinctrl_probe()'
Christophe JAILLET <[email protected]>
pinctrl: imxl: Fix an error handling path in 'imx1_pinctrl_core_probe()'
Can Guo <[email protected]>
scsi: ufs: Don't update urgent bkops level when toggling auto bkops
Qiushi Wu <[email protected]>
scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
Bob Peterson <[email protected]>
gfs2: Allow lock_nolock mount to specify jid=X
Stafford Horne <[email protected]>
openrisc: Fix issue with argument clobbering for clone/fork
Qiushi Wu <[email protected]>
vfio/mdev: Fix reference count leak in add_mdev_supported_type
Xiyu Yang <[email protected]>
ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
Christophe JAILLET <[email protected]>
extcon: adc-jack: Fix an error handling path in 'adc_jack_probe()'
huhai <[email protected]>
powerpc/4xx: Don't unmap NULL mbase
Olga Kornievskaia <[email protected]>
NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION
Fedor Tokarev <[email protected]>
net: sunrpc: Fix off-by-one issues in 'rpc_ntop6'
Jeffrey Hugo <[email protected]>
scsi: ufs-qcom: Fix scheduling while atomic issue
Nathan Chancellor <[email protected]>
clk: bcm2835: Fix return type of bcm2835_register_gate
Borislav Petkov <[email protected]>
x86/apic: Make TSC deadline timer detection message visible
Pawel Laszczak <[email protected]>
usb: gadget: Fix issue with config_ep_by_speed function
Qiushi Wu <[email protected]>
usb: gadget: fix potential double-free in m66592_probe.
Colin Ian King <[email protected]>
usb: gadget: lpc32xx_udc: don't dereference ep pointer before null check
Nathan Chancellor <[email protected]>
USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke
Fabrice Gasnier <[email protected]>
usb: dwc2: gadget: move gadget resume after the core is in L0 state
Stefan Riedmueller <[email protected]>
watchdog: da9062: No need to ping manually before setting timeout
Maor Gottlieb <[email protected]>
IB/cma: Fix ports memory leak in cma_configfs
Bjorn Helgaas <[email protected]>
PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream Port
Hannes Reinecke <[email protected]>
dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a zone
Qian Cai <[email protected]>
powerpc/64s/pgtable: fix an undefined behaviour
Marek Szyprowski <[email protected]>
clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
Gregory CLEMENT <[email protected]>
tty: n_gsm: Fix bogus i++ in gsm_data_kick
Tang Bin <[email protected]>
USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
Roy Spliet <[email protected]>
drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation
Qais Yousef <[email protected]>
usb/ohci-platform: Fix a warning when hibernating
Alex Williamson <[email protected]>
vfio-pci: Mask cap zero
Geoff Levand <[email protected]>
powerpc/ps3: Fix kexec shutdown hang
Nicholas Piggin <[email protected]>
powerpc/pseries/ras: Fix FWNMI_VALID off by one
Gregory CLEMENT <[email protected]>
tty: n_gsm: Fix waking up upper tty layer when room available
Gregory CLEMENT <[email protected]>
tty: n_gsm: Fix SOF skipping
Rob Herring <[email protected]>
PCI: Fix pci_register_host_bridge() device_register() error handling
Tero Kristo <[email protected]>
clk: ti: composite: fix memory leak
Arnd Bergmann <[email protected]>
dlm: remove BUG() before panic()
Suganath Prabu S <[email protected]>
scsi: mpt3sas: Fix double free warnings
Dmitry Osipenko <[email protected]>
power: supply: smb347-charger: IRQSTAT_D is volatile
Christophe JAILLET <[email protected]>
power: supply: lp8788: Fix an error handling path in 'lp8788_charger_probe()'
Viacheslav Dubeyko <[email protected]>
scsi: qla2xxx: Fix warning after FC target reset
Kai-Heng Feng <[email protected]>
PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
Andrew Murray <[email protected]>
PCI: rcar: Fix incorrect programming of OB windows
Kuppuswamy Sathyanarayanan <[email protected]>
drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
John Stultz <[email protected]>
serial: amba-pl011: Make sure we initialize the port.lock spinlock
Russell King <[email protected]>
i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
Matej Dujava <[email protected]>
staging: sm750fb: add missing case while setting FB_VISUAL
Sudip Mukherjee <[email protected]>
thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR
Raghavendra Rao Ananta <[email protected]>
tty: hvc: Fix data abort due to race in hvc_open
Julian Wiedmann <[email protected]>
s390/qdio: put thinint indicator after early error
Alexander Tsoy <[email protected]>
ALSA: usb-audio: Improve frames size computation
Nilesh Javali <[email protected]>
scsi: qedi: Do not flush offload work if ARP not resolved
Aiman Najjar <[email protected]>
staging: rtl8712: fix multiline derefernce warnings
Chen Zhou <[email protected]>
staging: greybus: fix a missing-check bug in gb_lights_light_config()
Tyrel Datwyler <[email protected]>
scsi: ibmvscsi: Don't send host info in adapter info MAD after LPM
Simon Arlott <[email protected]>
scsi: sr: Fix sr_probe() missing deallocate of device minor
John Johansen <[email protected]>
apparmor: fix introspection of of task mode for unconfined tasks
ashimida <[email protected]>
mksysmap: Fix the mismatch of '.L' symbols in System.map
Logan Gunthorpe <[email protected]>
NTB: Fix the default port and peer numbers for legacy drivers
Wang Hai <[email protected]>
yam: fix possible memory leak in yam_init_driver
Pingfan Liu <[email protected]>
powerpc/crashkernel: Take "mem=" option into account
Xiyu Yang <[email protected]>
nfsd: Fix svc_xprt refcnt leak when setup callback client failed
Kajol Jain <[email protected]>
powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple hv-24x7 events run
Alain Volmat <[email protected]>
clk: clk-flexgen: fix clock-critical handling
Xiyu Yang <[email protected]>
scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
Marek Szyprowski <[email protected]>
mfd: wm8994: Fix driver operation if loaded as modules
Christophe JAILLET <[email protected]>
m68k/PCI: Fix a memory leak in an error handling path
Qian Cai <[email protected]>
vfio/pci: fix memory leaks in alloc_perm_bits()
Emmanuel Nicolet <[email protected]>
ps3disk: use the default segment boundary
Pali Rohár <[email protected]>
PCI: aardvark: Don't blindly enable ASPM L0s and don't write to read-only register
Martin Wilck <[email protected]>
dm mpath: switch paths in dm_blk_ioctl() code path
Oliver Neukum <[email protected]>
usblp: poison URBs upon disconnect
Russell King <[email protected]>
i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
Konstantin Khlebnikov <[email protected]>
f2fs: report delalloc reserve as non-free in statfs for project quota
Andreas Klinger <[email protected]>
iio: bmp280: fix compensation of humidity
Viacheslav Dubeyko <[email protected]>
scsi: qla2xxx: Fix issue with adapter's stopping state
Dan Carpenter <[email protected]>
ALSA: isa/wavefront: prevent out of bounds write in ioctl
Dan Carpenter <[email protected]>
scsi: qedi: Check for buffer overflow in qedi_set_path()
Linus Walleij <[email protected]>
ARM: integrator: Add some Kconfig selections
Xiyu Yang <[email protected]>
ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
Jon Hunter <[email protected]>
backlight: lp855x: Ensure regulators are disabled on probe failure
Bryan O'Donoghue <[email protected]>
clk: qcom: msm8916: Fix the address location of pll->config_reg
Alex Elder <[email protected]>
remoteproc: Fix IDR initialisation in rproc_alloc()
Andy Shevchenko <[email protected]>
iio: pressure: bmp280: Tolerate IRQ before registering
Adam Honse <[email protected]>
i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
Rikard Falkeborn <[email protected]>
clk: sunxi: Fix incorrect usage of round_down()
Enric Balletbo i Serra <[email protected]>
power: supply: bq24257_charger: Replace depends on REGMAP_I2C with select
Chris Wilson <[email protected]>
drm/i915: Whitelist context-local timestamp in the gen9 cmdparser
Dmitry V. Levin <[email protected]>
s390: fix syscall_get_error for compat processes
-------------
Diffstat:
Documentation/driver-api/mtdnand.rst | 2 +- Makefile | 4 +- arch/arm/mach-integrator/Kconfig | 7 +- arch/arm64/kernel/hw_breakpoint.c | 44 ++++++----- arch/m68k/coldfire/pci.c | 4 +- arch/openrisc/kernel/entry.S | 4 +- arch/powerpc/include/asm/book3s/64/pgtable.h | 23 +++++- arch/powerpc/kernel/machine_kexec.c | 8 +- arch/powerpc/perf/hv-24x7.c | 10 --- arch/powerpc/platforms/4xx/pci.c | 4 +- arch/powerpc/platforms/ps3/mm.c | 22 +++--- arch/powerpc/platforms/pseries/ras.c | 5 +- arch/s390/include/asm/syscall.h | 12 ++- arch/x86/boot/Makefile | 2 +- arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/kprobes/core.c | 16 +--- crypto/algboss.c | 2 - crypto/algif_skcipher.c | 6 +- drivers/ata/libata-core.c | 11 ++- drivers/base/platform.c | 2 + drivers/block/ps3disk.c | 1 - drivers/clk/bcm/clk-bcm2835.c | 10 +-- drivers/clk/qcom/gcc-msm8916.c | 8 +- drivers/clk/samsung/clk-exynos5433.c | 3 +- drivers/clk/st/clk-flexgen.c | 1 + drivers/clk/sunxi/clk-sunxi.c | 2 +- drivers/clk/ti/composite.c | 1 + drivers/crypto/omap-sham.c | 64 ++++++++------- drivers/extcon/extcon-adc-jack.c | 3 +- drivers/gpu/drm/drm_dp_mst_topology.c | 58 ++++++++------ drivers/gpu/drm/drm_encoder_slave.c | 5 +- drivers/gpu/drm/i915/i915_cmd_parser.c | 4 + drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 3 +- drivers/gpu/drm/qxl/qxl_kms.c | 2 +- drivers/gpu/drm/sun4i/sun4i_hdmi.h | 2 +- drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | 2 +- drivers/i2c/busses/i2c-piix4.c | 3 +- drivers/i2c/busses/i2c-pxa.c | 13 ++-- drivers/iio/pressure/bmp280-core.c | 7 +- drivers/infiniband/core/cma_configfs.c | 13 ++++ drivers/md/bcache/btree.c | 8 +- drivers/md/dm-mpath.c | 2 +- drivers/md/dm-zoned-metadata.c | 4 +- drivers/md/dm-zoned-reclaim.c | 4 +- drivers/mfd/wm8994-core.c | 1 + drivers/mtd/nand/ams-delta.c | 2 +- drivers/mtd/nand/au1550nd.c | 2 +- drivers/mtd/nand/bcm47xxnflash/main.c | 2 +- drivers/mtd/nand/brcmnand/brcmnand.c | 2 +- drivers/mtd/nand/cafe_nand.c | 2 +- drivers/mtd/nand/cmx270_nand.c | 2 +- drivers/mtd/nand/cs553x_nand.c | 2 +- drivers/mtd/nand/davinci_nand.c | 2 +- drivers/mtd/nand/denali.c | 4 +- drivers/mtd/nand/diskonchip.c | 9 +-- drivers/mtd/nand/docg4.c | 4 +- drivers/mtd/nand/fsl_elbc_nand.c | 2 +- drivers/mtd/nand/fsl_ifc_nand.c | 2 +- drivers/mtd/nand/fsl_upm.c | 2 +- drivers/mtd/nand/fsmc_nand.c | 2 +- drivers/mtd/nand/gpio.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 2 +- drivers/mtd/nand/hisi504_nand.c | 5 +- drivers/mtd/nand/jz4740_nand.c | 2 +- drivers/mtd/nand/jz4780_nand.c | 4 +- drivers/mtd/nand/lpc32xx_mlc.c | 3 +- drivers/mtd/nand/lpc32xx_slc.c | 3 +- drivers/mtd/nand/mpc5121_nfc.c | 2 +- drivers/mtd/nand/mtk_nand.c | 4 +- drivers/mtd/nand/mxc_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 8 +- drivers/mtd/nand/nandsim.c | 4 +- drivers/mtd/nand/ndfc.c | 2 +- drivers/mtd/nand/nuc900_nand.c | 2 +- drivers/mtd/nand/omap2.c | 2 +- drivers/mtd/nand/orion_nand.c | 5 +- drivers/mtd/nand/oxnas_nand.c | 16 ++-- drivers/mtd/nand/pasemi_nand.c | 2 +- drivers/mtd/nand/plat_nand.c | 4 +- drivers/mtd/nand/qcom_nandc.c | 2 +- drivers/mtd/nand/r852.c | 4 +- drivers/mtd/nand/s3c2410.c | 2 +- drivers/mtd/nand/sh_flctl.c | 2 +- drivers/mtd/nand/sharpsl.c | 4 +- drivers/mtd/nand/socrates_nand.c | 5 +- drivers/mtd/nand/sunxi_nand.c | 4 +- drivers/mtd/nand/tango_nand.c | 2 +- drivers/mtd/nand/tmio_nand.c | 4 +- drivers/mtd/nand/txx9ndfmc.c | 2 +- drivers/mtd/nand/vf610_nfc.c | 2 +- drivers/mtd/nand/xway_nand.c | 4 +- drivers/net/ethernet/intel/e1000e/netdev.c | 14 +++- drivers/net/geneve.c | 7 +- drivers/net/hamradio/yam.c | 1 + drivers/ntb/ntb.c | 8 +- drivers/pci/host/pci-aardvark.c | 4 - drivers/pci/host/pcie-rcar.c | 9 ++- drivers/pci/pcie/aspm.c | 10 --- drivers/pci/pcie/ptm.c | 22 ++++-- drivers/pci/probe.c | 5 +- drivers/pinctrl/freescale/pinctrl-imx.c | 19 +---- drivers/pinctrl/freescale/pinctrl-imx1-core.c | 1 - drivers/power/supply/Kconfig | 2 +- drivers/power/supply/lp8788-charger.c | 18 +---- drivers/power/supply/smb347-charger.c | 1 + drivers/remoteproc/remoteproc_core.c | 3 +- drivers/s390/cio/qdio.h | 1 - drivers/s390/cio/qdio_setup.c | 1 - drivers/s390/cio/qdio_thinint.c | 14 ++-- drivers/scsi/arm/acornscsi.c | 4 +- drivers/scsi/ibmvscsi/ibmvscsi.c | 2 + drivers/scsi/iscsi_boot_sysfs.c | 2 +- drivers/scsi/lpfc/lpfc_els.c | 2 + drivers/scsi/mpt3sas/mpt3sas_base.c | 2 + drivers/scsi/qedi/qedi_iscsi.c | 7 +- drivers/scsi/qla2xxx/qla_os.c | 1 + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 + drivers/scsi/sr.c | 6 +- drivers/scsi/ufs/ufs-qcom.c | 6 +- drivers/scsi/ufs/ufshcd.c | 1 - drivers/staging/greybus/light.c | 3 +- drivers/staging/rtl8712/rtl871x_xmit.c | 11 +-- drivers/staging/sm750fb/sm750.c | 1 + drivers/thermal/ti-soc-thermal/ti-thermal-common.c | 6 +- drivers/tty/hvc/hvc_console.c | 16 +++- drivers/tty/n_gsm.c | 26 ++++--- drivers/tty/serial/amba-pl011.c | 1 + drivers/usb/class/usblp.c | 5 +- drivers/usb/dwc2/core_intr.c | 7 +- drivers/usb/gadget/composite.c | 78 +++++++++++++++---- drivers/usb/gadget/udc/lpc32xx_udc.c | 11 +-- drivers/usb/gadget/udc/m66592-udc.c | 2 +- drivers/usb/gadget/udc/s3c2410_udc.c | 4 - drivers/usb/host/ehci-mxc.c | 2 + drivers/usb/host/ehci-platform.c | 5 ++ drivers/usb/host/ohci-platform.c | 5 ++ drivers/usb/host/xhci-plat.c | 10 ++- drivers/vfio/mdev/mdev_sysfs.c | 2 +- drivers/vfio/pci/vfio_pci_config.c | 14 +++- drivers/video/backlight/lp855x_bl.c | 20 ++++- drivers/watchdog/da9062_wdt.c | 5 -- fs/block_dev.c | 12 +-- fs/dlm/dlm_internal.h | 1 - fs/ext4/extents.c | 2 +- fs/f2fs/super.c | 3 +- fs/gfs2/log.c | 11 ++- fs/gfs2/ops_fstype.c | 2 +- fs/nfs/nfs4proc.c | 2 +- fs/nfsd/nfs4callback.c | 2 + include/linux/bitops.h | 2 +- include/linux/elfnote.h | 2 +- include/linux/genhd.h | 2 + include/linux/kprobes.h | 4 + include/linux/libata.h | 3 + include/linux/mtd/rawnand.h | 6 +- include/linux/usb/composite.h | 3 + kernel/kprobes.c | 27 ++++++- kernel/trace/blktrace.c | 30 +++---- lib/zlib_inflate/inffast.c | 91 +++++++++------------- net/core/dev.c | 40 +++++----- net/sunrpc/addr.c | 4 +- scripts/mksysmap | 2 +- security/apparmor/label.c | 4 +- security/selinux/ss/services.c | 4 + sound/isa/wavefront/wavefront_synth.c | 8 +- sound/soc/davinci/davinci-mcasp.c | 4 +- sound/soc/fsl/fsl_asrc_dma.c | 1 + sound/usb/card.h | 4 + sound/usb/endpoint.c | 43 ++++++++-- sound/usb/endpoint.h | 1 + sound/usb/pcm.c | 2 + tools/perf/builtin-report.c | 3 +- .../networking/timestamping/timestamping.c | 10 ++- tools/testing/selftests/x86/protection_keys.c | 3 +- 174 files changed, 758 insertions(+), 555 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/136 s390: fix syscall_get_error for compat processes
From: Dmitry V. Levin <[email protected]>
commit b3583fca5fb654af2cfc1c08259abb9728272538 upstream.
If both the tracer and the tracee are compat processes, and gprs[2] is assigned a value by __poke_user_compat, then the higher 32 bits of gprs[2] are cleared, IS_ERR_VALUE() always returns false, and syscall_get_error() always returns 0.
Fix the implementation by sign-extending the value for compat processes the same way as x86 implementation does.
The bug was exposed to user space by commit 201766a20e30f ("ptrace: add PTRACE_GET_SYSCALL_INFO request") and detected by strace test suite.
This change fixes strace syscall tampering on s390.
--- arch/s390/include/asm/syscall.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
arch/s390/include/asm/syscall.h +11 -1
@@ -41,7 +41,17 @@ static inline void syscall_rollback(strustatic inline long syscall_get_error (struct task_struct *task,struct pt_regs *regs) { -return IS_ERR_VALUE (regs->gprs[2 ]) ? regs->gprs[2 ] :0 ; +unsigned long error = regs->gprs[2 ]; +#ifdef CONFIG_COMPAT +if (test_tsk_thread_flag (task,TIF_31BIT )) { +/* +* Sign-extend the value so (int)-EFOO becomes (long)-EFOO +* and will match correctly in comparisons. +*/ + error = (long )(int )error; + } +#endif +return IS_ERR_VALUE (error) ? error :0 ; } static inline long syscall_get_return_value(struct task_struct *task,
Greg Kroah-Hartman
maintainerPATCH 2/136 drm/i915: Whitelist context-local timestamp in the gen9 cmdparser
In reply to Greg Kroah-HartmanFrom: Chris Wilson <[email protected]>
commit 273500ae71711c040d258a7b3f4b6f44c368fff2 upstream.
Allow batch buffers to read their own _local_ cumulative HW runtime of their logical context.
--- drivers/gpu/drm/i915/i915_cmd_parser.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/i915/i915_cmd_parser.c +4 -0
@@ -570,6 +570,9 @@ struct drm_i915_reg_descriptor {#define REG32 (_reg, ...) \ { .addr = (_reg), __VA_ARGS__ } +#define REG32_IDX (_reg, idx) \ + { .addr = _reg(idx) } +/* * Convenience macro for adding 64-bit registers. *
@@ -667,6 +670,7 @@ static const struct drm_i915_reg_descripREG64_IDX (RING_TIMESTAMP ,BSD_RING_BASE ),REG32 (BCS_SWCTRL ),REG64_IDX (RING_TIMESTAMP ,BLT_RING_BASE ), +REG32_IDX (RING_CTX_TIMESTAMP ,BLT_RING_BASE ),REG64_IDX (BCS_GPR ,0 ),REG64_IDX (BCS_GPR ,1 ), REG64_IDX(BCS_GPR, 2),
Greg Kroah-Hartman
maintainerPATCH 3/136 power: supply: bq24257_charger: Replace depends on REGMAP_I2C with select
In reply to Greg Kroah-HartmanFrom: Enric Balletbo i Serra <[email protected]>
[ Upstream commit 87c3d579c8ed0eaea6b1567d529a8daa85a2bc6c ]
regmap is a library function that gets selected by drivers that need it. No driver modules should depend on it. Depending on REGMAP_I2C makes this driver only build if another driver already selected REGMAP_I2C, as the symbol can't be selected through the menu kernel configuration.
--- drivers/power/supply/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/power/supply/Kconfig +1 -1
@@ -530,7 +530,7 @@ config CHARGER_BQ24257 tristate "TI BQ24250/24251/24257 battery charger driver" depends on I2C depends on GPIOLIB || COMPILE_TEST - depends on REGMAP_I2C + select REGMAP_I2C help Say Y to enable support for the TI BQ24250, BQ24251, and BQ24257 battery chargers.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 4/136 clk: sunxi: Fix incorrect usage of round_down()
In reply to Greg Kroah-HartmanFrom: Rikard Falkeborn <[email protected]>
[ Upstream commit ee25d9742dabed3fd18158b518f846abeb70f319 ]
round_down() can only round to powers of 2. If round_down() is asked to round to something that is not a power of 2, incorrect results are produced. The incorrect results can be both too large and too small.
Instead, use rounddown() which can round to any number.
--- drivers/clk/sunxi/clk-sunxi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/sunxi/clk-sunxi.c +1 -1
@@ -98,7 +98,7 @@ static void sun6i_a31_get_pll1_factors(struct factors_request *req)* Round down the frequency to the closest multiple of either * 6 or 16 */ -u32 round_freq_6 =round_down (freq_mhz,6 ); +u32 round_freq_6 =rounddown (freq_mhz,6 );u32 round_freq_16 =round_down (freq_mhz,16 );if (round_freq_6 > round_freq_16)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 5/136 i2c: piix4: Detect secondary SMBus controller on AMD AM4 chipsets
In reply to Greg Kroah-HartmanFrom: Adam Honse <[email protected]>
[ Upstream commit f27237c174fd9653033330e4e532cd9d153ce824 ]
The AMD X370 and other AM4 chipsets (A/B/X 3/4/5 parts) and Threadripper equivalents have a secondary SMBus controller at I/O port address 0x0B20. This bus is used by several manufacturers to control motherboard RGB lighting via embedded controllers. I have been using this bus in my OpenRGB project to control the Aura RGB on many motherboards and ASRock also uses this bus for their Polychrome RGB controller.
I am not aware of any CZ-compatible platforms which do not have the second SMBus channel. All of AMD's AM4- and Threadripper- series chipsets that OpenRGB users have tested appear to have this secondary bus. I also noticed this secondary bus is present on older AMD platforms including my FM1 home server.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202587
--- drivers/i2c/busses/i2c-piix4.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-piix4.c +2 -1
@@ -960,7 +960,8 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id) }if (dev->vendor ==PCI_VENDOR_ID_AMD && - dev->device ==PCI_DEVICE_ID_AMD_HUDSON2_SMBUS ) { + (dev->device ==PCI_DEVICE_ID_AMD_HUDSON2_SMBUS || + dev->device ==PCI_DEVICE_ID_AMD_KERNCZ_SMBUS )) { retval =piix4_setup_sb800 (dev, id,1 ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 6/136 iio: pressure: bmp280: Tolerate IRQ before registering
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 97b31a6f5fb95b1ec6575b78a7240baddba34384 ]
With DEBUG_SHIRQ enabled we have a kernel crash
[ 116.482696] BUG: kernel NULL pointer dereference, address: 0000000000000000
...
[ 116.606571] Call Trace: [ 116.609023] <IRQ> [ 116.611047] complete+0x34/0x50 [ 116.614206] bmp085_eoc_irq+0x9/0x10 [bmp280]
because DEBUG_SHIRQ mechanism fires an IRQ before registration and drivers ought to be able to handle an interrupt happening before request_irq() returns.
--- drivers/iio/pressure/bmp280-core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/iio/pressure/bmp280-core.c +4 -1
@@ -651,7 +651,7 @@ static int bmp180_measure(struct bmp280_data *data, u8 ctrl_meas)unsigned int ctrl;if (data->use_eoc) -init_completion (&data->done); +reinit_completion (&data->done); ret =regmap_write (data->regmap,BMP280_REG_CTRL_MEAS , ctrl_meas);if (ret)
@@ -907,6 +907,9 @@ static int bmp085_fetch_eoc_irq(struct device *dev, "trying to enforce it\n"); irq_trig =IRQF_TRIGGER_RISING ; } + +init_completion (&data->done); + ret = devm_request_threaded_irq(dev, irq, bmp085_eoc_irq,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 7/136 remoteproc: Fix IDR initialisation in rproc_alloc()
In reply to Greg Kroah-HartmanFrom: Alex Elder <[email protected]>
[ Upstream commit 6442df49400b466431979e7634849a464a5f1861 ]
If ida_simple_get() returns an error when called in rproc_alloc(), put_device() is called to clean things up. By this time the rproc device type has been assigned, with rproc_type_release() as the release function.
The first thing rproc_type_release() does is call:
idr_destroy(&rproc->notifyids);
But at the time the ida_simple_get() call is made, the notifyids field in the remoteproc structure has not been initialized.
I'm not actually sure this case causes an observable problem, but it's incorrect. Fix this by initializing the notifyids field before calling ida_simple_get() in rproc_alloc().
--- drivers/remoteproc/remoteproc_core.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/remoteproc/remoteproc_core.c +1 -2
@@ -1432,6 +1432,7 @@ struct rproc *rproc_alloc(struct device *dev, const char *name, rproc->dev.type = &rproc_type; rproc->dev.class = &rproc_class; rproc->dev.driver_data = rproc; +idr_init (&rproc->notifyids);/* Assign a unique device index and name */ rproc->index =ida_simple_get (&rproc_dev_index,0 ,0 ,GFP_KERNEL );
@@ -1450,8 +1451,6 @@ struct rproc *rproc_alloc(struct device *dev, const char *name,mutex_init (&rproc->lock); -idr_init (&rproc->notifyids); -INIT_LIST_HEAD (&rproc->carveouts);INIT_LIST_HEAD (&rproc->mappings);INIT_LIST_HEAD (&rproc->traces);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 8/136 clk: qcom: msm8916: Fix the address location of pll->config_reg
In reply to Greg Kroah-HartmanFrom: Bryan O'Donoghue <[email protected]>
[ Upstream commit f47ab3c2f5338828a67e89d5f688d2cef9605245 ]
During the process of debugging a processor derived from the msm8916 which we found the new processor was not starting one of its PLLs.
After tracing the addresses and writes that downstream was doing and comparing to upstream it became obvious that we were writing to a different register location than downstream when trying to configure the PLL.
This error is also present in upstream msm8916.
As an example clk-pll.c::clk_pll_recalc_rate wants to write to pll->config_reg updating the bit-field POST_DIV_RATIO. That bit-field is defined in PLL_USER_CTL not in PLL_CONFIG_CTL. Taking the BIMC PLL as an example
lm80-p0436-13_c_qc_snapdragon_410_processor_hrd.pdf
0x01823010 GCC_BIMC_PLL_USER_CTL0x01823014 GCC_BIMC_PLL_CONFIG_CTL
This pattern is repeated for gpll0, gpll1, gpll2 and bimc_pll.
This error is likely not apparent since the bootloader will already have initialized these PLLs.
This patch corrects the location of config_reg from PLL_CONFIG_CTL to PLL_USER_CTL for all relevant PLLs on msm8916.
Fixes commit 3966fab8b6ab ("clk: qcom: Add MSM8916 Global Clock Controller support")
--- drivers/clk/qcom/gcc-msm8916.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clk/qcom/gcc-msm8916.c +4 -4
@@ -270,7 +270,7 @@ static struct clk_pll gpll0 = { .l_reg = 0x21004, .m_reg = 0x21008, .n_reg = 0x2100c, - .config_reg = 0x21014, + .config_reg = 0x21010, .mode_reg = 0x21000, .status_reg = 0x2101c, .status_bit = 17,
@@ -297,7 +297,7 @@ static struct clk_pll gpll1 = { .l_reg = 0x20004, .m_reg = 0x20008, .n_reg = 0x2000c, - .config_reg = 0x20014, + .config_reg = 0x20010, .mode_reg = 0x20000, .status_reg = 0x2001c, .status_bit = 17,
@@ -324,7 +324,7 @@ static struct clk_pll gpll2 = { .l_reg = 0x4a004, .m_reg = 0x4a008, .n_reg = 0x4a00c, - .config_reg = 0x4a014, + .config_reg = 0x4a010, .mode_reg = 0x4a000, .status_reg = 0x4a01c, .status_bit = 17,
@@ -351,7 +351,7 @@ static struct clk_pll bimc_pll = { .l_reg = 0x23004, .m_reg = 0x23008, .n_reg = 0x2300c, - .config_reg = 0x23014, + .config_reg = 0x23010, .mode_reg = 0x23000, .status_reg = 0x2301c, .status_bit = 17,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 9/136 backlight: lp855x: Ensure regulators are disabled on probe failure
In reply to Greg Kroah-HartmanFrom: Jon Hunter <[email protected]>
[ Upstream commit d8207c155a7c6015eb7f43739baa7dfb1fa638af ]
If probing the LP885x backlight fails after the regulators have been enabled, then the following warning is seen when releasing the regulators ...
WARNING: CPU: 1 PID: 289 at drivers/regulator/core.c:2051 _regulator_put.part.28+0x158/0x160 Modules linked in: tegra_xudc lp855x_bl(+) host1x pwm_tegra ip_tables x_tables ipv6 nf_defrag_ipv6 CPU: 1 PID: 289 Comm: systemd-udevd Not tainted 5.6.0-rc2-next-20200224 #1 Hardware name: NVIDIA Jetson TX1 Developer Kit (DT)
...
Call trace: _regulator_put.part.28+0x158/0x160 regulator_put+0x34/0x50 devm_regulator_release+0x10/0x18 release_nodes+0x12c/0x230 devres_release_all+0x34/0x50 really_probe+0x1c0/0x370 driver_probe_device+0x58/0x100 device_driver_attach+0x6c/0x78 __driver_attach+0xb0/0xf0 bus_for_each_dev+0x68/0xc8 driver_attach+0x20/0x28 bus_add_driver+0x160/0x1f0 driver_register+0x60/0x110 i2c_register_driver+0x40/0x80 lp855x_driver_init+0x20/0x1000 [lp855x_bl] do_one_initcall+0x58/0x1a0 do_init_module+0x54/0x1d0 load_module+0x1d80/0x21c8 __do_sys_finit_module+0xe8/0x100 __arm64_sys_finit_module+0x18/0x20 el0_svc_common.constprop.3+0xb0/0x168 do_el0_svc+0x20/0x98 el0_sync_handler+0xf4/0x1b0 el0_sync+0x140/0x180
Fix this by ensuring that the regulators are disabled, if enabled, on probe failure.
Finally, ensure that the vddio regulator is disabled in the driver remove handler.
--- drivers/video/backlight/lp855x_bl.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/video/backlight/lp855x_bl.c +16 -4
@@ -460,7 +460,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) ret =regulator_enable (lp->enable);if (ret <0 ) {dev_err (lp->dev,"failed to enable vddio: %d\n" , ret); -return ret; + goto disable_supply; }/*
@@ -475,24 +475,34 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id) ret =lp855x_configure (lp);if (ret) {dev_err (lp->dev,"device config err: %d" , ret); -return ret; + goto disable_vddio; } ret =lp855x_backlight_register (lp);if (ret) {dev_err (lp->dev,"failed to register backlight. err: %d\n" , ret); -return ret; + goto disable_vddio; } ret =sysfs_create_group (&lp->dev->kobj, &lp855x_attr_group);if (ret) {dev_err (lp->dev,"failed to register sysfs. err: %d\n" , ret); -return ret; + goto disable_vddio; }backlight_update_status (lp->bl); +return 0 ; + +disable_vddio: +if (lp->enable) +regulator_disable (lp->enable); +disable_supply: +if (lp->supply) +regulator_disable (lp->supply); + +return ret; }static int lp855x_remove (struct i2c_client *cl)
@@ -501,6 +511,8 @@ static int lp855x_remove(struct i2c_client *cl) lp->bl->props.brightness =0 ;backlight_update_status (lp->bl); +if (lp->enable) +regulator_disable (lp->enable);if (lp->supply)regulator_disable (lp->supply);sysfs_remove_group (&lp->dev->kobj, &lp855x_attr_group);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 10/136 ASoC: davinci-mcasp: Fix dma_chan refcnt leak when getting dma type
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit a697ae6ea56e23397341b027098c1b11d9ab13da ]
davinci_mcasp_get_dma_type() invokes dma_request_chan(), which returns a reference of the specified dma_chan object to "chan" with increased refcnt.
When davinci_mcasp_get_dma_type() returns, local variable "chan" becomes invalid, so the refcount should be decreased to keep refcount balanced.
The reference counting issue happens in one exception handling path of davinci_mcasp_get_dma_type(). When chan device is NULL, the function forgets to decrease the refcnt increased by dma_request_chan(), causing a refcnt leak.
Fix this issue by calling dma_release_channel() when chan device is NULL.
--- sound/soc/davinci/davinci-mcasp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/soc/davinci/davinci-mcasp.c +3 -1
@@ -1747,8 +1747,10 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp) PTR_ERR(chan));return PTR_ERR (chan); } -if (WARN_ON (!chan->device || !chan->device->dev)) +if (WARN_ON (!chan->device || !chan->device->dev)) { +dma_release_channel (chan);return -EINVAL ; + }if (chan->device->dev->of_node) ret = of_property_read_string(chan->device->dev->of_node,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 11/136 ARM: integrator: Add some Kconfig selections
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit d2854bbe5f5c4b4bec8061caf4f2e603d8819446 ]
The CMA and DMA_CMA Kconfig options need to be selected by the Integrator in order to produce boot console on some Integrator systems.
The REGULATOR and REGULATOR_FIXED_VOLTAGE need to be selected in order to boot the system from an external MMC card when using MMCI/PL181 from the device tree probe path.
Select these things directly from the Kconfig so we are sure to be able to bring the systems up with console from any device tree.
--- arch/arm/mach-integrator/Kconfig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
arch/arm/mach-integrator/Kconfig +4 -3
@@ -3,6 +3,8 @@ menuconfig ARCH_INTEGRATOR depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 select ARM_AMBA select COMMON_CLK_VERSATILE + select CMA + select DMA_CMA select HAVE_TCM select ICST select MFD_SYSCON
@@ -34,14 +36,13 @@ config INTEGRATOR_IMPD1 select ARM_VIC select GPIO_PL061 select GPIOLIB + select REGULATOR + select REGULATOR_FIXED_VOLTAGE help The IM-PD1 is an add-on logic module for the Integrator which allows ARM(R) Ltd PrimeCells to be developed and evaluated. The IM-PD1 can be found on the Integrator/PP2 platform. - To compile this driver as a module, choose M here: the - module will be called impd1. - config INTEGRATOR_CM7TDMI bool "Integrator/CM7TDMI core module" depends on ARCH_INTEGRATOR_AP
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 12/136 scsi: qedi: Check for buffer overflow in qedi_set_path()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 4a4c0cfb4be74e216dd4446b254594707455bfc6 ]
Smatch complains that the "path_data->handle" variable is user controlled. It comes from iscsi_set_path() so that seems possible. It's harmless to add a limit check.
The qedi->ep_tbl[] array has qedi->max_active_conns elements (which is always ISCSI_MAX_SESS_PER_HBA (4096) elements). The array is allocated in the qedi_cm_alloc_mem() function.
--- drivers/scsi/qedi/qedi_iscsi.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/scsi/qedi/qedi_iscsi.c +4 -0
@@ -1224,6 +1224,10 @@ static int qedi_set_path(struct Scsi_Host *shost, struct iscsi_path *path_data) } iscsi_cid = (u32 )path_data->handle; +if (iscsi_cid >= qedi->max_active_conns) { + ret = -EINVAL ; + goto set_path_exit; + } qedi_ep = qedi->ep_tbl[iscsi_cid];QEDI_INFO (&qedi->dbg_ctx,QEDI_LOG_INFO ,"iscsi_cid=0x%x, qedi_ep=%p\n" , iscsi_cid, qedi_ep);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 13/136 ALSA: isa/wavefront: prevent out of bounds write in ioctl
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 7f0d5053c5a9d23fe5c2d337495a9d79038d267b ]
The "header->number" comes from the ioctl and it needs to be clamped to prevent out of bounds writes.
--- sound/isa/wavefront/wavefront_synth.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
sound/isa/wavefront/wavefront_synth.c +7 -1
@@ -1175,7 +1175,10 @@ wavefront_send_alias (snd_wavefront_t *dev, wavefront_patch_info *header)"alias for %d\n" , header->number, header->hdr.a.OriginalSample); - + +if (header->number >=WF_MAX_SAMPLE ) +return -EINVAL ; +munge_int32 (header->number, &alias_hdr[0 ],2 );munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2 ],2 ); munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
@@ -1206,6 +1209,9 @@ wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header)int num_samples;unsigned char *msample_hdr; +if (header->number >=WF_MAX_SAMPLE ) +return -EINVAL ; + msample_hdr =kmalloc (WF_MSAMPLE_BYTES ,GFP_KERNEL );if (! msample_hdr)return -ENOMEM ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 14/136 scsi: qla2xxx: Fix issue with adapters stopping state
In reply to Greg Kroah-HartmanFrom: Viacheslav Dubeyko <[email protected]>
[ Upstream commit 803e45550b11c8e43d89812356fe6f105adebdf9 ]
The goal of the following command sequence is to restart the adapter. However, the tgt_stop flag remains set, indicating that the adapter is still in stopping state even after re-enabling it.
echo 0x7fffffff > /sys/module/qla2xxx/parameters/logging modprobe target_core_mod
modprobe tcm_qla2xxx
mkdir /sys/kernel/config/target/qla2xxx
mkdir /sys/kernel/config/target/qla2xxx/<port-name>
mkdir /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1 echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable echo 0 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
kernel: PID 1396:qla_target.c:1555 qlt_stop_phase1(): tgt_stop 0x0, tgt_stopped 0x0
kernel: qla2xxx [0001:00:02.0]-e803:1: PID 1396:qla_target.c:1567: Stopping target for host 1(c0000000033557e8)
kernel: PID 1396:qla_target.c:1579 qlt_stop_phase1(): tgt_stop 0x1, tgt_stopped 0x0
kernel: PID 1396:qla_target.c:1266 qlt_schedule_sess_for_deletion(): tgt_stop 0x1, tgt_stopped 0x0
kernel: qla2xxx [0001:00:02.0]-e801:1: PID 1396:qla_target.c:1316: Scheduling sess c00000002d5cd800 for deletion 21:00:00:24:ff:7f:35:c7 <skipped>
kernel: qla2xxx [0001:00:02.0]-290a:1: PID 340:qla_target.c:1187: qlt_unreg_sess sess c00000002d5cd800 for deletion 21:00:00:24:ff:7f:35:c7 <skipped>
kernel: qla2xxx [0001:00:02.0]-f801:1: PID 340:qla_target.c:1145: Unregistration of sess c00000002d5cd800 21:00:00:24:ff:7f:35:c7 finished fcp_cnt 0
kernel: PID 340:qla_target.c:1155 qlt_free_session_done(): tgt_stop 0x1, tgt_stopped 0x0
kernel: qla2xxx [0001:00:02.0]-4807:1: PID 346:qla_os.c:6329: ISP abort scheduled.
<skipped>
kernel: qla2xxx [0001:00:02.0]-28f1:1: PID 346:qla_os.c:3956: Mark all dev lost
kernel: PID 346:qla_target.c:1266 qlt_schedule_sess_for_deletion(): tgt_stop 0x1, tgt_stopped 0x0
kernel: qla2xxx [0001:00:02.0]-4808:1: PID 346:qla_os.c:6338: ISP abort end.
<skipped>
kernel: PID 1396:qla_target.c:6812 qlt_enable_vha(): tgt_stop 0x1, tgt_stopped 0x0
<skipped>
kernel: qla2xxx [0001:00:02.0]-4807:1: PID 346:qla_os.c:6329: ISP abort scheduled.
<skipped>
kernel: qla2xxx [0001:00:02.0]-4808:1: PID 346:qla_os.c:6338: ISP abort end.
qlt_handle_cmd_for_atio() rejects the request to send commands because the adapter is in the stopping state:
kernel: PID 0:qla_target.c:4442 qlt_handle_cmd_for_atio(): tgt_stop 0x1, tgt_stopped 0x0
kernel: qla2xxx [0001:00:02.0]-3861:1: PID 0:qla_target.c:4447: New command while device c000000005314600 is shutting down
kernel: qla2xxx [0001:00:02.0]-e85f:1: PID 0:qla_target.c:5728: qla_target: Unable to send command to target
This patch calls qla_stop_phase2() in addition to qlt_stop_phase1() in tcm_qla2xxx_tpg_enable_store() and tcm_qla2xxx_npiv_tpg_enable_store(). The qlt_stop_phase1() marks adapter as stopping (tgt_stop == 0x1, tgt_stopped == 0x0) but qlt_stop_phase2() marks adapter as stopped (tgt_stop == 0x0, tgt_stopped == 0x1).
--- drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/qla2xxx/tcm_qla2xxx.c +2 -0
@@ -937,6 +937,7 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,atomic_set (&tpg->lport_tpg_enabled,0 );qlt_stop_phase1 (vha->vha_tgt.qla_tgt); +qlt_stop_phase2 (vha->vha_tgt.qla_tgt); }return count;
@@ -1101,6 +1102,7 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,atomic_set (&tpg->lport_tpg_enabled,0 );qlt_stop_phase1 (vha->vha_tgt.qla_tgt); +qlt_stop_phase2 (vha->vha_tgt.qla_tgt); }return count;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 15/136 iio: bmp280: fix compensation of humidity
In reply to Greg Kroah-HartmanFrom: Andreas Klinger <[email protected]>
[ Upstream commit dee2dabc0e4115b80945fe2c91603e634f4b4686 ]
Limit the output of humidity compensation to the range between 0 and 100 percent.
Depending on the calibration parameters of the individual sensor it happens, that a humidity above 100 percent or below 0 percent is calculated, which don't make sense in terms of relative humidity.
Add a clamp to the compensation formula as described in the datasheet of the sensor in chapter 4.2.3.
Although this clamp is documented, it was never in the driver of the kernel.
It depends on the circumstances (calibration parameters, temperature, humidity) if one can see a value above 100 percent without the clamp. The writer of this patch was working with this type of sensor without noting this error. So it seems to be a rare event when this bug occures.
--- drivers/iio/pressure/bmp280-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iio/pressure/bmp280-core.c +2 -0
@@ -182,6 +182,8 @@ static u32 bmp280_compensate_humidity(struct bmp280_data *data, + (s32)2097152) * H2 + 8192) >> 14); var -= ((((var >>15 ) * (var >>15 )) >>7 ) * (s32 )H1 ) >>4 ; + var =clamp_val (var,0 ,419430400 ); +return var >>12 ; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 16/136 f2fs: report delalloc reserve as non-free in statfs for project quota
In reply to Greg Kroah-HartmanFrom: Konstantin Khlebnikov <[email protected]>
[ Upstream commit baaa7ebf25c78c5cb712fac16b7f549100beddd3 ]
This reserved space isn't committed yet but cannot be used for allocations. For userspace it has no difference from used space.
See the same fix in ext4 commit f06925c73942 ("ext4: report delalloc reserve as non-free in statfs for project quota").
--- fs/f2fs/super.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/super.c +2 -1
@@ -918,7 +918,8 @@ static int f2fs_statfs_project(struct super_block *sb, limit >>= sb->s_blocksize_bits;if (limit && buf->f_blocks > limit) { - curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits; + curblock = (dquot->dq_dqb.dqb_curspace + + dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; buf->f_blocks = limit; buf->f_bfree = buf->f_bavail = (buf->f_blocks > curblock) ?
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 17/136 i2c: pxa: clear all master action bits in i2c_pxa_stop_message()
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit e81c979f4e071d516aa27cf5a0c3939da00dc1ca ]
If we timeout during a message transfer, the control register may contain bits that cause an action to be set. Read-modify-writing the register leaving these bits set may trigger the hardware to attempt one of these actions unintentionally.
Always clear these bits when cleaning up after a message or after a timeout.
--- drivers/i2c/busses/i2c-pxa.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/i2c/busses/i2c-pxa.c +2 -4
@@ -709,11 +709,9 @@ static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c) {u32 icr; -/* -* Clear the STOP and ACK flags -*/ +/* Clear the START, STOP, ACK, TB and MA flags */ icr =readl (_ICR (i2c)); - icr &= ~(ICR_STOP |ICR_ACKNAK ); + icr &= ~(ICR_START |ICR_STOP |ICR_ACKNAK |ICR_TB |ICR_MA );writel (icr,_ICR (i2c)); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 18/136 usblp: poison URBs upon disconnect
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit 296a193b06120aa6ae7cf5c0d7b5e5b55968026e ]
syzkaller reported an URB that should have been killed to be active. We do not understand it, but this should fix the issue if it is real.
--- drivers/usb/class/usblp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/class/usblp.c +4 -1
@@ -481,7 +481,8 @@ static int usblp_release(struct inode *inode, struct file *file)usb_autopm_put_interface (usblp->intf);if (!usblp->present)/* finish cleanup from disconnect */ -usblp_cleanup (usblp); +usblp_cleanup (usblp);/* any URBs must be dead */ +mutex_unlock (&usblp_mutex);return 0 ; }
@@ -1388,9 +1389,11 @@ static void usblp_disconnect(struct usb_interface *intf)usblp_unlink_urbs (usblp);mutex_unlock (&usblp->mut); +usb_poison_anchored_urbs (&usblp->urbs);if (!usblp->used)usblp_cleanup (usblp); +mutex_unlock (&usblp_mutex); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 19/136 dm mpath: switch paths in dm_blk_ioctl() code path
In reply to Greg Kroah-HartmanFrom: Martin Wilck <[email protected]>
[ Upstream commit 2361ae595352dec015d14292f1b539242d8446d6 ]
SCSI LUN passthrough code such as qemu's "scsi-block" device model pass every IO to the host via SG_IO ioctls. Currently, dm-multipath calls choose_pgpath() only in the block IO code path, not in the ioctl code path (unless current_pgpath is NULL). This has the effect that no path switching and thus no load balancing is done for SCSI-passthrough IO, unless the active path fails.
Fix this by using the same logic in multipath_prepare_ioctl() as in multipath_clone_and_map().
Note: The allegedly best path selection algorithm, service-time, still wouldn't work perfectly, because the io size of the current request is always set to 0. Changing that for the IO passthrough case would require the ioctl cmd and arg to be passed to dm's prepare_ioctl() method.
--- drivers/md/dm-mpath.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-mpath.c +1 -1
@@ -1815,7 +1815,7 @@ static int multipath_prepare_ioctl(struct dm_target *ti,int r; current_pgpath =READ_ONCE (m->current_pgpath); -if (!current_pgpath) +if (!current_pgpath || !test_bit (MPATHF_QUEUE_IO , &m->flags)) current_pgpath =choose_pgpath (m,0 );if (current_pgpath) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 20/136 PCI: aardvark: Dont blindly enable ASPM L0s and dont write to read-only register
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 90c6cb4a355e7befcb557d217d1d8b8bd5875a05 ]
Trying to change Link Status register does not have any effect as this is a read-only register. Trying to overwrite bits for Negotiated Link Width does not make sense.
In future proper change of link width can be done via Lane Count Select bits in PCIe Control 0 register.
Trying to unconditionally enable ASPM L0s via ASPM Control bits in Link Control register is wrong. There should be at least some detection if endpoint supports L0s as isn't mandatory.
Moreover ASPM Control bits in Link Control register are controlled by pcie/aspm.c code which sets it according to system ASPM settings, immediately after aardvark driver probes. So setting these bits by aardvark driver has no long running effect.
Remove code which touches ASPM L0s bits from this driver and let kernel's ASPM implementation to set ASPM state properly.
Some users are reporting issues that this code is problematic for some Intel wifi cards and removing it fixes them, see e.g.:
https://bugzilla.kernel.org/show_bug.cgi?id=196339
If problems with Intel wifi cards occur even after this commit, then pcie/aspm.c code could be modified / hooked to not enable ASPM L0s state for affected problematic cards.
--- drivers/pci/host/pci-aardvark.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/pci/host/pci-aardvark.c +0 -4
@@ -365,10 +365,6 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)advk_pcie_wait_for_link (pcie); - reg =PCIE_CORE_LINK_L0S_ENTRY | - (1 <<PCIE_CORE_LINK_WIDTH_SHIFT ); -advk_writel (pcie, reg,PCIE_CORE_LINK_CTRL_STAT_REG ); - reg =advk_readl (pcie,PCIE_CORE_CMD_STATUS_REG ); reg |=PCIE_CORE_CMD_MEM_ACCESS_EN | PCIE_CORE_CMD_IO_ACCESS_EN |
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 21/136 ps3disk: use the default segment boundary
In reply to Greg Kroah-HartmanFrom: Emmanuel Nicolet <[email protected]>
[ Upstream commit 720bc316690bd27dea9d71510b50f0cd698ffc32 ]
Since commit dcebd755926b ("block: use bio_for_each_bvec() to compute multi-page bvec count"), the kernel will bug_on on the PS3 because bio_split() is called with sectors == 0:
kernel BUG at block/bio.c:1853!
Oops: Exception in kernel mode, sig: 5 [#1] BE PAGE_SIZE=4K MMU=Hash PREEMPT SMP NR_CPUS=8 NUMA PS3 Modules linked in: firewire_sbp2 rtc_ps3(+) soundcore ps3_gelic(+) \ ps3rom(+) firewire_core ps3vram(+) usb_common crc_itu_t CPU: 0 PID: 97 Comm: blkid Not tainted 5.3.0-rc4 #1 NIP: c00000000027d0d0 LR: c00000000027d0b0 CTR: 0000000000000000 REGS: c00000000135ae90 TRAP: 0700 Not tainted (5.3.0-rc4) MSR: 8000000000028032 <SF,EE,IR,DR,RI> CR: 44008240 XER: 20000000 IRQMASK: 0 GPR00: c000000000289368 c00000000135b120 c00000000084a500 c000000004ff8300 GPR04: 0000000000000c00 c000000004c905e0 c000000004c905e0 000000000000ffff GPR08: 0000000000000000 0000000000000001 0000000000000000 000000000000ffff GPR12: 0000000000000000 c0000000008ef000 000000000000003e 0000000000080001 GPR16: 0000000000000100 000000000000ffff 0000000000000000 0000000000000004 GPR20: c00000000062fd7e 0000000000000001 000000000000ffff 0000000000000080 GPR24: c000000000781788 c00000000135b350 0000000000000080 c000000004c905e0 GPR28: c00000000135b348 c000000004ff8300 0000000000000000 c000000004c90000 NIP [c00000000027d0d0] .bio_split+0x28/0xac LR [c00000000027d0b0] .bio_split+0x8/0xac Call Trace: [c00000000135b120] [c00000000027d130] .bio_split+0x88/0xac (unreliable) [c00000000135b1b0] [c000000000289368] .__blk_queue_split+0x11c/0x53c [c00000000135b2d0] [c00000000028f614] .blk_mq_make_request+0x80/0x7d4 [c00000000135b3d0] [c000000000283a8c] .generic_make_request+0x118/0x294 [c00000000135b4b0] [c000000000283d34] .submit_bio+0x12c/0x174 [c00000000135b580] [c000000000205a44] .mpage_bio_submit+0x3c/0x4c [c00000000135b600] [c000000000206184] .mpage_readpages+0xa4/0x184 [c00000000135b750] [c0000000001ff8fc] .blkdev_readpages+0x24/0x38 [c00000000135b7c0] [c0000000001589f0] .read_pages+0x6c/0x1a8 [c00000000135b8b0] [c000000000158c74] .__do_page_cache_readahead+0x118/0x184 [c00000000135b9b0] [c0000000001591a8] .force_page_cache_readahead+0xe4/0xe8 [c00000000135ba50] [c00000000014fc24] .generic_file_read_iter+0x1d8/0x830 [c00000000135bb50] [c0000000001ffadc] .blkdev_read_iter+0x40/0x5c [c00000000135bbc0] [c0000000001b9e00] .new_sync_read+0x144/0x1a0 [c00000000135bcd0] [c0000000001bc454] .vfs_read+0xa0/0x124 [c00000000135bd70] [c0000000001bc7a4] .ksys_read+0x70/0xd8 [c00000000135be20] [c00000000000a524] system_call+0x5c/0x70 Instruction dump: 7fe3fb78 482e30dc 7c0802a6 482e3085 7c9e2378 f821ff71 7ca42b78 7d3e00d0 7c7d1b78 79290fe0 7cc53378 69290001 <0b090000> 81230028 7bca0020 7929ba62 [ end trace 313fec760f30aa1f ]---
The problem originates from setting the segment boundary of the request queue to -1UL. This makes get_max_segment_size() return zero when offset is zero, whatever the max segment size. The test with BLK_SEG_BOUNDARY_MASK fails and 'mask - (mask & offset) + 1' overflows to zero in the return statement.
Not setting the segment boundary and using the default value (BLK_SEG_BOUNDARY_MASK) fixes the problem.
--- drivers/block/ps3disk.c | 1 - 1 file changed, 1 deletion(-)
drivers/block/ps3disk.c +0 -1
@@ -468,7 +468,6 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)blk_queue_bounce_limit (queue,BLK_BOUNCE_HIGH );blk_queue_max_hw_sectors (queue, dev->bounce_size >>9 ); -blk_queue_segment_boundary (queue,-1UL );blk_queue_dma_alignment (queue, dev->blk_size-1 );blk_queue_logical_block_size (queue, dev->blk_size);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 22/136 vfio/pci: fix memory leaks in alloc_perm_bits()
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit 3e63b94b6274324ff2e7d8615df31586de827c4e ]
vfio_pci_disable() calls vfio_config_free() but forgets to call free_perm_bits() resulting in memory leaks,
unreferenced object 0xc000000c4db2dee0 (size 16):
comm "qemu-kvm", pid 4305, jiffies 4295020272 (age 3463.780s) hex dump (first 16 bytes):
00 00 ff 00 ff ff ff ff ff ff ff ff ff ff 00 00 ................
backtrace:
[<00000000a6a4552d>] alloc_perm_bits+0x58/0xe0 [vfio_pci]
[<00000000ac990549>] vfio_config_init+0xdf0/0x11b0 [vfio_pci]
init_pci_cap_msi_perm at drivers/vfio/pci/vfio_pci_config.c:1125
(inlined by) vfio_msi_cap_len at drivers/vfio/pci/vfio_pci_config.c:1180
(inlined by) vfio_cap_len at drivers/vfio/pci/vfio_pci_config.c:1241
(inlined by) vfio_cap_init at drivers/vfio/pci/vfio_pci_config.c:1468
(inlined by) vfio_config_init at drivers/vfio/pci/vfio_pci_config.c:1707
[<000000006db873a1>] vfio_pci_open+0x234/0x700 [vfio_pci]
[<00000000630e1906>] vfio_group_fops_unl_ioctl+0x8e0/0xb84 [vfio]
[<000000009e34c54f>] ksys_ioctl+0xd8/0x130
[<000000006577923d>] sys_ioctl+0x28/0x40
[<000000006d7b1cf2>] system_call_exception+0x114/0x1e0
[<0000000008ea7dd5>] system_call_common+0xf0/0x278
unreferenced object 0xc000000c4db2e330 (size 16):
comm "qemu-kvm", pid 4305, jiffies 4295020272 (age 3463.780s)
hex dump (first 16 bytes):
00 ff ff 00 ff ff ff ff ff ff ff ff ff ff 00 00 ................
backtrace:
[<000000004c71914f>] alloc_perm_bits+0x44/0xe0 [vfio_pci]
[<00000000ac990549>] vfio_config_init+0xdf0/0x11b0 [vfio_pci]
[<000000006db873a1>] vfio_pci_open+0x234/0x700 [vfio_pci]
[<00000000630e1906>] vfio_group_fops_unl_ioctl+0x8e0/0xb84 [vfio]
[<000000009e34c54f>] ksys_ioctl+0xd8/0x130
[<000000006577923d>] sys_ioctl+0x28/0x40
[<000000006d7b1cf2>] system_call_exception+0x114/0x1e0
[<0000000008ea7dd5>] system_call_common+0xf0/0x278--- drivers/vfio/pci/vfio_pci_config.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/vfio/pci/vfio_pci_config.c +5 -2
@@ -1732,8 +1732,11 @@ void vfio_config_free(struct vfio_pci_device *vdev) vdev->vconfig =NULL ;kfree (vdev->pci_config_map); vdev->pci_config_map =NULL ; -kfree (vdev->msi_perm); - vdev->msi_perm =NULL ; +if (vdev->msi_perm) { +free_perm_bits (vdev->msi_perm); +kfree (vdev->msi_perm); + vdev->msi_perm =NULL ; + } }/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 23/136 m68k/PCI: Fix a memory leak in an error handling path
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit c3f4ec050f56eeab7c1f290321f9b762c95bd332 ]
If 'ioremap' fails, we must free 'bridge', as done in other error handling path bellow.
--- arch/m68k/coldfire/pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/m68k/coldfire/pci.c +3 -1
@@ -316,8 +316,10 @@ static int __init mcf_pci_init(void)/* Keep a virtual mapping to IO/config space active */ iospace = (unsigned long )ioremap (PCI_IO_PA ,PCI_IO_SIZE ); -if (iospace ==0 ) +if (iospace ==0 ) { +pci_free_host_bridge (bridge);return -ENODEV ; + }pr_info ("Coldfire: PCI IO/config window mapped to 0x%x\n" , (u32 ) iospace);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 24/136 mfd: wm8994: Fix driver operation if loaded as modules
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit d4f9b5428b53dd67f49ee8deed8d4366ed6b1933 ]
WM8994 chip has built-in regulators, which might be used for chip operation. They are controlled by a separate wm8994-regulator driver, which should be loaded before this driver calls regulator_get(), because that driver also provides consumer-supply mapping for the them. If that driver is not yet loaded, regulator core substitute them with dummy regulator, what breaks chip operation, because the built-in regulators are never enabled. Fix this by annotating this driver with MODULE_SOFTDEP() "pre" dependency to "wm8994_regulator" module.
--- drivers/mfd/wm8994-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/mfd/wm8994-core.c +1 -0
@@ -696,3 +696,4 @@ module_i2c_driver(wm8994_i2c_driver);MODULE_DESCRIPTION ("Core support for the WM8994 audio CODEC" );MODULE_LICENSE ("GPL" );MODULE_AUTHOR ("Mark Brown <[email protected]>" ); +MODULE_SOFTDEP ("pre: wm8994_regulator" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 25/136 scsi: lpfc: Fix lpfc_nodelist leak when processing unsolicited event
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit 7217e6e694da3aae6d17db8a7f7460c8d4817ebf ]
In order to create or activate a new node, lpfc_els_unsol_buffer() invokes lpfc_nlp_init() or lpfc_enable_node() or lpfc_nlp_get(), all of them will return a reference of the specified lpfc_nodelist object to "ndlp" with increased refcnt.
When lpfc_els_unsol_buffer() returns, local variable "ndlp" becomes invalid, so the refcount should be decreased to keep refcount balanced.
The reference counting issue happens in one exception handling path of lpfc_els_unsol_buffer(). When "ndlp" in DEV_LOSS, the function forgets to decrease the refcnt increased by lpfc_nlp_init() or lpfc_enable_node() or lpfc_nlp_get(), causing a refcnt leak.
Fix this issue by calling lpfc_nlp_put() when "ndlp" in DEV_LOSS.
--- drivers/scsi/lpfc/lpfc_els.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/lpfc/lpfc_els.c +2 -0
@@ -7913,6 +7913,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,spin_lock_irq (shost->host_lock);if (ndlp->nlp_flag &NLP_IN_DEV_LOSS ) {spin_unlock_irq (shost->host_lock); +if (newnode) +lpfc_nlp_put (ndlp); goto dropit; }spin_unlock_irq (shost->host_lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 26/136 clk: clk-flexgen: fix clock-critical handling
In reply to Greg Kroah-HartmanFrom: Alain Volmat <[email protected]>
[ Upstream commit a403bbab1a73d798728d76931cab3ff0399b9560 ]
Fixes an issue leading to having all clocks following a critical clocks marked as well as criticals.
--- drivers/clk/st/clk-flexgen.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/st/clk-flexgen.c +1 -0
@@ -373,6 +373,7 @@ static void __init st_of_flexgen_setup(struct device_node *np)break ; } + flex_flags &= ~CLK_IS_CRITICAL ;of_clk_detect_critical (np, i, &flex_flags);/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 27/136 powerpc/perf/hv-24x7: Fix inconsistent output values incase multiple hv-24x7 events run
In reply to Greg Kroah-HartmanFrom: Kajol Jain <[email protected]>
[ Upstream commit b4ac18eead28611ff470d0f47a35c4e0ac080d9c ]
Commit 2b206ee6b0df ("powerpc/perf/hv-24x7: Display change in counter values")' added to print _change_ in the counter value rather then raw value for 24x7 counters. Incase of transactions, the event count is set to 0 at the beginning of the transaction. It also sets the event's prev_count to the raw value at the time of initialization. Because of setting event count to 0, we are seeing some weird behaviour, whenever we run multiple 24x7 events at a time.
For example:
command#: ./perf stat -e "{hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/,
hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/}"
-C 0 -I 1000 sleep 100
1.000121704 120 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
1.000121704 5 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
2.000357733 8 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
2.000357733 10 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
3.000495215 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
3.000495215 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
4.000641884 56 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
4.000641884 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
5.000791887 18,446,744,073,709,551,616 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/Getting these large values in case we do -I.
As we are setting event_count to 0, for interval case, overall event_count is not coming in incremental order. As we may can get new delta lesser then previous count. Because of which when we print intervals, we are getting negative value which create these large values.
This patch removes part where we set event_count to 0 in function 'h_24x7_event_read'. There won't be much impact as we do set event->hw.prev_count to the raw value at the time of initialization to print change value.
With this patch
In power9 platform
command#: ./perf stat -e "{hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/,
hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/}"
-C 0 -I 1000 sleep 100
1.000117685 93 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
1.000117685 1 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
2.000349331 98 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
2.000349331 2 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
3.000495900 131 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
3.000495900 4 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
4.000645920 204 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/
4.000645920 61 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=1/
4.284169997 22 hv_24x7/PM_MCS01_128B_RD_DISP_PORT01,chip=0/--- arch/powerpc/perf/hv-24x7.c | 10 ---------- 1 file changed, 10 deletions(-)
arch/powerpc/perf/hv-24x7.c +0 -10
@@ -1413,16 +1413,6 @@ static void h_24x7_event_read(struct perf_event *event) h24x7hw = &get_cpu_var (hv_24x7_hw); h24x7hw->events[i] = event;put_cpu_var (h24x7hw); -/* -* Clear the event count so we can compute the _change_ -* in the 24x7 raw counter value at the end of the txn. -* -* Note that we could alternatively read the 24x7 value -* now and save its value in event->hw.prev_count. But -* that would require issuing a hcall, which would then -* defeat the purpose of using the txn interface. -*/ -local64_set (&event->count,0 ); }put_cpu_var (hv_24x7_reqb);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 28/136 nfsd: Fix svc_xprt refcnt leak when setup callback client failed
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit a4abc6b12eb1f7a533c2e7484cfa555454ff0977 ]
nfsd4_process_cb_update() invokes svc_xprt_get(), which increases the refcount of the "c->cn_xprt".
The reference counting issue happens in one exception handling path of nfsd4_process_cb_update(). When setup callback client failed, the function forgets to decrease the refcnt increased by svc_xprt_get(), causing a refcnt leak.
Fix this issue by calling svc_xprt_put() when setup callback client failed.
--- fs/nfsd/nfs4callback.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfsd/nfs4callback.c +2 -0
@@ -1161,6 +1161,8 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) err =setup_callback_client (clp, &conn, ses);if (err) {nfsd4_mark_cb_down (clp, err); +if (c) +svc_xprt_put (c->cn_xprt);return ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 29/136 powerpc/crashkernel: Take "mem=" option into account
In reply to Greg Kroah-HartmanFrom: Pingfan Liu <[email protected]>
[ Upstream commit be5470e0c285a68dc3afdea965032f5ddc8269d7 ]
'mem=" option is an easy way to put high pressure on memory during some test. Hence after applying the memory limit, instead of total mem, the actual usable memory should be considered when reserving mem for crashkernel. Otherwise the boot up may experience OOM issue.
E.g. it would reserve 4G prior to the change and 512M afterward, if passing crashkernel="2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G", and mem=5G on a 256G machine.
This issue is powerpc specific because it puts higher priority on fadump and kdump reservation than on "mem=". Referring the following code:
if (fadump_reserve_mem() == 0)
reserve_crashkernel();
...
/* Ensure that total memory size is page-aligned. */
limit = ALIGN(memory_limit ?: memblock_phys_mem_size(), PAGE_SIZE);
memblock_enforce_memory_limit(limit);While on other arches, the effect of "mem=" takes a higher priority and pass through memblock_phys_mem_size() before calling reserve_crashkernel().
--- arch/powerpc/kernel/machine_kexec.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/powerpc/kernel/machine_kexec.c +5 -3
@@ -113,11 +113,12 @@ void machine_kexec(struct kimage *image)void __init reserve_crashkernel (void ) { -unsigned long long crash_size, crash_base; +unsigned long long crash_size, crash_base, total_mem_sz;int ret; + total_mem_sz = memory_limit ? memory_limit :memblock_phys_mem_size ();/* use common parsing */ - ret =parse_crashkernel (boot_command_line,memblock_phys_mem_size (), + ret =parse_crashkernel (boot_command_line, total_mem_sz, &crash_size, &crash_base);if (ret ==0 && crash_size >0 ) { crashk_res.start = crash_base;
@@ -176,6 +177,7 @@ void __init reserve_crashkernel(void)/* Crash kernel trumps memory limit */ if (memory_limit && memory_limit <= crashk_res.end) { memory_limit = crashk_res.end +1 ; + total_mem_sz = memory_limit;printk ("Adjusted memory limit for crashkernel, now 0x%llx\n" , memory_limit); }
@@ -184,7 +186,7 @@ void __init reserve_crashkernel(void)"for crashkernel (System RAM: %ldMB)\n" , (unsigned long )(crash_size >>20 ), (unsigned long )(crashk_res.start >>20 ), - (unsigned long)(memblock_phys_mem_size() >> 20)); + (unsigned long)(total_mem_sz >> 20));if (!memblock_is_region_memory (crashk_res.start, crash_size) ||memblock_reserve (crashk_res.start, crash_size)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 30/136 yam: fix possible memory leak in yam_init_driver
In reply to Greg Kroah-HartmanFrom: Wang Hai <[email protected]>
[ Upstream commit 98749b7188affbf2900c2aab704a8853901d1139 ]
If register_netdev(dev) fails, free_netdev(dev) needs to be called, otherwise a memory leak will occur.
--- drivers/net/hamradio/yam.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/hamradio/yam.c +1 -0
@@ -1162,6 +1162,7 @@ static int __init yam_init_driver(void) err =register_netdev (dev);if (err) {printk (KERN_WARNING "yam: cannot register net device %s\n" , dev->name); +free_netdev (dev); goto error; } yam_devs[i] = dev;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 31/136 NTB: Fix the default port and peer numbers for legacy drivers
In reply to Greg Kroah-HartmanFrom: Logan Gunthorpe <[email protected]>
[ Upstream commit fc8b086d9dbd57458d136c4fa70ee26f832c3a2e ]
When the commit adding ntb_default_port_number() and ntb_default_peer_port_number() entered the kernel there was no users of it so it was impossible to tell what the API needed.
When a user finally landed a year later (ntb_pingpong) there were more NTB topologies were created and no consideration was considered to how other drivers had changed.
Now that there is a user it can be fixed to provide a sensible default for the legacy drivers that do not implement ntb_{peer_}port_number(). Seeing ntb_pingpong doesn't check error codes returning EINVAL was also not sensible.
Patches for ntb_pingpong and ntb_perf follow (which are broken otherwise) to support hardware that doesn't have port numbers. This is important not only to not break support with existing drivers but for the cross link topology which, due to its perfect symmetry, cannot assign unique port numbers to each side.
--- drivers/ntb/ntb.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/ntb/ntb.c +2 -6
@@ -216,10 +216,8 @@ int ntb_default_port_number(struct ntb_dev *ntb)case NTB_TOPO_B2B_DSD :return NTB_PORT_SEC_DSD ;default : -break ; +return 0 ; } - -return -EINVAL ; }EXPORT_SYMBOL (ntb_default_port_number);
@@ -242,10 +240,8 @@ int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx)case NTB_TOPO_B2B_DSD :return NTB_PORT_PRI_USD ;default : -break ; +return 0 ; } - -return -EINVAL ; }EXPORT_SYMBOL (ntb_default_peer_port_number);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 32/136 mksysmap: Fix the mismatch of .L symbols in System.map
In reply to Greg Kroah-HartmanFrom: ashimida <[email protected]>
[ Upstream commit 72d24accf02add25e08733f0ecc93cf10fcbd88c ]
When System.map was generated, the kernel used mksysmap to filter the kernel symbols, but all the symbols with the second letter 'L' in the kernel were filtered out, not just the symbols starting with 'dot + L'.
For example:
ashimida@ubuntu:~/linux$ cat System.map |grep ' .L' ashimida@ubuntu:~/linux$ nm -n vmlinux |grep ' .L' ffff0000088028e0 t bLength_show ...... ffff0000092e0408 b PLLP_OUTC_lock ffff0000092e0410 b PLLP_OUTA_lock
The original intent should be to filter out all local symbols starting with '.L', so the dot should be escaped.
--- scripts/mksysmap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/mksysmap +1 -1
@@ -41,4 +41,4 @@ # so we just ignore them to let readprofile continue to work. # (At least sparc64 has __crc_ in the middle). -$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( .L\)' > $2 +$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 33/136 apparmor: fix introspection of of task mode for unconfined tasks
In reply to Greg Kroah-HartmanFrom: John Johansen <[email protected]>
[ Upstream commit dd2569fbb053719f7df7ef8fdbb45cf47156a701 ]
Fix two issues with introspecting the task mode.
1. If a task is attached to a unconfined profile that is not the ns->unconfined profile then. Mode the mode is always reported as -
$ ps -Z
LABEL PID TTY TIME CMD
unconfined 1287 pts/0 00:00:01 bash
test (-) 1892 pts/0 00:00:00 psinstead of the correct value of (unconfined) as shown below
$ ps -Z
LABEL PID TTY TIME CMD
unconfined 2483 pts/0 00:00:01 bash
test (unconfined) 3591 pts/0 00:00:00 ps2. if a task is confined by a stack of profiles that are unconfined the output of label mode is again the incorrect value of (-) like above, instead of (unconfined). This is because the visibile profile count increment is skipped by the special casing of unconfined.
--- security/apparmor/label.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
security/apparmor/label.c +2 -2
@@ -1536,13 +1536,13 @@ static const char *label_modename(struct aa_ns *ns, struct aa_label *label,label_for_each (i, label, profile) {if (aa_ns_visible (ns, profile->ns, flags &FLAG_VIEW_SUBNS )) { -if (profile->mode ==APPARMOR_UNCONFINED ) + count++; +if (profile == profile->ns->unconfined)/* special case unconfined so stacks with * unconfined don't report as mixed. ie. * profile_foo//&:ns1:unconfined (mixed) */ continue ; - count++;if (mode ==-1 ) mode = profile->mode;else if (mode != profile->mode)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 34/136 scsi: sr: Fix sr_probe() missing deallocate of device minor
In reply to Greg Kroah-HartmanFrom: Simon Arlott <[email protected]>
[ Upstream commit 6555781b3fdec5e94e6914511496144241df7dee ]
If the cdrom fails to be registered then the device minor should be deallocated.
--- drivers/scsi/sr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/scsi/sr.c +5 -1
@@ -748,7 +748,7 @@ static int sr_probe(struct device *dev) cd->cdi.disk = disk;if (register_cdrom (&cd->cdi)) - goto fail_put; + goto fail_minor;/* * Initialize block layer runtime PM stuffs before the
@@ -766,6 +766,10 @@ static int sr_probe(struct device *dev)return 0 ; +fail_minor: +spin_lock (&sr_index_lock); +clear_bit (minor, sr_index_bits); +spin_unlock (&sr_index_lock); fail_put:put_disk (disk); fail_free:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 35/136 scsi: ibmvscsi: Dont send host info in adapter info MAD after LPM
In reply to Greg Kroah-HartmanFrom: Tyrel Datwyler <[email protected]>
[ Upstream commit 4919b33b63c8b69d8dcf2b867431d0e3b6dc6d28 ]
The adapter info MAD is used to send the client info and receive the host info as a response. A persistent buffer is used and as such the client info is overwritten after the response. During the course of a normal adapter reset the client info is refreshed in the buffer in preparation for sending the adapter info MAD.
However, in the special case of LPM where we reenable the CRQ instead of a full CRQ teardown and reset we fail to refresh the client info in the adapter info buffer. As a result, after Live Partition Migration (LPM) we erroneously report the host's info as our own.
[mkp: typos]
--- drivers/scsi/ibmvscsi/ibmvscsi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/ibmvscsi/ibmvscsi.c +2 -0
@@ -429,6 +429,8 @@ static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,int rc =0 ;struct vio_dev *vdev =to_vio_dev (hostdata->dev); +set_adapter_info (hostdata); +/* Re-enable the CRQ */ do { if (rc)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 36/136 staging: greybus: fix a missing-check bug in gb_lights_light_config()
In reply to Greg Kroah-HartmanFrom: Chen Zhou <[email protected]>
[ Upstream commit 9bb086e5ba9495ac150fbbcc5c8c2bccc06261dd ]
In gb_lights_light_config(), 'light->name' is allocated by kstrndup(). It returns NULL when fails, add check for it.
--- drivers/staging/greybus/light.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/staging/greybus/light.c +2 -1
@@ -1033,7 +1033,8 @@ static int gb_lights_light_config(struct gb_lights *glights, u8 id) light->channels_count = conf.channel_count; light->name =kstrndup (conf.name,NAMES_MAX ,GFP_KERNEL ); - +if (!light->name) +return -ENOMEM ; light->channels =kcalloc (light->channels_count,sizeof (struct gb_channel ),GFP_KERNEL );if (!light->channels)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 37/136 staging: rtl8712: fix multiline derefernce warnings
In reply to Greg Kroah-HartmanFrom: Aiman Najjar <[email protected]>
[ Upstream commit 269da10b1477c31c660288633c8d613e421b131f ]
This patch fixes remaining checkpatch warnings
in rtl871x_xmit.c:
WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->PrivacyKeyIndex' 636: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:636:
+ (u8)psecuritypriv->
+ PrivacyKeyIndex);
WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->XGrpKeyid' 643: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:643:
+ (u8)psecuritypriv->
+ XGrpKeyid);
WARNING: Avoid multiple line dereference - prefer 'psecuritypriv->XGrpKeyid' 652: FILE: drivers/staging//rtl8712/rtl871x_xmit.c:652:
+ (u8)psecuritypriv->
+ XGrpKeyid);
--- drivers/staging/rtl8712/rtl871x_xmit.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/staging/rtl8712/rtl871x_xmit.c +4 -7
@@ -601,7 +601,7 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,addr_t addr;u8 *pframe, *mem_start, *ptxdesc;struct sta_info *psta; -struct security_priv *psecuritypriv = &padapter->securitypriv; +struct security_priv *psecpriv = &padapter->securitypriv;struct mlme_priv *pmlmepriv = &padapter->mlmepriv;struct xmit_priv *pxmitpriv = &padapter->xmitpriv;struct pkt_attrib *pattrib = &pxmitframe->attrib;
@@ -644,15 +644,13 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,case _WEP40_:case _WEP104_:WEP_IV (pattrib->iv, psta->txpn, - (u8 )psecuritypriv-> - PrivacyKeyIndex); + (u8 )psecpriv->PrivacyKeyIndex);break ;case _TKIP_:if (bmcst)TKIP_IV (pattrib->iv, psta->txpn, - (u8 )psecuritypriv-> - XGrpKeyid); + (u8 )psecpriv->XGrpKeyid);else TKIP_IV (pattrib->iv, psta->txpn,0 );
@@ -660,8 +658,7 @@ sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,case _AES_:if (bmcst)AES_IV (pattrib->iv, psta->txpn, - (u8 )psecuritypriv-> - XGrpKeyid); + (u8 )psecpriv->XGrpKeyid);else AES_IV (pattrib->iv, psta->txpn,0 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 38/136 scsi: qedi: Do not flush offload work if ARP not resolved
In reply to Greg Kroah-HartmanFrom: Nilesh Javali <[email protected]>
[ Upstream commit 927527aea0e2a9c1d336c7d33f77f1911481d008 ]
For an unreachable target, offload_work is not initialized and the endpoint state is set to OFLDCONN_NONE. This results in a WARN_ON due to the check of the work function field being set to zero.
------------[ cut here ]------------
WARNING: CPU: 24 PID: 18587 at ../kernel/workqueue.c:3037 __flush_work+0x1c1/0x1d0
:
Hardware name: HPE ProLiant DL380 Gen10/ProLiant DL380 Gen10, BIOS U30 02/01/2020
RIP: 0010:__flush_work+0x1c1/0x1d0
Code: ba 6d 00 03 80 c9 f0 eb b6 48 c7 c7 20 ee 6c a4 e8 52 d3 04 00 0f 0b 31 c0 e9 d1 fe ff
ff 48 c7 c7 20 ee 6c a4 e8 3d d3 04 00 <0f> 0b 31 c0 e9 bc fe ff ff e8 11 f3 f
00 31 f6
RSP: 0018:ffffac5a8cd47a80 EFLAGS: 00010282
RAX: 0000000000000024 RBX: ffff98d68c1fcaf0 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff98ce9fd99898 RDI: ffff98ce9fd99898
RBP: ffff98d68c1fcbc0 R08: 00000000000006fa R09: 0000000000000001
R10: ffffac5a8cd47b50 R11: 0000000000000001 R12: 0000000000000000
R13: 000000000000489b R14: ffff98d68c1fc800 R15: ffff98d692132c00
FS: 00007f65f7f62280(0000) GS:ffff98ce9fd80000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007ffd2435e880 CR3: 0000000809334003 CR4: 00000000007606e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
PKRU: 55555554
Call Trace:
? class_create_release+0x40/0x40
? klist_put+0x2c/0x80
qedi_ep_disconnect+0xdd/0x400 [qedi]
iscsi_if_ep_disconnect.isra.20+0x59/0x70 [scsi_transport_iscsi]
iscsi_if_rx+0x129b/0x1670 [scsi_transport_iscsi]
? __netlink_lookup+0xe7/0x160
netlink_unicast+0x21d/0x300
netlink_sendmsg+0x30f/0x430
sock_sendmsg+0x5b/0x60
____sys_sendmsg+0x1e2/0x240
? copy_msghdr_from_user+0xd9/0x160
___sys_sendmsg+0x88/0xd0
? ___sys_recvmsg+0xa2/0xe0
? hrtimer_try_to_cancel+0x25/0x100
? do_nanosleep+0x9c/0x170
? __sys_sendmsg+0x5e/0xa0
__sys_sendmsg+0x5e/0xa0
do_syscall_64+0x60/0x1f0
entry_SYSCALL_64_after_hwframe+0x49/0xbe
RIP: 0033:0x7f65f6f16107
Code: 64 89 02 48 c7 c0 ff ff ff ff eb b9 0f 1f 80 00 00 00 00 8b 05 aa d2 2b 00 48 63 d2 48
63 ff 85 c0 75 18 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 59 f3 c3 0f 1f 8
0 00 00 00 00 53 48 89 f3 48
RSP: 002b:00007ffd24367ca8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
RAX: ffffffffffffffda RBX: 000055a7aeaaf110 RCX: 00007f65f6f16107
RDX: 0000000000000000 RSI: 00007ffd24367cc0 RDI: 0000000000000003
RBP: 0000000000000070 R08: 0000000000000000 R09: 0000000000000000
R10: 000000000000075c R11: 0000000000000246 R12: 00007ffd24367cc0
R13: 000055a7ae560008 R14: 00007ffd24367db0 R15: 0000000000000000
---[ end trace 54f499c05d41f8bb ]---Only flush if the connection endpoint state if different from OFLDCONN_NONE.
[mkp: clarified commit desc]
--- drivers/scsi/qedi/qedi_iscsi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/qedi/qedi_iscsi.c +2 -1
@@ -1007,7 +1007,8 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)if (qedi_ep->state ==EP_STATE_OFLDCONN_START ) goto ep_exit_recover; -flush_work (&qedi_ep->offload_work); +if (qedi_ep->state !=EP_STATE_OFLDCONN_NONE ) +flush_work (&qedi_ep->offload_work);if (qedi_ep->conn) { qedi_conn = qedi_ep->conn;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 39/136 ALSA: usb-audio: Improve frames size computation
In reply to Greg Kroah-HartmanFrom: Alexander Tsoy <[email protected]>
[ Upstream commit f0bd62b64016508938df9babe47f65c2c727d25c ]
For computation of the the next frame size current value of fs/fps and accumulated fractional parts of fs/fps are used, where values are stored in Q16.16 format. This is quite natural for computing frame size for asynchronous endpoints driven by explicit feedback, since in this case fs/fps is a value provided by the feedback endpoint and it's already in the Q format. If an error is accumulated over time, the device can adjust fs/fps value to prevent buffer overruns/underruns.
But for synchronous endpoints the accuracy provided by these computations is not enough. Due to accumulated error the driver periodically produces frames with incorrect size (+/- 1 audio sample).
This patch fixes this issue by implementing a different algorithm for frame size computation. It is based on accumulating of the remainders from division fs/fps and it doesn't accumulate errors over time. This new method is enabled for synchronous and adaptive playback endpoints.
--- sound/usb/card.h | 4 ++++ sound/usb/endpoint.c | 43 ++++++++++++++++++++++++++++++++++++++----- sound/usb/endpoint.h | 1 + sound/usb/pcm.c | 2 ++ 4 files changed, 45 insertions(+), 5 deletions(-)
sound/usb/card.h +4 -0
@@ -81,6 +81,10 @@ struct snd_usb_endpoint {dma_addr_t sync_dma;/* DMA address of syncbuf */ unsigned int pipe;/* the data i/o pipe */ +unsigned int framesize[2 ];/* small/large frame sizes in samples */ +unsigned int sample_rem;/* remainder from division fs/fps */ +unsigned int sample_accum;/* sample accumulator */ +unsigned int fps;/* frames per second */ unsigned int freqn;/* nominal sampling rate in fs/fps in Q16.16 format */ unsigned int freqm;/* momentary sampling rate in fs/fps in Q16.16 format */ int freqshift;/* how much to shift the feedback value to get Q16.16 */
sound/usb/endpoint.c +38 -5
78 lines not on this page · raw message
sound/usb/endpoint.h +1 -0
@@ -28,6 +28,7 @@ void snd_usb_endpoint_release(struct snd_usb_endpoint *ep);void snd_usb_endpoint_free (struct snd_usb_endpoint *ep);int snd_usb_endpoint_implicit_feedback_sink (struct snd_usb_endpoint *ep); +int snd_usb_endpoint_slave_next_packet_size (struct snd_usb_endpoint *ep);int snd_usb_endpoint_next_packet_size (struct snd_usb_endpoint *ep); void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
sound/usb/pcm.c +2 -0
@@ -1484,6 +1484,8 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,for (i =0 ; i < ctx->packets; i++) {if (ctx->packet_size[i]) counts = ctx->packet_size[i]; +else if (ep->sync_master) + counts =snd_usb_endpoint_slave_next_packet_size (ep);else counts =snd_usb_endpoint_next_packet_size (ep);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 40/136 s390/qdio: put thinint indicator after early error
In reply to Greg Kroah-HartmanFrom: Julian Wiedmann <[email protected]>
[ Upstream commit 75e82bec6b2622c6f455b7a543fb5476a5d0eed7 ]
qdio_establish() calls qdio_setup_thinint() via qdio_setup_irq(). If the subsequent qdio_establish_thinint() fails, we miss to put the DSCI again. Thus the DSCI isn't available for re-use. Given enough of such errors, we could end up with having only the shared DSCI available.
Merge qdio_setup_thinint() into qdio_establish_thinint(), and deal with such an error internally.
--- drivers/s390/cio/qdio.h | 1 - drivers/s390/cio/qdio_setup.c | 1 - drivers/s390/cio/qdio_thinint.c | 14 ++++++++------ 3 files changed, 8 insertions(+), 8 deletions(-)
drivers/s390/cio/qdio.h +0 -1
@@ -377,7 +377,6 @@ static inline int multicast_outbound(struct qdio_q *q)extern u64 last_ai_time;/* prototypes for thin interrupt */ -void qdio_setup_thinint (struct qdio_irq *irq_ptr);int qdio_establish_thinint (struct qdio_irq *irq_ptr);void qdio_shutdown_thinint (struct qdio_irq *irq_ptr);void tiqdio_add_input_queues (struct qdio_irq *irq_ptr);
drivers/s390/cio/qdio_setup.c +0 -1
@@ -479,7 +479,6 @@ int qdio_setup_irq(struct qdio_initialize *init_data)setup_queues (irq_ptr, init_data);setup_qib (irq_ptr, init_data); -qdio_setup_thinint (irq_ptr); set_impl_params(irq_ptr, init_data->qib_param_field_format, init_data->qib_param_field, init_data->input_slib_elements,
drivers/s390/cio/qdio_thinint.c +8 -6
@@ -270,17 +270,19 @@ int __init tiqdio_register_thinints(void)int qdio_establish_thinint (struct qdio_irq *irq_ptr) { +int rc; +if (!is_thinint_irq (irq_ptr))return 0 ; -return set_subchannel_ind (irq_ptr,0 ); -} -void qdio_setup_thinint (struct qdio_irq *irq_ptr) -{ -if (!is_thinint_irq (irq_ptr)) -return ; irq_ptr->dsci =get_indicator ();DBF_HEX (&irq_ptr->dsci,sizeof (void *)); + + rc =set_subchannel_ind (irq_ptr,0 ); +if (rc) +put_indicator (irq_ptr->dsci); + +return rc; }void qdio_shutdown_thinint (struct qdio_irq *irq_ptr)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 41/136 tty: hvc: Fix data abort due to race in hvc_open
In reply to Greg Kroah-HartmanFrom: Raghavendra Rao Ananta <[email protected]>
[ Upstream commit e2bd1dcbe1aa34ff5570b3427c530e4332ecf0fe ]
Potentially, hvc_open() can be called in parallel when two tasks calls open() on /dev/hvcX. In such a scenario, if the hp->ops->notifier_add() callback in the function fails, where it sets the tty->driver_data to NULL, the parallel hvc_open() can see this NULL and cause a memory abort. Hence, serialize hvc_open and check if tty->private_data is NULL before proceeding ahead.
The issue can be easily reproduced by launching two tasks simultaneously that does nothing but open() and close() on /dev/hvcX.
For example:
$ ./simple_open_close /dev/hvc0 & ./simple_open_close /dev/hvc0 &
--- drivers/tty/hvc/hvc_console.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/tty/hvc/hvc_console.c +14 -2
@@ -88,6 +88,8 @@ static LIST_HEAD(hvc_structs);*/ static DEFINE_SPINLOCK (hvc_structs_lock); +/* Mutex to serialize hvc_open */ +static DEFINE_MUTEX (hvc_open_mutex);/* * This value is used to assign a tty->index value to a hvc_struct based * upon order of exposure via hvc_probe(), when we can not match it to
@@ -332,16 +334,24 @@ static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)*/ static int hvc_open (struct tty_struct *tty,struct file * filp) { -struct hvc_struct *hp = tty->driver_data; +struct hvc_struct *hp;unsigned long flags;int rc =0 ; +mutex_lock (&hvc_open_mutex); + + hp = tty->driver_data; +if (!hp) { + rc = -EIO ; + goto out; + } +spin_lock_irqsave (&hp->port.lock, flags);/* Check and then increment for fast path open. */ if (hp->port.count++ >0 ) {spin_unlock_irqrestore (&hp->port.lock, flags);hvc_kick (); -return 0 ; + goto out; }/* else count == 0 */ spin_unlock_irqrestore (&hp->port.lock, flags);
@@ -369,6 +379,8 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)/* Force wakeup of the polling thread */ hvc_kick (); +out: +mutex_unlock (&hvc_open_mutex);return rc; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 42/136 thermal/drivers/ti-soc-thermal: Avoid dereferencing ERR_PTR
In reply to Greg Kroah-HartmanFrom: Sudip Mukherjee <[email protected]>
[ Upstream commit 7440f518dad9d861d76c64956641eeddd3586f75 ]
On error the function ti_bandgap_get_sensor_data() returns the error code in ERR_PTR() but we only checked if the return value is NULL or not. And, so we can dereference an error code inside ERR_PTR. While at it, convert a check to IS_ERR_OR_NULL.
--- drivers/thermal/ti-soc-thermal/ti-thermal-common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/thermal/ti-soc-thermal/ti-thermal-common.c +3 -3
@@ -183,7 +183,7 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id, data =ti_bandgap_get_sensor_data (bgp, id); -if (!data ||IS_ERR (data)) +if (!IS_ERR_OR_NULL (data)) data =ti_thermal_build_data (bgp, id);if (!data)
@@ -210,7 +210,7 @@ int ti_thermal_remove_sensor(struct ti_bandgap *bgp, int id) data =ti_bandgap_get_sensor_data (bgp, id); -if (data && data->ti_thermal) { +if (!IS_ERR_OR_NULL (data) && data->ti_thermal) {if (data->our_zone)thermal_zone_device_unregister (data->ti_thermal); }
@@ -276,7 +276,7 @@ int ti_thermal_unregister_cpu_cooling(struct ti_bandgap *bgp, int id) data =ti_bandgap_get_sensor_data (bgp, id); -if (data) { +if (!IS_ERR_OR_NULL (data)) {cpufreq_cooling_unregister (data->cool_dev);cpufreq_cpu_put (data->policy); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 43/136 staging: sm750fb: add missing case while setting FB_VISUAL
In reply to Greg Kroah-HartmanFrom: Matej Dujava <[email protected]>
[ Upstream commit fa90133377f4a7f15a937df6ad55133bb57c5665 ]
Switch statement does not contain all cases: 8, 16, 24, 32. This patch will add missing one (24)
--- drivers/staging/sm750fb/sm750.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/sm750fb/sm750.c +1 -0
@@ -899,6 +899,7 @@ static int lynxfb_set_fbinfo(struct fb_info *info, int index) fix->visual =FB_VISUAL_PSEUDOCOLOR ;break ;case 16 : +case 24 :case 32 : fix->visual =FB_VISUAL_TRUECOLOR ;break ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 44/136 i2c: pxa: fix i2c_pxa_scream_blue_murder() debug output
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit 88b73ee7ca4c90baf136ed5a8377fc5a9b73ac08 ]
The IRQ log output is supposed to appear on a single line. However, commit 3a2dc1677b60 ("i2c: pxa: Update debug function to dump more info on error") resulted in it being printed one-entry-per-line, which is excessively long.
Fixing this is not a trivial matter; using pr_cont() doesn't work as the previous dev_dbg() may not have been compiled in, or may be dynamic.
Since the rest of this function output is at error level, and is also debug output, promote this to error level as well to avoid this problem.
Reduce the number of always zero prefix digits to save screen real- estate.
--- drivers/i2c/busses/i2c-pxa.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/i2c/busses/i2c-pxa.c +3 -4
@@ -315,11 +315,10 @@ static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why)dev_err (dev,"IBMR: %08x IDBR: %08x ICR: %08x ISR: %08x\n" ,readl (_IBMR (i2c)),readl (_IDBR (i2c)),readl (_ICR (i2c)),readl (_ISR (i2c))); -dev_dbg (dev,"log: " ); +dev_err (dev,"log:" );for (i =0 ; i < i2c->irqlogidx; i++) -pr_debug ("[%08x:%08x] " , i2c->isrlog[i], i2c->icrlog[i]); - - pr_debug("\n"); +pr_cont (" [%03x:%05x]" , i2c->isrlog[i], i2c->icrlog[i]); + pr_cont("\n"); }#else /* ifdef DEBUG */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 45/136 serial: amba-pl011: Make sure we initialize the port.lock spinlock
In reply to Greg Kroah-HartmanFrom: John Stultz <[email protected]>
[ Upstream commit 8508f4cba308f785b2fd4b8c38849c117b407297 ]
Valentine reported seeing:
[ 3.626638] INFO: trying to register non-static key. [ 3.626639] the code is fine but needs lockdep annotation. [ 3.626640] turning off the locking correctness validator. [ 3.626644] CPU: 7 PID: 51 Comm: kworker/7:1 Not tainted 5.7.0-rc2-00115-g8c2e9790f196 #116 [ 3.626646] Hardware name: HiKey960 (DT) [ 3.626656] Workqueue: events deferred_probe_work_func [ 3.632476] sd 0:0:0:0: [sda] Optimal transfer size 8192 bytes not a multiple of physical block size (16384 bytes) [ 3.640220] Call trace: [ 3.640225] dump_backtrace+0x0/0x1b8 [ 3.640227] show_stack+0x20/0x30 [ 3.640230] dump_stack+0xec/0x158 [ 3.640234] register_lock_class+0x598/0x5c0 [ 3.640235] __lock_acquire+0x80/0x16c0 [ 3.640236] lock_acquire+0xf4/0x4a0 [ 3.640241] _raw_spin_lock_irqsave+0x70/0xa8 [ 3.640245] uart_add_one_port+0x388/0x4b8 [ 3.640248] pl011_register_port+0x70/0xf0 [ 3.640250] pl011_probe+0x184/0x1b8 [ 3.640254] amba_probe+0xdc/0x180 [ 3.640256] really_probe+0xe0/0x338 [ 3.640257] driver_probe_device+0x60/0xf8 [ 3.640259] __device_attach_driver+0x8c/0xd0 [ 3.640260] bus_for_each_drv+0x84/0xd8 [ 3.640261] __device_attach+0xe4/0x140 [ 3.640263] device_initial_probe+0x1c/0x28 [ 3.640265] bus_probe_device+0xa4/0xb0 [ 3.640266] deferred_probe_work_func+0x7c/0xb8 [ 3.640269] process_one_work+0x2c0/0x768 [ 3.640271] worker_thread+0x4c/0x498 [ 3.640272] kthread+0x14c/0x158 [ 3.640275] ret_from_fork+0x10/0x1c
Which seems to be due to the fact that after allocating the uap structure, nothing initializes the spinlock.
Its a little confusing, as uart_port_spin_lock_init() is one place where the lock is supposed to be initialized, but it has an exception for the case where the port is a console.
This makes it seem like a deeper fix is needed to properly register the console, but I'm not sure what that entails, and Andy suggested that this approach is less invasive.
Thus, this patch resolves the issue by initializing the spinlock in the driver, and resolves the resulting warning.
--- drivers/tty/serial/amba-pl011.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/amba-pl011.c +1 -0
@@ -2605,6 +2605,7 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap, uap->port.fifosize = uap->fifosize; uap->port.flags =UPF_BOOT_AUTOCONF ; uap->port.line = index; +spin_lock_init (&uap->port.lock); amba_ports[index] = uap;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 46/136 drivers: base: Fix NULL pointer exception in __platform_driver_probe() if a driver developer is foolish
In reply to Greg Kroah-HartmanFrom: Kuppuswamy Sathyanarayanan <[email protected]>
[ Upstream commit 388bcc6ecc609fca1b4920de7dc3806c98ec535e ]
If platform bus driver registration is failed then, accessing platform bus spin lock (&drv->driver.bus->p->klist_drivers.k_lock) in __platform_driver_probe() without verifying the return value __platform_driver_register() can lead to NULL pointer exception.
So check the return value before attempting the spin lock.
One such example is below:
For a custom usecase, I have intentionally failed the platform bus registration and I expected all the platform device/driver registrations to fail gracefully. But I came across this panic issue.
[ 1.331067] BUG: kernel NULL pointer dereference, address: 00000000000000c8 [ 1.331118] #PF: supervisor write access in kernel mode [ 1.331163] #PF: error_code(0x0002) - not-present page [ 1.331208] PGD 0 P4D 0 [ 1.331233] Oops: 0002 [#1] PREEMPT SMP [ 1.331268] CPU: 3 PID: 1 Comm: swapper/0 Tainted: G W 5.6.0-00049-g670d35fb0144 #165 [ 1.331341] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 [ 1.331406] RIP: 0010:_raw_spin_lock+0x15/0x30 [ 1.331588] RSP: 0000:ffffc9000001be70 EFLAGS: 00010246 [ 1.331632] RAX: 0000000000000000 RBX: 00000000000000c8 RCX: 0000000000000001 [ 1.331696] RDX: 0000000000000001 RSI: 0000000000000092 RDI: 0000000000000000 [ 1.331754] RBP: 00000000ffffffed R08: 0000000000000501 R09: 0000000000000001 [ 1.331817] R10: ffff88817abcc520 R11: 0000000000000670 R12: 00000000ffffffed [ 1.331881] R13: ffffffff82dbc268 R14: ffffffff832f070a R15: 0000000000000000 [ 1.331945] FS: 0000000000000000(0000) GS:ffff88817bd80000(0000) knlGS:0000000000000000 [ 1.332008] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1.332062] CR2: 00000000000000c8 CR3: 000000000681e001 CR4: 00000000003606e0 [ 1.332126] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 1.332189] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [ 1.332252] Call Trace: [ 1.332281] __platform_driver_probe+0x92/0xee [ 1.332323] ? rtc_dev_init+0x2b/0x2b [ 1.332358] cmos_init+0x37/0x67 [ 1.332396] do_one_initcall+0x7d/0x168 [ 1.332428] kernel_init_freeable+0x16c/0x1c9 [ 1.332473] ? rest_init+0xc0/0xc0 [ 1.332508] kernel_init+0x5/0x100 [ 1.332543] ret_from_fork+0x1f/0x30 [ 1.332579] CR2: 00000000000000c8 [ 1.332616] ---[ end trace 3bd87f12e9010b87 ]--- [ 1.333549] note: swapper/0[1] exited with preempt_count 1 [ 1.333592] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009 [ 1.333736] Kernel Offset: disabled
Note, this can only be triggered if a driver errors out from this call, which should never happen. If it does, the driver needs to be fixed.
--- drivers/base/platform.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/base/platform.c +2 -0
@@ -702,6 +702,8 @@ int __init_or_module __platform_driver_probe(struct platform_driver *drv,/* temporary section violation during probe() */ drv->probe = probe; retval = code =__platform_driver_register (drv, module); +if (retval) +return retval;/* * Fixup that section violation, being paranoid about code scanning
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 47/136 PCI: rcar: Fix incorrect programming of OB windows
In reply to Greg Kroah-HartmanFrom: Andrew Murray <[email protected]>
[ Upstream commit 2b9f217433e31d125fb697ca7974d3de3ecc3e92 ]
The outbound windows (PCIEPAUR(x), PCIEPALR(x)) describe a mapping between a CPU address (which is determined by the window number 'x') and a programmed PCI address - Thus allowing the controller to translate CPU accesses into PCI accesses.
However the existing code incorrectly writes the CPU address - lets fix this by writing the PCI address instead.
For memory transactions, existing DT users describe a 1:1 identity mapping and thus this change should have no effect. However the same isn't true for I/O.
--- drivers/pci/host/pcie-rcar.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/pci/host/pcie-rcar.c +5 -4
@@ -328,11 +328,12 @@ static struct pci_ops rcar_pcie_ops = { };static void rcar_pcie_setup_window (int win,struct rcar_pcie *pcie, -struct resource *res) +struct resource_entry *window) {/* Setup PCIe address space mappings for each resource */ resource_size_t size;resource_size_t res_start; +struct resource *res = window->res;u32 mask;rcar_pci_write_reg (pcie,0x00000000 ,PCIEPTCTLR (win));
@@ -346,9 +347,9 @@ static void rcar_pcie_setup_window(int win, struct rcar_pcie *pcie,rcar_pci_write_reg (pcie, mask <<7 ,PCIEPAMR (win));if (res->flags &IORESOURCE_IO ) - res_start =pci_pio_to_address (res->start); + res_start =pci_pio_to_address (res->start) - window->offset;else - res_start = res->start; + res_start = res->start - window->offset;rcar_pci_write_reg (pcie,upper_32_bits (res_start),PCIEPAUR (win)); rcar_pci_write_reg(pcie, lower_32_bits(res_start) & ~0x7F,
@@ -377,7 +378,7 @@ static int rcar_pcie_setup(struct list_head *resource, struct rcar_pcie *pci)switch (resource_type (res)) {case IORESOURCE_IO :case IORESOURCE_MEM : -rcar_pcie_setup_window (i, pci, res); +rcar_pcie_setup_window (i, pci, win); i++;break ;case IORESOURCE_BUS :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 48/136 PCI/ASPM: Allow ASPM on links to PCIe-to-PCI/PCI-X Bridges
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 66ff14e59e8a30690755b08bc3042359703fb07a ]
7d715a6c1ae5 ("PCI: add PCI Express ASPM support") added the ability for Linux to enable ASPM, but for some undocumented reason, it didn't enable ASPM on links where the downstream component is a PCIe-to-PCI/PCI-X Bridge.
Remove this exclusion so we can enable ASPM on these links.
The Dell OptiPlex 7080 mentioned in the bugzilla has a TI XIO2001 PCIe-to-PCI Bridge. Enabling ASPM on the link leading to it allows the Intel SoC to enter deeper Package C-states, which is a significant power savings.
[bhelgaas: commit log]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=207571
--- drivers/pci/pcie/aspm.c | 10 ---------- 1 file changed, 10 deletions(-)
drivers/pci/pcie/aspm.c +0 -10
@@ -584,16 +584,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)/* Setup initial capable state. Will be updated later */ link->aspm_capable = link->aspm_support; -/* -* If the downstream component has pci bridge function, don't -* do ASPM for now. -*/ -list_for_each_entry (child, &linkbus->devices, bus_list) { -if (pci_pcie_type (child) ==PCI_EXP_TYPE_PCI_BRIDGE ) { - link->aspm_disable =ASPM_STATE_ALL ; -break ; - } - }/* Get and check endpoint acceptable latencies */ list_for_each_entry (child, &linkbus->devices, bus_list) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 49/136 scsi: qla2xxx: Fix warning after FC target reset
In reply to Greg Kroah-HartmanFrom: Viacheslav Dubeyko <[email protected]>
[ Upstream commit f839544ccff60cbe534282aac68858fc3fb278ca ]
Currently, FC target reset finishes with the warning message:
[84010.596893] ------------[ cut here ]------------
[84010.596917] WARNING: CPU: 238 PID: 279973 at ../drivers/scsi/qla2xxx/qla_target.c:6644 qlt_enable_vha+0x1d0/0x260 [qla2xxx]
[84010.596918] Modules linked in: vrf af_packet 8021q garp mrp stp llc netlink_diag target_tatlin_tblock(OEX) dm_ec(OEX) ttln_rdma(OEX) dm_frontend(OEX) nvme_rdma nvmet tcm_qla2xxx iscsi_target_mod target_core_mod at24 nvmem_core pnv_php ipmi_watchdog ipmi_ssif vmx_crypto gf128mul crct10dif_vpmsum qla2xxx rpcrdma nvme_fc powernv_flash(X) nvme_fabrics uio_pdrv_genirq mtd rtc_opal(X) ibmpowernv(X) opal_prd(X) uio scsi_transport_fc i2c_opal(X) ses enclosure ipmi_poweroff ast i2c_algo_bit ttm bmc_mcu(OEX) drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm drm_panel_orientation_quirks agpgart nfsd auth_rpcgss nfs_acl ipmi_powernv(X) lockd ipmi_devintf ipmi_msghandler grace dummy ext4 crc16 jbd2 mbcache sd_mod rdma_ucm ib_iser rdma_cm ib_umad iw_cm ib_ipoib libiscsi scsi_transport_iscsi ib_cm
[84010.596975] configfs mlx5_ib ib_uverbs ib_core mlx5_core crc32c_vpmsum xhci_pci xhci_hcd mpt3sas(OEX) tg3 usbcore mlxfw tls raid_class libphy scsi_transport_sas devlink ptp pps_core nvme nvme_core sunrpc dm_mirror dm_region_hash dm_log sg dm_multipath dm_mod scsi_dh_rdac scsi_dh_emc scsi_dh_alua scsi_mod autofs4
[84010.597001] Supported: Yes, External
[84010.597004] CPU: 238 PID: 279973 Comm: bash Tainted: G OE 4.12.14-197.29-default #1 SLE15-SP1
[84010.597006] task: c000000a104c0000 task.stack: c000000b52188000
[84010.597007] NIP: d00000001ffd7f78 LR: d00000001ffd7f6c CTR: c0000000001676c0
[84010.597008] REGS: c000000b5218b910 TRAP: 0700 Tainted: G OE (4.12.14-197.29-default)
[84010.597008] MSR: 900000010282b033 <SF,HV,VEC,VSX,EE,FP,ME,IR,DR,RI,LE,TM[E]>
[84010.597015] CR: 48242424 XER: 00000000
[84010.597016] CFAR: d00000001ff45d08 SOFTE: 1
GPR00: d00000001ffd7f6c c000000b5218bb90 d00000002001b228 0000000000000102
GPR04: 0000000000000001 0000000000000001 00013d91ed0a5e2d 0000000000000000
GPR08: c000000007793300 0000000000000000 0000000000000000 c000000a086e7818
GPR12: 0000000000002200 c000000007793300 0000000000000000 000000012bc937c0
GPR16: 000000012bbf7ed0 0000000000000000 000000012bc3dd10 0000000000000000
GPR20: 000000012bc4db28 0000010036442810 000000012bc97828 000000012bc96c70
GPR24: 00000100365b1550 0000000000000000 00000100363f3d80 c000000be20d3080
GPR28: c000000bda7eae00 c000000be20db7e8 c000000be20d3778 c000000be20db7e8
[84010.597042] NIP [d00000001ffd7f78] qlt_enable_vha+0x1d0/0x260 [qla2xxx]
[84010.597051] LR [d00000001ffd7f6c] qlt_enable_vha+0x1c4/0x260 [qla2xxx]
[84010.597051] Call Trace:
[84010.597061] [c000000b5218bb90] [d00000001ffd7f6c] qlt_enable_vha+0x1c4/0x260 [qla2xxx] (unreliable)
[84010.597064] [c000000b5218bc20] [d000000009820b6c] tcm_qla2xxx_tpg_enable_store+0xc4/0x130 [tcm_qla2xxx]
[84010.597067] [c000000b5218bcb0] [d0000000185d0e68] configfs_write_file+0xd0/0x190 [configfs]
[84010.597072] [c000000b5218bd00] [c0000000003d0edc] __vfs_write+0x3c/0x1e0
[84010.597074] [c000000b5218bd90] [c0000000003d2ea8] vfs_write+0xd8/0x220
[84010.597076] [c000000b5218bde0] [c0000000003d4ddc] SyS_write+0x6c/0x110
[84010.597079] [c000000b5218be30] [c00000000000b188] system_call+0x3c/0x130
[84010.597080] Instruction dump:
[84010.597082] 7d0050a8 7d084b78 7d0051ad 40c2fff4 7fa3eb78 4bf73965 60000000 7fa3eb78
[84010.597086] 4bf6dcd9 60000000 2fa30000 419eff40 <0fe00000> 4bffff38 e95f0058 a12a0180
[84010.597090] ---[ end trace e32abaf6e6fee826 ]---To reproduce:
echo 0x7fffffff > /sys/module/qla2xxx/parameters/logging modprobe target_core_mod
modprobe tcm_qla2xxx
mkdir /sys/kernel/config/target/qla2xxx
mkdir /sys/kernel/config/target/qla2xxx/<port-name>
mkdir /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1 echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable echo 0 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable echo 1 > /sys/kernel/config/target/qla2xxx/<port-name>/tpgt_1/enable
SYSTEM START
kernel: pid 327:drivers/scsi/qla2xxx/qla_init.c:2174 qla2x00_initialize_adapter(): vha->flags.online 0x0 <...>
kernel: pid 327:drivers/scsi/qla2xxx/qla_os.c:3444 qla2x00_probe_one(): vha->flags.online 0x1
echo 1 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6641 qla2x00_abort_isp_cleanup(): vha->flags.online 0x0, ISP_ABORT_NEEDED 0x0 <...>
kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6998 qla2x00_restart_isp(): vha->flags.online 0x0
echo 0 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
kernel: pid 348:drivers/scsi/qla2xxx/qla_init.c:6641 qla2x00_abort_isp_cleanup(): vha->flags.online 0x0, ISP_ABORT_NEEDED 0x0 <...>
kernel: pid 1404:drivers/scsi/qla2xxx/qla_os.c:1107 qla2x00_wait_for_hba_online(): base_vha->flags.online 0x0
echo 1 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:86:a6:2a/tpgt_1/enable
kernel: pid 1404:drivers/scsi/qla2xxx/qla_os.c:1107 qla2x00_wait_for_hba_online(): base_vha->flags.online 0x0
kernel: -----------[ cut here ]-----------
kernel: WARNING: CPU: 1 PID: 1404 at drivers/scsi/qla2xxx/qla_target.c:6654 qlt_enable_vha+0x1e0/0x280 [qla2xxx]
The issue happens because no real ISP reset is executed. The qla2x00_abort_isp(scsi_qla_host_t *vha) function expects that vha->flags.online will be not zero for ISP reset procedure. This patch sets vha->flags.online to 1 before calling ->abort_isp() for starting the ISP reset.
--- drivers/scsi/qla2xxx/qla_os.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/qla2xxx/qla_os.c +1 -0
@@ -5824,6 +5824,7 @@ qla2x00_do_dpc(void *data)if (do_reset && !(test_and_set_bit (ABORT_ISP_ACTIVE , &base_vha->dpc_flags))) { + base_vha->flags.online =1 ;ql_dbg (ql_dbg_dpc, base_vha,0x4007 ,"ISP abort scheduled.\n" );if (ha->isp_ops->abort_isp (base_vha)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 50/136 power: supply: lp8788: Fix an error handling path in lp8788_charger_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 934ed3847a4ebc75b655659c4d2349ba4337941c ]
In the probe function, in case of error, resources allocated in 'lp8788_setup_adc_channel()' must be released.
This can be achieved easily by using the devm_ variant of 'iio_channel_get()'.
This has the extra benefit to simplify the remove function and to axe the 'lp8788_release_adc_channel()' function which is now useless.
--- drivers/power/supply/lp8788-charger.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
drivers/power/supply/lp8788-charger.c +2 -16
@@ -600,27 +600,14 @@ static void lp8788_setup_adc_channel(struct device *dev,return ;/* ADC channel for battery voltage */ - chan =iio_channel_get (dev, pdata->adc_vbatt); + chan =devm_iio_channel_get (dev, pdata->adc_vbatt); pchg->chan[LP8788_VBATT ] =IS_ERR (chan) ?NULL : chan;/* ADC channel for battery temperature */ - chan =iio_channel_get (dev, pdata->adc_batt_temp); + chan =devm_iio_channel_get (dev, pdata->adc_batt_temp); pchg->chan[LP8788_BATT_TEMP ] =IS_ERR (chan) ?NULL : chan; } -static void lp8788_release_adc_channel (struct lp8788_charger *pchg) -{ -int i; - -for (i =0 ; i <LP8788_NUM_CHG_ADC ; i++) { -if (!pchg->chan[i]) -continue ; - -iio_channel_release (pchg->chan[i]); - pchg->chan[i] =NULL ; - } -} -static ssize_t lp8788_show_charger_status (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -747,7 +734,6 @@ static int lp8788_charger_remove(struct platform_device *pdev)lp8788_irq_unregister (pdev, pchg);sysfs_remove_group (&pdev->dev.kobj, &lp8788_attr_group);lp8788_psy_unregister (pchg); -lp8788_release_adc_channel (pchg);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 51/136 power: supply: smb347-charger: IRQSTAT_D is volatile
In reply to Greg Kroah-HartmanFrom: Dmitry Osipenko <[email protected]>
[ Upstream commit c32ea07a30630ace950e07ffe7a18bdcc25898e1 ]
Fix failure when USB cable is connected:
smb347 2-006a: reading IRQSTAT_D failed
--- drivers/power/supply/smb347-charger.c | 1 + 1 file changed, 1 insertion(+)
drivers/power/supply/smb347-charger.c +1 -0
@@ -1141,6 +1141,7 @@ static bool smb347_volatile_reg(struct device *dev, unsigned int reg)switch (reg) {case IRQSTAT_A :case IRQSTAT_C : +case IRQSTAT_D :case IRQSTAT_E :case IRQSTAT_F :case STAT_A :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 52/136 scsi: mpt3sas: Fix double free warnings
In reply to Greg Kroah-HartmanFrom: Suganath Prabu S <[email protected]>
[ Upstream commit cbbfdb2a2416c9f0cde913cf09670097ac281282 ]
Fix following warning from Smatch static analyser:
drivers/scsi/mpt3sas/mpt3sas_base.c:5256 _base_allocate_memory_pools()
warn: 'ioc->hpr_lookup' double freed
drivers/scsi/mpt3sas/mpt3sas_base.c:5256 _base_allocate_memory_pools()
warn: 'ioc->internal_lookup' double freed
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/mpt3sas/mpt3sas_base.c +2 -0
@@ -3263,7 +3263,9 @@ _base_release_memory_pools(struct MPT3SAS_ADAPTER *ioc) ioc->scsi_lookup =NULL ; }kfree (ioc->hpr_lookup); + ioc->hpr_lookup =NULL ;kfree (ioc->internal_lookup); + ioc->internal_lookup =NULL ;if (ioc->chain_lookup) {for (i =0 ; i < ioc->chain_depth; i++) {if (ioc->chain_lookup[i].chain_buffer)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 53/136 dlm: remove BUG() before panic()
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit fe204591cc9480347af7d2d6029b24a62e449486 ]
Building a kernel with clang sometimes fails with an objtool error in dlm:
fs/dlm/lock.o: warning: objtool: revert_lock_pc()+0xbd: can't find jump dest instruction at .text+0xd7fc
The problem is that BUG() never returns and the compiler knows that anything after it is unreachable, however the panic still emits some code that does not get fully eliminated.
Having both BUG() and panic() is really pointless as the BUG() kills the current process and the subsequent panic() never hits. In most cases, we probably don't really want either and should replace the DLM_ASSERT() statements with WARN_ON(), as has been done for some of them.
Remove the BUG() here so the user at least sees the panic message and we can reliably build randconfig kernels.
--- fs/dlm/dlm_internal.h | 1 - 1 file changed, 1 deletion(-)
fs/dlm/dlm_internal.h +0 -1
@@ -99,7 +99,6 @@ do { \ __LINE__, __FILE__, #x, jiffies); \ {do} \ printk("\n"); \ - BUG(); \ panic("DLM: Record message above and reboot.\n"); \ } \ }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 54/136 clk: ti: composite: fix memory leak
In reply to Greg Kroah-HartmanFrom: Tero Kristo <[email protected]>
[ Upstream commit c7c1cbbc9217ebb5601b88d138d4a5358548de9d ]
The parent_names is never released for a component clock definition, causing some memory leak. Fix by releasing it once it is no longer needed.
--- drivers/clk/ti/composite.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/ti/composite.c +1 -0
@@ -240,6 +240,7 @@ cleanup:if (!cclk->comp_clks[i])continue ;list_del (&cclk->comp_clks[i]->link); +kfree (cclk->comp_clks[i]->parent_names);kfree (cclk->comp_clks[i]); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 55/136 PCI: Fix pci_register_host_bridge() device_register() error handling
In reply to Greg Kroah-HartmanFrom: Rob Herring <[email protected]>
[ Upstream commit 1b54ae8327a4d630111c8d88ba7906483ec6010b ]
If device_register() has an error, we should bail out of pci_register_host_bridge() rather than continuing on.
--- drivers/pci/probe.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pci/probe.c +3 -2
@@ -792,9 +792,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge) goto free; err =device_register (&bridge->dev); -if (err) +if (err) {put_device (&bridge->dev); - + goto free; + } bus->bridge =get_device (&bridge->dev);device_enable_async_suspend (bus->bridge);pci_set_bus_of_node (bus);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 56/136 tty: n_gsm: Fix SOF skipping
In reply to Greg Kroah-HartmanFrom: Gregory CLEMENT <[email protected]>
[ Upstream commit 84d6f81c1fb58b56eba81ff0a36cf31946064b40 ]
For at least some modems like the TELIT LE910, skipping SOF makes transfers blocking indefinitely after a short amount of data transferred.
Given the small improvement provided by skipping the SOF (just one byte on about 100 bytes), it seems better to completely remove this "feature" than make it optional.
--- drivers/tty/n_gsm.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
drivers/tty/n_gsm.c +1 -7
@@ -681,7 +681,6 @@ static void gsm_data_kick(struct gsm_mux *gsm) {struct gsm_msg *msg, *nmsg;int len; -int skip_sof =0 ;list_for_each_entry_safe (msg, nmsg, &gsm->tx_list, list) {if (gsm->constipated && msg->addr)
@@ -703,15 +702,10 @@ static void gsm_data_kick(struct gsm_mux *gsm)print_hex_dump_bytes ("gsm_data_kick: " ,DUMP_PREFIX_OFFSET , gsm->txframe, len); - -if (gsm->output (gsm, gsm->txframe + skip_sof, - len - skip_sof) <0 ) +if (gsm->output (gsm, gsm->txframe, len) <0 )break ;/* FIXME: Can eliminate one SOF in many more cases */ gsm->tx_bytes -= msg->len; -/* For a burst of frames skip the extra SOF within the -burst */ - skip_sof =1 ;list_del (&msg->list);kfree (msg);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 57/136 tty: n_gsm: Fix waking up upper tty layer when room available
In reply to Greg Kroah-HartmanFrom: Gregory CLEMENT <[email protected]>
[ Upstream commit 01dbb362f0a114fbce19c8abe4cd6f4710e934d5 ]
Warn the upper layer when n_gms is ready to receive data again. Without this the associated virtual tty remains blocked indefinitely.
--- drivers/tty/n_gsm.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
drivers/tty/n_gsm.c +22 -4
@@ -677,7 +677,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,* FIXME: lock against link layer control transmissions */ -static void gsm_data_kick (struct gsm_mux *gsm) +static void gsm_data_kick (struct gsm_mux *gsm,struct gsm_dlci *dlci) {struct gsm_msg *msg, *nmsg;int len;
@@ -709,6 +709,24 @@ static void gsm_data_kick(struct gsm_mux *gsm)list_del (&msg->list);kfree (msg); + +if (dlci) { +tty_port_tty_wakeup (&dlci->port); + }else { +int i =0 ; + +for (i =0 ; i <NUM_DLCI ; i++) { +struct gsm_dlci *dlci; + + dlci = gsm->dlci[i]; +if (dlci ==NULL ) { + i++; +continue ; + } + +tty_port_tty_wakeup (&dlci->port); + } + } } }
@@ -760,7 +778,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)/* Add to the actual output queue */ list_add_tail (&msg->list, &gsm->tx_list); gsm->tx_bytes += msg->len; -gsm_data_kick (gsm); +gsm_data_kick (gsm, dlci); }/**
@@ -1221,7 +1239,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,gsm_control_reply (gsm,CMD_FCON ,NULL ,0 );/* Kick the link in case it is idling */ spin_lock_irqsave (&gsm->tx_lock, flags); -gsm_data_kick (gsm); +gsm_data_kick (gsm,NULL );spin_unlock_irqrestore (&gsm->tx_lock, flags);break ;case CMD_FCOFF :
@@ -2420,7 +2438,7 @@ static void gsmld_write_wakeup(struct tty_struct *tty)/* Queue poll */ clear_bit (TTY_DO_WRITE_WAKEUP , &tty->flags);spin_lock_irqsave (&gsm->tx_lock, flags); -gsm_data_kick (gsm); +gsm_data_kick (gsm,NULL );if (gsm->tx_bytes <TX_THRESH_LO ) {gsm_dlci_data_sweep (gsm); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 58/136 powerpc/pseries/ras: Fix FWNMI_VALID off by one
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit deb70f7a35a22dffa55b2c3aac71bc6fb0f486ce ]
This was discovered developing qemu fwnmi sreset support. This off-by-one bug means the last 16 bytes of the rtas area can not be used for a 16 byte save area.
It's not a serious bug, and QEMU implementation has to retain a workaround for old kernels, but it's good to tighten it.
--- arch/powerpc/platforms/pseries/ras.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
arch/powerpc/platforms/pseries/ras.c +3 -2
@@ -325,10 +325,11 @@ static irqreturn_t ras_error_interrupt(int irq, void *dev_id)/* * Some versions of FWNMI place the buffer inside the 4kB page starting at * 0x7000. Other versions place it inside the rtas buffer. We check both. +* Minimum size of the buffer is 16 bytes. */ #define VALID_FWNMI_BUFFER (A ) \ - ((((A) >= 0x7000) && ((A) < 0x7ff0)) || \ - (((A) >= rtas.base) && ((A) < (rtas.base + rtas.size - 16)))) + ((((A) >= 0x7000) && ((A) <= 0x8000 - 16)) || \ + (((A) >= rtas.base) && ((A) <= (rtas.base + rtas.size - 16))))/* * Get the error information for errors coming through the
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 59/136 powerpc/ps3: Fix kexec shutdown hang
In reply to Greg Kroah-HartmanFrom: Geoff Levand <[email protected]>
[ Upstream commit 126554465d93b10662742128918a5fc338cda4aa ]
The ps3_mm_region_destroy() and ps3_mm_vas_destroy() routines are called very late in the shutdown via kexec's mmu_cleanup_all routine. By the time mmu_cleanup_all runs it is too late to use udbg_printf, and calling it will cause PS3 systems to hang.
Remove all debugging statements from ps3_mm_region_destroy() and ps3_mm_vas_destroy() and replace any error reporting with calls to lv1_panic.
With this change builds with 'DEBUG' defined will not cause kexec reboots to hang, and builds with 'DEBUG' defined or not will end in lv1_panic if an error is encountered.
--- arch/powerpc/platforms/ps3/mm.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
arch/powerpc/platforms/ps3/mm.c +12 -10
@@ -212,13 +212,14 @@ void ps3_mm_vas_destroy(void) {int result; -DBG ("%s:%d: map.vas_id = %llu\n" , __func__, __LINE__, map.vas_id); -if (map.vas_id) { result =lv1_select_virtual_address_space (0 ); -BUG_ON (result); - result =lv1_destruct_virtual_address_space (map.vas_id); -BUG_ON (result); + result +=lv1_destruct_virtual_address_space (map.vas_id); + +if (result) { +lv1_panic (0 ); + } + map.vas_id =0 ; } }
@@ -316,19 +317,20 @@ static void ps3_mm_region_destroy(struct mem_region *r)int result;if (!r->destroy) { -pr_info ("%s:%d: Not destroying high region: %llxh %llxh\n" , - __func__, __LINE__, r->base, r->size);return ; } -DBG ("%s:%d: r->base = %llxh\n" , __func__, __LINE__, r->base); -if (r->base) { result =lv1_release_memory (r->base); -BUG_ON (result); + +if (result) { +lv1_panic (0 ); + } + r->size = r->base = r->offset =0 ; map.total = map.rm.size; } +ps3_mm_set_repository_highmem (NULL ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 60/136 vfio-pci: Mask cap zero
In reply to Greg Kroah-HartmanFrom: Alex Williamson <[email protected]>
[ Upstream commit bc138db1b96264b9c1779cf18d5a3b186aa90066 ]
The PCI Code and ID Assignment Specification changed capability ID 0 from reserved to a NULL capability in the v1.1 revision. The NULL capability is defined to include only the 16-bit capability header, ie. only the ID and next pointer. Unfortunately vfio-pci creates a map of config space, where ID 0 is used to reserve the standard type 0 header. Finding an actual capability with this ID therefore results in a bogus range marked in that map and conflicts with subsequent capabilities. As this seems to be a dummy capability anyway and we already support dropping capabilities, let's hide this one rather than delving into the potentially subtle dependencies within our map.
Seen on an NVIDIA Tesla T4.
--- drivers/vfio/pci/vfio_pci_config.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/vfio/pci/vfio_pci_config.c +6 -1
@@ -1464,7 +1464,12 @@ static int vfio_cap_init(struct vfio_pci_device *vdev)if (ret)return ret; -if (cap <=PCI_CAP_ID_MAX ) { +/* +* ID 0 is a NULL capability, conflicting with our fake +* PCI_CAP_ID_BASIC. As it has no content, consider it +* hidden for now. +*/ +if (cap && cap <=PCI_CAP_ID_MAX ) { len = pci_cap_length[cap];if (len ==0xFF ) {/* Variable length */ len =vfio_cap_len (vdev, cap, pos);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 61/136 usb/ohci-platform: Fix a warning when hibernating
In reply to Greg Kroah-HartmanFrom: Qais Yousef <[email protected]>
[ Upstream commit 1cb3b0095c3d0bb96912bfbbce4fc006d41f367c ]
The following warning was observed when attempting to suspend to disk using a USB flash as a swap device.
[ 111.779649] ------------[ cut here ]------------ [ 111.788382] URB (____ptrval____) submitted while active [ 111.796646] WARNING: CPU: 3 PID: 365 at drivers/usb/core/urb.c:363 usb_submit_urb+0x3d8/0x590 [ 111.805417] Modules linked in: [ 111.808584] CPU: 3 PID: 365 Comm: kworker/3:2 Not tainted 5.6.0-rc6-00002-gdfd1731f9a3e-dirty #545 [ 111.817796] Hardware name: ARM Juno development board (r2) (DT) [ 111.823896] Workqueue: usb_hub_wq hub_event [ 111.828217] pstate: 60000005 (nZCv daif -PAN -UAO) [ 111.833156] pc : usb_submit_urb+0x3d8/0x590 [ 111.837471] lr : usb_submit_urb+0x3d8/0x590 [ 111.841783] sp : ffff800018de38b0 [ 111.845205] x29: ffff800018de38b0 x28: 0000000000000003 [ 111.850682] x27: ffff000970530b20 x26: ffff8000133fd000 [ 111.856159] x25: ffff8000133fd000 x24: ffff800018de3b38 [ 111.861635] x23: 0000000000000004 x22: 0000000000000c00 [ 111.867112] x21: 0000000000000000 x20: 00000000fffffff0 [ 111.872589] x19: ffff0009704e7a00 x18: ffffffffffffffff [ 111.878065] x17: 00000000a7c8f4bc x16: 000000002af33de8 [ 111.883542] x15: ffff8000133fda88 x14: 0720072007200720 [ 111.889019] x13: 0720072007200720 x12: 0720072007200720 [ 111.894496] x11: 0000000000000000 x10: 00000000a5286134 [ 111.899973] x9 : 0000000000000002 x8 : ffff000970c837a0 [ 111.905449] x7 : 0000000000000000 x6 : ffff800018de3570 [ 111.910926] x5 : 0000000000000001 x4 : 0000000000000003 [ 111.916401] x3 : 0000000000000000 x2 : ffff800013427118 [ 111.921879] x1 : 9d4e965b4b7d7c00 x0 : 0000000000000000 [ 111.927356] Call trace: [ 111.929892] usb_submit_urb+0x3d8/0x590 [ 111.933852] hub_activate+0x108/0x7f0 [ 111.937633] hub_resume+0xac/0x148 [ 111.941149] usb_resume_interface.isra.10+0x60/0x138 [ 111.946265] usb_resume_both+0xe4/0x140 [ 111.950225] usb_runtime_resume+0x24/0x30 [ 111.954365] __rpm_callback+0xdc/0x138 [ 111.958236] rpm_callback+0x34/0x98 [ 111.961841] rpm_resume+0x4a8/0x720 [ 111.965445] rpm_resume+0x50c/0x720 [ 111.969049] __pm_runtime_resume+0x4c/0xb8 [ 111.973276] usb_autopm_get_interface+0x28/0x60 [ 111.977948] hub_event+0x80/0x16d8 [ 111.981466] process_one_work+0x2a4/0x748 [ 111.985604] worker_thread+0x48/0x498 [ 111.989387] kthread+0x13c/0x140 [ 111.992725] ret_from_fork+0x10/0x18 [ 111.996415] irq event stamp: 354 [ 111.999756] hardirqs last enabled at (353): [<ffff80001019ea1c>] console_unlock+0x504/0x5b8 [ 112.008441] hardirqs last disabled at (354): [<ffff8000100a95d0>] do_debug_exception+0x1a8/0x258 [ 112.017479] softirqs last enabled at (350): [<ffff8000100818a4>] __do_softirq+0x4bc/0x568 [ 112.025984] softirqs last disabled at (343): [<ffff8000101145a4>] irq_exit+0x144/0x150 [ 112.034129] ---[ end trace dc96030b9cf6c8a3 ]---
The problem was tracked down to a missing call to pm_runtime_set_active() on resume in ohci-platform.
--- drivers/usb/host/ohci-platform.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/host/ohci-platform.c +5 -0
@@ -355,6 +355,11 @@ static int ohci_platform_resume(struct device *dev) }ohci_resume (hcd, false); + +pm_runtime_disable (dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); +return 0 ; }#endif /* CONFIG_PM_SLEEP */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 62/136 drm/msm/mdp5: Fix mdp5_init error path for failed mdp5_kms allocation
In reply to Greg Kroah-HartmanFrom: Roy Spliet <[email protected]>
[ Upstream commit e4337877c5d578722c0716f131fb774522013cf5 ]
When allocation for mdp5_kms fails, calling mdp5_destroy() leads to undefined behaviour, likely a nullptr exception or use-after-free troubles.
--- drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +2 -1
@@ -972,7 +972,8 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)return 0 ; fail: -mdp5_destroy (pdev); +if (mdp5_kms) +mdp5_destroy (pdev);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 63/136 USB: host: ehci-mxc: Add error handling in ehci_mxc_drv_probe()
In reply to Greg Kroah-HartmanFrom: Tang Bin <[email protected]>
[ Upstream commit d49292025f79693d3348f8e2029a8b4703be0f0a ]
The function ehci_mxc_drv_probe() does not perform sufficient error checking after executing platform_get_irq(), thus fix it.
--- drivers/usb/host/ehci-mxc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/host/ehci-mxc.c +2 -0
@@ -63,6 +63,8 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) } irq =platform_get_irq (pdev,0 ); +if (irq <0 ) +return irq; hcd =usb_create_hcd (&ehci_mxc_hc_driver, dev,dev_name (dev));if (!hcd)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 64/136 tty: n_gsm: Fix bogus i++ in gsm_data_kick
In reply to Greg Kroah-HartmanFrom: Gregory CLEMENT <[email protected]>
[ Upstream commit 4dd31f1ffec6c370c3c2e0c605628bf5e16d5c46 ]
When submitting the previous fix "tty: n_gsm: Fix waking up upper tty layer when room available". It was suggested to switch from a while to a for loop, but when doing it, there was a remaining bogus i++.
This patch removes this i++ and also reorganizes the code making it more compact.
--- drivers/tty/n_gsm.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/tty/n_gsm.c +3 -11
@@ -715,17 +715,9 @@ static void gsm_data_kick(struct gsm_mux *gsm, struct gsm_dlci *dlci) }else {int i =0 ; -for (i =0 ; i <NUM_DLCI ; i++) { -struct gsm_dlci *dlci; - - dlci = gsm->dlci[i]; -if (dlci ==NULL ) { - i++; -continue ; - } - -tty_port_tty_wakeup (&dlci->port); - } +for (i =0 ; i <NUM_DLCI ; i++) +if (gsm->dlci[i]) +tty_port_tty_wakeup (&gsm->dlci[i]->port); } } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 65/136 clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit 25bdae0f1c6609ceaf55fe6700654f0be2253d8e ]
Mark the SCLK clock for Exynos5433 I2S1 device with IGNORE_UNUSED flag to match its behaviour with SCLK clock for AUD_I2S (I2S0) device until a proper fix for Exynos I2S driver is ready.
This fixes the following synchronous abort issue revealed by the probe order change caused by the commit 93d2e4322aa7 ("of: platform: Batch fwnode parsing when adding all top level devices")
Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP Modules linked in: CPU: 0 PID: 50 Comm: kworker/0:1 Not tainted 5.7.0-rc5+ #701 Hardware name: Samsung TM2E board (DT) Workqueue: events deferred_probe_work_func pstate: 60000005 (nZCv daif -PAN -UAO) pc : samsung_i2s_probe+0x768/0x8f0 lr : samsung_i2s_probe+0x688/0x8f0 ... Call trace: samsung_i2s_probe+0x768/0x8f0 platform_drv_probe+0x50/0xa8 really_probe+0x108/0x370 driver_probe_device+0x54/0xb8 __device_attach_driver+0x90/0xc0 bus_for_each_drv+0x70/0xc8 __device_attach+0xdc/0x140 device_initial_probe+0x10/0x18 bus_probe_device+0x94/0xa0 deferred_probe_work_func+0x70/0xa8 process_one_work+0x2a8/0x718 worker_thread+0x48/0x470 kthread+0x134/0x160 ret_from_fork+0x10/0x1c Code: 17ffffaf d503201f f94086c0 91003000 (88dffc00) ---[ end trace ccf721c9400ddbd6 ]---
--- drivers/clk/samsung/clk-exynos5433.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/clk/samsung/clk-exynos5433.c +2 -1
@@ -1674,7 +1674,8 @@ static const struct samsung_gate_clock peric_gate_clks[] __initconst = {GATE (CLK_SCLK_PCM1 ,"sclk_pcm1" ,"sclk_pcm1_peric" ,ENABLE_SCLK_PERIC ,7 ,CLK_SET_RATE_PARENT ,0 ),GATE (CLK_SCLK_I2S1 ,"sclk_i2s1" ,"sclk_i2s1_peric" , -ENABLE_SCLK_PERIC ,6 ,CLK_SET_RATE_PARENT ,0 ), +ENABLE_SCLK_PERIC ,6 , +CLK_SET_RATE_PARENT |CLK_IGNORE_UNUSED ,0 ),GATE (CLK_SCLK_SPI2 ,"sclk_spi2" ,"sclk_spi2_peric" ,ENABLE_SCLK_PERIC ,5 ,CLK_SET_RATE_PARENT ,0 ), GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 66/136 powerpc/64s/pgtable: fix an undefined behaviour
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit c2e929b18cea6cbf71364f22d742d9aad7f4677a ]
Booting a power9 server with hash MMU could trigger an undefined behaviour because pud_offset(p4d, 0) will do,
0 >> (PAGE_SHIFT:16 + PTE_INDEX_SIZE:8 + H_PMD_INDEX_SIZE:10)
Fix it by converting pud_index() and friends to static inline functions.
UBSAN: shift-out-of-bounds in arch/powerpc/mm/ptdump/ptdump.c:282:15 shift exponent 34 is too large for 32-bit type 'int' CPU: 6 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc4-next-20200303+ #13 Call Trace: dump_stack+0xf4/0x164 (unreliable) ubsan_epilogue+0x18/0x78 __ubsan_handle_shift_out_of_bounds+0x160/0x21c walk_pagetables+0x2cc/0x700 walk_pud at arch/powerpc/mm/ptdump/ptdump.c:282 (inlined by) walk_pagetables at arch/powerpc/mm/ptdump/ptdump.c:311 ptdump_check_wx+0x8c/0xf0 mark_rodata_ro+0x48/0x80 kernel_init+0x74/0x194 ret_from_kernel_thread+0x5c/0x74
--- arch/powerpc/include/asm/book3s/64/pgtable.h | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
arch/powerpc/include/asm/book3s/64/pgtable.h +19 -4
@@ -898,10 +898,25 @@ extern struct page *pgd_page(pgd_t pgd);#define pud_page_vaddr (pud) __va(pud_val(pud) & ~PUD_MASKED_BITS)#define pgd_page_vaddr (pgd) __va(pgd_val(pgd) & ~PGD_MASKED_BITS) -#define pgd_index (address) (((address) >> (PGDIR_SHIFT)) & (PTRS_PER_PGD - 1)) -#define pud_index (address) (((address) >> (PUD_SHIFT)) & (PTRS_PER_PUD - 1)) -#define pmd_index (address) (((address) >> (PMD_SHIFT)) & (PTRS_PER_PMD - 1)) -#define pte_index (address) (((address) >> (PAGE_SHIFT)) & (PTRS_PER_PTE - 1)) +static inline unsigned long pgd_index (unsigned long address) +{ +return (address >>PGDIR_SHIFT ) & (PTRS_PER_PGD -1 ); +} + +static inline unsigned long pud_index (unsigned long address) +{ +return (address >>PUD_SHIFT ) & (PTRS_PER_PUD -1 ); +} + +static inline unsigned long pmd_index (unsigned long address) +{ +return (address >>PMD_SHIFT ) & (PTRS_PER_PMD -1 ); +} + +static inline unsigned long pte_index (unsigned long address) +{ +return (address >>PAGE_SHIFT ) & (PTRS_PER_PTE -1 ); +}/* * Find an entry in a page-table-directory. We combine the address region
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 67/136 dm zoned: return NULL if dmz_get_zone_for_reclaim() fails to find a zone
In reply to Greg Kroah-HartmanFrom: Hannes Reinecke <[email protected]>
[ Upstream commit 489dc0f06a5837f87482c0ce61d830d24e17082e ]
The only case where dmz_get_zone_for_reclaim() cannot return a zone is if the respective lists are empty. So we should just return a simple NULL value here as we really don't have an error code which would make sense.
--- drivers/md/dm-zoned-metadata.c | 4 ++-- drivers/md/dm-zoned-reclaim.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/md/dm-zoned-metadata.c +2 -2
@@ -1580,7 +1580,7 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd)return dzone; } -return ERR_PTR (-EBUSY ); +return NULL ; }/*
@@ -1600,7 +1600,7 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd)return zone; } -return ERR_PTR (-EBUSY ); +return NULL ; }/*
drivers/md/dm-zoned-reclaim.c +2 -2
@@ -350,8 +350,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc)/* Get a data zone */ dzone =dmz_get_zone_for_reclaim (zmd); -if (IS_ERR (dzone)) -return PTR_ERR (dzone); +if (!dzone) +return -EBUSY ; start = jiffies;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 68/136 PCI/PTM: Inherit Switch Downstream Port PTM settings from Upstream Port
In reply to Greg Kroah-HartmanFrom: Bjorn Helgaas <[email protected]>
[ Upstream commit 7b38fd9760f51cc83d80eed2cfbde8b5ead9e93a ]
Except for Endpoints, we enable PTM at enumeration-time. Previously we did not account for the fact that Switch Downstream Ports are not permitted to have a PTM capability; their PTM behavior is controlled by the Upstream Port (PCIe r5.0, sec 7.9.16). Since Downstream Ports don't have a PTM capability, we did not mark them as "ptm_enabled", which meant that pci_enable_ptm() on an Endpoint failed because there was no PTM path to it.
Mark Downstream Ports as "ptm_enabled" if their Upstream Port has PTM enabled.
--- drivers/pci/pcie/ptm.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/pci/pcie/ptm.c +17 -5
@@ -47,10 +47,6 @@ void pci_ptm_init(struct pci_dev *dev)if (!pci_is_pcie (dev))return ; - pos =pci_find_ext_capability (dev,PCI_EXT_CAP_ID_PTM ); -if (!pos) -return ; -/* * Enable PTM only on interior devices (root ports, switch ports, * etc.) on the assumption that it causes no link traffic until an
@@ -60,6 +56,23 @@ void pci_ptm_init(struct pci_dev *dev) pci_pcie_type(dev) == PCI_EXP_TYPE_RC_END))return ; +/* +* Switch Downstream Ports are not permitted to have a PTM +* capability; their PTM behavior is controlled by the Upstream +* Port (PCIe r5.0, sec 7.9.16). +*/ + ups =pci_upstream_bridge (dev); +if (pci_pcie_type (dev) ==PCI_EXP_TYPE_DOWNSTREAM && + ups && ups->ptm_enabled) { + dev->ptm_granularity = ups->ptm_granularity; + dev->ptm_enabled =1 ; +return ; + } + + pos =pci_find_ext_capability (dev,PCI_EXT_CAP_ID_PTM ); +if (!pos) +return ; +pci_read_config_dword (dev, pos +PCI_PTM_CAP , &cap); local_clock = (cap &PCI_PTM_GRANULARITY_MASK ) >>8 ;
@@ -69,7 +82,6 @@ void pci_ptm_init(struct pci_dev *dev)* the spec recommendation (PCIe r3.1, sec 7.32.3), select the * furthest upstream Time Source as the PTM Root. */ - ups =pci_upstream_bridge (dev);if (ups && ups->ptm_enabled) { ctrl =PCI_PTM_CTRL_ENABLE ;if (ups->ptm_granularity ==0 )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 69/136 IB/cma: Fix ports memory leak in cma_configfs
In reply to Greg Kroah-HartmanFrom: Maor Gottlieb <[email protected]>
[ Upstream commit 63a3345c2d42a9b29e1ce2d3a4043689b3995cea ]
The allocated ports structure in never freed. The free function should be called by release_cma_ports_group, but the group is never released since we don't remove its default group.
Remove default groups when device group is deleted.
--- drivers/infiniband/core/cma_configfs.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/infiniband/core/cma_configfs.c +13 -0
@@ -319,8 +319,21 @@ fail:return ERR_PTR (err); } +static void drop_cma_dev (struct config_group *cgroup,struct config_item *item) +{ +struct config_group *group = + container_of(item, struct config_group, cg_item); +struct cma_dev_group *cma_dev_group = + container_of(group, struct cma_dev_group, device_group); + +configfs_remove_default_groups (&cma_dev_group->ports_group); +configfs_remove_default_groups (&cma_dev_group->device_group); +config_item_put (item); +} +static struct configfs_group_operations cma_subsys_group_ops = { .make_group = make_cma_dev, + .drop_item = drop_cma_dev, };static struct config_item_type cma_subsys_type = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 70/136 watchdog: da9062: No need to ping manually before setting timeout
In reply to Greg Kroah-HartmanFrom: Stefan Riedmueller <[email protected]>
[ Upstream commit a0948ddba65f4f6d3cfb5e2b84685485d0452966 ]
There is actually no need to ping the watchdog before disabling it during timeout change. Disabling the watchdog already takes care of resetting the counter.
This fixes an issue during boot when the userspace watchdog handler takes over and the watchdog is already running. Opening the watchdog in this case leads to the first ping and directly after that without the required heartbeat delay a second ping issued by the set_timeout call. Due to the missing delay this resulted in a reset.
--- drivers/watchdog/da9062_wdt.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/watchdog/da9062_wdt.c +0 -5
@@ -94,11 +94,6 @@ static int da9062_wdt_update_timeout_register(struct da9062_watchdog *wdt, unsigned int regval) {struct da9062 *chip = wdt->hw; -int ret; - - ret =da9062_reset_watchdog_timer (wdt); -if (ret) -return ret; return regmap_update_bits(chip->regmap, DA9062AA_CONTROL_D,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 71/136 usb: dwc2: gadget: move gadget resume after the core is in L0 state
In reply to Greg Kroah-HartmanFrom: Fabrice Gasnier <[email protected]>
[ Upstream commit 8c935deacebb8fac8f41378701eb79d12f3c2e2d ]
When the remote wakeup interrupt is triggered, lx_state is resumed from L2 to L0 state. But when the gadget resume is called, lx_state is still L2. This prevents the resume callback to queue any request. Any attempt to queue a request from resume callback will result in:
- "submit request only in active state" debug message to be issued
- dwc2_hsotg_ep_queue() returns -EAGAIN
Call the gadget resume routine after the core is in L0 state.
--- drivers/usb/dwc2/core_intr.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/usb/dwc2/core_intr.c +5 -2
@@ -364,10 +364,13 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)if (ret && (ret != -ENOTSUPP ))dev_err (hsotg->dev,"exit hibernation failed\n" ); +/* Change to L0 state */ + hsotg->lx_state =DWC2_L0 ;call_gadget (hsotg, resume); + }else { +/* Change to L0 state */ + hsotg->lx_state =DWC2_L0 ; } -/* Change to L0 state */ - hsotg->lx_state =DWC2_L0 ; }else {if (hsotg->params.hibernation)return ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 72/136 USB: gadget: udc: s3c2410_udc: Remove pointless NULL check in s3c2410_udc_nuke
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 7a0fbcf7c308920bc6116b3a5fb21c8cc5fec128 ]
Clang warns:
drivers/usb/gadget/udc/s3c2410_udc.c:255:11: warning: comparison of address of 'ep->queue' equal to a null pointer is always false [-Wtautological-pointer-compare]
if (&ep->queue == NULL)
~~~~^~~~~ ~~~~1 warning generated.
It is not wrong, queue is not a pointer so if ep is not NULL, the address of queue cannot be NULL. No other driver does a check like this and this check has been around since the driver was first introduced, presumably with no issues so it does not seem like this check should be something else. Just remove it.
Commit afe956c577b2d ("kbuild: Enable -Wtautological-compare") exposed this but it is not the root cause of the warning.
--- drivers/usb/gadget/udc/s3c2410_udc.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/usb/gadget/udc/s3c2410_udc.c +0 -4
@@ -268,10 +268,6 @@ static void s3c2410_udc_done(struct s3c2410_ep *ep,static void s3c2410_udc_nuke (struct s3c2410_udc *udc,struct s3c2410_ep *ep,int status) { -/* Sanity check */ -if (&ep->queue ==NULL ) -return ; -while (!list_empty (&ep->queue)) {struct s3c2410_request *req; req = list_entry(ep->queue.next, struct s3c2410_request,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 73/136 usb: gadget: lpc32xx_udc: dont dereference ep pointer before null check
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit eafa80041645cd7604c4357b1a0cd4a3c81f2227 ]
Currently pointer ep is being dereferenced before it is null checked leading to a null pointer dereference issue. Fix this by only assigning pointer udc once ep is known to be not null. Also remove a debug message that requires a valid udc which may not be possible at that point.
Addresses-Coverity: ("Dereference before null check")
--- drivers/usb/gadget/udc/lpc32xx_udc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/usb/gadget/udc/lpc32xx_udc.c +6 -5
@@ -1615,17 +1615,17 @@ static int lpc32xx_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) { struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); -struct lpc32xx_udc *udc = ep->udc; +struct lpc32xx_udc *udc;u16 maxpacket;u32 tmp;unsigned long flags;/* Verify EP data */ if ((!_ep) || (!ep) || (!desc) || - (desc->bDescriptorType !=USB_DT_ENDPOINT )) { -dev_dbg (udc->dev,"bad ep or descriptor\n" ); + (desc->bDescriptorType !=USB_DT_ENDPOINT ))return -EINVAL ; - } + + udc = ep->udc; maxpacket =usb_endpoint_maxp (desc);if ((maxpacket ==0 ) || (maxpacket > ep->maxpacket)) {dev_dbg (udc->dev,"bad ep descriptor's packet size\n" );
@@ -1873,7 +1873,7 @@ static int lpc32xx_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)static int lpc32xx_ep_set_halt (struct usb_ep *_ep,int value) { struct lpc32xx_ep *ep = container_of(_ep, struct lpc32xx_ep, ep); -struct lpc32xx_udc *udc = ep->udc; +struct lpc32xx_udc *udc;unsigned long flags;if ((!ep) || (ep->hwep_num <=1 ))
@@ -1883,6 +1883,7 @@ static int lpc32xx_ep_set_halt(struct usb_ep *_ep, int value)if (ep->is_in)return -EAGAIN ; + udc = ep->udc;spin_lock_irqsave (&udc->lock, flags);if (value ==1 ) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 74/136 usb: gadget: fix potential double-free in m66592_probe.
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit 44734a594196bf1d474212f38fe3a0d37a73278b ]
m66592_free_request() is called under label "err_add_udc" and "clean_up", and m66592->ep0_req is not set to NULL after first free, leading to a double-free. Fix this issue by setting m66592->ep0_req to NULL after the first free.
--- drivers/usb/gadget/udc/m66592-udc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/udc/m66592-udc.c +1 -1
@@ -1672,7 +1672,7 @@ static int m66592_probe(struct platform_device *pdev) err_add_udc:m66592_free_request (&m66592->ep[0 ].ep, m66592->ep0_req); - + m66592->ep0_req =NULL ; clean_up3:if (m66592->pdata->on_chip) {clk_disable (m66592->clk);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 75/136 usb: gadget: Fix issue with config_ep_by_speed function
In reply to Greg Kroah-HartmanFrom: Pawel Laszczak <[email protected]>
[ Upstream commit 5d363120aa548ba52d58907a295eee25f8207ed2 ]
This patch adds new config_ep_by_speed_and_alt function which extends the config_ep_by_speed about alt parameter.
This additional parameter allows to find proper usb_ss_ep_comp_descriptor.
Problem has appeared during testing f_tcm (BOT/UAS) driver function.
f_tcm function for SS use array of headers for both BOT/UAS alternate setting:
static struct usb_descriptor_header *uasp_ss_function_desc[] = {
(struct usb_descriptor_header *) &bot_intf_desc, (struct usb_descriptor_header *) &uasp_ss_bi_desc, (struct usb_descriptor_header *) &bot_bi_ep_comp_desc, (struct usb_descriptor_header *) &uasp_ss_bo_desc, (struct usb_descriptor_header *) &bot_bo_ep_comp_desc,
(struct usb_descriptor_header *) &uasp_intf_desc, (struct usb_descriptor_header *) &uasp_ss_bi_desc, (struct usb_descriptor_header *) &uasp_bi_ep_comp_desc, (struct usb_descriptor_header *) &uasp_bi_pipe_desc, (struct usb_descriptor_header *) &uasp_ss_bo_desc, (struct usb_descriptor_header *) &uasp_bo_ep_comp_desc, (struct usb_descriptor_header *) &uasp_bo_pipe_desc, (struct usb_descriptor_header *) &uasp_ss_status_desc, (struct usb_descriptor_header *) &uasp_status_in_ep_comp_desc, (struct usb_descriptor_header *) &uasp_status_pipe_desc, (struct usb_descriptor_header *) &uasp_ss_cmd_desc, (struct usb_descriptor_header *) &uasp_cmd_comp_desc, (struct usb_descriptor_header *) &uasp_cmd_pipe_desc, NULL,
};
The first 5 descriptors are associated with BOT alternate setting, and others are associated with UAS.
During handling UAS alternate setting f_tcm driver invokes config_ep_by_speed and this function sets incorrect companion endpoint descriptor in usb_ep object.
Instead setting ep->comp_desc to uasp_bi_ep_comp_desc function in this case set ep->comp_desc to uasp_ss_bi_desc.
This is due to the fact that it searches endpoint based on endpoint address:
for_each_ep_desc(speed_desc, d_spd) {
chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;
if (chosen_desc->bEndpoitAddress == _ep->address)
goto ep_found;
}And in result it uses the descriptor from BOT alternate setting instead UAS.
Finally, it causes that controller driver during enabling endpoints detect that just enabled endpoint for bot.
--- drivers/usb/gadget/composite.c | 78 ++++++++++++++++++++++++++-------- include/linux/usb/composite.h | 3 ++ 2 files changed, 64 insertions(+), 17 deletions(-)
drivers/usb/gadget/composite.c +61 -17
@@ -100,40 +100,43 @@ function_descriptors(struct usb_function *f, }/** -* next_ep_desc() - advance to the next EP descriptor +* next_desc() - advance to the next desc_type descriptor * @t: currect pointer within descriptor array +* @desc_type: descriptor type * -* Return: next EP descriptor or NULL +* Return: next desc_type descriptor or NULL * -* Iterate over @t until either EP descriptor found or +* Iterate over @t until either desc_type descriptor found or * NULL (that indicates end of list) encountered */ static struct usb_descriptor_header ** -next_ep_desc (struct usb_descriptor_header **t) +next_desc (struct usb_descriptor_header **t,u8 desc_type) {for (; *t; t++) { -if ((*t)->bDescriptorType ==USB_DT_ENDPOINT ) +if ((*t)->bDescriptorType == desc_type)return t; }return NULL ; }/* -* for_each_ep_desc()- iterate over endpoint descriptors in the -* descriptors list -* @start: pointer within descriptor array. -* @ep_desc: endpoint descriptor to use as the loop cursor +* for_each_desc() - iterate over desc_type descriptors in the +* descriptors list +* @start: pointer within descriptor array. +* @iter_desc: desc_type descriptor to use as the loop cursor +* @desc_type: wanted descriptr type */ -#define for_each_ep_desc (start, ep_desc) \ - for (ep_desc = next_ep_desc(start); \ - ep_desc; ep_desc = next_ep_desc(ep_desc+1)) +#define for_each_desc (start, iter_desc, desc_type) \ + for (iter_desc = next_desc(start, desc_type); \ + iter_desc; iter_desc = next_desc(iter_desc + 1, desc_type))/** -* config_ep_by_speed() - configures the given endpoint +* config_ep_by_speed_and_alt() - configures the given endpoint * according to gadget speed. * @g: pointer to the gadget * @f: usb function * @_ep: the endpoint to configure +* @alt: alternate setting number * * Return: error code, 0 on success *
@@ -146,11 +149,13 @@ next_ep_desc(struct usb_descriptor_header **t)* Note: the supplied function should hold all the descriptors * for supported speeds */ -int config_ep_by_speed (struct usb_gadget *g, -struct usb_function *f, -struct usb_ep *_ep) +int config_ep_by_speed_and_alt (struct usb_gadget *g, +struct usb_function *f, +struct usb_ep *_ep, +u8 alt) {struct usb_endpoint_descriptor *chosen_desc =NULL ; +struct usb_interface_descriptor *int_desc =NULL ;struct usb_descriptor_header **speed_desc =NULL ;struct usb_ss_ep_comp_descriptor *comp_desc =NULL ;
@@ -186,8 +191,21 @@ int config_ep_by_speed(struct usb_gadget *g,default : speed_desc = f->fs_descriptors; } + +/* find correct alternate setting descriptor */ +for_each_desc (speed_desc, d_spd,USB_DT_INTERFACE ) { + int_desc = (struct usb_interface_descriptor *)*d_spd; + +if (int_desc->bAlternateSetting == alt) { + speed_desc = d_spd; + goto intf_found; + } + } +return -EIO ; + +intf_found:/* find descriptors */ -for_each_ep_desc (speed_desc, d_spd) { +for_each_desc (speed_desc, d_spd,USB_DT_ENDPOINT ) { chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;if (chosen_desc->bEndpointAddress == _ep->address) goto ep_found;
@@ -240,6 +258,32 @@ ep_found: }return 0 ; } +EXPORT_SYMBOL_GPL (config_ep_by_speed_and_alt); + +/** +* config_ep_by_speed() - configures the given endpoint +* according to gadget speed. +* @g: pointer to the gadget +* @f: usb function +* @_ep: the endpoint to configure +* +* Return: error code, 0 on success +* +* This function chooses the right descriptors for a given +* endpoint according to gadget speed and saves it in the +* endpoint desc field. If the endpoint already has a descriptor +* assigned to it - overwrites it with currently corresponding +* descriptor. The endpoint maxpacket field is updated according +* to the chosen descriptor. +* Note: the supplied function should hold all the descriptors +* for supported speeds +*/ +int config_ep_by_speed (struct usb_gadget *g, +struct usb_function *f, +struct usb_ep *_ep) +{ +return config_ep_by_speed_and_alt (g, f, _ep,0 ); +}EXPORT_SYMBOL_GPL (config_ep_by_speed);/**
include/linux/usb/composite.h +3 -0
@@ -248,6 +248,9 @@ int usb_function_activate(struct usb_function *);int usb_interface_id (struct usb_configuration *,struct usb_function *); +int config_ep_by_speed_and_alt (struct usb_gadget *g,struct usb_function *f, +struct usb_ep *_ep,u8 alt); +int config_ep_by_speed (struct usb_gadget *g,struct usb_function *f,struct usb_ep *_ep);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 76/136 x86/apic: Make TSC deadline timer detection message visible
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit de308d1815c9e8fe602a958c5c76142ff6501d75 ]
The commit
c84cb3735fd5 ("x86/apic: Move TSC deadline timer debug printk")
removed the message which said that the deadline timer was enabled. It added a pr_debug() message which is issued when deadline timer validation succeeds.
Well, issued only when CONFIG_DYNAMIC_DEBUG is enabled - otherwise pr_debug() calls get optimized away if DEBUG is not defined in the compilation unit.
Therefore, make the above message pr_info() so that it is visible in dmesg.
--- arch/x86/kernel/apic/apic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kernel/apic/apic.c +1 -1
@@ -1915,7 +1915,7 @@ void __init init_apic_mappings(void)unsigned int new_apicid;if (apic_validate_deadline_timer ()) -pr_debug ("TSC deadline timer available\n" ); +pr_info ("TSC deadline timer available\n" );if (x2apic_mode) { boot_cpu_physical_apicid =read_apic_id ();
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 77/136 clk: bcm2835: Fix return type of bcm2835_register_gate
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit f376c43bec4f8ee8d1ba5c5c4cfbd6e84fb279cb ]
bcm2835_register_gate is used as a callback for the clk_register member of bcm2835_clk_desc, which expects a struct clk_hw * return type but bcm2835_register_gate returns a struct clk *.
This discrepancy is hidden by the fact that bcm2835_register_gate is cast to the typedef bcm2835_clk_register by the _REGISTER macro. This turns out to be a control flow integrity violation, which is how this was noticed.
Change the return type of bcm2835_register_gate to be struct clk_hw * and use clk_hw_register_gate to do so. This should be a non-functional change as clk_register_gate calls clk_hw_register_gate anyways but this is needed to avoid issues with further changes.
--- drivers/clk/bcm/clk-bcm2835.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/bcm/clk-bcm2835.c +5 -5
@@ -1483,13 +1483,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman,return &clock->hw; } -static struct clk *bcm2835_register_gate (struct bcm2835_cprman *cprman, +static struct clk_hw *bcm2835_register_gate (struct bcm2835_cprman *cprman,const struct bcm2835_gate_data *data) { -return clk_register_gate (cprman->dev, data->name, data->parent, -CLK_IGNORE_UNUSED |CLK_SET_RATE_GATE , - cprman->regs + data->ctl_reg, -CM_GATE_BIT ,0 , &cprman->regs_lock); +return clk_hw_register_gate (cprman->dev, data->name, data->parent, +CLK_IGNORE_UNUSED |CLK_SET_RATE_GATE , + cprman->regs + data->ctl_reg, +CM_GATE_BIT ,0 , &cprman->regs_lock); } typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 78/136 scsi: ufs-qcom: Fix scheduling while atomic issue
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
[ Upstream commit 3be60b564de49875e47974c37fabced893cd0931 ]
ufs_qcom_dump_dbg_regs() uses usleep_range, a sleeping function, but can be called from atomic context in the following flow:
ufshcd_intr -> ufshcd_sl_intr -> ufshcd_check_errors -> ufshcd_print_host_regs -> ufshcd_vops_dbg_register_dump -> ufs_qcom_dump_dbg_regs
This causes a boot crash on the Lenovo Miix 630 when the interrupt is handled on the idle thread.
Fix the issue by switching to udelay().
--- drivers/scsi/ufs/ufs-qcom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/scsi/ufs/ufs-qcom.c +3 -3
@@ -1649,11 +1649,11 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)/* sleep a bit intermittently as we are dumping too much data */ ufs_qcom_print_hw_debug_reg_all (hba,NULL , ufs_qcom_dump_regs_wrapper); -usleep_range (1000 ,1100 ); +udelay (1000 );ufs_qcom_testbus_read (hba); -usleep_range (1000 ,1100 ); +udelay (1000 );ufs_qcom_print_unipro_testbus (hba); -usleep_range (1000 ,1100 ); +udelay (1000 ); }/**
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 79/136 net: sunrpc: Fix off-by-one issues in rpc_ntop6
In reply to Greg Kroah-HartmanFrom: Fedor Tokarev <[email protected]>
[ Upstream commit 118917d696dc59fd3e1741012c2f9db2294bed6f ]
Fix off-by-one issues in 'rpc_ntop6':
- 'snprintf' returns the number of characters which would have been written if enough space had been available, excluding the terminating null byte. Thus, a return value of 'sizeof(scopebuf)' means that the last character was dropped.
- 'strcat' adds a terminating null byte to the string, thus if len == buflen, the null byte is written past the end of the buffer.
--- net/sunrpc/addr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/sunrpc/addr.c +2 -2
@@ -81,11 +81,11 @@ static size_t rpc_ntop6(const struct sockaddr *sap, rc =snprintf (scopebuf,sizeof (scopebuf),"%c%u" ,IPV6_SCOPE_DELIMITER , sin6->sin6_scope_id); -if (unlikely ((size_t )rc >sizeof (scopebuf))) +if (unlikely ((size_t )rc >=sizeof (scopebuf)))return 0 ; len += rc; -if (unlikely (len > buflen)) +if (unlikely (len >= buflen))return 0 ;strcat (buf, scopebuf);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 80/136 NFSv4.1 fix rpc_call_done assignment for BIND_CONN_TO_SESSION
In reply to Greg Kroah-HartmanFrom: Olga Kornievskaia <[email protected]>
[ Upstream commit 1c709b766e73e54d64b1dde1b7cfbcf25bcb15b9 ]
--- fs/nfs/nfs4proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/nfs4proc.c +1 -1
@@ -7309,7 +7309,7 @@ nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata) }static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = { - .rpc_call_done = &nfs4_bind_one_conn_to_session_done, + .rpc_call_done = nfs4_bind_one_conn_to_session_done, };/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 81/136 powerpc/4xx: Dont unmap NULL mbase
In reply to Greg Kroah-HartmanFrom: huhai <[email protected]>
[ Upstream commit bcec081ecc940fc38730b29c743bbee661164161 ]
--- arch/powerpc/platforms/4xx/pci.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/powerpc/platforms/4xx/pci.c +1 -3
@@ -1242,7 +1242,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port)if (mbase ==NULL ) {printk (KERN_ERR "%pOF: Can't map internal config space !" , port->node); - goto done; +return ; } while (attempt && (0 == (in_le32(mbase + PECFG_460SX_DLLSTA)
@@ -1252,9 +1252,7 @@ static void __init ppc460sx_pciex_check_link(struct ppc4xx_pciex_port *port) }if (attempt) port->link =1 ; -done:iounmap (mbase); - }static struct ppc4xx_pciex_hwops ppc460sx_pcie_hwops__initdata = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 82/136 extcon: adc-jack: Fix an error handling path in adc_jack_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit bc84cff2c92ae5ccb2c37da73756e7174b1b430f ]
In some error handling paths, a call to 'iio_channel_get()' is not balanced by a corresponding call to 'iio_channel_release()'.
This can be achieved easily by using the devm_ variant of 'iio_channel_get()'.
This has the extra benefit to simplify the remove function.
--- drivers/extcon/extcon-adc-jack.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/extcon/extcon-adc-jack.c +1 -2
@@ -128,7 +128,7 @@ static int adc_jack_probe(struct platform_device *pdev)for (i =0 ; data->adc_conditions[i].id !=EXTCON_NONE ; i++); data->num_conditions = i; - data->chan =iio_channel_get (&pdev->dev, pdata->consumer_channel); + data->chan =devm_iio_channel_get (&pdev->dev, pdata->consumer_channel);if (IS_ERR (data->chan))return PTR_ERR (data->chan);
@@ -170,7 +170,6 @@ static int adc_jack_remove(struct platform_device *pdev)free_irq (data->irq, data);cancel_work_sync (&data->handler.work); -iio_channel_release (data->chan);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 83/136 ASoC: fsl_asrc_dma: Fix dma_chan leak when config DMA channel failed
In reply to Greg Kroah-HartmanFrom: Xiyu Yang <[email protected]>
[ Upstream commit 36124fb19f1ae68a500cd76a76d40c6e81bee346 ]
fsl_asrc_dma_hw_params() invokes dma_request_channel() or fsl_asrc_get_dma_channel(), which returns a reference of the specified dma_chan object to "pair->dma_chan[dir]" with increased refcnt.
The reference counting issue happens in one exception handling path of fsl_asrc_dma_hw_params(). When config DMA channel failed for Back-End, the function forgets to decrease the refcnt increased by dma_request_channel() or fsl_asrc_get_dma_channel(), causing a refcnt leak.
Fix this issue by calling dma_release_channel() when config DMA channel failed.
--- sound/soc/fsl/fsl_asrc_dma.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/fsl/fsl_asrc_dma.c +1 -0
@@ -243,6 +243,7 @@ static int fsl_asrc_dma_hw_params(struct snd_pcm_substream *substream, ret =dmaengine_slave_config (pair->dma_chan[dir], &config_be);if (ret) {dev_err (dev,"failed to config DMA channel for Back-End\n" ); +dma_release_channel (pair->dma_chan[dir]);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 84/136 vfio/mdev: Fix reference count leak in add_mdev_supported_type
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit aa8ba13cae3134b8ef1c1b6879f66372531da738 ]
kobject_init_and_add() takes reference even when it fails. If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object. Thus, replace kfree() by kobject_put() to fix this issue. Previous commit "b8eb718348b8" fixed a similar problem.
--- drivers/vfio/mdev/mdev_sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/vfio/mdev/mdev_sysfs.c +1 -1
@@ -113,7 +113,7 @@ struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,"%s-%s" ,dev_driver_string (parent->dev), group->name);if (ret) { -kfree (type); +kobject_put (&type->kobj);return ERR_PTR (ret); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 85/136 openrisc: Fix issue with argument clobbering for clone/fork
In reply to Greg Kroah-HartmanFrom: Stafford Horne <[email protected]>
[ Upstream commit 6bd140e14d9aaa734ec37985b8b20a96c0ece948 ]
Working on the OpenRISC glibc port I found that sometimes clone was working strange. That the tls data argument sent in r7 was always wrong. Further investigation revealed that the arguments were getting clobbered in the entry code. This patch removes the code that writes to the argument registers. This was likely due to some old code hanging around.
This patch fixes this up for clone and fork. This fork clobber is harmless but also useless so remove.
--- arch/openrisc/kernel/entry.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/openrisc/kernel/entry.S +2 -2
@@ -1102,13 +1102,13 @@ ENTRY(__sys_clone) l.movhi r29,hi(sys_clone) l.ori r29,r29,lo(sys_clone) l.j _fork_save_extra_regs_and_call - l.addi r7,r1,0 + l.nop ENTRY(__sys_fork) l.movhi r29,hi(sys_fork) l.ori r29,r29,lo(sys_fork) l.j _fork_save_extra_regs_and_call - l.addi r3,r1,0 + l.nop ENTRY(sys_rt_sigreturn) l.jal _sys_rt_sigreturn
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 86/136 gfs2: Allow lock_nolock mount to specify jid=X
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit ea22eee4e6027d8927099de344f7fff43c507ef9 ]
Before this patch, a simple typo accidentally added \n to the jid= string for lock_nolock mounts. This made it impossible to mount a gfs2 file system with a journal other than journal0. Thus:
mount -tgfs2 -o hostdata="jid=1" <device> <mount pt>
Resulted in:
mount: wrong fs type, bad option, bad superblock on <device>
In most cases this is not a problem. However, for debugging and testing purposes we sometimes want to test the integrity of other journals. This patch removes the unnecessary \n and thus allows lock_nolock users to specify an alternate journal.
--- fs/gfs2/ops_fstype.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/gfs2/ops_fstype.c +1 -1
@@ -922,7 +922,7 @@ fail: }static const match_table_t nolock_tokens = { - { Opt_jid,"jid=%d\n" , }, + { Opt_jid,"jid=%d" , }, { Opt_err,NULL }, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 87/136 scsi: iscsi: Fix reference count leak in iscsi_boot_create_kobj
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit 0267ffce562c8bbf9b57ebe0e38445ad04972890 ]
kobject_init_and_add() takes reference even when it fails. If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object.
--- drivers/scsi/iscsi_boot_sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/iscsi_boot_sysfs.c +1 -1
@@ -360,7 +360,7 @@ iscsi_boot_create_kobj(struct iscsi_boot_kset *boot_kset, boot_kobj->kobj.kset = boot_kset->kset;if (kobject_init_and_add (&boot_kobj->kobj, &iscsi_boot_ktype,NULL , name, index)) { -kfree (boot_kobj); +kobject_put (&boot_kobj->kobj);return NULL ; } boot_kobj->data = data;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 88/136 scsi: ufs: Dont update urgent bkops level when toggling auto bkops
In reply to Greg Kroah-HartmanFrom: Can Guo <[email protected]>
[ Upstream commit be32acff43800c87dc5c707f5d47cc607b76b653 ]
Urgent bkops level is used to compare against actual bkops status read from UFS device. Urgent bkops level is set during initialization and might be updated in exception event handler during runtime. But it should not be updated to the actual bkops status every time when auto bkops is toggled. Otherwise, if urgent bkops level is updated to 0, auto bkops shall always be kept enabled.
--- drivers/scsi/ufs/ufshcd.c | 1 - 1 file changed, 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +0 -1
@@ -4890,7 +4890,6 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, err =ufshcd_enable_auto_bkops (hba); else err =ufshcd_disable_auto_bkops (hba); - hba->urgent_bkops_lvl = curr_status; out:return err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 89/136 pinctrl: imxl: Fix an error handling path in imx1_pinctrl_core_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 9eb728321286c4b31e964d2377fca2368526d408 ]
When 'pinctrl_register()' has been turned into 'devm_pinctrl_register()', an error handling path has not been updated.
Axe a now unneeded 'pinctrl_unregister()'.
--- drivers/pinctrl/freescale/pinctrl-imx1-core.c | 1 - 1 file changed, 1 deletion(-)
drivers/pinctrl/freescale/pinctrl-imx1-core.c +0 -1
@@ -642,7 +642,6 @@ int imx1_pinctrl_core_probe(struct platform_device *pdev, ret =of_platform_populate (pdev->dev.of_node,NULL ,NULL , &pdev->dev);if (ret) { -pinctrl_unregister (ipctl->pctl);dev_err (&pdev->dev,"Failed to populate subdevices\n" );return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 90/136 pinctrl: freescale: imx: Fix an error handling path in imx_pinctrl_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 11d8da5cabf7c6c3263ba2cd9c00260395867048 ]
'pinctrl_unregister()' should not be called to undo 'devm_pinctrl_register_and_init()', it is already handled by the framework.
This simplifies the error handling paths of the probe function. The 'imx_free_resources()' can be removed as well.
--- drivers/pinctrl/freescale/pinctrl-imx.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
drivers/pinctrl/freescale/pinctrl-imx.c +2 -17
@@ -661,16 +661,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,return 0 ; } -/* -* imx_free_resources() - free memory used by this driver -* @info: info driver instance -*/ -static void imx_free_resources (struct imx_pinctrl *ipctl) -{ -if (ipctl->pctl) -pinctrl_unregister (ipctl->pctl); -} -int imx_pinctrl_probe (struct platform_device *pdev,struct imx_pinctrl_soc_info *info) {
@@ -761,21 +751,16 @@ int imx_pinctrl_probe(struct platform_device *pdev, &ipctl->pctl);if (ret) {dev_err (&pdev->dev,"could not register IMX pinctrl driver\n" ); - goto free; +return ret; } ret =imx_pinctrl_probe_dt (pdev, ipctl);if (ret) {dev_err (&pdev->dev,"fail to probe dt properties\n" ); - goto free; +return ret; }dev_info (&pdev->dev,"initialized IMX pinctrl driver\n" );return pinctrl_enable (ipctl->pctl); - -free: -imx_free_resources (ipctl); - -return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 91/136 crypto: omap-sham - add proper load balancing support for multicore
In reply to Greg Kroah-HartmanFrom: Tero Kristo <[email protected]>
[ Upstream commit 281c377872ff5d15d80df25fc4df02d2676c7cde ]
The current implementation of the multiple accelerator core support for OMAP SHA does not work properly. It always picks up the first probed accelerator core if this is available, and rest of the book keeping also gets confused if there are two cores available. Add proper load balancing support for SHA, and also fix any bugs related to the multicore support while doing it.
--- drivers/crypto/omap-sham.c | 64 ++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 33 deletions(-)
drivers/crypto/omap-sham.c +31 -33
@@ -168,8 +168,6 @@ struct omap_sham_hmac_ctx { };struct omap_sham_ctx { -struct omap_sham_dev *dd; -unsigned long flags;/* fallback stuff */
@@ -916,27 +914,35 @@ static int omap_sham_update_dma_stop(struct omap_sham_dev *dd)return 0 ; } +struct omap_sham_dev *omap_sham_find_dev (struct omap_sham_reqctx *ctx) +{ +struct omap_sham_dev *dd; + +if (ctx->dd) +return ctx->dd; + +spin_lock_bh (&sham.lock); + dd = list_first_entry(&sham.dev_list, struct omap_sham_dev, list); +list_move_tail (&dd->list, &sham.dev_list); + ctx->dd = dd; +spin_unlock_bh (&sham.lock); + +return dd; +} +static int omap_sham_init (struct ahash_request *req) {struct crypto_ahash *tfm =crypto_ahash_reqtfm (req);struct omap_sham_ctx *tctx =crypto_ahash_ctx (tfm);struct omap_sham_reqctx *ctx =ahash_request_ctx (req); -struct omap_sham_dev *dd =NULL , *tmp; +struct omap_sham_dev *dd;int bs =0 ; -spin_lock_bh (&sham.lock); -if (!tctx->dd) { -list_for_each_entry (tmp, &sham.dev_list, list) { - dd = tmp; -break ; - } - tctx->dd = dd; - }else { - dd = tctx->dd; - } -spin_unlock_bh (&sham.lock); + ctx->dd =NULL ; - ctx->dd = dd; + dd =omap_sham_find_dev (ctx); +if (!dd) +return -ENODEV ; ctx->flags =0 ;
@@ -1186,8 +1192,7 @@ err1:static int omap_sham_enqueue (struct ahash_request *req,unsigned int op) {struct omap_sham_reqctx *ctx =ahash_request_ctx (req); -struct omap_sham_ctx *tctx =crypto_tfm_ctx (req->base.tfm); -struct omap_sham_dev *dd = tctx->dd; +struct omap_sham_dev *dd = ctx->dd; ctx->op = op;
@@ -1197,7 +1202,7 @@ static int omap_sham_enqueue(struct ahash_request *req, unsigned int op)static int omap_sham_update (struct ahash_request *req) {struct omap_sham_reqctx *ctx =ahash_request_ctx (req); -struct omap_sham_dev *dd = ctx->dd; +struct omap_sham_dev *dd =omap_sham_find_dev (ctx);if (!req->nbytes)return 0 ;
@@ -1302,21 +1307,8 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,struct omap_sham_hmac_ctx *bctx = tctx->base;int bs =crypto_shash_blocksize (bctx->shash);int ds =crypto_shash_digestsize (bctx->shash); -struct omap_sham_dev *dd =NULL , *tmp;int err, i; -spin_lock_bh (&sham.lock); -if (!tctx->dd) { -list_for_each_entry (tmp, &sham.dev_list, list) { - dd = tmp; -break ; - } - tctx->dd = dd; - }else { - dd = tctx->dd; - } -spin_unlock_bh (&sham.lock); - err =crypto_shash_setkey (tctx->fallback, key, keylen);if (err)return err;
@@ -1334,7 +1326,7 @@ static int omap_sham_setkey(struct crypto_ahash *tfm, const u8 *key,memset (bctx->ipad + keylen,0 , bs - keylen); -if (!test_bit (FLAGS_AUTO_XOR , &dd->flags)) { +if (!test_bit (FLAGS_AUTO_XOR , &sham.flags)) {memcpy (bctx->opad, bctx->ipad, bs);for (i =0 ; i < bs; i++) {
@@ -2073,6 +2065,7 @@ static int omap_sham_probe(struct platform_device *pdev) } dd->flags |= dd->pdata->flags; + sham.flags |= dd->pdata->flags;pm_runtime_use_autosuspend (dev);pm_runtime_set_autosuspend_delay (dev,DEFAULT_AUTOSUSPEND_DELAY );
@@ -2098,6 +2091,9 @@ static int omap_sham_probe(struct platform_device *pdev)spin_unlock (&sham.lock);for (i =0 ; i < dd->pdata->algs_info_size; i++) { +if (dd->pdata->algs_info[i].registered) +break ; +for (j =0 ; j < dd->pdata->algs_info[i].size; j++) {struct ahash_alg *alg;
@@ -2143,9 +2139,11 @@ static int omap_sham_remove(struct platform_device *pdev)list_del (&dd->list);spin_unlock (&sham.lock);for (i = dd->pdata->algs_info_size -1 ; i >=0 ; i--) -for (j = dd->pdata->algs_info[i].registered -1 ; j >=0 ; j--) +for (j = dd->pdata->algs_info[i].registered -1 ; j >=0 ; j--) {crypto_unregister_ahash ( &dd->pdata->algs_info[i].algs_list[j]); + dd->pdata->algs_info[i].registered--; + }tasklet_kill (&dd->done_task);pm_runtime_disable (&pdev->dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 92/136 geneve: change from tx_error to tx_dropped on missing metadata
In reply to Greg Kroah-HartmanFrom: Jiri Benc <[email protected]>
[ Upstream commit 9d149045b3c0e44c049cdbce8a64e19415290017 ]
If the geneve interface is in collect_md (external) mode, it can't send any packets submitted directly to its net interface, as such packets won't have metadata attached. This is expected.
However, the kernel itself sends some packets to the interface, most notably, IPv6 DAD, IPv6 multicast listener reports, etc. This is not wrong, as tunnel metadata can be specified in routing table (although technically, that has never worked for IPv6, but hopefully will be fixed eventually) and then the interface must correctly participate in IPv6 housekeeping.
The problem is that any such attempt increases the tx_error counter. Just bringing up a geneve interface with IPv6 enabled is enough to see a number of tx_errors. That causes confusion among users, prompting them to find a network error where there is none.
Change the counter used to tx_dropped. That better conveys the meaning (there's nothing wrong going on, just some packets are getting dropped) and hopefully will make admins panic less.
--- drivers/net/geneve.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/net/geneve.c +4 -3
@@ -915,9 +915,10 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)if (geneve->collect_md) { info =skb_tunnel_info (skb);if (unlikely (!info || !(info->mode &IP_TUNNEL_INFO_TX ))) { - err = -EINVAL ;netdev_dbg (dev,"no tunnel metadata\n" ); - goto tx_error; +dev_kfree_skb (skb); + dev->stats.tx_dropped++; +return NETDEV_TX_OK ; } }else { info = &geneve->info;
@@ -934,7 +935,7 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev)if (likely (!err))return NETDEV_TX_OK ; -tx_error: +dev_kfree_skb (skb);if (err == -ELOOP )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 93/136 lib/zlib: remove outdated and incorrect pre-increment optimization
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
[ Upstream commit acaab7335bd6f0c0b54ce3a00bd7f18222ce0f5f ]
The zlib inflate code has an old micro-optimization based on the assumption that for pre-increment memory accesses, the compiler will generate code that fits better into the processor's pipeline than what would be generated for post-increment memory accesses.
This optimization was already removed in upstream zlib in 2016:
https://github.com/madler/zlib/commit/9aaec95e8211
This optimization causes UB according to C99, which says in section 6.5.6 "Additive operators": "If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined".
This UB is not only a theoretical concern, but can also cause trouble for future work on compiler-based sanitizers.
According to the zlib commit, this optimization also is not optimal anymore with modern compilers.
Replace uses of OFF, PUP and UP_UNALIGNED with their definitions in the POSTINC case, and remove the macro definitions, just like in the upstream patch.
--- lib/zlib_inflate/inffast.c | 91 +++++++++++++++----------------------- 1 file changed, 35 insertions(+), 56 deletions(-)
lib/zlib_inflate/inffast.c +35 -56
@@ -10,17 +10,6 @@ #ifndef ASMINF -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ union uu { unsigned short us; unsigned char b[2];
@@ -38,16 +27,6 @@ get_unaligned16(const unsigned short *p)return mm.us; } -#ifdef POSTINC -# define OFF 0 -# define PUP (a) *(a)++ -# define UP_UNALIGNED (a) get_unaligned16((a)++) -#else -# define OFF 1 -# define PUP (a) *++(a) -# define UP_UNALIGNED (a) get_unaligned16(++(a)) -#endif -/* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is
@@ -115,9 +94,9 @@ void inflate_fast(z_streamp strm, unsigned start)/* copy state to local variables */ state = (struct inflate_state *)strm->state; - in = strm->next_in -OFF ; + in = strm->next_in; last = in + (strm->avail_in -5 ); - out = strm->next_out -OFF ; + out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out -257 );#ifdef INFLATE_STRICT
@@ -138,9 +117,9 @@ void inflate_fast(z_streamp strm, unsigned start)input data or output space */ do { if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } this = lcode[hold & lmask];
@@ -150,14 +129,14 @@ void inflate_fast(z_streamp strm, unsigned start) bits -= op; op = (unsigned )(this.op);if (op ==0 ) {/* literal */ -PUP (out) = (unsigned char )(this.val); + *out++ = (unsigned char )(this.val); }else if (op &16 ) {/* length base */ len = (unsigned )(this.val); op &=15 ;/* number of extra bits */ if (op) {if (bits < op) { - hold += (unsigned long )(PUP (in)) << bits; + hold += (unsigned long )(*in++) << bits; bits +=8 ; } len += (unsigned )hold & ((1U << op) -1 );
@@ -165,9 +144,9 @@ void inflate_fast(z_streamp strm, unsigned start) bits -= op; }if (bits <15 ) { - hold += (unsigned long )(PUP (in)) << bits; + hold += (unsigned long )(*in++) << bits; bits +=8 ; - hold += (unsigned long )(PUP (in)) << bits; + hold += (unsigned long )(*in++) << bits; bits +=8 ; } this = dcode[hold & dmask];
@@ -180,10 +159,10 @@ void inflate_fast(z_streamp strm, unsigned start) dist = (unsigned )(this.val); op &=15 ;/* number of extra bits */ if (bits < op) { - hold += (unsigned long )(PUP (in)) << bits; + hold += (unsigned long )(*in++) << bits; bits +=8 ;if (bits < op) { - hold += (unsigned long )(PUP (in)) << bits; + hold += (unsigned long )(*in++) << bits; bits +=8 ; } }
@@ -205,13 +184,13 @@ void inflate_fast(z_streamp strm, unsigned start) state->mode =BAD ;break ; } - from = window -OFF ; + from = window;if (write ==0 ) {/* very common case */ from += wsize - op;if (op < len) {/* some from window */ len -= op;do { -PUP (out) =PUP (from); + *out++ = *from++; }while (--op); from = out - dist;/* rest from output */ }
@@ -222,14 +201,14 @@ void inflate_fast(z_streamp strm, unsigned start)if (op < len) {/* some from end of window */ len -= op;do { -PUP (out) =PUP (from); + *out++ = *from++; }while (--op); - from = window -OFF ; + from = window;if (write < len) {/* some from start of window */ op = write; len -= op;do { -PUP (out) =PUP (from); + *out++ = *from++; }while (--op); from = out - dist;/* rest from output */ }
@@ -240,21 +219,21 @@ void inflate_fast(z_streamp strm, unsigned start)if (op < len) {/* some from window */ len -= op;do { -PUP (out) =PUP (from); + *out++ = *from++; }while (--op); from = out - dist;/* rest from output */ } }while (len >2 ) { -PUP (out) =PUP (from); -PUP (out) =PUP (from); -PUP (out) =PUP (from); + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; len -=3 ; }if (len) { -PUP (out) =PUP (from); + *out++ = *from++;if (len >1 ) -PUP (out) =PUP (from); + *out++ = *from++; } }else {
@@ -264,29 +243,29 @@ void inflate_fast(z_streamp strm, unsigned start) from = out - dist;/* copy direct from output */ /* minimum length is three */ /* Align out addr */ -if (!((long )(out -1 +OFF ) &1 )) { -PUP (out) =PUP (from); +if (!((long )(out -1 ) &1 )) { + *out++ = *from++; len--; } - sout = (unsigned short *)(out -OFF ); + sout = (unsigned short *)(out);if (dist >2 ) {unsigned short *sfrom; - sfrom = (unsigned short *)(from -OFF ); + sfrom = (unsigned short *)(from); loops = len >>1 ; do#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS -PUP (sout) =PUP (sfrom); + *sout++ = *sfrom++;#else -PUP (sout) =UP_UNALIGNED (sfrom); + *sout++ =get_unaligned16 (sfrom++);#endif while (--loops); - out = (unsigned char *)sout +OFF ; - from = (unsigned char *)sfrom +OFF ; + out = (unsigned char *)sout; + from = (unsigned char *)sfrom; }else {/* dist == 1 or dist == 2 */ unsigned short pat16; - pat16 = *(sout-1 +OFF ); + pat16 = *(sout-1 );if (dist ==1 ) {union uu mm;/* copy one char pattern to both bytes */
@@ -296,12 +275,12 @@ void inflate_fast(z_streamp strm, unsigned start) } loops = len >>1 ;do -PUP (sout) = pat16; + *sout++ = pat16;while (--loops); - out = (unsigned char *)sout +OFF ; + out = (unsigned char *)sout; }if (len &1 ) -PUP (out) =PUP (from); + *out++ = *from++; } }else if ((op &64 ) ==0 ) {/* 2nd level distance code */
@@ -336,8 +315,8 @@ void inflate_fast(z_streamp strm, unsigned start) hold &= (1U << bits) -1 ;/* update state and return */ - strm->next_in = in +OFF ; - strm->next_out = out +OFF ; + strm->next_in = in; + strm->next_out = out; strm->avail_in = (unsigned )(in < last ?5 + (last - in) :5 - (in - last)); strm->avail_out = (unsigned )(out < end ?257 + (end - out) :257 - (out - end));
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 94/136 include/linux/bitops.h: avoid clang shift-count-overflow warnings
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit bd93f003b7462ae39a43c531abca37fe7073b866 ]
Clang normally does not warn about certain issues in inline functions when it only happens in an eliminated code path. However if something else goes wrong, it does tend to complain about the definition of hweight_long() on 32-bit targets:
include/linux/bitops.h:75:41: error: shift count >= width of type [-Werror,-Wshift-count-overflow]
return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
^~~~~~~~~~~~
include/asm-generic/bitops/const_hweight.h:29:49: note: expanded from macro 'hweight64'
define hweight64(w) (__builtin_constant_p(w) ? __const_hweight64(w) : __arch_hweight64(w))
^~~~~~~~~~~~~~~~~~~~
include/asm-generic/bitops/const_hweight.h:21:76: note: expanded from macro '__const_hweight64'
define __const_hweight64(w) (__const_hweight32(w) + __const_hweight32((w) >> 32))
^ ~~
include/asm-generic/bitops/const_hweight.h:20:49: note: expanded from macro '__const_hweight32'
define __const_hweight32(w) (__const_hweight16(w) + __const_hweight16((w) >> 16))
^
include/asm-generic/bitops/const_hweight.h:19:72: note: expanded from macro '__const_hweight16'
define __const_hweight16(w) (__const_hweight8(w) + __const_hweight8((w) >> 8 ))
^
include/asm-generic/bitops/const_hweight.h:12:9: note: expanded from macro '__const_hweight8'
(!!((w) & (1ULL << 2))) + \Adding an explicit cast to __u64 avoids that warning and makes it easier to read other output.
--- include/linux/bitops.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/bitops.h +1 -1
@@ -50,7 +50,7 @@ static inline int get_bitmask_order(unsigned int count)static __always_inline unsigned long hweight_long (unsigned long w) { -return sizeof (w) ==4 ?hweight32 (w) :hweight64 (w); +return sizeof (w) ==4 ?hweight32 (w) :hweight64 ((__u64 )w); }/**
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 95/136 elfnote: mark all .note sections SHF_ALLOC
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
[ Upstream commit 51da9dfb7f20911ae4e79e9b412a9c2d4c373d4b ]
ELFNOTE_START allows callers to specify flags for .pushsection assembler directives. All callsites but ELF_NOTE use "a" for SHF_ALLOC. For vdso's that explicitly use ELF_NOTE_START and BUILD_SALT, the same section is specified twice after preprocessing, once with "a" flag, once without. Example:
.pushsection .note.Linux, "a", @note ;
.pushsection .note.Linux, "", @note ;
While GNU as allows this ordering, it warns for the opposite ordering, making these directives position dependent. We'd prefer not to precisely match this behavior in Clang's integrated assembler. Instead, the non __ASSEMBLY__ definition of ELF_NOTE uses __attribute__((section(".note.Linux"))) which is created with SHF_ALLOC, so let's make the __ASSEMBLY__ definition of ELF_NOTE consistent with C and just always use "a" flag.
This allows Clang to assemble a working mainline (5.6) kernel via:
$ make CC=clang AS=clang
--- include/linux/elfnote.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/elfnote.h +1 -1
@@ -54,7 +54,7 @@ .popsection ;#define ELFNOTE (name, type, desc) \ - ELFNOTE_START(name, type, "") \ + ELFNOTE_START(name, type, "a") \ desc ; \ ELFNOTE_END
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 96/136 selftests/vm/pkeys: fix alloc_random_pkey() to make it really random
In reply to Greg Kroah-HartmanFrom: Ram Pai <[email protected]>
[ Upstream commit 6e373263ce07eeaa6410843179535fbdf561fc31 ]
alloc_random_pkey() was allocating the same pkey every time. Not all pkeys were geting tested. This fixes it.
--- tools/testing/selftests/x86/protection_keys.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/x86/protection_keys.c +2 -1
@@ -24,6 +24,7 @@#define _GNU_SOURCE#include <errno.h> #include <linux/futex.h> +#include <time.h> #include <sys/time.h> #include <sys/syscall.h> #include <string.h>
@@ -612,10 +613,10 @@ int alloc_random_pkey(void)int nr_alloced =0 ;int random_index;memset (alloced_pkeys,0 ,sizeof (alloced_pkeys)); +srand ((unsigned int )time (NULL ));/* allocate every possible key and make a note of which ones we got */ max_nr_pkey_allocs =NR_PKEYS ; - max_nr_pkey_allocs =1 ;for (i =0 ; i < max_nr_pkey_allocs; i++) {int new_pkey =alloc_pkey ();if (new_pkey <0 )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 97/136 blktrace: use errno instead of bi_status
In reply to Greg Kroah-HartmanFrom: Chaitanya Kulkarni <[email protected]>
[ Upstream commit 48bc3cd3e07a1486f45d9971c75d6090976c3b1b ]
In blk_add_trace_spliti() blk_add_trace_bio_remap() use blk_status_to_errno() to pass the error instead of pasing the bi_status. This fixes the sparse warning.
--- kernel/trace/blktrace.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
kernel/trace/blktrace.c +6 -3
@@ -1022,8 +1022,10 @@ static void blk_add_trace_split(void *ignore,__blk_add_trace (bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size,bio_op (bio), bio->bi_opf, -BLK_TA_SPLIT , bio->bi_status,sizeof (rpdu), - &rpdu,blk_trace_bio_get_cgid (q, bio)); +BLK_TA_SPLIT , +blk_status_to_errno (bio->bi_status), +sizeof (rpdu), &rpdu, +blk_trace_bio_get_cgid (q, bio)); }rcu_read_unlock (); }
@@ -1060,7 +1062,8 @@ static void blk_add_trace_bio_remap(void *ignore, r.sector_from =cpu_to_be64 (from);__blk_add_trace (bt, bio->bi_iter.bi_sector, bio->bi_iter.bi_size, -bio_op (bio), bio->bi_opf,BLK_TA_REMAP , bio->bi_status, +bio_op (bio), bio->bi_opf,BLK_TA_REMAP , +blk_status_to_errno (bio->bi_status),sizeof (r), &r,blk_trace_bio_get_cgid (q, bio));rcu_read_unlock (); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 98/136 blktrace: fix endianness in get_pdu_int()
In reply to Greg Kroah-HartmanFrom: Chaitanya Kulkarni <[email protected]>
[ Upstream commit 71df3fd82e7cccec7b749a8607a4662d9f7febdd ]
In function get_pdu_len() replace variable type from __u64 to __be64. This fixes sparse warning.
--- kernel/trace/blktrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/blktrace.c +1 -1
@@ -1285,7 +1285,7 @@ static inline __u16 t_error(const struct trace_entry *ent)static __u64 get_pdu_int (const struct trace_entry *ent,bool has_cg) { -const __u64 *val =pdu_start (ent, has_cg); +const __be64 *val =pdu_start (ent, has_cg);return be64_to_cpu (*val); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 99/136 blktrace: fix endianness for blk_log_remap()
In reply to Greg Kroah-HartmanFrom: Chaitanya Kulkarni <[email protected]>
[ Upstream commit 5aec598c456fe3c1b71a1202cbb42bdc2a643277 ]
The function blk_log_remap() can be simplified by removing the call to get_pdu_remap() that copies the values into extra variable to print the data, which also fixes the endiannness warning reported by sparse.
--- kernel/trace/blktrace.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-)
kernel/trace/blktrace.c +4 -15
@@ -1289,17 +1289,6 @@ static __u64 get_pdu_int(const struct trace_entry *ent, bool has_cg)return be64_to_cpu (*val); } -static void get_pdu_remap (const struct trace_entry *ent, -struct blk_io_trace_remap *r,bool has_cg) -{ -const struct blk_io_trace_remap *__r =pdu_start (ent, has_cg); -__u64 sector_from = __r->sector_from; - - r->device_from =be32_to_cpu (__r->device_from); - r->device_to =be32_to_cpu (__r->device_to); - r->sector_from =be64_to_cpu (sector_from); -} -typedef void (blk_log_action_t ) (struct trace_iterator *iter,const char *act,bool has_cg);
@@ -1425,13 +1414,13 @@ static void blk_log_with_error(struct trace_seq *s,static void blk_log_remap (struct trace_seq *s,const struct trace_entry *ent,bool has_cg) { -struct blk_io_trace_remap r = { .device_from =0 , }; +const struct blk_io_trace_remap *__r =pdu_start (ent, has_cg); -get_pdu_remap (ent, &r, has_cg);trace_seq_printf (s,"%llu + %u <- (%d,%d) %llu\n" ,t_sector (ent),t_sec (ent), -MAJOR (r.device_from),MINOR (r.device_from), - (unsigned long long )r.sector_from); +MAJOR (be32_to_cpu (__r->device_from)), +MINOR (be32_to_cpu (__r->device_from)), +be64_to_cpu (__r->sector_from)); }static void blk_log_plug (struct trace_seq *s,const struct trace_entry *ent,bool has_cg)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 100/136 gfs2: fix use-after-free on transaction ail lists
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
[ Upstream commit 83d060ca8d90fa1e3feac227f995c013100862d3 ]
Before this patch, transactions could be merged into the system transaction by function gfs2_merge_trans(), but the transaction ail lists were never merged. Because the ail flushing mechanism can run separately, bd elements can be attached to the transaction's buffer list during the transaction (trans_add_meta, etc) but quickly moved to its ail lists. Later, in function gfs2_trans_end, the transaction can be freed (by gfs2_trans_end) while it still has bd elements queued to its ail lists, which can cause it to either lose track of the bd elements altogether (memory leak) or worse, reference the bd elements after the parent transaction has been freed.
Although I've not seen any serious consequences, the problem becomes apparent with the previous patch's addition of:
gfs2_assert_warn(sdp, list_empty(&tr->tr_ail1_list));
to function gfs2_trans_free().
This patch adds logic into gfs2_merge_trans() to move the merged transaction's ail lists to the sdp transaction. This prevents the use-after-free. To do this properly, we need to hold the ail lock, so we pass sdp into the function instead of the transaction itself.
--- fs/gfs2/log.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/gfs2/log.c +9 -2
@@ -804,8 +804,10 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl,* @new: New transaction to be merged */ -static void gfs2_merge_trans (struct gfs2_trans *old,struct gfs2_trans *new) +static void gfs2_merge_trans (struct gfs2_sbd *sdp,struct gfs2_trans *new) { +struct gfs2_trans *old = sdp->sd_log_tr; +WARN_ON_ONCE (!test_bit (TR_ATTACHED , &old->tr_flags)); old->tr_num_buf_new += new->tr_num_buf_new;
@@ -817,6 +819,11 @@ static void gfs2_merge_trans(struct gfs2_trans *old, struct gfs2_trans *new)list_splice_tail_init (&new->tr_databuf, &old->tr_databuf);list_splice_tail_init (&new->tr_buf, &old->tr_buf); + +spin_lock (&sdp->sd_ail_lock); +list_splice_tail_init (&new->tr_ail1_list, &old->tr_ail1_list); +list_splice_tail_init (&new->tr_ail2_list, &old->tr_ail2_list); +spin_unlock (&sdp->sd_ail_lock); }static void log_refund (struct gfs2_sbd *sdp,struct gfs2_trans *tr)
@@ -828,7 +835,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)gfs2_log_lock (sdp);if (sdp->sd_log_tr) { -gfs2_merge_trans (sdp->sd_log_tr, tr); +gfs2_merge_trans (sdp, tr); }else if (tr->tr_num_buf_new || tr->tr_num_databuf_new) {gfs2_assert_withdraw (sdp,test_bit (TR_ALLOCED , &tr->tr_flags)); sdp->sd_log_tr = tr;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 101/136 selftests/net: in timestamping, strncpy needs to preserve null byte
In reply to Greg Kroah-HartmanFrom: tannerlove <[email protected]>
[ Upstream commit 8027bc0307ce59759b90679fa5d8b22949586d20 ]
If user passed an interface option longer than 15 characters, then device.ifr_name and hwtstamp.ifr_name became non-null-terminated strings. The compiler warned about this:
timestamping.c:353:2: warning: ‘strncpy’ specified bound 16 equals \
destination size [-Wstringop-truncation]
353 | strncpy(device.ifr_name, interface, sizeof(device.ifr_name));
--- .../selftests/networking/timestamping/timestamping.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
tools/testing/selftests/networking/timestamping/timestamping.c +8 -2
@@ -332,10 +332,16 @@ int main(int argc, char **argv)int val;socklen_t len;struct timeval next; +size_t if_len;if (argc <2 )usage (0 ); interface = argv[1 ]; + if_len =strlen (interface); +if (if_len >=IFNAMSIZ ) { +printf ("interface name exceeds IFNAMSIZ\n" ); +exit (1 ); + }for (i =2 ; i < argc; i++) {if (!strcasecmp (argv[i],"SO_TIMESTAMP" ))
@@ -369,12 +375,12 @@ int main(int argc, char **argv)bail ("socket" );memset (&device,0 ,sizeof (device)); -strncpy (device.ifr_name, interface,sizeof (device.ifr_name)); +memcpy (device.ifr_name, interface, if_len +1 );if (ioctl (sock,SIOCGIFADDR , &device) <0 )bail ("getting interface IP address" );memset (&hwtstamp,0 ,sizeof (hwtstamp)); -strncpy (hwtstamp.ifr_name, interface,sizeof (hwtstamp.ifr_name)); +memcpy (hwtstamp.ifr_name, interface, if_len +1 ); hwtstamp.ifr_data = (void *)&hwconfig;memset (&hwconfig,0 ,sizeof (hwconfig)); hwconfig.tx_type =
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 102/136 drm/sun4i: hdmi ddc clk: Fix size of m divider
In reply to Greg Kroah-HartmanFrom: Jernej Skrabec <[email protected]>
[ Upstream commit 54e1e06bcf1cf6e7ac3f86daa5f7454add24b494 ]
m divider in DDC clock register is 4 bits wide. Fix that.
--- drivers/gpu/drm/sun4i/sun4i_hdmi.h | 2 +- drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/sun4i/sun4i_hdmi.h +1 -1
@@ -143,7 +143,7 @@#define SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE 3#define SUN4I_HDMI_DDC_CLK_REG 0x528 -#define SUN4I_HDMI_DDC_CLK_M (m) (((m) & 0x7) << 3) +#define SUN4I_HDMI_DDC_CLK_M (m) (((m) & 0xf) << 3)#define SUN4I_HDMI_DDC_CLK_N (n) ((n) & 0x7)#define SUN4I_HDMI_DDC_LINE_CTRL_REG 0x540
drivers/gpu/drm/sun4i/sun4i_hdmi_ddc_clk.c +1 -1
@@ -32,7 +32,7 @@ static unsigned long sun4i_ddc_calc_divider(unsigned long rate,unsigned long best_rate =0 ;u8 best_m =0 , best_n =0 , _m, _n; -for (_m =0 ; _m <8 ; _m++) { +for (_m =0 ; _m <16 ; _m++) {for (_n =0 ; _n <8 ; _n++) {unsigned long tmp_rate;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 103/136 scsi: acornscsi: Fix an error handling path in acornscsi_probe()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 42c76c9848e13dbe0538d7ae0147a269dfa859cb ]
'ret' is known to be 0 at this point. Explicitly return -ENOMEM if one of the 'ecardm_iomap()' calls fail.
--- drivers/scsi/arm/acornscsi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/arm/acornscsi.c +3 -1
@@ -2914,8 +2914,10 @@ static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) ashost->base =ecardm_iomap (ec,ECARD_RES_MEMC ,0 ,0 ); ashost->fast =ecardm_iomap (ec,ECARD_RES_IOCFAST ,0 ,0 ); -if (!ashost->base || !ashost->fast) +if (!ashost->base || !ashost->fast) { + ret = -ENOMEM ; goto out_put; + } host->irq = ec->irq; ashost->host = host;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 104/136 usb/xhci-plat: Set PM runtime as active on resume
In reply to Greg Kroah-HartmanFrom: Qais Yousef <[email protected]>
[ Upstream commit 79112cc3c29f4a8c73a21428fbcbcb0afb005e3e ]
Follow suit of ohci-platform.c and perform pm_runtime_set_active() on resume.
ohci-platform.c had a warning reported due to the missing pm_runtime_set_active() [1].
[1] https://lore.kernel.org/lkml/[email protected]/
--- drivers/usb/host/xhci-plat.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-plat.c +9 -1
@@ -381,7 +381,15 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)if (ret)return ret; -return xhci_resume (xhci,0 ); + ret =xhci_resume (xhci,0 ); +if (ret) +return ret; + +pm_runtime_disable (dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); + +return 0 ; }static int __maybe_unused xhci_plat_runtime_suspend (struct device *dev)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 105/136 usb/ehci-platform: Set PM runtime as active on resume
In reply to Greg Kroah-HartmanFrom: Qais Yousef <[email protected]>
[ Upstream commit 16bdc04cc98ab0c74392ceef2475ecc5e73fcf49 ]
Follow suit of ohci-platform.c and perform pm_runtime_set_active() on resume.
ohci-platform.c had a warning reported due to the missing pm_runtime_set_active() [1].
[1] https://lore.kernel.org/lkml/[email protected]/
--- drivers/usb/host/ehci-platform.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/host/ehci-platform.c +5 -0
@@ -390,6 +390,11 @@ static int ehci_platform_resume(struct device *dev) }ehci_resume (hcd, priv->reset_on_resume); + +pm_runtime_disable (dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); +return 0 ; }#endif /* CONFIG_PM_SLEEP */
Signature · 1 line
2.25.1
Re: [PATCH 4.14 105/136] usb/ehci-platform: Set PM runtime as active on resume
Hello everyone,
Quoted 33 lines · Greg Kroah-Hartman
From: Qais Yousef <[email protected]>
[ Upstream commit
16bdc04cc98ab0c74392ceef2475ecc5e73fcf49]Follow suit of
ohci-platform.cand performpm_runtime_set_active()on resume.
ohci-platform.chad a warning reported due to the missingpm_runtime_set_active()[1].[1] https://lore.kernel.org/lkml/[email protected]/
Acked-by Alan Stern <[email protected]>Signed-off-by Qais Yousef <[email protected]>CC Tony Prisk <[email protected]>CC Greg Kroah-Hartman <[email protected]>CC Mathias Nyman <[email protected]>CC Oliver Neukum <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/usb/host/ehci-platform.c | 5 +++++ 1 file changed, 5 insertions(+)drivers/usb/host/ehci-platform.c +0
-0
drivers/usb/host/ehci-platform.c static int ehci_platform_resume(struct device *dev) · line 398
Quoted 9 lines
drivers/usb/host/ehci-platform.c +5
-0@@ -390,6 +390,11 @@ static int ehci_platform_resume(struct device *dev) }ehci_resume (hcd, priv->reset_on_resume); + +pm_runtime_disable (dev); +pm_runtime_set_active (dev); +pm_runtime_enable (dev); +return 0 ;
After integrating v4.14.186 commit 5410d158ca2a50 ("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.
After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit 987351e1ea7772 ("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting 987351e1ea7772 in vanilla leads to a similar backtrace [2].
Questions:
- Backporting 987351e1ea7772 ("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
* baef809ea497a4 ("usb/ohci-platform: Fix a warning when hibernating")
* 9f33eff4958885 ("usb/xhci-plat: Set PM runtime as active on resume")
* 5410d158ca2a50 ("usb/ehci-platform: Set PM runtime as active on resume")
[1] https://elinux.org/R-Car/Boards/Salvator-X#Suspend-to-RAM
root@rcar-gen3:~# cat s2ram.sh modprobe i2c-dev echo 9 > /proc/sys/kernel/printk i2cset -f -y 7 0x30 0x20 0x0F echo 0 > /sys/module/suspend/parameters/pm_test_delay echo core > /sys/power/pm_test echo deep > /sys/power/mem_sleep echo 1 > /sys/power/pm_debug_messages echo 0 > /sys/power/pm_print_times echo mem > /sys/power/state; root@rcar-gen3:~# root@rcar-gen3:~# sh s2ram.sh [ 65.853020] PM: suspend entry (deep) [ 65.858395] PM: Syncing filesystems ... done. [ 65.895890] PM: Preparing system for sleep (deep) [ 65.906272] Freezing user space processes ... (elapsed 0.004 seconds) done. [ 65.918350] OOM killer disabled. [ 65.921827] Freezing remaining freezable tasks ... (elapsed 0.005 seconds) done. [ 65.935063] PM: Suspending system (deep) [ 66.094910] PM: suspend of devices complete after 143.807 msecs [ 66.101282] PM: suspend devices took 0.162 seconds [ 66.133020] PM: late suspend of devices complete after 26.225 msecs [ 66.166806] PM: noirq suspend of devices complete after 24.050 msecs [ 66.173518] Disabling non-boot CPUs ... [ 66.199539] CPU1: shutdown [ 66.202563] psci: CPU1 killed (polled 0 ms) [ 66.230911] CPU2: shutdown [ 66.233923] psci: CPU2 killed (polled 0 ms) [ 66.261940] CPU3: shutdown [ 66.265351] psci: CPU3 killed (polled 0 ms) [ 66.300596] CPU4: shutdown [ 66.303837] psci: CPU4 killed (polled 0 ms) [ 66.340455] NOHZ: local_softirq_pending 202 [ 66.346818] CPU5: shutdown [ 66.349811] psci: CPU5 killed (polled 0 ms) [ 66.388761] CPU6: shutdown [ 66.391732] psci: CPU6 killed (polled 0 ms) [ 66.442557] CPU7: shutdown [ 66.445659] psci: CPU7 killed (polled 0 ms) [ 66.452730] PM: suspend debug: Waiting for 0 second(s). [ 66.452730] PM: Timekeeping suspended for 0.005 seconds [ 66.452898] Enabling non-boot CPUs ... [ 66.470705] CPU1 is up [ 66.480825] CPU2 is up [ 66.491482] CPU3 is up [ 66.517818] CPU4 is up [ 66.537699] CPU5 is up [ 66.558622] CPU6 is up [ 66.580985] CPU7 is up [ 66.597724] PM: noirq resume of devices complete after 13.979 msecs [ 66.689793] PM: early resume of devices complete after 83.851 msecs [ 66.700577] Bad mode in Error handler detected on CPU3, code 0xbf000002 -- SError [ 66.700610] Bad mode in Error handler detected on CPU2, code 0xbf000002 -- SError [ 66.700687] Kernel panic - not syncing: bad mode [ 66.700709] CPU: 3 PID: 2689 Comm: kworker/u16:22 Tainted: G C 4.14.187-ltsi+ #17 [ 66.730293] Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (DT) [ 66.738028] Workqueue: events_unbound async_run_entry_fn [ 66.743598] Call trace: [ 66.746232] dump_backtrace+0x0/0x348 [ 66.750106] show_stack+0x24/0x30 [ 66.753618] dump_stack+0x11c/0x18c [ 66.757311] panic+0x2e4/0x5fc [ 66.760560] bad_el0_sync+0x0/0x210 [ 66.764375] el1_error_invalid+0x7c/0x9c [ 66.768528] rcar_gen3_phy_usb2_init+0xa8/0x228 [ 66.773283] phy_init+0xdc/0x15c [ 66.776701] ehci_platform_power_on+0x1f4/0x43c [ 66.781443] ehci_platform_resume+0x194/0x1d8 [ 66.786014] dpm_run_callback+0x754/0xe80 [ 66.790232] device_resume+0x194/0x3bc [ 66.794178] async_resume+0x30/0x64 [ 66.797855] async_run_entry_fn+0x194/0x4f0 [ 66.802244] process_one_work+0xfe4/0x1b58 [ 66.806544] worker_thread+0x73c/0xaf0 [ 66.810490] kthread+0x3fc/0x414 [ 66.813903] ret_from_fork+0x10/0x18 [ 66.817784] SMP: stopping secondary CPUs [ 67.843559] SMP: failed to stop secondary CPUs 2-3 [ 67.848616] Kernel Offset: disabled [ 67.852599] CPU features: 0x1002004 [ 67.856285] Memory Limit: none [ 67.859568] ---[ end Kernel panic - not syncing: bad mode ]---
[2] Same as [1], but on vanilla after reverting 987351e1ea7772 ("phy: core: Add consumer device link support")
root@rcar-gen3:~# sh s2ram.sh [ 23.028192] Filesystems sync: 0.000 seconds [ 23.033611] PM: Preparing system for sleep (deep) [ 23.040723] Freezing user space processes ... (elapsed 0.001 seconds) done. [ 23.050170] OOM killer disabled. [ 23.054796] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. [ 23.064901] PM: Suspending system (deep) [ 23.098442] PM: suspend of devices complete after 28.499 msecs [ 23.104324] PM: start suspend of devices complete after 35.478 msecs [ 23.110705] PM: suspend devices took 0.042 seconds [ 23.118196] PM: late suspend of devices complete after 2.673 msecs [ 23.126686] PM: noirq suspend of devices complete after 1.837 msecs [ 23.132982] Disabling non-boot CPUs ... [ 23.137756] CPU1: shutdown [ 23.140496] psci: CPU1 killed (polled 0 ms) [ 23.145860] CPU2: shutdown [ 23.148598] psci: CPU2 killed (polled 0 ms) [ 23.153920] CPU3: shutdown [ 23.156658] psci: CPU3 killed (polled 0 ms) [ 23.162406] CPU4: shutdown [ 23.165135] psci: CPU4 killed (polled 0 ms) [ 23.170701] CPU5: shutdown [ 23.173441] psci: CPU5 killed (polled 0 ms) [ 23.178930] CPU6: shutdown [ 23.181706] psci: CPU6 killed (polled 0 ms) [ 23.187070] CPU7: shutdown [ 23.189834] psci: CPU7 killed (polled 0 ms) [ 23.194490] PM: suspend debug: Waiting for 0 second(s). [ 23.194490] PM: Timekeeping suspended for 0.005 seconds [ 23.194515] Enabling non-boot CPUs ... [ 23.203786] Detected PIPT I-cache on CPU1 [ 23.203837] CPU1: Booted secondary processor 0x0000000001 [0x411fd073] [ 23.204566] CPU1 is up [ 23.217725] Detected PIPT I-cache on CPU2 [ 23.217756] CPU2: Booted secondary processor 0x0000000002 [0x411fd073] [ 23.218352] CPU2 is up [ 23.231469] Detected PIPT I-cache on CPU3 [ 23.231496] CPU3: Booted secondary processor 0x0000000003 [0x411fd073] [ 23.232098] CPU3 is up [ 23.245257] Detected VIPT I-cache on CPU4 [ 23.245315] CPU4: Booted secondary processor 0x0000000100 [0x410fd034] [ 23.246621] CPU4 is up [ 23.259744] Detected VIPT I-cache on CPU5 [ 23.259782] CPU5: Booted secondary processor 0x0000000101 [0x410fd034] [ 23.261039] CPU5 is up [ 23.274141] Detected VIPT I-cache on CPU6 [ 23.274180] CPU6: Booted secondary processor 0x0000000102 [0x410fd034] [ 23.275494] CPU6 is up [ 23.288598] Detected VIPT I-cache on CPU7 [ 23.288639] CPU7: Booted secondary processor 0x0000000103 [0x410fd034] [ 23.289996] CPU7 is up [ 23.304324] PM: noirq resume of devices complete after 1.369 msecs [ 23.315803] PM: early resume of devices complete after 4.991 msecs [ 23.322623] Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP [ 23.322680] SError Interrupt on CPU2, code 0xbf000002 -- SError [ 23.322682] CPU: 2 PID: 1032 Comm: kworker/u16:6 Not tainted 5.8.0-rc4-00075-g81e8773b8f41 #28 [ 23.322684] Hardware name: Renesas Salvator-X board based on r8a77951 (DT) [ 23.322686] Workqueue: events_unbound async_run_entry_fn [ 23.322688] pstate: 40000005 (nZcv daif -PAN -UAO BTYPE=--) [ 23.322690] pc : ehci_readl.isra.13+0x8/0x20 [ 23.322691] lr : ehci_resume+0x60/0x14c [ 23.322692] sp : ffff80001252bca0 [ 23.322693] x29: ffff80001252bca0 x28: 0000000000000000 [ 23.322696] x27: 0000000000000000 x26: 0000000000000000 [ 23.322698] x25: 0000000000000000 x24: 0000000000000010 [ 23.322701] x23: ffff800010d79000 x22: 0000000000000000 [ 23.322704] x21: ffff0006f917f324 x20: ffff0006f917f000 [ 23.322706] x19: ffff0006f917f250 x18: 000000000000000a [ 23.322709] x17: 0000000000000000 x16: 0000000000000000 [ 23.322712] x15: 0000000000000000 x14: 0000000000000000 [ 23.322714] x13: 0000000400000000 x12: 0000000000000001 [ 23.322717] x11: 0000000000000001 x10: 0000000000000a60 [ 23.322719] x9 : ffff80001252bab0 x8 : ffff0006f92045c0 [ 23.322722] x7 : ffff80001252bc70 x6 : 0000000000000000 [ 23.322724] x5 : ffff0006fa610848 x4 : 0000000000000000 [ 23.322727] x3 : 0000000000000000 x2 : 0000000000000001 [ 23.322730] x1 : ffff0006f917f138 x0 : 0000000000000000 [ 23.322733] Kernel panic - not syncing: Asynchronous SError Interrupt [ 23.460158] Modules linked in: [ 23.463225] CPU: 5 PID: 2116 Comm: kworker/u16:12 Not tainted 5.8.0-rc4-00075-g81e8773b8f41 #28 [ 23.471946] Hardware name: Renesas Salvator-X board based on r8a77951 (DT) [ 23.478844] Workqueue: events_unbound async_run_entry_fn [ 23.484172] pstate: 40000005 (nZcv daif -PAN -UAO BTYPE=--) [ 23.489760] pc : ehci_readl.isra.13+0x4/0x20 [ 23.494041] lr : ehci_resume+0x60/0x14c [ 23.497885] sp : ffff800012da3ca0 [ 23.501206] x29: ffff800012da3ca0 x28: 0000000000000000 [ 23.506532] x27: 0000000000000000 x26: 0000000000000000 [ 23.511858] x25: 0000000000000000 x24: 0000000000000010 [ 23.517184] x23: ffff800010d79000 x22: 0000000000000000 [ 23.522510] x21: ffff0006f9f4cb24 x20: ffff0006f9f4c800 [ 23.527835] x19: ffff0006f9f4ca50 x18: fffffe001bc4e708 [ 23.533162] x17: 0000000000000000 x16: 0000000000000000 [ 23.538487] x15: 0000000000000001 x14: 0000000000000000 [ 23.543814] x13: 0000000100000000 x12: 0000000000000001 [ 23.549139] x11: 0000000000000001 x10: 0000000000000a60 [ 23.554465] x9 : ffff800012da3ab0 x8 : ffff0006faeba840 [ 23.559791] x7 : ffff800012da3c70 x6 : 0000000000000000 [ 23.565117] x5 : ffff0006fa610c48 x4 : 0000000000000000 [ 23.570443] x3 : 0000000000000000 x2 : 0000000000000001 [ 23.575768] x1 : ffff0006f9f4c938 x0 : ffff800010f6d160 [ 23.581096] Call trace: [ 23.583549] ehci_readl.isra.13+0x4/0x20 [ 23.587484] ehci_platform_resume+0x48/0xb8 [ 23.591681] dpm_run_callback+0x68/0xdc [ 23.595527] device_resume+0xcc/0x180 [ 23.599199] async_resume+0x28/0x5c [ 23.602696] async_run_entry_fn+0x50/0x14c [ 23.606808] process_one_work+0x1dc/0x2b4 [ 23.610829] worker_thread+0x1d0/0x260 [ 23.614590] kthread+0xf0/0x100 [ 23.617743] ret_from_fork+0x10/0x30 [ 23.621331] Code: d65f03c0 52808000 17fffffd d503233f (b9400000) [ 23.627441] ---[ end trace f663646e2a9dfb92 ]--- [ 23.632072] Internal error: synchronous external abort: 96000210 [#2] PREEMPT SMP [ 23.639576] Modules linked in: [ 23.642642] CPU: 7 PID: 2112 Comm: kworker/u16:8 Tainted: G D 5.8.0-rc4-00075-g81e8773b8f41 #28 [ 23.652668] Hardware name: Renesas Salvator-X board based on r8a77951 (DT) [ 23.659563] Workqueue: events_unbound async_run_entry_fn [ 23.664890] pstate: 40000005 (nZcv daif -PAN -UAO BTYPE=--) [ 23.670477] pc : ehci_readl.isra.13+0x4/0x20 [ 23.674758] lr : ehci_resume+0x60/0x14c [ 23.678601] sp : ffff800012d83ca0 [ 23.681922] x29: ffff800012d83ca0 x28: 0000000000000000 [ 23.687249] x27: 0000000000000000 x26: 0000000000000000 [ 23.692574] x25: 0000000000000000 x24: 0000000000000010 [ 23.697900] x23: ffff800010d79000 x22: 0000000000000000 [ 23.703226] x21: ffff0006f9f4db24 x20: ffff0006f9f4d800 [ 23.708552] x19: ffff0006f9f4da50 x18: 000000000000000a [ 23.713878] x17: 0000000000000000 x16: 0000000000000000 [ 23.719203] x15: 000000000000000d x14: ffff80001103be18 [ 23.724529] x13: ffffffffffffffff x12: 0000000000000000 [ 23.729855] x11: 0000000000000000 x10: 0000000000000a60 [ 23.735181] x9 : ffff800012d83ab0 x8 : ffff0006faeb9980 [ 23.740507] x7 : ffff800012d83c70 x6 : 0000000000000000 [ 23.745833] x5 : ffff0006fa611048 x4 : 0000000000000000 [ 23.751159] x3 : 0000000000000000 x2 : 0000000000000001 [ 23.756484] x1 : ffff0006f9f4d938 x0 : ffff800010f8d160 [ 23.761810] Call trace: [ 23.764263] ehci_readl.isra.13+0x4/0x20 [ 23.768197] ehci_platform_resume+0x48/0xb8 [ 23.772391] dpm_run_callback+0x68/0xdc [ 23.776237] device_resume+0xcc/0x180 [ 23.779908] async_resume+0x28/0x5c [ 23.783406] async_run_entry_fn+0x50/0x14c [ 23.787513] process_one_work+0x1dc/0x2b4 [ 23.791534] worker_thread+0x1d0/0x260 [ 23.795292] kthread+0xf0/0x100 [ 23.798442] ret_from_fork+0x10/0x30 [ 23.802028] Code: d65f03c0 52808000 17fffffd d503233f (b9400000) [ 23.808137] ---[ end trace f663646e2a9dfb93 ]--- [ 23.812773] SMP: stopping secondary CPUs [ 23.812774] Kernel Offset: disabled [ 23.812775] CPU features: 0x040022,20006004 [ 23.812777] Memory Limit: none
Signature · 2 lines
Best regards, Eugeniu Rosca
Re: [PATCH 4.14 105/136] usb/ehci-platform: Set PM runtime as active on resume
Hi Eugeniu
Quoted 4 lines · Eugeniu Rosca
Hello everyone,
Cc linux-renesas-socCc linux-pm
[...]
Quoted 12 lines
After integrating v4.14.186 commit
5410d158ca2a50("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit987351e1ea7772("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting987351e1ea7772in vanilla leads to a similar backtrace [2].
Quoted 9 lines
Questions:
- Backporting987351e1ea7772("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
*baef809ea497a4("usb/ohci-platform: Fix a warning when hibernating")
*9f33eff4958885("usb/xhci-plat: Set PM runtime as active on resume")
*5410d158ca2a50("usb/ehci-platform: Set PM runtime as active on resume")
Thanks for investigating this.
Alan, Greg, do you have any ideas?
Let me know if there's anything I can help with.
Thanks
--
Qais Yousef
Sasha Levin
maintainerRe: [PATCH 4.14 105/136] usb/ehci-platform: Set PM runtime as active on resume
Quoted 32 lines · Qais Yousef
Hi Eugeniu
Quoted 4 lines · Eugeniu Rosca
Hello everyone,
Cc linux-renesas-socCc linux-pm[...]
Quoted 12 lines
After integrating v4.14.186 commit
5410d158ca2a50("usb/ehci-platform:
Set PM runtime as active on resume") into downstream v4.14.x, we started to consistently experience below panic [1] on every second s2ram of R-Car H3 Salvator-X Renesas reference board.After some investigations, we concluded the following:
- the issue does not exist in vanilla v5.8-rc4+
- [bisecting shows that] the panic on v4.14.186 is caused by the lack of v5.6-rc1 commit987351e1ea7772("phy: core: Add consumer device link support"). Getting evidence for that is easy. Reverting987351e1ea7772in vanilla leads to a similar backtrace [2].Quoted 9 lines
Questions:
- Backporting987351e1ea7772("phy: core: Add consumer device link support") to v4.14.187 looks challenging enough, so probably not worth it. Anybody to contradict this?
- Assuming no plans to backport the missing mainline commit to v4.14.x, should the following three v4.14.186 commits be reverted on v4.14.x?
*baef809ea497a4("usb/ohci-platform: Fix a warning when hibernating")
*9f33eff4958885("usb/xhci-plat: Set PM runtime as active on resume")
*5410d158ca2a50("usb/ehci-platform: Set PM runtime as active on resume")
Quoted 3 lines
Thanks for investigating this.
Alan, Greg, do you have any ideas?
I've reverted these 3 commits from 5.4 and earlier, thank you for investigating this issue.
Signature · 2 lines
Thanks, Sasha
Greg Kroah-Hartman
maintainerPATCH 106/136 perf report: Fix NULL pointer dereference in hists__fprintf_nr_sample_events()
In reply to Greg Kroah-HartmanFrom: Gaurav Singh <[email protected]>
[ Upstream commit 11b6e5482e178055ec1f2444b55f2518713809d1 ]
The 'evname' variable can be NULL, as it is checked a few lines back, check it before using.
--- tools/perf/builtin-report.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
tools/perf/builtin-report.c +1 -2
@@ -401,8 +401,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct reportif (evname !=NULL ) ret +=fprintf (fp," of event '%s'" , evname); -if (symbol_conf.show_ref_callgraph && -strstr (evname,"call-graph=no" )) { +if (symbol_conf.show_ref_callgraph && evname &&strstr (evname,"call-graph=no" )) { ret +=fprintf (fp,", show reference callgraph" ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 107/136 bcache: fix potential deadlock problem in btree_gc_coalesce
In reply to Greg Kroah-HartmanFrom: Zhiqiang Liu <[email protected]>
[ Upstream commit be23e837333a914df3f24bf0b32e87b0331ab8d1 ]
coccicheck reports:
drivers/md//bcache/btree.c:1538:1-7: preceding lock on line 1417
In btree_gc_coalesce func, if the coalescing process fails, we will goto to out_nocoalesce tag directly without releasing new_nodes[i]->write_lock. Then, it will cause a deadlock when trying to acquire new_nodes[i]-> write_lock for freeing new_nodes[i] before return.
btree_gc_coalesce func details as follows:
if alloc new_nodes[i] fails: goto out_nocoalesce; // obtain new_nodes[i]->write_lock mutex_lock(&new_nodes[i]->write_lock) // main coalescing process for (i = nodes - 1; i > 0; --i) [snipped] if coalescing process fails: // Here, directly goto out_nocoalesce // tag will cause a deadlock goto out_nocoalesce; [snipped] // release new_nodes[i]->write_lock mutex_unlock(&new_nodes[i]->write_lock) // coalesing succ, return return; out_nocoalesce: btree_node_free(new_nodes[i]) // free new_nodes[i] // obtain new_nodes[i]->write_lock mutex_lock(&new_nodes[i]->write_lock); // set flag for reuse clear_bit(BTREE_NODE_dirty, &ew_nodes[i]->flags); // release new_nodes[i]->write_lock mutex_unlock(&new_nodes[i]->write_lock);
To fix the problem, we add a new tag 'out_unlock_nocoalesce' for releasing new_nodes[i]->write_lock before out_nocoalesce tag. If coalescing process fails, we will go to out_unlock_nocoalesce tag for releasing new_nodes[i]->write_lock before free new_nodes[i] in out_nocoalesce tag.
(Coly Li helps to clean up commit log format.)
--- drivers/md/bcache/btree.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/md/bcache/btree.c +6 -2
@@ -1374,7 +1374,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,if (__set_blocks (n1, n1->keys + n2->keys,block_bytes (b->c)) >btree_blocks (new_nodes[i])) - goto out_nocoalesce; + goto out_unlock_nocoalesce; keys = n2->keys;/* Take the key of the node we're getting rid of */
@@ -1403,7 +1403,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,if (__bch_keylist_realloc (&keylist,bkey_u64s (&new_nodes[i]->key))) - goto out_nocoalesce; + goto out_unlock_nocoalesce;bch_btree_node_write (new_nodes[i], &cl);bch_keylist_add (&keylist, &new_nodes[i]->key);
@@ -1449,6 +1449,10 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,/* Invalidated our iterator */ return -EINTR ; +out_unlock_nocoalesce: +for (i =0 ; i < nodes; i++) +mutex_unlock (&new_nodes[i]->write_lock); + out_nocoalesce:closure_sync (&cl);bch_keylist_free (&keylist);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 108/136 block: Fix use-after-free in blkdev_get()
In reply to Greg Kroah-HartmanFrom: Jason Yan <[email protected]>
[ Upstream commit 2d3a8e2deddea6c89961c422ec0c5b851e648c14 ]
In blkdev_get() we call __blkdev_get() to do some internal jobs and if there is some errors in __blkdev_get(), the bdput() is called which means we have released the refcount of the bdev (actually the refcount of the bdev inode). This means we cannot access bdev after that point. But acctually bdev is still accessed in blkdev_get() after calling __blkdev_get(). This results in use-after-free if the refcount is the last one we released in __blkdev_get(). Let's take a look at the following scenerio:
CPU0 CPU1 CPU2blkdev_open blkdev_open Remove disk
bd_acquire
blkdev_get
__blkdev_get del_gendisk
bdev_unhash_inode
bd_acquire bdev_get_gendisk
bd_forget failed because of unhashed
bdput
bdput (the last one)
bdev_evict_inode
access bdev => use after free
[ 459.350216] BUG: KASAN: use-after-free in __lock_acquire+0x24c1/0x31b0
[ 459.351190] Read of size 8 at addr ffff88806c815a80 by task syz-executor.0/20132
[ 459.352347]
[ 459.352594] CPU: 0 PID: 20132 Comm: syz-executor.0 Not tainted 4.19.90 #2
[ 459.353628] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014
[ 459.354947] Call Trace:
[ 459.355337] dump_stack+0x111/0x19e
[ 459.355879] ? __lock_acquire+0x24c1/0x31b0
[ 459.356523] print_address_description+0x60/0x223
[ 459.357248] ? __lock_acquire+0x24c1/0x31b0
[ 459.357887] kasan_report.cold+0xae/0x2d8
[ 459.358503] __lock_acquire+0x24c1/0x31b0
[ 459.359120] ? _raw_spin_unlock_irq+0x24/0x40
[ 459.359784] ? lockdep_hardirqs_on+0x37b/0x580
[ 459.360465] ? _raw_spin_unlock_irq+0x24/0x40
[ 459.361123] ? finish_task_switch+0x125/0x600
[ 459.361812] ? finish_task_switch+0xee/0x600
[ 459.362471] ? mark_held_locks+0xf0/0xf0
[ 459.363108] ? __schedule+0x96f/0x21d0
[ 459.363716] lock_acquire+0x111/0x320
[ 459.364285] ? blkdev_get+0xce/0xbe0
[ 459.364846] ? blkdev_get+0xce/0xbe0
[ 459.365390] __mutex_lock+0xf9/0x12a0
[ 459.365948] ? blkdev_get+0xce/0xbe0
[ 459.366493] ? bdev_evict_inode+0x1f0/0x1f0
[ 459.367130] ? blkdev_get+0xce/0xbe0
[ 459.367678] ? destroy_inode+0xbc/0x110
[ 459.368261] ? mutex_trylock+0x1a0/0x1a0
[ 459.368867] ? __blkdev_get+0x3e6/0x1280
[ 459.369463] ? bdev_disk_changed+0x1d0/0x1d0
[ 459.370114] ? blkdev_get+0xce/0xbe0
[ 459.370656] blkdev_get+0xce/0xbe0
[ 459.371178] ? find_held_lock+0x2c/0x110
[ 459.371774] ? __blkdev_get+0x1280/0x1280
[ 459.372383] ? lock_downgrade+0x680/0x680
[ 459.373002] ? lock_acquire+0x111/0x320
[ 459.373587] ? bd_acquire+0x21/0x2c0
[ 459.374134] ? do_raw_spin_unlock+0x4f/0x250
[ 459.374780] blkdev_open+0x202/0x290
[ 459.375325] do_dentry_open+0x49e/0x1050
[ 459.375924] ? blkdev_get_by_dev+0x70/0x70
[ 459.376543] ? __x64_sys_fchdir+0x1f0/0x1f0
[ 459.377192] ? inode_permission+0xbe/0x3a0
[ 459.377818] path_openat+0x148c/0x3f50
[ 459.378392] ? kmem_cache_alloc+0xd5/0x280
[ 459.379016] ? entry_SYSCALL_64_after_hwframe+0x49/0xbe
[ 459.379802] ? path_lookupat.isra.0+0x900/0x900
[ 459.380489] ? __lock_is_held+0xad/0x140
[ 459.381093] do_filp_open+0x1a1/0x280
[ 459.381654] ? may_open_dev+0xf0/0xf0
[ 459.382214] ? find_held_lock+0x2c/0x110
[ 459.382816] ? lock_downgrade+0x680/0x680
[ 459.383425] ? __lock_is_held+0xad/0x140
[ 459.384024] ? do_raw_spin_unlock+0x4f/0x250
[ 459.384668] ? _raw_spin_unlock+0x1f/0x30
[ 459.385280] ? __alloc_fd+0x448/0x560
[ 459.385841] do_sys_open+0x3c3/0x500
[ 459.386386] ? filp_open+0x70/0x70
[ 459.386911] ? trace_hardirqs_on_thunk+0x1a/0x1c
[ 459.387610] ? trace_hardirqs_off_caller+0x55/0x1c0
[ 459.388342] ? do_syscall_64+0x1a/0x520
[ 459.388930] do_syscall_64+0xc3/0x520
[ 459.389490] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[ 459.390248] RIP: 0033:0x416211
[ 459.390720] Code: 75 14 b8 02 00 00 00 0f 05 48 3d 01 f0 ff ff 0f 83
04 19 00 00 c3 48 83 ec 08 e8 0a fa ff ff 48 89 04 24 b8 02 00 00 00 0f
05 <48> 8b 3c 24 48 89 c2 e8 53 fa ff ff 48 89 d0 48 83 c4 08 48 3d
01
[ 459.393483] RSP: 002b:00007fe45dfe9a60 EFLAGS: 00000293 ORIG_RAX: 0000000000000002
[ 459.394610] RAX: ffffffffffffffda RBX: 00007fe45dfea6d4 RCX: 0000000000416211
[ 459.395678] RDX: 00007fe45dfe9b0a RSI: 0000000000000002 RDI: 00007fe45dfe9b00
[ 459.396758] RBP: 000000000076bf20 R08: 0000000000000000 R09: 000000000000000a
[ 459.397930] R10: 0000000000000075 R11: 0000000000000293 R12: 00000000ffffffff
[ 459.399022] R13: 0000000000000bd9 R14: 00000000004cdb80 R15: 000000000076bf2c
[ 459.400168]
[ 459.400430] Allocated by task 20132:
[ 459.401038] kasan_kmalloc+0xbf/0xe0
[ 459.401652] kmem_cache_alloc+0xd5/0x280
[ 459.402330] bdev_alloc_inode+0x18/0x40
[ 459.402970] alloc_inode+0x5f/0x180
[ 459.403510] iget5_locked+0x57/0xd0
[ 459.404095] bdget+0x94/0x4e0
[ 459.404607] bd_acquire+0xfa/0x2c0
[ 459.405113] blkdev_open+0x110/0x290
[ 459.405702] do_dentry_open+0x49e/0x1050
[ 459.406340] path_openat+0x148c/0x3f50
[ 459.406926] do_filp_open+0x1a1/0x280
[ 459.407471] do_sys_open+0x3c3/0x500
[ 459.408010] do_syscall_64+0xc3/0x520
[ 459.408572] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[ 459.409415]
[ 459.409679] Freed by task 1262:
[ 459.410212] __kasan_slab_free+0x129/0x170
[ 459.410919] kmem_cache_free+0xb2/0x2a0
[ 459.411564] rcu_process_callbacks+0xbb2/0x2320
[ 459.412318] __do_softirq+0x225/0x8acFix this by delaying bdput() to the end of blkdev_get() which means we have finished accessing bdev.
--- fs/block_dev.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/block_dev.c +7 -5
@@ -1439,10 +1439,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)*/ if (!for_part) { ret =devcgroup_inode_permission (bdev->bd_inode, perm); -if (ret !=0 ) { -bdput (bdev); +if (ret !=0 )return ret; - } } restart:
@@ -1515,8 +1513,10 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part) goto out_clear;BUG_ON (for_part); ret =__blkdev_get (whole, mode,1 ); -if (ret) +if (ret) { +bdput (whole); goto out_clear; + } bdev->bd_contains = whole; bdev->bd_part =disk_get_part (disk, partno); if (!(disk->flags & GENHD_FL_UP) ||
@@ -1570,7 +1570,6 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)put_disk (disk);module_put (owner); out: -bdput (bdev);return ret; }
@@ -1656,6 +1655,9 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)bdput (whole); } +if (res) +bdput (bdev); +return res; }EXPORT_SYMBOL (blkdev_get);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 109/136 arm64: hw_breakpoint: Dont invoke overflow handler on uaccess watchpoints
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
[ Upstream commit 24ebec25fb270100e252b19c288e21bd7d8cc7f7 ]
Unprivileged memory accesses generated by the so-called "translated" instructions (e.g. STTR) at EL1 can cause EL0 watchpoints to fire unexpectedly if kernel debugging is enabled. In such cases, the hw_breakpoint logic will invoke the user overflow handler which will typically raise a SIGTRAP back to the current task. This is futile when returning back to the kernel because (a) the signal won't have been delivered and (b) userspace can't handle the thing anyway.
Avoid invoking the user overflow handler for watchpoints triggered by kernel uaccess routines, and instead single-step over the faulting instruction as we would if no overflow handler had been installed.
(Fixes tag identifies the introduction of unprivileged memory accesses,
which exposed this latent bug in the hw_breakpoint code)
--- arch/arm64/kernel/hw_breakpoint.c | 44 ++++++++++++++++++------------- 1 file changed, 26 insertions(+), 18 deletions(-)
arch/arm64/kernel/hw_breakpoint.c +26 -18
@@ -738,6 +738,27 @@ static u64 get_distance_from_watchpoint(unsigned long addr, u64 val,return 0 ; } +static int watchpoint_report (struct perf_event *wp,unsigned long addr, +struct pt_regs *regs) +{ +int step =is_default_overflow_handler (wp); +struct arch_hw_breakpoint *info =counter_arch_bp (wp); + + info->trigger = addr; + +/* +* If we triggered a user watchpoint from a uaccess routine, then +* handle the stepping ourselves since userspace really can't help +* us with this. +*/ +if (!user_mode (regs) && info->ctrl.privilege ==AARCH64_BREAKPOINT_EL0 ) + step =1 ; +else +perf_bp_event (wp, regs); + +return step; +} +static int watchpoint_handler (unsigned long addr,unsigned int esr,struct pt_regs *regs) {
@@ -747,7 +768,6 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,u64 val;struct perf_event *wp, **slots;struct debug_info *debug_info; -struct arch_hw_breakpoint *info;struct arch_hw_breakpoint_ctrl ctrl; slots =this_cpu_ptr (wp_on_reg);
@@ -785,25 +805,13 @@ static int watchpoint_handler(unsigned long addr, unsigned int esr,if (dist !=0 )continue ; - info =counter_arch_bp (wp); - info->trigger = addr; -perf_bp_event (wp, regs); - -/* Do we need to handle the stepping? */ -if (is_default_overflow_handler (wp)) - step =1 ; + step =watchpoint_report (wp, addr, regs); } -if (min_dist >0 && min_dist !=-1 ) { -/* No exact match found. */ - wp = slots[closest_match]; - info =counter_arch_bp (wp); - info->trigger = addr; -perf_bp_event (wp, regs); -/* Do we need to handle the stepping? */ -if (is_default_overflow_handler (wp)) - step =1 ; - } +/* No exact match found? */ +if (min_dist >0 && min_dist !=-1 ) + step =watchpoint_report (slots[closest_match], addr, regs); +rcu_read_unlock ();if (!step)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 110/136 libata: Use per port sync for detach
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit b5292111de9bb70cba3489075970889765302136 ]
Commit 130f4caf145c ("libata: Ensure ata_port probe has completed before detach") may cause system freeze during suspend.
Using async_synchronize_full() in PM callbacks is wrong, since async callbacks that are already scheduled may wait for not-yet-scheduled callbacks, causes a circular dependency.
Instead of using big hammer like async_synchronize_full(), use async cookie to make sure port probe are synced, without affecting other scheduled PM callbacks.
--- drivers/ata/libata-core.c | 11 +++++------ include/linux/libata.h | 3 +++ 2 files changed, 8 insertions(+), 6 deletions(-)
drivers/ata/libata-core.c +5 -6
@@ -57,7 +57,6 @@#include <linux/workqueue.h> #include <linux/scatterlist.h> #include <linux/io.h> -#include <linux/async.h> #include <linux/log2.h> #include <linux/slab.h> #include <linux/glob.h>
@@ -6536,7 +6535,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)/* perform each probe asynchronously */ for (i =0 ; i < host->n_ports; i++) {struct ata_port *ap = host->ports[i]; -async_schedule (async_port_probe, ap); + ap->cookie =async_schedule (async_port_probe, ap); }return 0 ;
@@ -6676,11 +6675,11 @@ void ata_host_detach(struct ata_host *host) {int i; -/* Ensure ata_port probe has completed */ -async_synchronize_full (); - -for (i =0 ; i < host->n_ports; i++) +for (i =0 ; i < host->n_ports; i++) { +/* Ensure ata_port probe has completed */ +async_synchronize_cookie (host->ports[i]->cookie +1 );ata_port_detach (host->ports[i]); + }/* the host is dead now, dissociate ACPI */ ata_acpi_dissociate (host);
include/linux/libata.h +3 -0
@@ -38,6 +38,7 @@#include <linux/acpi.h> #include <linux/cdrom.h> #include <linux/sched.h> +#include <linux/async.h> /* * Define if arch has non-standard setup. This is a _PCI_ standard
@@ -884,6 +885,8 @@ struct ata_port {struct timer_list fastdrain_timer;unsigned long fastdrain_cnt; +async_cookie_t cookie; +int em_message_type;void *private_data;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 111/136 drm: encoder_slave: fix refcouting error for modules
In reply to Greg Kroah-HartmanFrom: Wolfram Sang <[email protected]>
[ Upstream commit f78d4032de60f50fd4afaa0fb68ea03b985f820a ]
module_put() balances try_module_get(), not request_module(). Fix the error path to match that.
--- drivers/gpu/drm/drm_encoder_slave.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_encoder_slave.c +3 -2
@@ -84,7 +84,7 @@ int drm_i2c_encoder_init(struct drm_device *dev, err = encoder_drv->encoder_init (client, dev, encoder);if (err) - goto fail_unregister; + goto fail_module_put;if (info->platform_data) encoder->slave_funcs->set_config(&encoder->base,
@@ -92,9 +92,10 @@ int drm_i2c_encoder_init(struct drm_device *dev,return 0 ; +fail_module_put: +module_put (module); fail_unregister:i2c_unregister_device (client); -module_put (module); fail:return err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 112/136 drm/dp_mst: Reformat drm_dp_check_act_status() a bit
In reply to Greg Kroah-HartmanFrom: Lyude Paul <[email protected]>
commit a5cb5fa6c3a5c2cf492db667b8670ee7b044b79f upstream.
Just add a bit more line wrapping, get rid of some extraneous whitespace, remove an unneeded goto label, and move around some variable declarations. No functional changes here.
--- drivers/gpu/drm/drm_dp_mst_topology.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/gpu/drm/drm_dp_mst_topology.c +10 -12
@@ -2760,33 +2760,31 @@ fail:*/ int drm_dp_check_act_status (struct drm_dp_mst_topology_mgr *mgr) { +int count =0 , ret;u8 status; -int ret; -int count =0 ;do { - ret =drm_dp_dpcd_readb (mgr->aux,DP_PAYLOAD_TABLE_UPDATE_STATUS , &status); - + ret =drm_dp_dpcd_readb (mgr->aux, +DP_PAYLOAD_TABLE_UPDATE_STATUS , + &status);if (ret <0 ) { -DRM_DEBUG_KMS ("failed to read payload table status %d\n" , ret); - goto fail; +DRM_DEBUG_KMS ("failed to read payload table status %d\n" , + ret); +return ret; }if (status &DP_PAYLOAD_ACT_HANDLED )break ; count++;udelay (100 ); - }while (count <30 );if (!(status &DP_PAYLOAD_ACT_HANDLED )) { -DRM_DEBUG_KMS ("failed to get ACT bit %d after %d retries\n" , status, count); - ret = -EINVAL ; - goto fail; +DRM_DEBUG_KMS ("failed to get ACT bit %d after %d retries\n" , + status, count); +return -EINVAL ; }return 0 ; -fail: -return ret; }EXPORT_SYMBOL (drm_dp_check_act_status);
Greg Kroah-Hartman
maintainerPATCH 113/136 drm/qxl: Use correct notify port address when creating cursor ring
In reply to Greg Kroah-HartmanFrom: Huacai Chen <[email protected]>
commit 80e5f89da3ab949fbbf1cae01dfaea29f5483a75 upstream.
The command ring and cursor ring use different notify port addresses
definition: QXL_IO_NOTIFY_CMD and QXL_IO_NOTIFY_CURSOR. However, in qxl_device_init() we use QXL_IO_NOTIFY_CMD to create both command ring and cursor ring. This doesn't cause any problems now, because QEMU's behaviors on QXL_IO_NOTIFY_CMD and QXL_IO_NOTIFY_CURSOR are the same. However, QEMU's behavior may be change in future, so let's fix it.
P.S.: In the X.org QXL driver, the notify port address of cursor ring
is correct.
--- drivers/gpu/drm/qxl/qxl_kms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/qxl/qxl_kms.c +1 -1
@@ -181,7 +181,7 @@ int qxl_device_init(struct qxl_device *q &(qdev->ram_header->cursor_ring_hdr),sizeof (struct qxl_command ),QXL_CURSOR_RING_SIZE , - qdev->io_base +QXL_IO_NOTIFY_CMD , + qdev->io_base +QXL_IO_NOTIFY_CURSOR , false, &qdev->cursor_event);
Greg Kroah-Hartman
maintainerPATCH 114/136 selinux: fix double free
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit 65de50969a77509452ae590e9449b70a22b923bb upstream.
Clang's static analysis tool reports these double free memory errors.
security/selinux/ss/services.c:2987:4: warning: Attempt to free released memory [unix.Malloc]
kfree(bnames[i]);
^~~~~~~~~~~~~~~~
security/selinux/ss/services.c:2990:2: warning: Attempt to free released memory [unix.Malloc]
kfree(bvalues);
^~~~~~~~~~~~~~So improve the security_get_bools error handling by freeing these variables and setting their return pointers to NULL and the return len to 0
--- security/selinux/ss/services.c | 4 ++++ 1 file changed, 4 insertions(+)
security/selinux/ss/services.c +4 -0
@@ -2736,8 +2736,12 @@ err:if (*names) {for (i =0 ; i < *len; i++)kfree ((*names)[i]); +kfree (*names); }kfree (*values); + *len =0 ; + *names =NULL ; + *values =NULL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 115/136 ext4: fix partial cluster initialization when splitting extent
In reply to Greg Kroah-HartmanFrom: Jeffle Xu <[email protected]>
[ Upstream commit cfb3c85a600c6aa25a2581b3c1c4db3460f14e46 ]
Fix the bug when calculating the physical block number of the first block in the split extent.
This bug will cause xfstests shared/298 failure on ext4 with bigalloc enabled occasionally. Ext4 error messages indicate that previously freed blocks are being freed again, and the following fsck will fail due to the inconsistency of block bitmap and bg descriptor.
The following is an example case:
1. First, Initialize a ext4 filesystem with cluster size '16K', block size '4K', in which case, one cluster contains four blocks.
2. Create one file (e.g., xxx.img) on this ext4 filesystem. Now the extent tree of this file is like:
...
36864:[0]4:220160
36868:[0]14332:145408
51200:[0]2:231424
...
3. Then execute PUNCH_HOLE fallocate on this file. The hole range is like:
..ext4_ext_remove_space: dev 254,16 ino 12 since 49506 end 49506 depth 1ext4_ext_remove_space: dev 254,16 ino 12 since 49544 end 49546 depth 1ext4_ext_remove_space: dev 254,16 ino 12 since 49605 end 49607 depth 1
...
4. Then the extent tree of this file after punching is like
...
49507:[0]37:158047
49547:[0]58:158087
...
5. Detailed procedure of punching hole [49544, 49546]
5.1. The block address space:
``` lblk ~49505 49506 49507~49543 49544~49546 49547~ ---------+------+-------------+----------------+-------- extent | hole | extent | hole | extent ---------+------+-------------+----------------+-------- pblk ~158045 158046 158047~158083 158084~158086 158087~ ```
5.2. The detailed layout of cluster 39521:
``` cluster 39521 <-------------------------------> hole extent <----------------------><-------- lblk 49544 49545 49546 49547 +-------+-------+-------+-------+ | | | | | +-------+-------+-------+-------+ pblk 158084 1580845 158086 158087 ```
5.3. The ftrace output when punching hole [49544, 49546]:
- ext4_ext_remove_space (start 49544, end 49546)
- ext4_ext_rm_leaf (start 49544, end 49546, last_extent [49507(158047), 40], partial [pclu 39522 lblk 0 state 2])
- ext4_remove_blocks (extent [49507(158047), 40], from 49544 to 49546, partial [pclu 39522 lblk 0 state 2]
- ext4_free_blocks: (block 158084 count 4)
- ext4_mballoc_free (extent 1/6753/1)
5.4. Ext4 error message in dmesg:
EXT4-fs error (device vdb): mb_free_blocks:1457: group 1, block 158084:freeing already freed block (bit 6753); block bitmap corrupt. EXT4-fs error (device vdb): ext4_mb_generate_buddy:747: group 1, block bitmap and bg descriptor inconsistent: 19550 vs 19551 free clusters
In this case, the whole cluster 39521 is freed mistakenly when freeing pblock 158084~158086 (i.e., the first three blocks of this cluster), although pblock 158087 (the last remaining block of this cluster) has not been freed yet.
The root cause of this isuue is that, the pclu of the partial cluster is calculated mistakenly in ext4_ext_remove_space(). The correct partial_cluster.pclu (i.e., the cluster number of the first block in the next extent, that is, lblock 49597 (pblock 158086)) should be 39521 rather than 39522.
--- fs/ext4/extents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/extents.c +1 -1
@@ -2917,7 +2917,7 @@ int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,* in use to avoid freeing it when removing blocks. */ if (sbi->s_cluster_ratio >1 ) { - pblk =ext4_ext_pblock (ex) + end - ee_block +2 ; + pblk =ext4_ext_pblock (ex) + end - ee_block +1 ; partial_cluster = -(long long )EXT4_B2C (sbi, pblk); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 116/136 drm/dp_mst: Increase ACT retry timeout to 3s
In reply to Greg Kroah-HartmanFrom: Lyude Paul <[email protected]>
[ Upstream commit 873a95e0d59ac06901ae261dda0b7165ffd002b8 ]
Currently we only poll for an ACT up to 30 times, with a busy-wait delay of 100µs between each attempt - giving us a timeout of 2900µs. While this might seem sensible, it would appear that in certain scenarios it can take dramatically longer then that for us to receive an ACT. On one of the EVGA MST hubs that I have available, I observed said hub sometimes taking longer then a second before signalling the ACT. These delays mostly seem to occur when previous sideband messages we've sent are NAKd by the hub, however it wouldn't be particularly surprising if it's possible to reproduce times like this simply by introducing branch devices with large LCTs since payload allocations have to take effect on every downstream device up to the payload's target.
So, instead of just retrying 30 times we poll for the ACT for up to 3ms, and additionally use usleep_range() to avoid a very long and rude busy-wait. Note that the previous retry count of 30 appears to have been arbitrarily chosen, as I can't find any mention of a recommended timeout or retry count for ACTs in the DisplayPort 2.0 specification. This also goes for the range we were previously using for udelay(), although I suspect that was just copied from the recommended delay for link training on SST devices.
Changes since v1:
* Use readx_poll_timeout() instead of open-coding timeout loop - Sean Paul
Changes since v2:
* Increase poll interval to 200us - Sean Paul
* Print status in hex when we timeout waiting for ACT - Sean Paul
--- drivers/gpu/drm/drm_dp_mst_topology.c | 54 ++++++++++++++++----------- 1 file changed, 32 insertions(+), 22 deletions(-)
drivers/gpu/drm/drm_dp_mst_topology.c +32 -22
@@ -29,6 +29,7 @@#include <linux/i2c.h> #include <drm/drm_dp_mst_helper.h> #include <drm/drmP.h> +#include <linux/iopoll.h> #include <drm/drm_fixed.h> #include <drm/drm_atomic.h>
@@ -2751,6 +2752,17 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,return ret; } +static int do_get_act_status (struct drm_dp_aux *aux) +{ +int ret; +u8 status; + + ret =drm_dp_dpcd_readb (aux,DP_PAYLOAD_TABLE_UPDATE_STATUS , &status); +if (ret <0 ) +return ret; + +return status; +}/** * drm_dp_check_act_status() - Check ACT handled status.
@@ -2760,30 +2772,28 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,*/ int drm_dp_check_act_status (struct drm_dp_mst_topology_mgr *mgr) { -int count =0 , ret; -u8 status; - -do { - ret =drm_dp_dpcd_readb (mgr->aux, -DP_PAYLOAD_TABLE_UPDATE_STATUS , - &status); -if (ret <0 ) { -DRM_DEBUG_KMS ("failed to read payload table status %d\n" , - ret); -return ret; - } - -if (status &DP_PAYLOAD_ACT_HANDLED ) -break ; - count++; -udelay (100 ); - }while (count <30 ); - -if (!(status &DP_PAYLOAD_ACT_HANDLED )) { -DRM_DEBUG_KMS ("failed to get ACT bit %d after %d retries\n" , - status, count); +/* +* There doesn't seem to be any recommended retry count or timeout in +* the MST specification. Since some hubs have been observed to take +* over 1 second to update their payload allocations under certain +* conditions, we use a rather large timeout value. +*/ +const int timeout_ms =3000 ; +int ret, status; + + ret =readx_poll_timeout (do_get_act_status, mgr->aux, status, + status &DP_PAYLOAD_ACT_HANDLED || status <0 , +200 , timeout_ms *USEC_PER_MSEC ); +if (ret <0 && status >=0 ) { +DRM_DEBUG_KMS ("Failed to get ACT after %dms, last status: %02x\n" , + timeout_ms, status);return -EINVAL ; + }else if (status <0 ) { +DRM_DEBUG_KMS ("Failed to read payload table status: %d\n" , + status); +return status; } +return 0 ; }EXPORT_SYMBOL (drm_dp_check_act_status);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 117/136 x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit bc310baf2ba381c648983c7f4748327f17324562 upstream.
The final build stage of the x86 kernel captures some symbol addresses from the decompressor binary and copies them into zoffset.h. It uses sed with a regular expression that matches the address, symbol type and symbol name, and mangles the captured addresses and the names of symbols of interest into #define directives that are added to zoffset.h
The symbol type is indicated by a single letter, which we match
strictly: only letters in the set 'ABCDGRSTVW' are matched, even though the actual symbol type is relevant and therefore ignored.
Commit bc7c9d620 ("efi/libstub/x86: Force 'hidden' visibility for extern declarations") made a change to the way external symbol references are classified, resulting in 'startup_32' now being emitted as a hidden symbol. This prevents the use of GOT entries to refer to this symbol via its absolute address, which recent toolchains (including Clang based ones) already avoid by default, making this change a no-op in the majority of cases.
However, as it turns out, the LLVM linker classifies such hidden symbols as symbols with static linkage in fully linked ELF binaries, causing tools such as NM to output a lowercase 't' rather than an upper case 'T' for the type of such symbols. Since our sed expression only matches upper case letters for the symbol type, the line describing startup_32 is disregarded, resulting in a build error like the following
arch/x86/boot/header.S:568:18: error: symbol 'ZO_startup_32' can not be
undefined in a subtraction expression
init_size: .long (0x00000000008fd000 - ZO_startup_32 +
(((0x0000000001f6361c + ((0x0000000001f6361c >> 8) + 65536)
- 0x00000000008c32e5) + 4095) & ~4095)) # kernel initialization size
Given that we are only interested in the value of the symbol, let's match any character in the set 'a-zA-Z' instead.
--- arch/x86/boot/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/boot/Makefile +1 -1
@@ -87,7 +87,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 118/136 block: nr_sects_write(): Disable preemption on seqcount write
In reply to Greg Kroah-HartmanFrom: Ahmed S. Darwish <[email protected]>
[ Upstream commit 15b81ce5abdc4b502aa31dff2d415b79d2349d2f ]
For optimized block readers not holding a mutex, the "number of sectors" 64-bit value is protected from tearing on 32-bit architectures by a sequence counter.
Disable preemption before entering that sequence counter's write side critical section. Otherwise, the read side can preempt the write side section and spin for the entire scheduler tick. If the reader belongs to a real-time scheduling class, it can spin forever and the kernel will livelock.
--- include/linux/genhd.h | 2 ++ 1 file changed, 2 insertions(+)
include/linux/genhd.h +2 -0
@@ -693,9 +693,11 @@ static inline sector_t part_nr_sects_read(struct hd_struct *part)static inline void part_nr_sects_write (struct hd_struct *part,sector_t size) {#if BITS_PER_LONG ==32 && defined(CONFIG_LBDAF ) && defined(CONFIG_SMP ) +preempt_disable ();write_seqcount_begin (&part->nr_sects_seq); part->nr_sects = size;write_seqcount_end (&part->nr_sects_seq); +preempt_enable ();#elif BITS_PER_LONG ==32 && defined(CONFIG_LBDAF ) && defined(CONFIG_PREEMPT )preempt_disable (); part->nr_sects = size;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 119/136 mtd: rawnand: Pass a nand_chip object to nand_release()
In reply to Greg Kroah-HartmanFrom: Boris Brezillon <[email protected]>
[ Upstream commit 59ac276f22270fb2094910f9a734c17f41c25e70 ]
Let's make the raw NAND API consistent by patching all helpers to take a nand_chip object instead of an mtd_info one.
Now is nand_release()'s turn.
--- Documentation/driver-api/mtdnand.rst | 2 +- drivers/mtd/nand/ams-delta.c | 2 +- drivers/mtd/nand/au1550nd.c | 2 +- drivers/mtd/nand/bcm47xxnflash/main.c | 2 +- drivers/mtd/nand/brcmnand/brcmnand.c | 2 +- drivers/mtd/nand/cafe_nand.c | 2 +- drivers/mtd/nand/cmx270_nand.c | 2 +- drivers/mtd/nand/cs553x_nand.c | 2 +- drivers/mtd/nand/davinci_nand.c | 2 +- drivers/mtd/nand/denali.c | 4 +--- drivers/mtd/nand/diskonchip.c | 4 ++-- drivers/mtd/nand/docg4.c | 4 ++-- drivers/mtd/nand/fsl_elbc_nand.c | 2 +- drivers/mtd/nand/fsl_ifc_nand.c | 2 +- drivers/mtd/nand/fsl_upm.c | 2 +- drivers/mtd/nand/fsmc_nand.c | 2 +- drivers/mtd/nand/gpio.c | 2 +- drivers/mtd/nand/gpmi-nand/gpmi-nand.c | 2 +- drivers/mtd/nand/hisi504_nand.c | 5 ++--- drivers/mtd/nand/jz4740_nand.c | 2 +- drivers/mtd/nand/jz4780_nand.c | 4 ++-- drivers/mtd/nand/lpc32xx_mlc.c | 3 +-- drivers/mtd/nand/lpc32xx_slc.c | 3 +-- drivers/mtd/nand/mpc5121_nfc.c | 2 +- drivers/mtd/nand/mtk_nand.c | 4 ++-- drivers/mtd/nand/mxc_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 8 ++++---- drivers/mtd/nand/nandsim.c | 4 ++-- drivers/mtd/nand/ndfc.c | 2 +- drivers/mtd/nand/nuc900_nand.c | 2 +- drivers/mtd/nand/omap2.c | 2 +- drivers/mtd/nand/orion_nand.c | 5 ++--- drivers/mtd/nand/oxnas_nand.c | 4 ++-- drivers/mtd/nand/pasemi_nand.c | 2 +- drivers/mtd/nand/plat_nand.c | 4 ++-- drivers/mtd/nand/qcom_nandc.c | 2 +- drivers/mtd/nand/r852.c | 4 ++-- drivers/mtd/nand/s3c2410.c | 2 +- drivers/mtd/nand/sh_flctl.c | 2 +- drivers/mtd/nand/sharpsl.c | 4 ++-- drivers/mtd/nand/socrates_nand.c | 5 ++--- drivers/mtd/nand/sunxi_nand.c | 4 ++-- drivers/mtd/nand/tango_nand.c | 2 +- drivers/mtd/nand/tmio_nand.c | 4 ++-- drivers/mtd/nand/txx9ndfmc.c | 2 +- drivers/mtd/nand/vf610_nfc.c | 2 +- drivers/mtd/nand/xway_nand.c | 4 ++-- include/linux/mtd/rawnand.h | 6 ++---- 48 files changed, 67 insertions(+), 76 deletions(-)
Documentation/driver-api/mtdnand.rst +1 -1
@@ -277,7 +277,7 @@ unregisters the partitions in the MTD layer. static void __exit board_cleanup (void) { /* Release resources, unregister device */ - nand_release (board_mtd); + nand_release (mtd_to_nand(board_mtd)); /* unmap physical address */ iounmap(baseaddr);
drivers/mtd/nand/ams-delta.c +1 -1
@@ -263,7 +263,7 @@ static int ams_delta_cleanup(struct platform_device *pdev)void __iomem *io_base =platform_get_drvdata (pdev);/* Release resources, unregister device */ -nand_release (ams_delta_mtd); +nand_release (mtd_to_nand (ams_delta_mtd));gpio_free_array (_mandatory_gpio,ARRAY_SIZE (_mandatory_gpio));gpio_free (AMS_DELTA_GPIO_PIN_NAND_RB );
drivers/mtd/nand/au1550nd.c +1 -1
@@ -496,7 +496,7 @@ static int au1550nd_remove(struct platform_device *pdev)struct au1550nd_ctx *ctx =platform_get_drvdata (pdev);struct resource *r =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -nand_release (nand_to_mtd (&ctx->chip)); +nand_release (&ctx->chip);iounmap (ctx->base);release_mem_region (r->start,0x1000 );kfree (ctx);
drivers/mtd/nand/bcm47xxnflash/main.c +1 -1
@@ -65,7 +65,7 @@ static int bcm47xxnflash_remove(struct platform_device *pdev) {struct bcm47xxnflash *nflash =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&nflash->nand_chip)); +nand_release (&nflash->nand_chip);return 0 ; }
drivers/mtd/nand/brcmnand/brcmnand.c +1 -1
@@ -2597,7 +2597,7 @@ int brcmnand_remove(struct platform_device *pdev)struct brcmnand_host *host;list_for_each_entry (host, &ctrl->host_list, node) -nand_release (nand_to_mtd (&host->chip)); +nand_release (&host->chip);clk_disable_unprepare (ctrl->clk);
drivers/mtd/nand/cafe_nand.c +1 -1
@@ -826,7 +826,7 @@ static void cafe_nand_remove(struct pci_dev *pdev)/* Disable NAND IRQ in global IRQ mask register */ cafe_writel (cafe, ~1 &cafe_readl (cafe,GLOBAL_IRQ_MASK ),GLOBAL_IRQ_MASK );free_irq (pdev->irq, mtd); -nand_release (mtd); +nand_release (chip);free_rs (cafe->rs);pci_iounmap (pdev, cafe->mmio); dma_free_coherent(&cafe->pdev->dev,
drivers/mtd/nand/cmx270_nand.c +1 -1
@@ -230,7 +230,7 @@ module_init(cmx270_init); static void __exit cmx270_cleanup(void) {/* Release resources, unregister device */ -nand_release (cmx270_nand_mtd); +nand_release (mtd_to_nand (cmx270_nand_mtd));gpio_free (GPIO_NAND_RB );gpio_free (GPIO_NAND_CS );
drivers/mtd/nand/cs553x_nand.c +1 -1
@@ -338,7 +338,7 @@ static void __exit cs553x_cleanup(void) mmio_base = this->IO_ADDR_R;/* Release resources, unregister device */ -nand_release (mtd); +nand_release (this);kfree (mtd->name); cs553x_mtd[i] =NULL ;
drivers/mtd/nand/davinci_nand.c +1 -1
@@ -854,7 +854,7 @@ static int nand_davinci_remove(struct platform_device *pdev) ecc4_busy = false;spin_unlock_irq (&davinci_nand_lock); -nand_release (nand_to_mtd (&info->chip)); +nand_release (&info->chip);clk_disable_unprepare (info->clk);
drivers/mtd/nand/denali.c +1 -3
@@ -1444,9 +1444,7 @@ EXPORT_SYMBOL(denali_init);/* driver exit point */ void denali_remove (struct denali_nand_info *denali) { -struct mtd_info *mtd =nand_to_mtd (&denali->nand); - -nand_release (mtd); +nand_release (&denali->nand);kfree (denali->buf);denali_disable_irq (denali); }
drivers/mtd/nand/diskonchip.c +2 -2
@@ -1611,7 +1611,7 @@ static int __init doc_probe(unsigned long physadr)/* nand_release will call mtd_device_unregister, but we haven't yet added it. This is handled without incident by mtd_device_unregister, as far as I can tell. */ -nand_release (mtd); +nand_release (nand);kfree (nand); goto fail; }
@@ -1644,7 +1644,7 @@ static void release_nanddoc(void) doc =nand_get_controller_data (nand); nextmtd = doc->nextdoc; -nand_release (mtd); +nand_release (nand);iounmap (doc->virtadr);release_mem_region (doc->physadr,DOC_IOREMAP_LEN );kfree (nand);
drivers/mtd/nand/docg4.c +2 -2
@@ -1376,7 +1376,7 @@ static int __init probe_docg4(struct platform_device *pdev)return 0 ; fail: -nand_release (mtd);/* deletes partitions and mtd devices */ +nand_release (nand);/* deletes partitions and mtd devices */ free_bch (doc->bch);kfree (nand);
@@ -1389,7 +1389,7 @@ static int __init probe_docg4(struct platform_device *pdev) static int __exit cleanup_docg4(struct platform_device *pdev) {struct docg4_priv *doc =platform_get_drvdata (pdev); -nand_release (doc->mtd); +nand_release (mtd_to_nand (doc->mtd));free_bch (doc->bch);kfree (mtd_to_nand (doc->mtd));iounmap (doc->virtadr);
drivers/mtd/nand/fsl_elbc_nand.c +1 -1
@@ -813,7 +813,7 @@ static int fsl_elbc_chip_remove(struct fsl_elbc_mtd *priv)struct fsl_elbc_fcm_ctrl *elbc_fcm_ctrl = priv->ctrl->nand;struct mtd_info *mtd =nand_to_mtd (&priv->chip); -nand_release (mtd); +nand_release (&priv->chip);kfree (mtd->name);
drivers/mtd/nand/fsl_ifc_nand.c +1 -1
@@ -927,7 +927,7 @@ static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv) {struct mtd_info *mtd =nand_to_mtd (&priv->chip); -nand_release (mtd); +nand_release (&priv->chip);kfree (mtd->name);
drivers/mtd/nand/fsl_upm.c +1 -1
@@ -326,7 +326,7 @@ static int fun_remove(struct platform_device *ofdev)struct mtd_info *mtd =nand_to_mtd (&fun->chip);int i; -nand_release (mtd); +nand_release (&fun->chip);kfree (mtd->name);for (i =0 ; i < fun->mchip_count; i++) {
drivers/mtd/nand/fsmc_nand.c +1 -1
@@ -1118,7 +1118,7 @@ static int fsmc_nand_remove(struct platform_device *pdev)struct fsmc_nand_data *host =platform_get_drvdata (pdev);if (host) { -nand_release (nand_to_mtd (&host->nand)); +nand_release (&host->nand);if (host->mode ==USE_DMA_ACCESS ) {dma_release_channel (host->write_dma_chan);
drivers/mtd/nand/gpio.c +1 -1
@@ -199,7 +199,7 @@ static int gpio_nand_remove(struct platform_device *pdev) {struct gpiomtd *gpiomtd =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&gpiomtd->nand_chip)); +nand_release (&gpiomtd->nand_chip);if (gpio_is_valid (gpiomtd->plat.gpio_nwp))gpio_set_value (gpiomtd->plat.gpio_nwp,0 );
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +1 -1
@@ -2135,7 +2135,7 @@ static int gpmi_nand_remove(struct platform_device *pdev) {struct gpmi_nand_data *this =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&this->nand)); +nand_release (&this->nand);gpmi_free_dma_buffer (this);release_resources (this);return 0 ;
drivers/mtd/nand/hisi504_nand.c +2 -3
@@ -823,7 +823,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)return 0 ; err_mtd: -nand_release (mtd); +nand_release (chip); err_res:return ret; }
@@ -831,9 +831,8 @@ static int hisi_nfc_probe(struct platform_device *pdev)static int hisi_nfc_remove (struct platform_device *pdev) {struct hinfc_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd =nand_to_mtd (&host->chip); -nand_release (mtd); +nand_release (&host->chip);return 0 ; }
drivers/mtd/nand/jz4740_nand.c +1 -1
@@ -500,7 +500,7 @@ static int jz_nand_remove(struct platform_device *pdev)struct jz_nand *nand =platform_get_drvdata (pdev);size_t i; -nand_release (nand_to_mtd (&nand->chip)); +nand_release (&nand->chip);/* Deassert and disable all chips */ writel (0 , nand->base +JZ_REG_NAND_CTRL );
drivers/mtd/nand/jz4780_nand.c +2 -2
@@ -293,7 +293,7 @@ static int jz4780_nand_init_chip(struct platform_device *pdev, ret =mtd_device_register (mtd,NULL ,0 );if (ret) { -nand_release (mtd); +nand_release (chip);return ret; }
@@ -308,7 +308,7 @@ static void jz4780_nand_cleanup_chips(struct jz4780_nand_controller *nfc)while (!list_empty (&nfc->chips)) { chip = list_first_entry(&nfc->chips, struct jz4780_nand_chip, chip_list); -nand_release (nand_to_mtd (&chip->chip)); +nand_release (&chip->chip);list_del (&chip->chip_list); } }
drivers/mtd/nand/lpc32xx_mlc.c +1 -2
@@ -829,9 +829,8 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)static int lpc32xx_nand_remove (struct platform_device *pdev) {struct lpc32xx_nand_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd =nand_to_mtd (&host->nand_chip); -nand_release (mtd); +nand_release (&host->nand_chip);free_irq (host->irq, host);if (use_dma)dma_release_channel (host->dma_chan);
drivers/mtd/nand/lpc32xx_slc.c +1 -2
@@ -954,9 +954,8 @@ static int lpc32xx_nand_remove(struct platform_device *pdev) {uint32_t tmp;struct lpc32xx_nand_host *host =platform_get_drvdata (pdev); -struct mtd_info *mtd =nand_to_mtd (&host->nand_chip); -nand_release (mtd); +nand_release (&host->nand_chip);dma_release_channel (host->dma_chan);/* Force CE high */
drivers/mtd/nand/mpc5121_nfc.c +1 -1
@@ -829,7 +829,7 @@ static int mpc5121_nfc_remove(struct platform_device *op)struct device *dev = &op->dev;struct mtd_info *mtd =dev_get_drvdata (dev); -nand_release (mtd); +nand_release (mtd_to_nand (mtd));mpc5121_nfc_free (dev, mtd);return 0 ;
drivers/mtd/nand/mtk_nand.c +2 -2
@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, ret =mtd_device_parse_register (mtd,NULL ,NULL ,NULL ,0 );if (ret) {dev_err (dev,"mtd parse partition error\n" ); -nand_release (mtd); +nand_release (nand);return ret; }
@@ -1514,7 +1514,7 @@ static int mtk_nfc_remove(struct platform_device *pdev)while (!list_empty (&nfc->chips)) { chip = list_first_entry(&nfc->chips, struct mtk_nfc_nand_chip, node); -nand_release (nand_to_mtd (&chip->nand)); +nand_release (&chip->nand);list_del (&chip->node); }
drivers/mtd/nand/mxc_nand.c +1 -1
@@ -1834,7 +1834,7 @@ static int mxcnd_remove(struct platform_device *pdev) {struct mxc_nand_host *host =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&host->nand)); +nand_release (&host->nand);if (host->clk_act)clk_disable_unprepare (host->clk);
drivers/mtd/nand/nand_base.c +4 -4
@@ -5046,12 +5046,12 @@ EXPORT_SYMBOL_GPL(nand_cleanup);/** * nand_release - [NAND Interface] Unregister the MTD device and free resources * held by the NAND device -* @mtd: MTD device structure +* @chip: NAND chip object */ -void nand_release (struct mtd_info *mtd) +void nand_release (struct nand_chip *chip) { -mtd_device_unregister (mtd); -nand_cleanup (mtd_to_nand (mtd)); +mtd_device_unregister (nand_to_mtd (chip)); +nand_cleanup (chip); }EXPORT_SYMBOL_GPL (nand_release);
drivers/mtd/nand/nandsim.c +2 -2
@@ -2356,7 +2356,7 @@ static int __init ns_init_module(void) err_exit:free_nandsim (nand); -nand_release (nsmtd); +nand_release (chip);for (i =0 ;i <ARRAY_SIZE (nand->partitions); ++i)kfree (nand->partitions[i].name); error:
@@ -2378,7 +2378,7 @@ static void __exit ns_cleanup_module(void)int i;free_nandsim (ns);/* Free nandsim private resources */ -nand_release (nsmtd);/* Unregister driver */ +nand_release (chip);/* Unregister driver */ for (i =0 ;i <ARRAY_SIZE (ns->partitions); ++i)kfree (ns->partitions[i].name);kfree (mtd_to_nand (nsmtd));/* Free other structures */
drivers/mtd/nand/ndfc.c +1 -1
@@ -258,7 +258,7 @@ static int ndfc_remove(struct platform_device *ofdev)struct ndfc_controller *ndfc =dev_get_drvdata (&ofdev->dev);struct mtd_info *mtd =nand_to_mtd (&ndfc->chip); -nand_release (mtd); +nand_release (&ndfc->chip);kfree (mtd->name);return 0 ;
drivers/mtd/nand/nuc900_nand.c +1 -1
@@ -284,7 +284,7 @@ static int nuc900_nand_remove(struct platform_device *pdev) {struct nuc900_nand *nuc900_nand =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&nuc900_nand->chip)); +nand_release (&nuc900_nand->chip);clk_disable (nuc900_nand->clk);return 0 ;
drivers/mtd/nand/omap2.c +1 -1
@@ -2306,7 +2306,7 @@ static int omap_nand_remove(struct platform_device *pdev) }if (info->dma)dma_release_channel (info->dma); -nand_release (mtd); +nand_release (nand_chip);return 0 ; }
drivers/mtd/nand/orion_nand.c +2 -3
@@ -186,7 +186,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) mtd->name ="orion_nand" ; ret =mtd_device_register (mtd, board->parts, board->nr_parts);if (ret) { -nand_release (mtd); +nand_release (nc); goto no_dev; }
@@ -201,9 +201,8 @@ static int orion_nand_remove(struct platform_device *pdev) {struct orion_nand_info *info =platform_get_drvdata (pdev);struct nand_chip *chip = &info->chip; -struct mtd_info *mtd =nand_to_mtd (chip); -nand_release (mtd); +nand_release (chip);clk_disable_unprepare (info->clk);
drivers/mtd/nand/oxnas_nand.c +2 -2
@@ -148,7 +148,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) err =mtd_device_register (mtd,NULL ,0 );if (err) { -nand_release (mtd); +nand_release (chip); goto err_clk_unprepare; }
@@ -176,7 +176,7 @@ static int oxnas_nand_remove(struct platform_device *pdev)struct oxnas_nand_ctrl *oxnas =platform_get_drvdata (pdev);if (oxnas->chips[0 ]) -nand_release (nand_to_mtd (oxnas->chips[0 ])); +nand_release (oxnas->chips[0 ]);clk_disable_unprepare (oxnas->clk);
drivers/mtd/nand/pasemi_nand.c +1 -1
@@ -193,7 +193,7 @@ static int pasemi_nand_remove(struct platform_device *ofdev) chip =mtd_to_nand (pasemi_nand_mtd);/* Release resources, unregister device */ -nand_release (pasemi_nand_mtd); +nand_release (chip);release_region (lpcctl,4 );
drivers/mtd/nand/plat_nand.c +2 -2
@@ -99,7 +99,7 @@ static int plat_nand_probe(struct platform_device *pdev)if (!err)return err; -nand_release (mtd); +nand_release (&data->chip); out:if (pdata->ctrl.remove) pdata->ctrl.remove (pdev);
@@ -114,7 +114,7 @@ static int plat_nand_remove(struct platform_device *pdev)struct plat_nand_data *data =platform_get_drvdata (pdev);struct platform_nand_data *pdata =dev_get_platdata (&pdev->dev); -nand_release (nand_to_mtd (&data->chip)); +nand_release (&data->chip);if (pdata->ctrl.remove) pdata->ctrl.remove (pdev);
drivers/mtd/nand/qcom_nandc.c +1 -1
@@ -2760,7 +2760,7 @@ static int qcom_nandc_remove(struct platform_device *pdev)struct qcom_nand_host *host;list_for_each_entry (host, &nandc->host_list, node) -nand_release (nand_to_mtd (&host->chip)); +nand_release (&host->chip);qcom_nandc_unalloc (nandc);
drivers/mtd/nand/r852.c +2 -2
@@ -656,7 +656,7 @@ static int r852_register_nand_device(struct r852_device *dev) dev->card_registred =1 ;return 0 ; error3: -nand_release (mtd); +nand_release (dev->chip); error1:/* Force card redetect */ dev->card_detected =0 ;
@@ -675,7 +675,7 @@ static void r852_unregister_nand_device(struct r852_device *dev)return ;device_remove_file (&mtd->dev, &dev_attr_media_type); -nand_release (mtd); +nand_release (dev->chip);r852_engine_disable (dev); dev->card_registred =0 ; }
drivers/mtd/nand/s3c2410.c +1 -1
@@ -784,7 +784,7 @@ static int s3c24xx_nand_remove(struct platform_device *pdev)for (mtdno =0 ; mtdno < info->mtd_count; mtdno++, ptr++) {pr_debug ("releasing mtd %d (%p)\n" , mtdno, ptr); -nand_release (nand_to_mtd (&ptr->chip)); +nand_release (&ptr->chip); } }
drivers/mtd/nand/sh_flctl.c +1 -1
@@ -1231,7 +1231,7 @@ static int flctl_remove(struct platform_device *pdev)struct sh_flctl *flctl =platform_get_drvdata (pdev);flctl_release_dma (flctl); -nand_release (nand_to_mtd (&flctl->chip)); +nand_release (&flctl->chip);pm_runtime_disable (&pdev->dev);return 0 ;
drivers/mtd/nand/sharpsl.c +2 -2
@@ -192,7 +192,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)return 0 ; err_add: -nand_release (mtd); +nand_release (this); err_scan:iounmap (sharpsl->io);
@@ -210,7 +210,7 @@ static int sharpsl_nand_remove(struct platform_device *pdev)struct sharpsl_nand *sharpsl =platform_get_drvdata (pdev);/* Release resources, unregister device */ -nand_release (nand_to_mtd (&sharpsl->chip)); +nand_release (&sharpsl->chip);iounmap (sharpsl->io);
drivers/mtd/nand/socrates_nand.c +2 -3
@@ -195,7 +195,7 @@ static int socrates_nand_probe(struct platform_device *ofdev)if (!res)return res; -nand_release (mtd); +nand_release (nand_chip); out:iounmap (host->io_base);
@@ -208,9 +208,8 @@ static int socrates_nand_probe(struct platform_device *ofdev)static int socrates_nand_remove (struct platform_device *ofdev) {struct socrates_nand_host *host =dev_get_drvdata (&ofdev->dev); -struct mtd_info *mtd =nand_to_mtd (&host->nand_chip); -nand_release (mtd); +nand_release (&host->nand_chip);iounmap (host->io_base);
drivers/mtd/nand/sunxi_nand.c +2 -2
@@ -2125,7 +2125,7 @@ static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, ret =mtd_device_register (mtd,NULL ,0 );if (ret) {dev_err (dev,"failed to register mtd device: %d\n" , ret); -nand_release (mtd); +nand_release (nand);return ret; }
@@ -2164,7 +2164,7 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)while (!list_empty (&nfc->chips)) { chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip, node); -nand_release (nand_to_mtd (&chip->nand)); +nand_release (&chip->nand);sunxi_nand_ecc_cleanup (&chip->nand.ecc);list_del (&chip->node); }
drivers/mtd/nand/tango_nand.c +1 -1
@@ -619,7 +619,7 @@ static int tango_nand_remove(struct platform_device *pdev)for (cs =0 ; cs <MAX_CS ; ++cs) {if (nfc->chips[cs]) -nand_release (nand_to_mtd (&nfc->chips[cs]->nand_chip)); +nand_release (&nfc->chips[cs]->nand_chip); }return 0 ;
drivers/mtd/nand/tmio_nand.c +2 -2
@@ -448,7 +448,7 @@ static int tmio_probe(struct platform_device *dev)if (!retval)return retval; -nand_release (mtd); +nand_release (nand_chip); err_irq:tmio_hw_stop (dev, tmio);
@@ -459,7 +459,7 @@ static int tmio_remove(struct platform_device *dev) {struct tmio_nand *tmio =platform_get_drvdata (dev); -nand_release (nand_to_mtd (&tmio->chip)); +nand_release (&tmio->chip);tmio_hw_stop (dev, tmio);return 0 ; }
drivers/mtd/nand/txx9ndfmc.c +1 -1
@@ -390,7 +390,7 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) chip =mtd_to_nand (mtd); txx9_priv =nand_get_controller_data (chip); -nand_release (mtd); +nand_release (chip);kfree (txx9_priv->mtdname);kfree (txx9_priv); }
drivers/mtd/nand/vf610_nfc.c +1 -1
@@ -794,7 +794,7 @@ static int vf610_nfc_remove(struct platform_device *pdev)struct mtd_info *mtd =platform_get_drvdata (pdev);struct vf610_nfc *nfc =mtd_to_nfc (mtd); -nand_release (mtd); +nand_release (mtd_to_nand (mtd));clk_disable_unprepare (nfc->clk);return 0 ; }
drivers/mtd/nand/xway_nand.c +2 -2
@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) err =mtd_device_register (mtd,NULL ,0 );if (err) -nand_release (mtd); +nand_release (&data->chip);return err; }
@@ -223,7 +223,7 @@ static int xway_nand_remove(struct platform_device *pdev) {struct xway_nand_data *data =platform_get_drvdata (pdev); -nand_release (nand_to_mtd (&data->chip)); +nand_release (&data->chip);return 0 ; }
include/linux/mtd/rawnand.h +2 -4
@@ -22,6 +22,7 @@#include <linux/mtd/flashchip.h> #include <linux/mtd/bbm.h> +struct nand_chip ;struct mtd_info ;struct nand_flash_dev ;struct device_node ;
@@ -37,7 +38,7 @@ int nand_scan_ident(struct mtd_info *mtd, int max_chips,int nand_scan_tail (struct mtd_info *mtd);/* Unregister the MTD device and free resources held by the NAND device */ -void nand_release (struct mtd_info *mtd); +void nand_release (struct nand_chip *chip);/* Internal helper for board drivers which need to override command function */ void nand_wait_ready (struct mtd_info *mtd);
@@ -227,9 +228,6 @@ enum nand_ecc_algo {#define NAND_CI_CELLTYPE_MSK 0x0C#define NAND_CI_CELLTYPE_SHIFT 2 -/* Keep gcc happy */ -struct nand_chip ; -/* ONFI features */ #define ONFI_FEATURE_16_BIT_BUS (1 << 0)#define ONFI_FEATURE_EXT_PARAM_PAGE (1 << 7)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 120/136 mtd: rawnand: diskonchip: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit c5be12e45940f1aa1b5dfa04db5d15ad24f7c896 ]
Not sure nand_cleanup() is the right function to call here but in any case it is not nand_release(). Indeed, even a comment says that calling nand_release() is a bit of a hack as there is no MTD device to unregister. So switch to nand_cleanup() for now and drop this comment.
There is no Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if it did not intruce
any bug.
--- drivers/mtd/nand/diskonchip.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/mtd/nand/diskonchip.c +2 -5
@@ -1605,13 +1605,10 @@ static int __init doc_probe(unsigned long physadr) numchips =doc2001_init (mtd);if ((ret =nand_scan (mtd, numchips)) || (ret = doc->late_init (mtd))) { -/* DBB note: i believe nand_release is necessary here, as +/* DBB note: i believe nand_cleanup is necessary here, as buffers may have been allocated in nand_base. Check with Thomas. FIX ME! */ -/* nand_release will call mtd_device_unregister, but we -haven't yet added it. This is handled without incident by -mtd_device_unregister, as far as I can tell. */ -nand_release (nand); +nand_cleanup (nand);kfree (nand); goto fail; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 121/136 mtd: rawnand: sharpsl: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 0f44b3275b3798ccb97a2f51ac85871c30d6fbbc ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense.
--- drivers/mtd/nand/sharpsl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/sharpsl.c +1 -1
@@ -192,7 +192,7 @@ static int sharpsl_nand_probe(struct platform_device *pdev)return 0 ; err_add: -nand_release (this); +nand_cleanup (this); err_scan:iounmap (sharpsl->io);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 122/136 mtd: rawnand: xway: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 34531be5e804a8e1abf314a6c3a19fe342e4a154 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if this commit is not introducing any bug.
--- drivers/mtd/nand/xway_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/xway_nand.c +1 -1
@@ -211,7 +211,7 @@ static int xway_nand_probe(struct platform_device *pdev) err =mtd_device_register (mtd,NULL ,0 );if (err) -nand_release (&data->chip); +nand_cleanup (&data->chip);return err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 123/136 mtd: rawnand: orion: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit be238fbf78e4c7c586dac235ab967d3e565a4d1a ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if this commit is not introducing any bug.
--- drivers/mtd/nand/orion_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/orion_nand.c +1 -1
@@ -186,7 +186,7 @@ static int __init orion_nand_probe(struct platform_device *pdev) mtd->name ="orion_nand" ; ret =mtd_device_register (mtd, board->parts, board->nr_parts);if (ret) { -nand_release (nc); +nand_cleanup (nc); goto no_dev; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 124/136 mtd: rawnand: oxnas: Add of_node_put()
In reply to Greg Kroah-HartmanFrom: Nishka Dasgupta <[email protected]>
[ Upstream commit c436f68beeb20f2f92937677db1d9069b0dd2a3d ]
Each iteration of for_each_child_of_node puts the previous node, but in the case of a goto from the middle of the loop, there is no put, thus causing a memory leak. Hence add an of_node_put under a new goto to put the node at a loop exit.
Issue found with Coccinelle.
--- drivers/mtd/nand/oxnas_nand.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/mtd/nand/oxnas_nand.c +5 -3
@@ -123,7 +123,7 @@ static int oxnas_nand_probe(struct platform_device *pdev) GFP_KERNEL);if (!chip) { err = -ENOMEM ; - goto err_clk_unprepare; + goto err_release_child; } chip->controller = &oxnas->base;
@@ -144,12 +144,12 @@ static int oxnas_nand_probe(struct platform_device *pdev)/* Scan to find existence of the device */ err =nand_scan (mtd,1 );if (err) - goto err_clk_unprepare; + goto err_release_child; err =mtd_device_register (mtd,NULL ,0 );if (err) {nand_release (chip); - goto err_clk_unprepare; + goto err_release_child; } oxnas->chips[nchips] = chip;
@@ -166,6 +166,8 @@ static int oxnas_nand_probe(struct platform_device *pdev)return 0 ; +err_release_child: +of_node_put (nand_np); err_clk_unprepare:clk_disable_unprepare (oxnas->clk);return err;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 125/136 mtd: rawnand: oxnas: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 154298e2a3f6c9ce1d76cdb48d89fd5b107ea1a3 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
While at it, be consistent and move the function call in the error path thanks to a goto statement.
--- drivers/mtd/nand/oxnas_nand.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mtd/nand/oxnas_nand.c +4 -4
@@ -147,10 +147,8 @@ static int oxnas_nand_probe(struct platform_device *pdev) goto err_release_child; err =mtd_device_register (mtd,NULL ,0 ); -if (err) { -nand_release (chip); - goto err_release_child; - } +if (err) + goto err_cleanup_nand; oxnas->chips[nchips] = chip; ++nchips;
@@ -166,6 +164,8 @@ static int oxnas_nand_probe(struct platform_device *pdev)return 0 ; +err_cleanup_nand: +nand_cleanup (chip); err_release_child:of_node_put (nand_np); err_clk_unprepare:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 126/136 mtd: rawnand: socrates: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 9c6c2e5cc77119ce0dacb4f9feedb73ce0354421 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if this commit is not introducing any bug.
--- drivers/mtd/nand/socrates_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/socrates_nand.c +1 -1
@@ -195,7 +195,7 @@ static int socrates_nand_probe(struct platform_device *ofdev)if (!res)return res; -nand_release (nand_chip); +nand_cleanup (nand_chip); out:iounmap (host->io_base);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 127/136 mtd: rawnand: plat_nand: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 5284024b4dac5e94f7f374ca905c7580dbc455e9 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible, hence pointing it as the commit to
fix for backporting purposes, even if this commit is not introducing
any bug.
--- drivers/mtd/nand/plat_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/plat_nand.c +1 -1
@@ -99,7 +99,7 @@ static int plat_nand_probe(struct platform_device *pdev)if (!err)return err; -nand_release (&data->chip); +nand_cleanup (&data->chip); out:if (pdata->ctrl.remove) pdata->ctrl.remove (pdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 128/136 mtd: rawnand: mtk: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 8a82bbcadec877f5f938c54026278dfc1f05a332 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if this commit is not introducing any bug.
--- drivers/mtd/nand/mtk_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/mtk_nand.c +1 -1
@@ -1357,7 +1357,7 @@ static int mtk_nfc_nand_chip_init(struct device *dev, struct mtk_nfc *nfc, ret =mtd_device_parse_register (mtd,NULL ,NULL ,NULL ,0 );if (ret) {dev_err (dev,"mtd parse partition error\n" ); -nand_release (nand); +nand_cleanup (nand);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 129/136 mtd: rawnand: tmio: Fix the probe error path
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 75e9a330a9bd48f97a55a08000236084fe3dae56 ]
nand_release() is supposed be called after MTD device registration. Here, only nand_scan() happened, so use nand_cleanup() instead.
There is no real Fixes tag applying here as the use of nand_release()
in this driver predates by far the introduction of nand_cleanup() in
commit d44154f969a4 ("mtd: nand: Provide nand_cleanup() function to free NAND related resources") which makes this change possible. However, pointing this commit as the
culprit for backporting purposes makes sense even if this commit is not introducing any bug.
--- drivers/mtd/nand/tmio_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/tmio_nand.c +1 -1
@@ -448,7 +448,7 @@ static int tmio_probe(struct platform_device *dev)if (!retval)return retval; -nand_release (nand_chip); +nand_cleanup (nand_chip); err_irq:tmio_hw_stop (dev, tmio);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 130/136 crypto: algif_skcipher - Cap recv SG list at ctx->used
In reply to Greg Kroah-HartmanFrom: Herbert Xu <[email protected]>
commit 7cf81954705b7e5b057f7dc39a7ded54422ab6e1 upstream.
Somewhere along the line the cap on the SG list length for receive was lost. This patch restores it and removes the subsequent test which is now redundant.
--- crypto/algif_skcipher.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
crypto/algif_skcipher.c +1 -5
@@ -85,14 +85,10 @@ static int _skcipher_recvmsg(struct sockreturn PTR_ERR (areq);/* convert iovecs of output buffers into RX SGL */ - err =af_alg_get_rsgl (sk, msg, flags, areq,-1 , &len); + err =af_alg_get_rsgl (sk, msg, flags, areq, ctx->used, &len);if (err) goto free; -/* Process only as much RX buffers for which we have TX data */ -if (len > ctx->used) - len = ctx->used; -/* * If more buffers are to be expected to be processed, process only * full block size buffers.
Greg Kroah-Hartman
maintainerPATCH 131/136 crypto: algboss - dont wait during notifier callback
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit 77251e41f89a813b4090f5199442f217bbf11297 upstream.
When a crypto template needs to be instantiated, CRYPTO_MSG_ALG_REQUEST is sent to crypto_chain. cryptomgr_schedule_probe() handles this by starting a thread to instantiate the template, then waiting for this thread to complete via crypto_larval::completion.
This can deadlock because instantiating the template may require loading modules, and this (apparently depending on userspace) may need to wait for the crc-t10dif module (lib/crc-t10dif.c) to be loaded. But crc-t10dif's module_init function uses crypto_register_notifier() and therefore takes crypto_chain.rwsem for write. That can't proceed until the notifier callback has finished, as it holds this semaphore for read.
Fix this by removing the wait on crypto_larval::completion from within cryptomgr_schedule_probe(). It's actually unnecessary because crypto_alg_mod_lookup() calls crypto_larval_wait() itself after sending CRYPTO_MSG_ALG_REQUEST.
This only actually became a problem in v4.20 due to commit b76377543b73 ("crc-t10dif: Pick better transform if one becomes available"), but the unnecessary wait was much older.
--- crypto/algboss.c | 2 -- 1 file changed, 2 deletions(-)
crypto/algboss.c +0 -2
@@ -194,8 +194,6 @@ static int cryptomgr_schedule_probe(struif (IS_ERR (thread)) goto err_put_larval; -wait_for_completion_interruptible (&larval->completion); -return NOTIFY_STOP ; err_put_larval:
Greg Kroah-Hartman
maintainerPATCH 132/136 kprobes: Fix to protect kick_kprobe_optimizer() by kprobe_mutex
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 1a0aa991a6274161c95a844c58cfb801d681eb59 upstream.
In kprobe_optimizer() kick_kprobe_optimizer() is called without kprobe_mutex, but this can race with other caller which is protected by kprobe_mutex.
To fix that, expand kprobe_mutex protected area to protect kick_kprobe_optimizer() call.
--- kernel/kprobes.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/kprobes.c +2 -1
@@ -599,11 +599,12 @@ static void kprobe_optimizer(struct workmutex_unlock (&module_mutex);mutex_unlock (&text_mutex);cpus_read_unlock (); -mutex_unlock (&kprobe_mutex);/* Step 5: Kick optimizer again if needed */ if (!list_empty (&optimizing_list) || !list_empty (&unoptimizing_list))kick_kprobe_optimizer (); + +mutex_unlock (&kprobe_mutex); }/* Wait for completing optimization and unoptimization */
Greg Kroah-Hartman
maintainerPATCH 133/136 e1000e: Do not wake up the system via WOL if device wakeup is disabled
In reply to Greg Kroah-HartmanFrom: Chen Yu <[email protected]>
commit 6bf6be1127f7e6d4bf39f84d56854e944d045d74 upstream.
Currently the system will be woken up via WOL(Wake On LAN) even if the device wakeup ability has been disabled via sysfs:
cat /sys/devices/pci0000:00/0000:00:1f.6/power/wakeup disabled
The system should not be woken up if the user has explicitly disabled the wake up ability for this device.
This patch clears the WOL ability of this network device if the user has disabled the wake up ability in sysfs.
--- drivers/net/ethernet/intel/e1000e/netdev.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/e1000e/netdev.c +10 -4
@@ -6328,11 +6328,17 @@ static int __e1000_shutdown(struct pci_dstruct net_device *netdev =pci_get_drvdata (pdev);struct e1000_adapter *adapter =netdev_priv (netdev);struct e1000_hw *hw = &adapter->hw; -u32 ctrl, ctrl_ext, rctl, status; -/* Runtime suspend should only enable wakeup for link changes */ -u32 wufc = runtime ?E1000_WUFC_LNKC : adapter->wol; +u32 ctrl, ctrl_ext, rctl, status, wufc;int retval =0 ; +/* Runtime suspend should only enable wakeup for link changes */ +if (runtime) + wufc =E1000_WUFC_LNKC ; +else if (device_may_wakeup (&pdev->dev)) + wufc = adapter->wol; +else + wufc =0 ; + status =er32 (STATUS );if (status &E1000_STATUS_LU ) wufc &= ~E1000_WUFC_LNKC ;
@@ -6389,7 +6395,7 @@ static int __e1000_shutdown(struct pci_dif (adapter->hw.phy.type == e1000_phy_igp_3) {e1000e_igp3_phy_powerdown_workaround_ich8lan (&adapter->hw); }else if (hw->mac.type >= e1000_pch_lpt) { -if (!(wufc & (E1000_WUFC_EX |E1000_WUFC_MC |E1000_WUFC_BC ))) +if (wufc && !(wufc & (E1000_WUFC_EX |E1000_WUFC_MC |E1000_WUFC_BC )))/* ULP does not support wake from unicast, multicast * or broadcast. */
Greg Kroah-Hartman
maintainerPATCH 134/136 kretprobe: Prevent triggering kretprobe from within kprobe_flush_task
In reply to Greg Kroah-HartmanFrom: Jiri Olsa <[email protected]>
[ Upstream commit 9b38cc704e844e41d9cf74e647bff1d249512cb3 ]
Ziqian reported lockup when adding retprobe on _raw_spin_lock_irqsave. My test was also able to trigger lockdep output:
============================================
WARNING: possible recursive locking detected
5.6.0-rc6+ #6 Not tainted
--------------------------------------------
sched-messaging/2767 is trying to acquire lock:
ffffffff9a492798 (&(kretprobe_table_locks[i].lock)){-.-.}, at: kretprobe_hash_lock+0x52/0xa0
but task is already holding lock:
ffffffff9a491a18 (&(kretprobe_table_locks[i].lock)){-.-.}, at: kretprobe_trampoline+0x0/0x50
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(&(kretprobe_table_locks[i].lock));
lock(&(kretprobe_table_locks[i].lock));
*** DEADLOCK ***
May be due to missing lock nesting notation
1 lock held by sched-messaging/2767:
#0: ffffffff9a491a18 (&(kretprobe_table_locks[i].lock)){-.-.}, at: kretprobe_trampoline+0x0/0x50
stack backtrace: CPU: 3 PID: 2767 Comm: sched-messaging Not tainted 5.6.0-rc6+ #6 Call Trace: dump_stack+0x96/0xe0 __lock_acquire.cold.57+0x173/0x2b7 ? native_queued_spin_lock_slowpath+0x42b/0x9e0 ? lockdep_hardirqs_on+0x590/0x590 ? __lock_acquire+0xf63/0x4030 lock_acquire+0x15a/0x3d0 ? kretprobe_hash_lock+0x52/0xa0 _raw_spin_lock_irqsave+0x36/0x70 ? kretprobe_hash_lock+0x52/0xa0 kretprobe_hash_lock+0x52/0xa0 trampoline_handler+0xf8/0x940 ? kprobe_fault_handler+0x380/0x380 ? find_held_lock+0x3a/0x1c0 kretprobe_trampoline+0x25/0x50 ? lock_acquired+0x392/0xbc0 ? _raw_spin_lock_irqsave+0x50/0x70 ? __get_valid_kprobe+0x1f0/0x1f0 ? _raw_spin_unlock_irqrestore+0x3b/0x40 ? finish_task_switch+0x4b9/0x6d0 ? __switch_to_asm+0x34/0x70 ? __switch_to_asm+0x40/0x70
The code within the kretprobe handler checks for probe reentrancy, so we won't trigger any _raw_spin_lock_irqsave probe in there.
The problem is in outside kprobe_flush_task, where we call:
kprobe_flush_task
kretprobe_table_lock
raw_spin_lock_irqsave
_raw_spin_lock_irqsave
where _raw_spin_lock_irqsave triggers the kretprobe and installs kretprobe_trampoline handler on _raw_spin_lock_irqsave return.
The kretprobe_trampoline handler is then executed with already locked kretprobe_table_locks, and first thing it does is to lock kretprobe_table_locks ;-) the whole lockup path like:
kprobe_flush_task
kretprobe_table_lock
raw_spin_lock_irqsave
_raw_spin_lock_irqsave ---> probe triggered, kretprobe_trampoline installed
---> kretprobe_table_locks locked
kretprobe_trampoline
trampoline_handler
kretprobe_hash_lock(current, &head, &flags); <--- deadlockAdding kprobe_busy_begin/end helpers that mark code with fake probe installed to prevent triggering of another kprobe within this code.
Using these helpers in kprobe_flush_task, so the probe recursion protection check is hit and the probe is never set to prevent above lockup.
--- arch/x86/kernel/kprobes/core.c | 16 +++------------- include/linux/kprobes.h | 4 ++++ kernel/kprobes.c | 24 ++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 13 deletions(-)
arch/x86/kernel/kprobes/core.c +3 -13
@@ -744,16 +744,11 @@ asm(NOKPROBE_SYMBOL (kretprobe_trampoline);STACK_FRAME_NON_STANDARD (kretprobe_trampoline); -static struct kprobe kretprobe_kprobe = { - .addr = (void *)kretprobe_trampoline, -}; -/* * Called from kretprobe_trampoline */ __visible __used void *trampoline_handler(struct pt_regs *regs) { -struct kprobe_ctlblk *kcb;struct kretprobe_instance *ri =NULL ;struct hlist_head *head, empty_rp;struct hlist_node *tmp;
@@ -763,16 +758,12 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)void *frame_pointer;bool skipped = false; -preempt_disable (); -/* * Set a dummy kprobe for avoiding kretprobe recursion. * Since kretprobe never run in kprobe handler, kprobe must not * be running at this point. */ - kcb =get_kprobe_ctlblk (); -__this_cpu_write (current_kprobe, &kretprobe_kprobe); - kcb->kprobe_status =KPROBE_HIT_ACTIVE ; +kprobe_busy_begin ();INIT_HLIST_HEAD (&empty_rp);kretprobe_hash_lock (current, &head, &flags);
@@ -851,7 +842,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)__this_cpu_write (current_kprobe, &ri->rp->kp); ri->ret_addr = correct_ret_addr; ri->rp->handler (ri, regs); -__this_cpu_write (current_kprobe, &kretprobe_kprobe); +__this_cpu_write (current_kprobe, &kprobe_busy); }recycle_rp_inst (ri, &empty_rp);
@@ -867,8 +858,7 @@ __visible __used void *trampoline_handler(struct pt_regs *regs)kretprobe_hash_unlock (current, &flags); -__this_cpu_write (current_kprobe,NULL ); -preempt_enable (); +kprobe_busy_end ();hlist_for_each_entry_safe (ri, tmp, &empty_rp, hlist) {hlist_del (&ri->hlist);
include/linux/kprobes.h +4 -0
@@ -385,6 +385,10 @@ static inline struct kprobe_ctlblk *get_kprobe_ctlblk(void)return this_cpu_ptr (&kprobe_ctlblk); } +extern struct kprobe kprobe_busy; +void kprobe_busy_begin (void ); +void kprobe_busy_end (void ); +kprobe_opcode_t *kprobe_lookup_name (const char *name,unsigned int offset);int register_kprobe (struct kprobe *p);void unregister_kprobe (struct kprobe *p);
kernel/kprobes.c +24 -0
@@ -1218,6 +1218,26 @@ __releases(hlist_lock) }NOKPROBE_SYMBOL (kretprobe_table_unlock); +struct kprobe kprobe_busy = { + .addr = (void *) get_kprobe, +}; + +void kprobe_busy_begin (void ) +{ +struct kprobe_ctlblk *kcb; + +preempt_disable (); +__this_cpu_write (current_kprobe, &kprobe_busy); + kcb =get_kprobe_ctlblk (); + kcb->kprobe_status =KPROBE_HIT_ACTIVE ; +} + +void kprobe_busy_end (void ) +{ +__this_cpu_write (current_kprobe,NULL ); +preempt_enable (); +} +/* * This function is called from finish_task_switch when task tk becomes dead, * so that we can recycle any function-return probe instances associated
@@ -1235,6 +1255,8 @@ void kprobe_flush_task(struct task_struct *tk)/* Early boot. kretprobe_table_locks not yet initialized. */ return ; +kprobe_busy_begin (); +INIT_HLIST_HEAD (&empty_rp); hash =hash_ptr (tk,KPROBE_HASH_BITS ); head = &kretprobe_inst_table[hash];
@@ -1248,6 +1270,8 @@ void kprobe_flush_task(struct task_struct *tk)hlist_del (&ri->hlist);kfree (ri); } + +kprobe_busy_end (); }NOKPROBE_SYMBOL (kprobe_flush_task);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 135/136 sched/rt, net: Use CONFIG_PREEMPTION.patch
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit 2da2b32fd9346009e9acdb68c570ca8d3966aba7 ]
CONFIG_PREEMPTION is selected by CONFIG_PREEMPT and by CONFIG_PREEMPT_RT. Both PREEMPT and PREEMPT_RT require the same functionality which today depends on CONFIG_PREEMPT.
Update the comment to use CONFIG_PREEMPTION.
--- net/core/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/core/dev.c +1 -1
@@ -901,7 +901,7 @@ EXPORT_SYMBOL(dev_get_by_napi_id);* * The use of raw_seqcount_begin() and cond_resched() before * retrying is required as we want to give the writers a chance -* to complete when CONFIG_PREEMPT is not set. +* to complete when CONFIG_PREEMPTION is not set. */ int netdev_get_name (struct net *net,char *name,int ifindex) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 136/136 net: core: device_rename: Use rwsem instead of a seqcount
In reply to Greg Kroah-HartmanFrom: Ahmed S. Darwish <[email protected]>
[ Upstream commit 11d6011c2cf29f7c8181ebde6c8bc0c4d83adcd7 ]
Sequence counters write paths are critical sections that must never be preempted, and blocking, even for CONFIG_PREEMPTION=n, is not allowed.
Commit 5dbe7c178d3f ("net: fix kernel deadlock with interface rename and netdev name retrieval.") handled a deadlock, observed with CONFIG_PREEMPTION=n, where the devnet_rename seqcount read side was infinitely spinning: it got scheduled after the seqcount write side blocked inside its own critical section.
To fix that deadlock, among other issues, the commit added a cond_resched() inside the read side section. While this will get the non-preemptible kernel eventually unstuck, the seqcount reader is fully exhausting its slice just spinning -- until TIF_NEED_RESCHED is set.
The fix is also still broken: if the seqcount reader belongs to a real-time scheduling policy, it can spin forever and the kernel will livelock.
Disabling preemption over the seqcount write side critical section will not work: inside it are a number of GFP_KERNEL allocations and mutex locking through the drivers/base/ :: device_rename() call chain.
Quoted 1 line
From all the above, replace the seqcount with a rwsem.
--- net/core/dev.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-)
net/core/dev.c +18 -22
@@ -83,6 +83,7 @@#include <linux/sched.h> #include <linux/sched/mm.h> #include <linux/mutex.h> +#include <linux/rwsem.h> #include <linux/string.h> #include <linux/mm.h> #include <linux/socket.h>
@@ -194,7 +195,7 @@ static DEFINE_SPINLOCK(napi_hash_lock);static unsigned int napi_gen_id =NR_CPUS ; static DEFINE_READ_MOSTLY_HASHTABLE(napi_hash, 8); -static seqcount_t devnet_rename_seq; +static DECLARE_RWSEM (devnet_rename_sem);static inline void dev_base_seq_inc (struct net *net) {
@@ -898,33 +899,28 @@ EXPORT_SYMBOL(dev_get_by_napi_id);* @net: network namespace * @name: a pointer to the buffer where the name will be stored. * @ifindex: the ifindex of the interface to get the name from. -* -* The use of raw_seqcount_begin() and cond_resched() before -* retrying is required as we want to give the writers a chance -* to complete when CONFIG_PREEMPTION is not set. */ int netdev_get_name (struct net *net,char *name,int ifindex) {struct net_device *dev; -unsigned int seq; +int ret; -retry: - seq =raw_seqcount_begin (&devnet_rename_seq); +down_read (&devnet_rename_sem);rcu_read_lock (); + dev =dev_get_by_index_rcu (net, ifindex);if (!dev) { -rcu_read_unlock (); -return -ENODEV ; + ret = -ENODEV ; + goto out; }strcpy (name, dev->name); -rcu_read_unlock (); -if (read_seqcount_retry (&devnet_rename_seq, seq)) { -cond_resched (); - goto retry; - } -return 0 ; + ret =0 ; +out: +rcu_read_unlock (); +up_read (&devnet_rename_sem); +return ret; }/**
@@ -1189,10 +1185,10 @@ int dev_change_name(struct net_device *dev, const char *newname)if (dev->flags &IFF_UP )return -EBUSY ; -write_seqcount_begin (&devnet_rename_seq); +down_write (&devnet_rename_sem);if (strncmp (newname, dev->name,IFNAMSIZ ) ==0 ) { -write_seqcount_end (&devnet_rename_seq); +up_write (&devnet_rename_sem);return 0 ; }
@@ -1200,7 +1196,7 @@ int dev_change_name(struct net_device *dev, const char *newname) err =dev_get_valid_name (net, dev, newname);if (err <0 ) { -write_seqcount_end (&devnet_rename_seq); +up_write (&devnet_rename_sem);return err; }
@@ -1215,11 +1211,11 @@ rollback:if (ret) {memcpy (dev->name, oldname,IFNAMSIZ ); dev->name_assign_type = old_assign_type; -write_seqcount_end (&devnet_rename_seq); +up_write (&devnet_rename_sem);return ret; } -write_seqcount_end (&devnet_rename_seq); +up_write (&devnet_rename_sem);netdev_adjacent_rename_links (dev, oldname);
@@ -1240,7 +1236,7 @@ rollback:/* err >= 0 after dev_alloc_name() or stores the first errno */ if (err >=0 ) { err = ret; -write_seqcount_begin (&devnet_rename_seq); +down_write (&devnet_rename_sem);memcpy (dev->name, oldname,IFNAMSIZ );memcpy (oldname, newname,IFNAMSIZ ); dev->name_assign_type = old_assign_type;
Signature · 1 line
2.25.1
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.186 release. There are 136 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 Thu, 25 Jun 2020 19:52:30 +0000. Anything received after that time might be too late.
For v4.14.185-136-g1c6114e25934:
arm:allmodconfig, arm64:allmodconfig, arm:pxa_defconfig:
drivers/mtd/nand/pxa3xx_nand.c: In function 'pxa3xx_nand_remove':drivers/mtd/nand/pxa3xx_nand.c:1918:16: error: passing argument 1 of 'nand_release' from incompatible pointer type
arm:lpc32xx_defconfig:
drivers/mtd/nand/lpc32xx_slc.c: In function 'lpc32xx_nand_probe':drivers/mtd/nand/lpc32xx_slc.c:938:15: error: passing argument 1 of 'nand_release' from incompatible pointer type
drivers/mtd/nand/lpc32xx_mlc.c: In function 'lpc32xx_nand_probe':drivers/mtd/nand/lpc32xx_mlc.c:808:15: error: passing argument 1 of 'nand_release' from incompatible pointer type
Boot tests are not complete, so there may be more failures. Also, looking through callers of nand_release(), there are more failures. Confirmed:
drivers/mtd/nand/jz4740_nand.c (mips:qi_lb60_defconfig) drivers/mtd/nand/bf5xx_nand.c (blackfin:BF548-EZKIT_defconfig)
I don't know if I found all instances.
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.14.186 release. There are 136 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 Thu, 25 Jun 2020 19:52:30 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.14.186-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.14.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah