4.4.208-stable review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 4.4.208-stable review
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +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.4.208-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.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.208-rc1
Eric Dumazet <[email protected]>
tcp: do not send empty skb from tcp_write_xmit()
Faiz Abbas <[email protected]>
mmc: sdhci: Update the tuning failed messages to pr_debug level
Eric Dumazet <[email protected]>
hrtimer: Annotate lockless access to timer->state
Eric Dumazet <[email protected]>
net: icmp: fix data-race in cmp_global_allow()
Eric Dumazet <[email protected]>
netfilter: bridge: make sure to pull arp header in br_nf_forward_arp()
Eric Dumazet <[email protected]>
6pack,mkiss: fix possible deadlock
Florian Westphal <[email protected]>
netfilter: ebtables: compat: reject all padding in matches/watchers
Arnd Bergmann <[email protected]>
net: davinci_cpdma: use dma_addr_t for DMA address
Linus Torvalds <[email protected]>
filldir[64]: remove WARN_ON_ONCE() for bad directory entries
Linus Torvalds <[email protected]>
Make filldir[64]() verify the directory entry filename is valid
Takashi Iwai <[email protected]>
ALSA: hda - Downgrade error message for single-cmd fallback
Johannes Weiner <[email protected]>
kernel: sysctl: make drop_caches write-only
Ding Xiang <[email protected]>
ocfs2: fix passing zero to 'PTR_ERR' warning
Thomas Richter <[email protected]>
s390/cpum_sf: Check for SDBT and SDB consistency
Masahiro Yamada <[email protected]>
libfdt: define INT32_MAX and UINT32_MAX in libfdt_env.h
Arnaldo Carvalho de Melo <[email protected]>
perf regs: Make perf_reg_name() return "unknown" instead of NULL
Diego Elio Pettenò <[email protected]>
cdrom: respect device capabilities during opening action
Masahiro Yamada <[email protected]>
scripts/kallsyms: fix definitely-lost memory leak
Vladimir Oltean <[email protected]>
gpio: mpc8xxx: Don't overwrite default irq_set_type callback
Bart Van Assche <[email protected]>
scsi: target: iscsi: Wait for all commands to finish before freeing a session
peter chang <[email protected]>
scsi: pm80xx: Fix for SATA device discovery
Theodore Ts'o <[email protected]>
ext4: work around deleting a file with i_nlink == 0 safely
Blaž Hrastnik <[email protected]>
HID: Improve Windows Precision Touchpad detection.
Coly Li <[email protected]>
bcache: at least try to shrink 1 node in bch_mca_scan()
Robert Jarzmik <[email protected]>
clk: pxa: fix one of the pxa RTC clocks
Gustavo L. F. Walbon <[email protected]>
powerpc/security: Fix wrong message when RFI Flush is disable
David Hildenbrand <[email protected]>
powerpc/pseries/cmm: Implement release() function for sysfs device
Bean Huo <[email protected]>
scsi: ufs: fix potential bug which ends in system hang
James Smart <[email protected]>
scsi: lpfc: fix: Coverity: lpfc_cmpl_els_rsp(): Null pointer dereferences
Konstantin Khlebnikov <[email protected]>
fs/quota: handle overflows of sysctl fs.quota.* and report as unsigned long
Lee Jones <[email protected]>
mfd: mfd-core: Honour Device Tree's request to disable a child-device
Paul Cercueil <[email protected]>
irqchip: ingenic: Error out if IRQ domain creation failed
Florian Fainelli <[email protected]>
irqchip/irq-bcm7038-l1: Enable parent IRQ if necessary
Jeffrey Hugo <[email protected]>
clk: qcom: Allow constant ratio freq tables for rcg
James Smart <[email protected]>
scsi: lpfc: Fix duplicate unreg_rpi error in port offline flow
Bart Van Assche <[email protected]>
scsi: tracing: Fix handling of TRANSFER LENGTH == 0 for READ(6) and WRITE(6)
Jan Kara <[email protected]>
jbd2: Fix statistics for the number of logged blocks
Anthony Steinhauser <[email protected]>
powerpc/security/book3s64: Report L1TF status in sysfs
Chuhong Yuan <[email protected]>
clocksource/drivers/asm9260: Add a check for of_clk_get
Eric Dumazet <[email protected]>
dma-debug: add a schedule point in debug_dma_dump_mappings()
Michael Ellerman <[email protected]>
powerpc/pseries: Mark accumulate_stolen_time() as notrace
Dan Carpenter <[email protected]>
scsi: csiostor: Don't enable IRQs too early
James Smart <[email protected]>
scsi: lpfc: Fix SLI3 hba in loop mode not discovering devices
David Disseldorp <[email protected]>
scsi: target: compare full CHAP_A Algorithm strings
Thierry Reding <[email protected]>
iommu/tegra-smmu: Fix page tables in > 4 GiB memory
Evan Green <[email protected]>
Input: atmel_mxt_ts - disable IRQ across suspend
James Smart <[email protected]>
scsi: lpfc: Fix locking on mailbox command completion
Sreekanth Reddy <[email protected]>
scsi: mpt3sas: Fix clear pending bit in ioctl status
Masami Hiramatsu <[email protected]>
perf probe: Fix to show function entry line as probe-able
Yangbo Lu <[email protected]>
mmc: sdhci-of-esdhc: fix P2020 errata handling
Christophe Leroy <[email protected]>
powerpc/irq: fix stack overflow verification
Jan Kara <[email protected]>
ext4: check for directory entries too close to block end
Ian Abbott <[email protected]>
staging: comedi: gsc_hpdi: check dma_alloc_coherent() return value
Hans de Goede <[email protected]>
platform/x86: hp-wmi: Make buffer for HPWMI_FEATURE2_QUERY 128 bytes
Erkka Talvitie <[email protected]>
USB: EHCI: Do not return -EPIPE when hub is disconnected
Suwan Kim <[email protected]>
usbip: Fix error path of vhci_recv_ret_submit()
Geert Uytterhoeven <[email protected]>
net: dst: Force 4-byte alignment of dst_metrics
Xin Long <[email protected]>
sctp: fully initialize v4 addr in some functions
Cristian Birsan <[email protected]>
net: usb: lan78xx: Fix suspend/resume PHY register access error
Ben Hutchings <[email protected]>
net: qlogic: Fix error paths in ql_alloc_large_buffers()
Jia-Ju Bai <[email protected]>
net: nfc: nci: fix a possible sleep-in-atomic-context bug in nci_uart_tty_receive()
Jiangfeng Xiao <[email protected]>
net: hisilicon: Fix a BUG trigered by wrong bytes_compl
Russell King <[email protected]>
mod_devicetable: fix PHY module format
Chuhong Yuan <[email protected]>
fjes: fix missed check in fjes_acpi_add
Mao Wenan <[email protected]>
af_packet: set defaule value for tmo
Takashi Iwai <[email protected]>
ALSA: pcm: Avoid possible info leaks from PCM stream buffers
Filipe Manana <[email protected]>
Btrfs: fix removal logic of the tree mod log that leads to use-after-free issues
Josef Bacik <[email protected]>
btrfs: abort transaction after failed inode updates in create_subvol
Dan Carpenter <[email protected]>
btrfs: return error pointer from alloc_test_extent_buffer
Josef Bacik <[email protected]>
btrfs: do not call synchronize_srcu() in inode_tree_del
Guenter Roeck <[email protected]>
usb: xhci: Fix build warning seen with CONFIG_PM=n
Faiz Abbas <[email protected]>
Revert "mmc: sdhci: Fix incorrect switch to HS mode"
Russell King <[email protected]>
net: phy: initialise phydev speed and duplex sanely
Hewenliang <[email protected]>
libtraceevent: Fix memory leakage in copy_filter_type
Michael Ellerman <[email protected]>
crypto: vmx - Avoid weird build failures
Corentin Labbe <[email protected]>
crypto: sun4i-ss - Fix 64-bit size_t warnings on sun4i-ss-hash.c
Andy Shevchenko <[email protected]>
fbtft: Make sure string is NULL terminated
Johannes Berg <[email protected]>
iwlwifi: check kasprintf() return value
Omar Sandoval <[email protected]>
btrfs: don't prematurely free work in end_workqueue_fn()
Chuhong Yuan <[email protected]>
spi: tegra20-slink: add missed clk_unprepare
Lianbo Jiang <[email protected]>
x86/crash: Add a forward declaration of struct kimage
Viresh Kumar <[email protected]>
cpufreq: Register drivers only after CPU devices have been registered
Sudip Mukherjee <[email protected]>
parport: load lowlevel driver if ports not found
Ben Zhang <[email protected]>
ASoC: rt5677: Mark reg RT5677_PWR_ANLG2 as volatile
Chuhong Yuan <[email protected]>
spi: pxa2xx: Add missed security checks
Robert Richter <[email protected]>
EDAC/ghes: Fix grain calculation
Chuhong Yuan <[email protected]>
media: si470x-i2c: add missed operations in remove
Mike Isely <[email protected]>
media: pvrusb2: Fix oops on tear-down when radio support is not present
Miaoqing Pan <[email protected]>
ath10k: fix get invalid tx rate for Mesh metric
Masami Hiramatsu <[email protected]>
perf probe: Filter out instances except for inlined subroutine and subprogram
Masami Hiramatsu <[email protected]>
perf probe: Skip end-of-sequence and non statement lines
Masami Hiramatsu <[email protected]>
perf probe: Fix to show calling lines of inlined functions
Masami Hiramatsu <[email protected]>
perf probe: Return a better scope DIE if there is no best scope
Masami Hiramatsu <[email protected]>
perf probe: Skip overlapped location on searching variables
Masami Hiramatsu <[email protected]>
perf probe: Fix to show inlined function callsite without entry_pc
Masami Hiramatsu <[email protected]>
perf probe: Fix to show ranges of variables in functions without entry_pc
Masami Hiramatsu <[email protected]>
perf probe: Fix to probe an inline function which has no entry pc
Masami Hiramatsu <[email protected]>
perf probe: Walk function lines in lexical blocks
Masami Hiramatsu <[email protected]>
perf probe: Fix to list probe event with correct line number
Masami Hiramatsu <[email protected]>
perf probe: Fix to find range-only function instance
Ping-Ke Shih <[email protected]>
rtlwifi: fix memory leak in rtl92c_set_fw_rsvdpagepkt()
Pan Bian <[email protected]>
spi: img-spfi: fix potential double release
Manish Chopra <[email protected]>
bnx2x: Fix PF-VF communication over multi-cos queues.
Geert Uytterhoeven <[email protected]>
pinctrl: sh-pfc: sh7734: Fix duplicate TCLK1_B
John Garry <[email protected]>
libata: Ensure ata_port probe has completed before detach
Yunfeng Ye <[email protected]>
arm64: psci: Reduce the waiting time for cpu_psci_cpu_kill()
Thomas Gleixner <[email protected]>
x86/ioapic: Prevent inconsistent state when moving an interrupt
Kangjie Lu <[email protected]>
drm/gma500: fix memory disclosures due to uninitialized bytes
Mattijs Korpershoek <[email protected]>
Bluetooth: hci_core: fix init for HCI_USER_CHANNEL
Miquel Raynal <[email protected]>
iio: adc: max1027: Reset the device at probe time
Jin Yao <[email protected]>
perf report: Add warning when libunwind not compiled in
Sami Tolvanen <[email protected]>
x86/mm: Use the correct function type for native_set_fixmap()
Stephan Gerhold <[email protected]>
extcon: sm5502: Reset registers during initialization
Benoit Parrot <[email protected]>
media: ti-vpe: vpe: Make sure YUYV is set as default format
Benoit Parrot <[email protected]>
media: ti-vpe: vpe: fix a v4l2-compliance failure about frame sequence number
Benoit Parrot <[email protected]>
media: ti-vpe: vpe: fix a v4l2-compliance warning about invalid pixel format
Navid Emamdoost <[email protected]>
mwifiex: pcie: Fix memory leak in mwifiex_pcie_init_evt_ring
Daniel T. Lee <[email protected]>
samples: pktgen: fix proc_cmd command result check logic
Yang Yingliang <[email protected]>
media: flexcop-usb: fix NULL-ptr deref in flexcop_usb_transfer_init()
Yizhuo <[email protected]>
regulator: max8907: Fix the usage of uninitialized variable in max8907_regulator_probe()
Tony Lindgren <[email protected]>
hwrng: omap3-rom - Call clk_disable_unprepare() on exit only if not idled
Veeraiyan Chidambaram <[email protected]>
usb: renesas_usbhs: add suspend event support in gadget mode
Nathan Chancellor <[email protected]>
tools/power/cpupower: Fix initializer override in hsw_ext_cstates
Janusz Krzysztofik <[email protected]>
media: ov6650: Fix stored frame format not in sync with hardware
Benoit Parrot <[email protected]>
media: i2c: ov2659: Fix missing 720p register config
Benoit Parrot <[email protected]>
media: i2c: ov2659: fix s_stream return value
Benoit Parrot <[email protected]>
media: am437x-vpfe: Setting STD to current value is not an error
Max Gurtovoy <[email protected]>
IB/iser: bound protection_sg size by data_sg size
Navid Emamdoost <[email protected]>
rtlwifi: prevent memory leak in rtl_usb_probe
Connor Kuehl <[email protected]>
staging: rtl8188eu: fix possible null dereference
Lukasz Majewski <[email protected]>
spi: Add call to spi_slave_abort() function when spidev driver is released
Krzysztof Wilczynski <[email protected]>
iio: light: bh1750: Resolve compiler warning and make code more readable
Sean Paul <[email protected]>
drm: mst: Fix query_payload ack reply struct
Takashi Iwai <[email protected]>
ALSA: hda/ca0132 - Avoid endless loop
Takashi Iwai <[email protected]>
ALSA: hda/ca0132 - Keep power on during processing DSP response
Josef Bacik <[email protected]>
btrfs: handle ENOENT in btrfs_uuid_tree_iterate
Josef Bacik <[email protected]>
btrfs: do not leak reloc root if we fail to read the fs root
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/compressed/libfdt_env.h | 4 +- arch/arm64/kernel/psci.c | 15 ++-- arch/powerpc/boot/libfdt_env.h | 2 + arch/powerpc/kernel/irq.c | 4 +- arch/powerpc/kernel/security.c | 21 +++--- arch/powerpc/kernel/time.c | 2 +- arch/powerpc/platforms/pseries/cmm.c | 5 ++ arch/s390/kernel/perf_cpum_sf.c | 17 ++++- arch/sh/include/cpu-sh4/cpu/sh7734.h | 2 +- arch/x86/include/asm/crash.h | 2 + arch/x86/include/asm/fixmap.h | 2 +- arch/x86/kernel/apic/io_apic.c | 9 ++- arch/x86/mm/pgtable.c | 4 +- drivers/ata/libata-core.c | 3 + drivers/cdrom/cdrom.c | 12 +++- drivers/char/hw_random/omap3-rom-rng.c | 3 +- drivers/clk/pxa/clk-pxa27x.c | 1 + drivers/clk/qcom/clk-rcg2.c | 2 + drivers/clk/qcom/common.c | 3 + drivers/clocksource/asm9260_timer.c | 4 ++ drivers/cpufreq/cpufreq.c | 7 ++ drivers/crypto/sunxi-ss/sun4i-ss-hash.c | 12 ++-- drivers/crypto/vmx/Makefile | 6 +- drivers/edac/ghes_edac.c | 10 ++- drivers/extcon/extcon-sm5502.c | 4 ++ drivers/extcon/extcon-sm5502.h | 2 + drivers/gpio/gpio-mpc8xxx.c | 3 +- drivers/gpu/drm/gma500/oaktrail_crtc.c | 2 + drivers/hid/hid-core.c | 4 ++ drivers/iio/adc/max1027.c | 8 +++ drivers/iio/light/bh1750.c | 4 +- drivers/infiniband/ulp/iser/iscsi_iser.c | 1 + drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++ drivers/iommu/tegra-smmu.c | 11 +-- drivers/irqchip/irq-bcm7038-l1.c | 4 ++ drivers/irqchip/irq-ingenic.c | 15 ++-- drivers/md/bcache/btree.c | 2 + drivers/media/i2c/ov2659.c | 18 +++-- drivers/media/i2c/soc_camera/ov6650.c | 9 ++- drivers/media/platform/am437x/am437x-vpfe.c | 4 ++ drivers/media/platform/ti-vpe/vpe.c | 16 +++-- drivers/media/radio/si470x/radio-si470x-i2c.c | 2 + drivers/media/usb/b2c2/flexcop-usb.c | 8 ++- drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 9 ++- drivers/mfd/mfd-core.c | 5 ++ drivers/mmc/host/sdhci-of-esdhc.c | 4 +- drivers/mmc/host/sdhci.c | 6 +- drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | 16 +++-- drivers/net/ethernet/hisilicon/hip04_eth.c | 2 +- drivers/net/ethernet/qlogic/qla3xxx.c | 8 +-- drivers/net/ethernet/ti/davinci_cpdma.c | 12 ++-- drivers/net/fjes/fjes_main.c | 3 + drivers/net/hamradio/6pack.c | 4 +- drivers/net/hamradio/mkiss.c | 4 +- drivers/net/phy/phy_device.c | 4 +- drivers/net/usb/lan78xx.c | 1 + drivers/net/wireless/ath/ath10k/txrx.c | 2 + drivers/net/wireless/iwlwifi/dvm/led.c | 3 + drivers/net/wireless/iwlwifi/mvm/led.c | 3 + drivers/net/wireless/mwifiex/pcie.c | 5 +- .../net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 2 + drivers/net/wireless/realtek/rtlwifi/usb.c | 5 +- drivers/parport/share.c | 21 ++++++ drivers/pinctrl/sh-pfc/pfc-sh7734.c | 4 +- drivers/platform/x86/hp-wmi.c | 2 +- drivers/regulator/max8907-regulator.c | 15 +++- drivers/scsi/csiostor/csio_lnode.c | 15 ++-- drivers/scsi/lpfc/lpfc_els.c | 2 +- drivers/scsi/lpfc/lpfc_nportdisc.c | 4 +- drivers/scsi/lpfc/lpfc_sli.c | 15 +++- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 3 +- drivers/scsi/pm8001/pm80xx_hwi.c | 2 + drivers/scsi/scsi_trace.c | 11 +-- drivers/scsi/ufs/ufshcd.c | 2 +- drivers/spi/spi-img-spfi.c | 2 + drivers/spi/spi-pxa2xx.c | 6 ++ drivers/spi/spi-tegra20-slink.c | 5 +- drivers/spi/spidev.c | 3 + drivers/staging/comedi/drivers/gsc_hpdi.c | 10 +++ drivers/staging/fbtft/fbtft-core.c | 2 +- drivers/staging/rtl8188eu/core/rtw_xmit.c | 4 +- drivers/target/iscsi/iscsi_target.c | 10 ++- drivers/target/iscsi/iscsi_target_auth.c | 2 +- drivers/usb/host/ehci-q.c | 13 +++- drivers/usb/host/xhci-pci.c | 2 +- drivers/usb/renesas_usbhs/common.h | 3 +- drivers/usb/renesas_usbhs/mod_gadget.c | 12 +++- drivers/usb/usbip/vhci_rx.c | 13 ++-- fs/btrfs/ctree.c | 2 +- fs/btrfs/disk-io.c | 2 +- fs/btrfs/extent_io.c | 6 +- fs/btrfs/inode.c | 1 - fs/btrfs/ioctl.c | 10 ++- fs/btrfs/relocation.c | 1 + fs/btrfs/tests/qgroup-tests.c | 4 +- fs/btrfs/uuid-tree.c | 2 + fs/ext4/dir.c | 5 ++ fs/ext4/namei.c | 11 ++- fs/jbd2/commit.c | 4 +- fs/ocfs2/acl.c | 4 +- fs/quota/dquot.c | 29 ++++---- fs/readdir.c | 40 +++++++++++ include/drm/drm_dp_mst_helper.h | 2 +- include/linux/hrtimer.h | 14 ++-- include/linux/libfdt_env.h | 3 + include/linux/mod_devicetable.h | 4 +- include/linux/quota.h | 2 +- include/net/dst.h | 2 +- include/scsi/iscsi_proto.h | 1 + kernel/sysctl.c | 2 +- kernel/time/hrtimer.c | 11 +-- lib/dma-debug.c | 1 + net/bluetooth/hci_core.c | 9 ++- net/bridge/br_netfilter_hooks.c | 3 + net/bridge/netfilter/ebtables.c | 33 +++++---- net/ipv4/icmp.c | 11 +-- net/ipv4/tcp_output.c | 8 +++ net/nfc/nci/uart.c | 2 +- net/packet/af_packet.c | 3 +- net/sctp/protocol.c | 4 ++ samples/pktgen/functions.sh | 17 +++-- scripts/kallsyms.c | 2 + sound/core/pcm_native.c | 4 ++ sound/pci/hda/hda_controller.c | 2 +- sound/pci/hda/patch_ca0132.c | 7 +- sound/soc/codecs/rt5677.c | 1 + tools/lib/traceevent/parse-filter.c | 9 ++- tools/perf/builtin-report.c | 7 ++ tools/perf/util/dwarf-aux.c | 80 ++++++++++++++++++---- tools/perf/util/dwarf-aux.h | 3 + tools/perf/util/perf_regs.h | 2 +- tools/perf/util/probe-finder.c | 43 ++++++++++-- .../cpupower/utils/idle_monitor/hsw_ext_idle.c | 1 - 134 files changed, 731 insertions(+), 241 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/137 btrfs: do not leak reloc root if we fail to read the fs root
From: Josef Bacik <[email protected]>
commit ca1aa2818a53875cfdd175fb5e9a2984e997cce9 upstream.
If we fail to read the fs root corresponding with a reloc root we'll just break out and free the reloc roots. But we remove our current reloc_root from this list higher up, which means we'll leak this reloc_root. Fix this by adding ourselves back to the reloc_roots list so we are properly cleaned up.
--- fs/btrfs/relocation.c | 1 + 1 file changed, 1 insertion(+)
fs/btrfs/relocation.c +1 -0
@@ -4454,6 +4454,7 @@ int btrfs_recover_relocation(struct btrf reloc_root->root_key.offset);if (IS_ERR (fs_root)) { err =PTR_ERR (fs_root); +list_add_tail (&reloc_root->root_list, &reloc_roots); goto out_free; }
Greg Kroah-Hartman
maintainerPATCH 2/137 btrfs: handle ENOENT in btrfs_uuid_tree_iterate
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
commit 714cd3e8cba6841220dce9063a7388a81de03825 upstream.
If we get an -ENOENT back from btrfs_uuid_iter_rem when iterating the uuid tree we'll just continue and do btrfs_next_item(). However we've done a btrfs_release_path() at this point and no longer have a valid path. So increment the key and go back and do a normal search.
--- fs/btrfs/uuid-tree.c | 2 ++ 1 file changed, 2 insertions(+)
fs/btrfs/uuid-tree.c +2 -0
@@ -332,6 +332,8 @@ again_search_slot: }if (ret <0 && ret != -ENOENT ) goto out; + key.offset++; + goto again_search_slot; } item_size -=sizeof (subid_le); offset +=sizeof (subid_le);
Greg Kroah-Hartman
maintainerPATCH 3/137 ALSA: hda/ca0132 - Keep power on during processing DSP response
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 377bc0cfabce0244632dada19060839ced4e6949 upstream.
We need to keep power on while processing the DSP response via unsol event. Each snd_hda_codec_read() call does the power management, so it should work normally, but still it's safer to keep the power up for the whole function.
--- sound/pci/hda/patch_ca0132.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/patch_ca0132.c +2 -0
@@ -4424,12 +4424,14 @@ static void ca0132_process_dsp_response(struct ca0132_spec *spec = codec->spec;codec_dbg (codec,"ca0132_process_dsp_response\n" ); +snd_hda_power_up_pm (codec);if (spec->wait_scp) {if (dspio_get_response_data (codec) >=0 ) spec->wait_scp =0 ; }dspio_clear_response_queue (codec); +snd_hda_power_down_pm (codec); }static void hp_callback (struct hda_codec *codec,struct hda_jack_callback *cb)
Greg Kroah-Hartman
maintainerPATCH 4/137 ALSA: hda/ca0132 - Avoid endless loop
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit cb04fc3b6b076f67d228a0b7d096c69ad486c09c upstream.
Introduce a timeout to dspio_clear_response_queue() so that it won't be caught in an endless loop even if the hardware doesn't respond properly.
--- sound/pci/hda/patch_ca0132.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/pci/hda/patch_ca0132.c +3 -2
@@ -1300,13 +1300,14 @@ struct scp_msg {static void dspio_clear_response_queue (struct hda_codec *codec) { +unsigned long timeout = jiffies +msecs_to_jiffies (1000 );unsigned int dummy =0 ; -int status =-1 ; +int status;/* clear all from the response queue */ do { status =dspio_read (codec, &dummy); - }while (status ==0 ); + }while (status ==0 &&time_before (jiffies, timeout)); }static int dspio_get_response_data (struct hda_codec *codec)
Greg Kroah-Hartman
maintainerPATCH 5/137 drm: mst: Fix query_payload ack reply struct
In reply to Greg Kroah-HartmanFrom: Sean Paul <[email protected]>
[ Upstream commit 268de6530aa18fe5773062367fd119f0045f6e88 ]
Spec says[1] Allocated_PBN is 16 bits
[1]- DisplayPort 1.2 Spec, Section 2.11.9.8, Table 2-98
--- include/drm/drm_dp_mst_helper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/drm/drm_dp_mst_helper.h +1 -1
@@ -303,7 +303,7 @@ struct drm_dp_resource_status_notify {struct drm_dp_query_payload_ack_reply {u8 port_number; -u8 allocated_pbn; +u16 allocated_pbn; };struct drm_dp_sideband_msg_req_body {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 6/137 iio: light: bh1750: Resolve compiler warning and make code more readable
In reply to Greg Kroah-HartmanFrom: Krzysztof Wilczynski <[email protected]>
[ Upstream commit f552fde983d378e7339f9ea74a25f918563bf0d3 ]
Separate the declaration of struct bh1750_chip_info from definition of bh1750_chip_info_tbl[] in a single statement as it makes the code hard to read, and with the extra newline it makes it look as if the bh1750_chip_info_tbl[] had no explicit type.
This change also resolves the following compiler warning about the unusual position of the static keyword that can be seen when building with warnings enabled (W=1):
drivers/iio/light/bh1750.c:64:1: warning:
‘static’ is not at beginning of declaration [-Wold-style-declaration]
Related to commit 3a11fbb037a1 ("iio: light: add support for ROHM BH1710/BH1715/BH1721/BH1750/BH1751 ambient light sensors").
--- drivers/iio/light/bh1750.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/light/bh1750.c +2 -2
@@ -62,9 +62,9 @@ struct bh1750_chip_info {u16 int_time_low_mask;u16 int_time_high_mask; -} +}; -static const bh1750_chip_info_tbl[] = { +static const struct bh1750_chip_info bh1750_chip_info_tbl[] = { [BH1710 ] = {140 ,1022 ,300 ,400 ,250000000 ,2 ,0x001F ,0x03E0 }, [BH1721 ] = {140 ,1020 ,300 ,400 ,250000000 ,2 ,0x0010 ,0x03E0 }, [BH1750 ] = {31 ,254 ,69 ,1740 ,57500000 ,1 ,0x001F ,0x00E0 },
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 7/137 spi: Add call to spi_slave_abort() function when spidev driver is released
In reply to Greg Kroah-HartmanFrom: Lukasz Majewski <[email protected]>
[ Upstream commit 9f918a728cf86b2757b6a7025e1f46824bfe3155 ]
This change is necessary for spidev devices (e.g. /dev/spidev3.0) working in the slave mode (like NXP's dspi driver for Vybrid SoC).
When SPI HW works in this mode - the master is responsible for providing CS and CLK signals. However, when some fault happens - like for example distortion on SPI lines - the SPI Linux driver needs a chance to recover from this abnormal situation and prepare itself for next (correct) transmission.
This change doesn't pose any threat on drivers working in master mode as spi_slave_abort() function checks if SPI slave mode is supported.
--- drivers/spi/spidev.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/spi/spidev.c +3 -0
@@ -662,6 +662,9 @@ static int spidev_release(struct inode *inode, struct file *filp)if (dofree)kfree (spidev); } +#ifdef CONFIG_SPI_SLAVE +spi_slave_abort (spidev->spi); +#endif mutex_unlock (&device_list_lock);return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 8/137 staging: rtl8188eu: fix possible null dereference
In reply to Greg Kroah-HartmanFrom: Connor Kuehl <[email protected]>
[ Upstream commit 228241944a48113470d3c3b46c88ba7fbe0a274b ]
Inside a nested 'else' block at the beginning of this function is a call that assigns 'psta' to the return value of 'rtw_get_stainfo()'. If 'rtw_get_stainfo()' returns NULL and the flow of control reaches the 'else if' where 'psta' is dereferenced, then we will dereference a NULL pointer.
Fix this by checking if 'psta' is not NULL before reading its 'psta->qos_option' data member.
Addresses-Coverity: ("Dereference null return value")
--- drivers/staging/rtl8188eu/core/rtw_xmit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/rtl8188eu/core/rtw_xmit.c +2 -2
@@ -822,7 +822,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattrmemcpy (pwlanhdr->addr2,get_bssid (pmlmepriv),ETH_ALEN );memcpy (pwlanhdr->addr3, pattrib->src,ETH_ALEN ); -if (psta->qos_option) +if (psta && psta->qos_option) qos_option = true; }else if (check_fwstate (pmlmepriv,WIFI_ADHOC_STATE ) ||check_fwstate (pmlmepriv,WIFI_ADHOC_MASTER_STATE )) {
@@ -830,7 +830,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattrmemcpy (pwlanhdr->addr2, pattrib->src,ETH_ALEN );memcpy (pwlanhdr->addr3,get_bssid (pmlmepriv),ETH_ALEN ); -if (psta->qos_option) +if (psta && psta->qos_option) qos_option = true; }else {RT_TRACE (_module_rtl871x_xmit_c_, _drv_err_, ("fw_state:%x is not allowed to xmit frame\n" ,get_fwstate (pmlmepriv)));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 9/137 rtlwifi: prevent memory leak in rtl_usb_probe
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit 3f93616951138a598d930dcaec40f2bfd9ce43bb ]
In rtl_usb_probe if allocation for usb_data fails the allocated hw should be released. In addition the allocated rtlpriv->usb_data should be released on error handling path.
--- drivers/net/wireless/realtek/rtlwifi/usb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtlwifi/usb.c +4 -1
@@ -1094,8 +1094,10 @@ int rtl_usb_probe(struct usb_interface *intf, rtlpriv->hw = hw; rtlpriv->usb_data =kzalloc (RTL_USB_MAX_RX_COUNT *sizeof (u32),GFP_KERNEL ); -if (!rtlpriv->usb_data) +if (!rtlpriv->usb_data) { +ieee80211_free_hw (hw);return -ENOMEM ; + }/* this spin lock must be initialized early */ spin_lock_init (&rtlpriv->locks.usb_lock);
@@ -1158,6 +1160,7 @@ error_out:_rtl_usb_io_handler_release (hw);usb_put_dev (udev);complete (&rtlpriv->firmware_loading_complete); +kfree (rtlpriv->usb_data);return -ENODEV ; }EXPORT_SYMBOL (rtl_usb_probe);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 10/137 IB/iser: bound protection_sg size by data_sg size
In reply to Greg Kroah-HartmanFrom: Max Gurtovoy <[email protected]>
[ Upstream commit 7718cf03c3ce4b6ebd90107643ccd01c952a1fce ]
In case we don't set the sg_prot_tablesize, the scsi layer assign the default size (65535 entries). We should limit this size since we should take into consideration the underlaying device capability. This cap is considered when calculating the sg_tablesize. Otherwise, for example, we can get that /sys/block/sdb/queue/max_segments is 128 and /sys/block/sdb/queue/max_integrity_segments is 65535.
--- drivers/infiniband/ulp/iser/iscsi_iser.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/ulp/iser/iscsi_iser.c +1 -0
@@ -646,6 +646,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,if (ib_conn->pi_support) {u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap; + shost->sg_prot_tablesize = shost->sg_tablesize;scsi_host_set_prot (shost,iser_dif_prot_caps (sig_caps));scsi_host_set_guard (shost,SHOST_DIX_GUARD_IP |SHOST_DIX_GUARD_CRC );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 11/137 media: am437x-vpfe: Setting STD to current value is not an error
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit 13aa21cfe92ce9ebb51824029d89f19c33f81419 ]
VIDIOC_S_STD should not return an error if the value is identical to the current one.
This error was highlighted by the v4l2-compliance test.
--- drivers/media/platform/am437x/am437x-vpfe.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/platform/am437x/am437x-vpfe.c +4 -0
@@ -1847,6 +1847,10 @@ static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id)if (!(sdinfo->inputs[0 ].capabilities &V4L2_IN_CAP_STD ))return -ENODATA ; +/* if trying to set the same std then nothing to do */ +if (vpfe_standards[vpfe->std_index].std_id == std_id) +return 0 ; +/* If streaming is started, return error */ if (vb2_is_busy (&vpfe->buffer_queue)) {vpfe_err (vpfe,"%s device busy\n" , __func__);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 12/137 media: i2c: ov2659: fix s_stream return value
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit 85c4043f1d403c222d481dfc91846227d66663fb ]
In ov2659_s_stream() return value for invoked function should be checked and propagated.
--- drivers/media/i2c/ov2659.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/media/i2c/ov2659.c +9 -5
@@ -1204,11 +1204,15 @@ static int ov2659_s_stream(struct v4l2_subdev *sd, int on) goto unlock; } -ov2659_set_pixel_clock (ov2659); -ov2659_set_frame_size (ov2659); -ov2659_set_format (ov2659); -ov2659_set_streaming (ov2659,1 ); - ov2659->streaming = on; + ret =ov2659_set_pixel_clock (ov2659); +if (!ret) + ret =ov2659_set_frame_size (ov2659); +if (!ret) + ret =ov2659_set_format (ov2659); +if (!ret) { +ov2659_set_streaming (ov2659,1 ); + ov2659->streaming = on; + } unlock:mutex_unlock (&ov2659->lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 13/137 media: i2c: ov2659: Fix missing 720p register config
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit 9d669fbfca20e6035ead814e55d9ef1a6b500540 ]
The initial registers sequence is only loaded at probe time. Afterward only the resolution and format specific register are modified. Care must be taken to make sure registers modified by one resolution setting are reverted back when another resolution is programmed.
This was not done properly for the 720p case.
--- drivers/media/i2c/ov2659.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/i2c/ov2659.c +4 -0
@@ -419,10 +419,14 @@ static struct sensor_register ov2659_720p[] = { { REG_TIMING_YINC, 0x11 }, { REG_TIMING_VERT_FORMAT, 0x80 }, { REG_TIMING_HORIZ_FORMAT, 0x00 }, + { 0x370a, 0x12 }, { 0x3a03, 0xe8 }, { 0x3a09, 0x6f }, { 0x3a0b, 0x5d }, { 0x3a15, 0x9a }, + { REG_VFIFO_READ_START_H, 0x00 }, + { REG_VFIFO_READ_START_L, 0x80 }, + { REG_ISP_CTRL02, 0x00 }, { REG_NULL, 0x00 }, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 14/137 media: ov6650: Fix stored frame format not in sync with hardware
In reply to Greg Kroah-HartmanFrom: Janusz Krzysztofik <[email protected]>
[ Upstream commit 3143b459de4cdcce67b36827476c966e93c1cf01 ]
The driver stores frame format settings supposed to be in line with hardware state in a device private structure. Since the driver initial submission, those settings are updated before they are actually applied on hardware. If an error occurs on device update, the stored settings my not reflect hardware state anymore and consecutive calls to .get_fmt() may return incorrect information. That in turn may affect ability of a bridge device to use correct DMA transfer settings if such incorrect informmation on active frame format returned by .get_fmt() is used.
Assuming a failed device update means its state hasn't changed, update frame format related settings stored in the device private structure only after they are successfully applied so the stored values always reflect hardware state as closely as possible.
--- drivers/media/i2c/soc_camera/ov6650.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/media/i2c/soc_camera/ov6650.c +6 -3
@@ -611,7 +611,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)dev_err (&client->dev,"Pixel format not handled: 0x%x\n" , code);return -EINVAL ; } - priv->code = code;if (code ==MEDIA_BUS_FMT_Y8_1X8 || code ==MEDIA_BUS_FMT_SBGGR8_1X8 ) {
@@ -637,7 +636,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)dev_dbg (&client->dev,"max resolution: CIF\n" ); coma_mask |=COMA_QCIF ; } - priv->half_scale = half_scale;if (sense) {if (sense->master_clock ==8000000 ) {
@@ -677,8 +675,13 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) ret =ov6650_reg_rmw (client,REG_COMA , coma_set, coma_mask);if (!ret) ret =ov6650_reg_write (client,REG_CLKRC , clkrc); -if (!ret) +if (!ret) { + priv->half_scale = half_scale; + ret =ov6650_reg_rmw (client,REG_COML , coml_set, coml_mask); + } +if (!ret) + priv->code = code;if (!ret) { mf->colorspace = priv->colorspace;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 15/137 tools/power/cpupower: Fix initializer override in hsw_ext_cstates
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 7e5705c635ecfccde559ebbbe1eaf05b5cc60529 ]
When building cpupower with clang, the following warning appears:
utils/idle_monitor/hsw_ext_idle.c:42:16: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
.desc = N_("Processor Package C2"),
^~~~~~~~~~~~~~~~~~~~~~
./utils/helpers/helpers.h:25:33: note: expanded from macro 'N_'
#define N_(String) gettext_noop(String)
^~~~~~
./utils/helpers/helpers.h:23:30: note: expanded from macro
'gettext_noop'
#define gettext_noop(String) String
^~~~~~
utils/idle_monitor/hsw_ext_idle.c:41:16: note: previous initialization
is here
.desc = N_("Processor Package C9"),
^~~~~~~~~~~~~~~~~~~~~~
./utils/helpers/helpers.h:25:33: note: expanded from macro 'N_'
#define N_(String) gettext_noop(String)
^~~~~~
./utils/helpers/helpers.h:23:30: note: expanded from macro
'gettext_noop'
#define gettext_noop(String) String
^~~~~~1 warning generated.
This appears to be a copy and paste or merge mistake because the name and id fields both have PC9 in them, not PC2. Remove the second assignment to fix the warning.
--- tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c | 1 - 1 file changed, 1 deletion(-)
tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c +0 -1
@@ -40,7 +40,6 @@ static cstate_t hsw_ext_cstates[HSW_EXT_CSTATE_COUNT] = { { .name = "PC9", .desc = N_("Processor Package C9"), - .desc = N_("Processor Package C2"), .id = PC9, .range = RANGE_PACKAGE, .get_count_percent = hsw_ext_get_count_percent,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 16/137 usb: renesas_usbhs: add suspend event support in gadget mode
In reply to Greg Kroah-HartmanFrom: Veeraiyan Chidambaram <[email protected]>
[ Upstream commit 39abcc84846bbc0538f13c190b6a9c7e36890cd2 ]
When R-Car Gen3 USB 2.0 is in Gadget mode, if host is detached an interrupt will be generated and Suspended state bit is set in interrupt status register. Interrupt handler will call driver->suspend(composite_suspend) if suspended state bit is set. composite_suspend will call ffs_func_suspend which will post FUNCTIONFS_SUSPEND and will be consumed by user space application via /dev/ep0.
To be able to detect host detach, extend the DVSQ_MASK to cover the Suspended bit of the DVSQ[2:0] bitfield from the Interrupt Status Register 0 (INTSTS0) register and perform appropriate action in the DVST interrupt handler (usbhsg_irq_dev_state).
Without this commit, disconnection of the phone from R-Car-H3 ES2.0 Salvator-X CN9 port is not recognized and reverse role switch does not happen. If phone is connected again it does not enumerate.
With this commit, disconnection will be recognized and reverse role switch will happen by a user space application. If phone is connected again it will enumerate properly and will become visible in the output of 'lsusb'.
--- drivers/usb/renesas_usbhs/common.h | 3 ++- drivers/usb/renesas_usbhs/mod_gadget.c | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-)
drivers/usb/renesas_usbhs/common.h +2 -1
@@ -163,11 +163,12 @@ struct usbhs_priv;#define VBSTS (1 << 7)/* VBUS_0 and VBUSIN_0 Input Status */ #define VALID (1 << 3)/* USB Request Receive */ -#define DVSQ_MASK (0x3 << 4)/* Device State */ +#define DVSQ_MASK (0x7 << 4)/* Device State */ #define POWER_STATE (0 << 4)#define DEFAULT_STATE (1 << 4)#define ADDRESS_STATE (2 << 4)#define CONFIGURATION_STATE (3 << 4) +#define SUSPENDED_STATE (4 << 4)#define CTSQ_MASK (0x7)/* Control Transfer Stage */ #define IDLE_SETUP_STAGE 0/* Idle stage or setup stage */
drivers/usb/renesas_usbhs/mod_gadget.c +9 -3
@@ -467,12 +467,18 @@ static int usbhsg_irq_dev_state(struct usbhs_priv *priv, {struct usbhsg_gpriv *gpriv =usbhsg_priv_to_gpriv (priv);struct device *dev =usbhsg_gpriv_to_dev (gpriv); +int state =usbhs_status_get_device_state (irq_state); gpriv->gadget.speed =usbhs_bus_get_speed (priv); -dev_dbg (dev,"state = %x : speed : %d\n" , -usbhs_status_get_device_state (irq_state), - gpriv->gadget.speed); +dev_dbg (dev,"state = %x : speed : %d\n" , state, gpriv->gadget.speed); + +if (gpriv->gadget.speed !=USB_SPEED_UNKNOWN && + (state &SUSPENDED_STATE )) { +if (gpriv->driver && gpriv->driver->suspend) + gpriv->driver->suspend (&gpriv->gadget); +usb_gadget_set_state (&gpriv->gadget,USB_STATE_SUSPENDED ); + }return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 17/137 hwrng: omap3-rom - Call clk_disable_unprepare() on exit only if not idled
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit eaecce12f5f0d2c35d278e41e1bc4522393861ab ]
When unloading omap3-rom-rng, we'll get the following:
WARNING: CPU: 0 PID: 100 at drivers/clk/clk.c:948 clk_core_disable
This is because the clock may be already disabled by omap3_rom_rng_idle(). Let's fix the issue by checking for rng_idle on exit.
--- drivers/char/hw_random/omap3-rom-rng.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/char/hw_random/omap3-rom-rng.c +2 -1
@@ -119,7 +119,8 @@ static int omap3_rom_rng_probe(struct platform_device *pdev)static int omap3_rom_rng_remove (struct platform_device *pdev) {hwrng_unregister (&omap3_rom_rng_ops); -clk_disable_unprepare (rng_clk); +if (!rng_idle) +clk_disable_unprepare (rng_clk);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 18/137 regulator: max8907: Fix the usage of uninitialized variable in max8907_regulator_probe()
In reply to Greg Kroah-HartmanFrom: Yizhuo <[email protected]>
[ Upstream commit 472b39c3d1bba0616eb0e9a8fa3ad0f56927c7d7 ]
Inside function max8907_regulator_probe(), variable val could be uninitialized if regmap_read() fails. However, val is used later in the if statement to decide the content written to "pmic", which is potentially unsafe.
--- drivers/regulator/max8907-regulator.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/regulator/max8907-regulator.c +12 -3
@@ -299,7 +299,10 @@ static int max8907_regulator_probe(struct platform_device *pdev)memcpy (pmic->desc, max8907_regulators,sizeof (pmic->desc));/* Backwards compatibility with MAX8907B; SD1 uses different voltages */ -regmap_read (max8907->regmap_gen,MAX8907_REG_II2RR , &val); + ret =regmap_read (max8907->regmap_gen,MAX8907_REG_II2RR , &val); +if (ret) +return ret; +if ((val &MAX8907_II2RR_VERSION_MASK ) ==MAX8907_II2RR_VERSION_REV_B ) { pmic->desc[MAX8907_SD1 ].min_uV =637500 ;
@@ -336,14 +339,20 @@ static int max8907_regulator_probe(struct platform_device *pdev) }if (pmic->desc[i].ops == &max8907_ldo_ops) { -regmap_read (config.regmap, pmic->desc[i].enable_reg, + ret =regmap_read (config.regmap, pmic->desc[i].enable_reg, &val); +if (ret) +return ret; +if ((val &MAX8907_MASK_LDO_SEQ ) !=MAX8907_MASK_LDO_SEQ ) pmic->desc[i].ops = &max8907_ldo_hwctl_ops; }else if (pmic->desc[i].ops == &max8907_out5v_ops) { -regmap_read (config.regmap, pmic->desc[i].enable_reg, + ret =regmap_read (config.regmap, pmic->desc[i].enable_reg, &val); +if (ret) +return ret; +if ((val & (MAX8907_MASK_OUT5V_VINEN |MAX8907_MASK_OUT5V_ENSRC )) !=MAX8907_MASK_OUT5V_ENSRC )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 19/137 media: flexcop-usb: fix NULL-ptr deref in flexcop_usb_transfer_init()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 649cd16c438f51d4cd777e71ca1f47f6e0c5e65d ]
If usb_set_interface() failed, iface->cur_altsetting will not be assigned and it will be used in flexcop_usb_transfer_init() It may lead a NULL pointer dereference.
Check usb_set_interface() return value in flexcop_usb_init() and return failed to avoid using this NULL pointer.
--- drivers/media/usb/b2c2/flexcop-usb.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/media/usb/b2c2/flexcop-usb.c +7 -1
@@ -474,7 +474,13 @@ urb_error:static int flexcop_usb_init (struct flexcop_usb *fc_usb) {/* use the alternate setting with the larges buffer */ -usb_set_interface (fc_usb->udev,0 ,1 ); +int ret =usb_set_interface (fc_usb->udev,0 ,1 ); + +if (ret) { +err ("set interface failed." ); +return ret; + } +switch (fc_usb->udev->speed) {case USB_SPEED_LOW :err ("cannot handle USB speed because it is too slow." );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 20/137 samples: pktgen: fix proc_cmd command result check logic
In reply to Greg Kroah-HartmanFrom: Daniel T. Lee <[email protected]>
[ Upstream commit 3cad8f911575191fb3b81d8ed0e061e30f922223 ]
Currently, proc_cmd is used to dispatch command to 'pg_ctrl', 'pg_thread', 'pg_set'. proc_cmd is designed to check command result with grep the "Result:", but this might fail since this string is only shown in 'pg_thread' and 'pg_set'.
This commit fixes this logic by grep-ing the "Result:" string only when the command is not for 'pg_ctrl'.
For clarity of an execution flow, 'errexit' flag has been set.
To cleanup pktgen on exit, trap has been added for EXIT signal.
--- samples/pktgen/functions.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
samples/pktgen/functions.sh +11 -6
@@ -5,6 +5,8 @@ # Author: Jesper Dangaaard Brouer # License: GPL +set -o errexit + ## -- General shell logging cmds -- function err() { local exitcode=$1
@@ -58,6 +60,7 @@ function pg_set() { function proc_cmd() { local result local proc_file=$1 + local status=0 # after shift, the remaining args are contained in $@ shift local proc_ctrl=${PROC_DIR}/$proc_file
@@ -73,13 +76,13 @@ function proc_cmd() { echo "cmd: $@ > $proc_ctrl" fi # Quoting of "$@" is important for space expansion - echo "$@" > "$proc_ctrl" - local status=$? + echo "$@" > "$proc_ctrl" || status=$? - result=$(grep "Result: OK:" $proc_ctrl) - # Due to pgctrl, cannot use exit code $? from grep - if [[ "$result" == "" ]]; then - grep "Result:" $proc_ctrl >&2 + if [[ "$proc_file" != "pgctrl" ]]; then + result=$(grep "Result: OK:" $proc_ctrl) || true + if [[ "$result" == "" ]]; then + grep "Result:" $proc_ctrl >&2 + fi fi if (( $status != 0 )); then err 5 "Write error($status) occurred cmd: \"$@ > $proc_ctrl\""
@@ -105,6 +108,8 @@ function pgset() { fi } +[[ $EUID -eq 0 ]] && trap 'pg_ctrl "reset"' EXIT + ## -- General shell tricks -- function root_check_run_with_sudo() {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 21/137 mwifiex: pcie: Fix memory leak in mwifiex_pcie_init_evt_ring
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit d10dcb615c8e29d403a24d35f8310a7a53e3050c ]
In mwifiex_pcie_init_evt_ring, a new skb is allocated which should be released if mwifiex_map_pci_memory() fails. The release for skb and card->evtbd_ring_vbase is added.
--- drivers/net/wireless/mwifiex/pcie.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/mwifiex/pcie.c +4 -1
@@ -577,8 +577,11 @@ static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)skb_put (skb,MAX_EVENT_SIZE );if (mwifiex_map_pci_memory (adapter, skb,MAX_EVENT_SIZE , -PCI_DMA_FROMDEVICE )) +PCI_DMA_FROMDEVICE )) { +kfree_skb (skb); +kfree (card->evtbd_ring_vbase);return -1 ; + } buf_pa =MWIFIEX_SKB_DMA_ADDR (skb);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 22/137 media: ti-vpe: vpe: fix a v4l2-compliance warning about invalid pixel format
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit 06bec72b250b2cb3ba96fa45c2b8e0fb83745517 ]
v4l2-compliance warns with this message:
warn: v4l2-test-formats.cpp(717): \
TRY_FMT cannot handle an invalid pixelformat.
warn: v4l2-test-formats.cpp(718): \
This may or may not be a problem. For more information see:
warn: v4l2-test-formats.cpp(719): \
http://www.mail-archive.com/[email protected]/msg56550.html
...
test VIDIOC_TRY_FMT: FAIL
We need to make sure that the returns a valid pixel format in all instance. Based on the v4l2 framework convention drivers must return a valid pixel format when the requested pixel format is either invalid or not supported.
--- drivers/media/platform/ti-vpe/vpe.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/media/platform/ti-vpe/vpe.c +9 -4
@@ -330,20 +330,25 @@ enum { };/* find our format description corresponding to the passed v4l2_format */ -static struct vpe_fmt *find_format (struct v4l2_format *f) +static struct vpe_fmt *__find_format (u32 fourcc) {struct vpe_fmt *fmt;unsigned int k;for (k =0 ; k <ARRAY_SIZE (vpe_formats); k++) { fmt = &vpe_formats[k]; -if (fmt->fourcc == f->fmt.pix.pixelformat) +if (fmt->fourcc == fourcc)return fmt; }return NULL ; } +static struct vpe_fmt *find_format (struct v4l2_format *f) +{ +return __find_format (f->fmt.pix.pixelformat); +} +/* * there is one vpe_dev structure in the driver, it is shared by * all instances.
@@ -1434,9 +1439,9 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f,int i, depth, depth_bytes;if (!fmt || !(fmt->types & type)) { -vpe_err (ctx->dev,"Fourcc format (0x%08x) invalid.\n" , +vpe_dbg (ctx->dev,"Fourcc format (0x%08x) invalid.\n" , pix->pixelformat); -return -EINVAL ; + fmt =__find_format (V4L2_PIX_FMT_YUYV ); }if (pix->field !=V4L2_FIELD_NONE && pix->field !=V4L2_FIELD_ALTERNATE )
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 23/137 media: ti-vpe: vpe: fix a v4l2-compliance failure about frame sequence number
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit 2444846c0dbfa4ead21b621e4300ec32c90fbf38 ]
v4l2-compliance fails with this message:
fail: v4l2-test-buffers.cpp(294): \ (int)g_sequence() < seq.last_seq + 1 fail: v4l2-test-buffers.cpp(740): \ buf.check(m2m_q, last_m2m_seq)
fail: v4l2-test-buffers.cpp(974): \
captureBufs(node, q, m2m_q, frame_count, true)
test MMAP: FAIL
The driver is failing to update the source frame sequence number in the vb2 buffer object. Only the destination frame sequence was being updated.
This is only a reporting issue if the user space app actually cares about the frame sequence number. But it is fixed nonetheless.
--- drivers/media/platform/ti-vpe/vpe.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/ti-vpe/vpe.c +1 -0
@@ -1299,6 +1299,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data) d_vb->timecode = s_vb->timecode; d_vb->sequence = ctx->sequence; + s_vb->sequence = ctx->sequence; d_q_data = &ctx->q_data[Q_DATA_DST ];if (d_q_data->flags &Q_DATA_INTERLACED ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 24/137 media: ti-vpe: vpe: Make sure YUYV is set as default format
In reply to Greg Kroah-HartmanFrom: Benoit Parrot <[email protected]>
[ Upstream commit e20b248051ca0f90d84b4d9378e4780bc31f16c6 ]
v4l2-compliance fails with this message:
fail: v4l2-test-formats.cpp(672): \ Video Capture Multiplanar: TRY_FMT(G_FMT) != G_FMT fail: v4l2-test-formats.cpp(672): \ Video Output Multiplanar: TRY_FMT(G_FMT) != G_FMT ...
test VIDIOC_TRY_FMT: FAIL
The default pixel format was setup as pointing to a specific offset in the vpe_formats table assuming it was pointing to the V4L2_PIX_FMT_YUYV entry. This became false after the addition on the NV21 format (see above commid-id)
So instead of hard-coding an offset which might change over time we need to use a lookup helper instead so we know the default will always be what we intended.
--- drivers/media/platform/ti-vpe/vpe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/ti-vpe/vpe.c +1 -1
@@ -2000,7 +2000,7 @@ static int vpe_open(struct file *file)v4l2_ctrl_handler_setup (hdl); s_q_data = &ctx->q_data[Q_DATA_SRC ]; - s_q_data->fmt = &vpe_formats[2 ]; + s_q_data->fmt =__find_format (V4L2_PIX_FMT_YUYV ); s_q_data->width =1920 ; s_q_data->height =1080 ; s_q_data->bytesperline[VPE_LUMA] = (s_q_data->width *
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 25/137 extcon: sm5502: Reset registers during initialization
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit 6942635032cfd3e003e980d2dfa4e6323a3ce145 ]
On some devices (e.g. Samsung Galaxy A5 (2015)), the bootloader seems to keep interrupts enabled for SM5502 when booting Linux. Changing the cable state (i.e. plugging in a cable) - until the driver is loaded - will therefore produce an interrupt that is never read.
In this situation, the cable state will be stuck forever on the initial state because SM5502 stops sending interrupts. This can be avoided by clearing those pending interrupts after the driver has been loaded.
One way to do this is to reset all registers to default state by writing to SM5502_REG_RESET. This ensures that we start from a clean state, with all interrupts disabled.
--- drivers/extcon/extcon-sm5502.c | 4 ++++ drivers/extcon/extcon-sm5502.h | 2 ++ 2 files changed, 6 insertions(+)
drivers/extcon/extcon-sm5502.c +4 -0
@@ -69,6 +69,10 @@ struct sm5502_muic_info {/* Default value of SM5502 register to bring up MUIC device. */ static struct reg_data sm5502_reg_data[] = { { + .reg =SM5502_REG_RESET , + .val =SM5502_REG_RESET_MASK , + .invert = true, + }, { .reg =SM5502_REG_CONTROL , .val =SM5502_REG_CONTROL_MASK_INT_MASK , .invert = false,
drivers/extcon/extcon-sm5502.h +2 -0
@@ -241,6 +241,8 @@ enum sm5502_reg {#define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \ | (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT)) +#define SM5502_REG_RESET_MASK (0x1) +/* SM5502 Interrupts */ enum sm5502_irq {/* INT1 */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 26/137 x86/mm: Use the correct function type for native_set_fixmap()
In reply to Greg Kroah-HartmanFrom: Sami Tolvanen <[email protected]>
[ Upstream commit f53e2cd0b8ab7d9e390414470bdbd830f660133f ]
We call native_set_fixmap indirectly through the function pointer struct pv_mmu_ops::set_fixmap, which expects the first parameter to be 'unsigned' instead of 'enum fixed_addresses'. This patch changes the function type for native_set_fixmap to match the pointer, which fixes indirect call mismatches with Control-Flow Integrity (CFI) checking.
--- arch/x86/include/asm/fixmap.h | 2 +- arch/x86/mm/pgtable.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/x86/include/asm/fixmap.h +1 -1
@@ -147,7 +147,7 @@ extern pgprot_t kmap_prot;extern pte_t *pkmap_page_table;void __native_set_fixmap (enum fixed_addresses idx,pte_t pte); -void native_set_fixmap (enum fixed_addresses idx, +void native_set_fixmap (unsigned /* enum fixed_addresses */ idx,phys_addr_t phys,pgprot_t flags);#ifndef CONFIG_PARAVIRT
arch/x86/mm/pgtable.c +2 -2
@@ -567,8 +567,8 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) fixmaps_set++; } -void native_set_fixmap (enum fixed_addresses idx,phys_addr_t phys, -pgprot_t flags) +void native_set_fixmap (unsigned /* enum fixed_addresses */ idx, +phys_addr_t phys,pgprot_t flags) {__native_set_fixmap (idx,pfn_pte (phys >>PAGE_SHIFT , flags)); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 27/137 perf report: Add warning when libunwind not compiled in
In reply to Greg Kroah-HartmanFrom: Jin Yao <[email protected]>
[ Upstream commit 800d3f561659b5436f8c57e7c26dd1f6928b5615 ]
We received a user report that call-graph DWARF mode was enabled in 'perf record' but 'perf report' didn't unwind the callstack correctly. The reason was, libunwind was not compiled in.
We can use 'perf -vv' to check the compiled libraries but it would be valuable to report a warning to user directly (especially valuable for a perf newbie).
The warning is:
Warning:
Please install libunwind development packages during the perf build.
Both TUI and stdio are supported.
--- tools/perf/builtin-report.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/builtin-report.c +7 -0
@@ -285,6 +285,13 @@ static int report__setup_sample_type(struct report *rep) PERF_SAMPLE_BRANCH_ANY)) rep->nonany_branch_mode = true; +#ifndef HAVE_LIBUNWIND_SUPPORT +if (dwarf_callchain_users) { +ui__warning ("Please install libunwind development packages " +"during the perf build.\n" ); + } +#endif +return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 28/137 iio: adc: max1027: Reset the device at probe time
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit db033831b4f5589f9fcbadb837614a7c4eac0308 ]
All the registers are configured by the driver, let's reset the chip at probe time, avoiding any conflict with a possible earlier configuration.
--- drivers/iio/adc/max1027.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/iio/adc/max1027.c +8 -0
@@ -470,6 +470,14 @@ static int max1027_probe(struct spi_device *spi) goto fail_dev_register; } +/* Internal reset */ + st->reg =MAX1027_RST_REG ; + ret =spi_write (st->spi, &st->reg,1 ); +if (ret <0 ) { +dev_err (&indio_dev->dev,"Failed to reset the ADC\n" ); +return ret; + } +/* Disable averaging */ st->reg =MAX1027_AVG_REG ; ret =spi_write (st->spi, &st->reg,1 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 29/137 Bluetooth: hci_core: fix init for HCI_USER_CHANNEL
In reply to Greg Kroah-HartmanFrom: Mattijs Korpershoek <[email protected]>
[ Upstream commit eb8c101e28496888a0dcfe16ab86a1bee369e820 ]
During the setup() stage, HCI device drivers expect the chip to acknowledge its setup() completion via vendor specific frames.
If userspace opens() such HCI device in HCI_USER_CHANNEL [1] mode, the vendor specific frames are never tranmitted to the driver, as they are filtered in hci_rx_work().
Allow HCI devices which operate in HCI_USER_CHANNEL mode to receive frames if the HCI device is is HCI_INIT state.
[1] https://www.spinics.net/lists/linux-bluetooth/msg37345.html
--- net/bluetooth/hci_core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
net/bluetooth/hci_core.c +8 -1
@@ -4459,7 +4459,14 @@ static void hci_rx_work(struct work_struct *work)hci_send_to_sock (hdev, skb); } -if (hci_dev_test_flag (hdev,HCI_USER_CHANNEL )) { +/* If the device has been opened in HCI_USER_CHANNEL, +* the userspace has exclusive access to device. +* When device is HCI_INIT, we still need to process +* the data packets to the driver in order +* to complete its setup(). +*/ +if (hci_dev_test_flag (hdev,HCI_USER_CHANNEL ) && + !test_bit (HCI_INIT , &hdev->flags)) {kfree_skb (skb);continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 30/137 drm/gma500: fix memory disclosures due to uninitialized bytes
In reply to Greg Kroah-HartmanFrom: Kangjie Lu <[email protected]>
[ Upstream commit ec3b7b6eb8c90b52f61adff11b6db7a8db34de19 ]
"clock" may be copied to "best_clock". Initializing best_clock is not sufficient. The fix initializes clock as well to avoid memory disclosures and informaiton leaks.
--- drivers/gpu/drm/gma500/oaktrail_crtc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/gma500/oaktrail_crtc.c +2 -0
@@ -139,6 +139,7 @@ static bool mrst_sdvo_find_best_pll(const struct gma_limit_t *limit,s32 freq_error, min_error =100000 ;memset (best_clock,0 ,sizeof (*best_clock)); +memset (&clock,0 ,sizeof (clock));for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) { for (clock.n = limit->n.min; clock.n <= limit->n.max;
@@ -195,6 +196,7 @@ static bool mrst_lvds_find_best_pll(const struct gma_limit_t *limit,int err = target;memset (best_clock,0 ,sizeof (*best_clock)); +memset (&clock,0 ,sizeof (clock));for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) { for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 31/137 x86/ioapic: Prevent inconsistent state when moving an interrupt
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit df4393424af3fbdcd5c404077176082a8ce459c4 ]
There is an issue with threaded interrupts which are marked ONESHOT and using the fasteoi handler:
if (IS_ONESHOT())
mask_irq();
....
cond_unmask_eoi_irq()
chip->irq_eoi();
if (setaffinity_pending) {
mask_ioapic();
...
move_affinity();
unmask_ioapic();
}So if setaffinity is pending the interrupt will be moved and then unconditionally unmasked at the ioapic level, which is wrong in two aspects:
1) It should be kept masked up to the point where the threaded handler finished.
2) The physical chip state and the software masked state are inconsistent
Guard both the mask and the unmask with a check for the software masked state. If the line is marked masked then the ioapic line is also masked, so both mask_ioapic() and unmask_ioapic() can be skipped safely.
--- arch/x86/kernel/apic/io_apic.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/x86/kernel/apic/io_apic.c +6 -3
@@ -1710,9 +1710,10 @@ static bool io_apic_level_ack_pending(struct mp_chip_data *data)static inline bool ioapic_irqd_mask (struct irq_data *data) { -/* If we are moving the irq we need to mask it */ +/* If we are moving the IRQ we need to mask it */ if (unlikely (irqd_is_setaffinity_pending (data))) { -mask_ioapic_irq (data); +if (!irqd_irq_masked (data)) +mask_ioapic_irq (data);return true; }return false;
@@ -1749,7 +1750,9 @@ static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)*/ if (!io_apic_level_ack_pending (data->chip_data))irq_move_masked_irq (data); - unmask_ioapic_irq(data); +/* If the IRQ is masked in the core, leave it: */ +if (!irqd_irq_masked (data)) + unmask_ioapic_irq(data); } }#else
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 32/137 arm64: psci: Reduce the waiting time for cpu_psci_cpu_kill()
In reply to Greg Kroah-HartmanFrom: Yunfeng Ye <[email protected]>
[ Upstream commit bfcef4ab1d7ee8921bc322109b1692036cc6cbe0 ]
In cases like suspend-to-disk and suspend-to-ram, a large number of CPU cores need to be shut down. At present, the CPU hotplug operation is serialised, and the CPU cores can only be shut down one by one. In this process, if PSCI affinity_info() does not return LEVEL_OFF quickly, cpu_psci_cpu_kill() needs to wait for 10ms. If hundreds of CPU cores need to be shut down, it will take a long time.
Normally, there is no need to wait 10ms in cpu_psci_cpu_kill(). So change the wait interval from 10 ms to max 1 ms and use usleep_range() instead of msleep() for more accurate timer.
In addition, reducing the time interval will increase the messages output, so remove the "Retry ..." message, instead, track time and output to the the sucessful message.
--- arch/arm64/kernel/psci.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
arch/arm64/kernel/psci.c +9 -6
@@ -151,7 +151,8 @@ static void cpu_psci_cpu_die(unsigned int cpu)static int cpu_psci_cpu_kill (unsigned int cpu) { -int err, i; +int err; +unsigned long start, end;if (!psci_ops.affinity_info)return 0 ;
@@ -161,16 +162,18 @@ static int cpu_psci_cpu_kill(unsigned int cpu)* while it is dying. So, try again a few times. */ -for (i =0 ; i <10 ; i++) { + start = jiffies; + end = start +msecs_to_jiffies (100 ); +do { err = psci_ops.affinity_info (cpu_logical_map (cpu),0 );if (err ==PSCI_0_2_AFFINITY_LEVEL_OFF ) { -pr_info ("CPU%d killed.\n" , cpu); +pr_info ("CPU%d killed (polled %d ms)\n" , cpu, +jiffies_to_msecs (jiffies - start));return 0 ; } -msleep (10 ); -pr_info ("Retrying again to check for CPU kill\n" ); - } +usleep_range (100 ,1000 ); + }while (time_before (jiffies, end));pr_warn ("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n" , cpu, err);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 33/137 libata: Ensure ata_port probe has completed before detach
In reply to Greg Kroah-HartmanFrom: John Garry <[email protected]>
[ Upstream commit 130f4caf145c3562108b245a576db30b916199d2 ]
With CONFIG_DEBUG_TEST_DRIVER_REMOVE set, we may find the following WARN:
[ 23.452574] ------------[ cut here ]------------ [ 23.457190] WARNING: CPU: 59 PID: 1 at drivers/ata/libata-core.c:6676 ata_host_detach+0x15c/0x168 [ 23.466047] Modules linked in: [ 23.469092] CPU: 59 PID: 1 Comm: swapper/0 Not tainted 5.4.0-rc1-00010-g5b83fd27752b-dirty #296 [ 23.477776] Hardware name: Huawei D06 /D06, BIOS Hisilicon D06 UEFI RC0 - V1.16.01 03/15/2019 [ 23.486286] pstate: a0c00009 (NzCv daif +PAN +UAO) [ 23.491065] pc : ata_host_detach+0x15c/0x168 [ 23.495322] lr : ata_host_detach+0x88/0x168 [ 23.499491] sp : ffff800011cabb50 [ 23.502792] x29: ffff800011cabb50 x28: 0000000000000007 [ 23.508091] x27: ffff80001137f068 x26: ffff8000112c0c28 [ 23.513390] x25: 0000000000003848 x24: ffff0023ea185300 [ 23.518689] x23: 0000000000000001 x22: 00000000000014c0 [ 23.523987] x21: 0000000000013740 x20: ffff0023bdc20000 [ 23.529286] x19: 0000000000000000 x18: 0000000000000004 [ 23.534584] x17: 0000000000000001 x16: 00000000000000f0 [ 23.539883] x15: ffff0023eac13790 x14: ffff0023eb76c408 [ 23.545181] x13: 0000000000000000 x12: ffff0023eac13790 [ 23.550480] x11: ffff0023eb76c228 x10: 0000000000000000 [ 23.555779] x9 : ffff0023eac13798 x8 : 0000000040000000 [ 23.561077] x7 : 0000000000000002 x6 : 0000000000000001 [ 23.566376] x5 : 0000000000000002 x4 : 0000000000000000 [ 23.571674] x3 : ffff0023bf08a0bc x2 : 0000000000000000 [ 23.576972] x1 : 3099674201f72700 x0 : 0000000000400284 [ 23.582272] Call trace: [ 23.584706] ata_host_detach+0x15c/0x168 [ 23.588616] ata_pci_remove_one+0x10/0x18 [ 23.592615] ahci_remove_one+0x20/0x40 [ 23.596356] pci_device_remove+0x3c/0xe0 [ 23.600267] really_probe+0xdc/0x3e0 [ 23.603830] driver_probe_device+0x58/0x100 [ 23.608000] device_driver_attach+0x6c/0x90 [ 23.612169] __driver_attach+0x84/0xc8 [ 23.615908] bus_for_each_dev+0x74/0xc8 [ 23.619730] driver_attach+0x20/0x28 [ 23.623292] bus_add_driver+0x148/0x1f0 [ 23.627115] driver_register+0x60/0x110 [ 23.630938] __pci_register_driver+0x40/0x48 [ 23.635199] ahci_pci_driver_init+0x20/0x28 [ 23.639372] do_one_initcall+0x5c/0x1b0 [ 23.643199] kernel_init_freeable+0x1a4/0x24c [ 23.647546] kernel_init+0x10/0x108 [ 23.651023] ret_from_fork+0x10/0x18 [ 23.654590] ---[ end trace 634a14b675b71c13 ]---
With KASAN also enabled, we may also get many use-after-free reports.
The issue is that when CONFIG_DEBUG_TEST_DRIVER_REMOVE is set, we may attempt to detach the ata_port before it has been probed.
This is because the ata_ports are async probed, meaning that there is no guarantee that the ata_port has probed prior to detach. When the ata_port does probe in this scenario, we get all sorts of issues as the detach may have already happened.
Fix by ensuring synchronisation with async_synchronize_full(). We could alternatively use the cookie returned from the ata_port probe async_schedule() call, but that means managing the cookie, so more complicated.
--- drivers/ata/libata-core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/ata/libata-core.c +3 -0
@@ -6355,6 +6355,9 @@ 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++)ata_port_detach (host->ports[i]);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 34/137 pinctrl: sh-pfc: sh7734: Fix duplicate TCLK1_B
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 884caadad128efad8e00c1cdc3177bc8912ee8ec ]
The definitions for bit field [19:18] of the Peripheral Function Select Register 3 were accidentally copied from bit field [20], leading to duplicates for the TCLK1_B function, and missing TCLK0, CAN_CLK_B, and ET0_ETXD4 functions.
Fix this by adding the missing GPIO_FN_CAN_CLK_B and GPIO_FN_ET0_ETXD4 enum values, and correcting the functions.
--- arch/sh/include/cpu-sh4/cpu/sh7734.h | 2 +- drivers/pinctrl/sh-pfc/pfc-sh7734.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
arch/sh/include/cpu-sh4/cpu/sh7734.h +1 -1
@@ -133,7 +133,7 @@ enum {GPIO_FN_EX_WAIT1 ,GPIO_FN_SD1_DAT0_A ,GPIO_FN_DREQ2 ,GPIO_FN_CAN1_TX_C ,GPIO_FN_ET0_LINK_C ,GPIO_FN_ET0_ETXD5_A ,GPIO_FN_EX_WAIT0 ,GPIO_FN_TCLK1_B , -GPIO_FN_RD_WR ,GPIO_FN_TCLK0 , +GPIO_FN_RD_WR ,GPIO_FN_TCLK0 ,GPIO_FN_CAN_CLK_B ,GPIO_FN_ET0_ETXD4 ,GPIO_FN_EX_CS5 ,GPIO_FN_SD1_CMD_A ,GPIO_FN_ATADIR ,GPIO_FN_QSSL_B ,GPIO_FN_ET0_ETXD3_A , GPIO_FN_EX_CS4, GPIO_FN_SD1_WP_A, GPIO_FN_ATAWR, GPIO_FN_QMI_QIO1_B,
drivers/pinctrl/sh-pfc/pfc-sh7734.c +2 -2
@@ -1458,7 +1458,7 @@ static const struct pinmux_func pinmux_func_gpios[] = {GPIO_FN (ET0_ETXD2_A ),GPIO_FN (EX_CS5 ),GPIO_FN (SD1_CMD_A ),GPIO_FN (ATADIR ),GPIO_FN (QSSL_B ),GPIO_FN (ET0_ETXD3_A ), -GPIO_FN (RD_WR ),GPIO_FN (TCLK1_B ), +GPIO_FN (RD_WR ),GPIO_FN (TCLK0 ),GPIO_FN (CAN_CLK_B ),GPIO_FN (ET0_ETXD4 ),GPIO_FN (EX_WAIT0 ),GPIO_FN (TCLK1_B ),GPIO_FN (EX_WAIT1 ),GPIO_FN (SD1_DAT0_A ),GPIO_FN (DREQ2 ), GPIO_FN(CAN1_TX_C), GPIO_FN(ET0_LINK_C), GPIO_FN(ET0_ETXD5_A),
@@ -1954,7 +1954,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {/* IP3_20 [1] */ FN_EX_WAIT0 ,FN_TCLK1_B ,/* IP3_19_18 [2] */ -FN_RD_WR ,FN_TCLK1_B ,0 ,0 , +FN_RD_WR ,FN_TCLK0 ,FN_CAN_CLK_B ,FN_ET0_ETXD4 ,/* IP3_17_15 [3] */ FN_EX_CS5 ,FN_SD1_CMD_A ,FN_ATADIR ,FN_QSSL_B , FN_ET0_ETXD3_A, 0, 0, 0,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 35/137 bnx2x: Fix PF-VF communication over multi-cos queues.
In reply to Greg Kroah-HartmanFrom: Manish Chopra <[email protected]>
[ Upstream commit dc5a3d79c345871439ffe72550b604fcde9770e1 ]
PF driver doesn't enable tx-switching for all cos queues/clients, which causes packets drop from PF to VF. Fix this by enabling tx-switching on all cos queues/clients.
--- .../net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +11 -5
@@ -2384,15 +2384,21 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)/* send the ramrod on all the queues of the PF */ for_each_eth_queue (bp, i) {struct bnx2x_fastpath *fp = &bp->fp[i]; +int tx_idx;/* Set the appropriate Queue object */ q_params.q_obj = &bnx2x_sp_obj (bp, fp).q_obj; -/* Update the Queue state */ - rc =bnx2x_queue_state_change (bp, &q_params); -if (rc) { -BNX2X_ERR ("Failed to configure Tx switching\n" ); -return rc; +for (tx_idx =FIRST_TX_COS_INDEX ; + tx_idx < fp->max_cos; tx_idx++) { + q_params.params.update.cid_index = tx_idx; + +/* Update the Queue state */ + rc =bnx2x_queue_state_change (bp, &q_params); +if (rc) { +BNX2X_ERR ("Failed to configure Tx switching\n" ); +return rc; + } } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 36/137 spi: img-spfi: fix potential double release
In reply to Greg Kroah-HartmanFrom: Pan Bian <[email protected]>
[ Upstream commit e9a8ba9769a0e354341bc6cc01b98aadcea1dfe9 ]
The channels spfi->tx_ch and spfi->rx_ch are not set to NULL after they are released. As a result, they will be released again, either on the error handling branch in the same function or in the corresponding remove function, i.e. img_spfi_remove(). This patch fixes the bug by setting the two members to NULL.
--- drivers/spi/spi-img-spfi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/spi/spi-img-spfi.c +2 -0
@@ -673,6 +673,8 @@ static int img_spfi_probe(struct platform_device *pdev)dma_release_channel (spfi->tx_ch);if (spfi->rx_ch)dma_release_channel (spfi->rx_ch); + spfi->tx_ch =NULL ; + spfi->rx_ch =NULL ;dev_warn (spfi->dev,"Failed to get DMA channels, falling back to PIO mode\n" ); }else { master->dma_tx = spfi->tx_ch;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 37/137 rtlwifi: fix memory leak in rtl92c_set_fw_rsvdpagepkt()
In reply to Greg Kroah-HartmanFrom: Ping-Ke Shih <[email protected]>
[ Upstream commit 5174f1e41074b5186608badc2e89441d021e8c08 ]
This leak was found by testing the EDIMAX EW-7612 on Raspberry Pi 3B+ with Linux 5.4-rc5 (multi_v7_defconfig + rtlwifi + kmemleak) and noticed a single memory leak during probe:
unreferenced object 0xec13ee40 (size 176):
comm "kworker/u8:1", pid 36, jiffies 4294939321 (age 5580.790s) hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<fc1bbb3e>] __netdev_alloc_skb+0x9c/0x164
[<863dfa6e>] rtl92c_set_fw_rsvdpagepkt+0x254/0x340 [rtl8192c_common]
[<9572be0d>] rtl92cu_set_hw_reg+0xf48/0xfa4 [rtl8192cu]
[<116df4d8>] rtl_op_bss_info_changed+0x234/0x96c [rtlwifi]
[<8933575f>] ieee80211_bss_info_change_notify+0xb8/0x264 [mac80211]
[<d4061e86>] ieee80211_assoc_success+0x934/0x1798 [mac80211]
[<e55adb56>] ieee80211_rx_mgmt_assoc_resp+0x174/0x314 [mac80211]
[<5974629e>] ieee80211_sta_rx_queued_mgmt+0x3f4/0x7f0 [mac80211]
[<d91091c6>] ieee80211_iface_work+0x208/0x318 [mac80211]
[<ac5fcae4>] process_one_work+0x22c/0x564
[<f5e6d3b6>] worker_thread+0x44/0x5d8
[<82c7b073>] kthread+0x150/0x154
[<b43e1b7d>] ret_from_fork+0x14/0x2c
[<794dff30>] 0x0It is because 8192cu doesn't implement usb_cmd_send_packet(), and this patch just frees the skb within the function to resolve memleak problem by now. Since 8192cu doesn't turn on fwctrl_lps that needs to download command packet for firmware via the function, applying this patch doesn't affect driver behavior.
--- drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c +2 -0
@@ -1601,6 +1601,8 @@ static bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)* This is maybe necessary: * rtlpriv->cfg->ops->fill_tx_cmddesc(hw, buffer, 1, 1, skb); */ +dev_kfree_skb (skb); +return true; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 38/137 perf probe: Fix to find range-only function instance
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit b77afa1f810f37bd8a36cb1318178dfe2d7af6b6 ]
Fix die_is_func_instance() to find range-only function instance.
In some case, a function instance can be made without any low PC or entry PC, but only with address ranges by optimization. (e.g. cold text partially in "text.unlikely" section) To find such function instance, we have to check the range attribute too.
--- tools/perf/util/dwarf-aux.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
tools/perf/util/dwarf-aux.c +5 -1
@@ -304,10 +304,14 @@ bool die_is_func_def(Dwarf_Die *dw_die)bool die_is_func_instance (Dwarf_Die *dw_die) {Dwarf_Addr tmp; +Dwarf_Attribute attr_mem;/* Actually gcc optimizes non-inline as like as inlined */ -return !dwarf_func_inline (dw_die) &&dwarf_entrypc (dw_die, &tmp) ==0 ; +return !dwarf_func_inline (dw_die) && + (dwarf_entrypc (dw_die, &tmp) ==0 || +dwarf_attr (dw_die, DW_AT_ranges, &attr_mem) !=NULL ); } +/** * die_get_data_member_location - Get the data-member offset * @mb_die: a DIE of a member of a data structure
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 39/137 perf probe: Fix to list probe event with correct line number
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 3895534dd78f0fd4d3f9e05ee52b9cdd444a743e ]
Since debuginfo__find_probe_point() uses dwarf_entrypc() for finding the entry address of the function on which a probe is, it will fail when the function DIE has only ranges attribute.
To fix this issue, use die_entrypc() instead of dwarf_entrypc().
Without this fix, perf probe -l shows incorrect offset:
# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask+18446744071579263632@work/linux/linux/kernel/cpu.c)
probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask+18446744071579263752@work/linux/linux/kernel/cpu.c)With this:
# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@work/linux/linux/kernel/cpu.c)
probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:21@work/linux/linux/kernel/cpu.c)Committer testing:
Before:
[root@quaco ~]# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask+18446744071579765152@kernel/cpu.c)
[root@quaco ~]#
After:
[root@quaco ~]# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
[root@quaco ~]#
--- tools/perf/util/probe-finder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/probe-finder.c +2 -2
@@ -1481,7 +1481,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,/* Get function entry information */ func = basefunc =dwarf_diename (&spdie);if (!func || -dwarf_entrypc (&spdie, &baseaddr) !=0 || +die_entrypc (&spdie, &baseaddr) !=0 ||dwarf_decl_line (&spdie, &baseline) !=0 ) { lineno =0 ; goto post;
@@ -1498,7 +1498,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr,while (die_find_top_inlinefunc (&spdie, (Dwarf_Addr )addr, &indie)) {/* There is an inline function */ -if (dwarf_entrypc (&indie, &_addr) ==0 && +if (die_entrypc (&indie, &_addr) ==0 && _addr == addr) {/* * addr is at an inline function entry.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 40/137 perf probe: Walk function lines in lexical blocks
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit acb6a7047ac2146b723fef69ee1ab6b7143546bf ]
Since some inlined functions are in lexical blocks of given function, we have to recursively walk through the DIE tree. Without this fix, perf-probe -L can miss the inlined functions which is in a lexical block (like if (..) { func() } case.)
However, even though, to walk the lines in a given function, we don't need to follow the children DIE of inlined functions because those do not have any lines in the specified function.
We need to walk though whole trees only if we walk all lines in a given file, because an inlined function can include another inlined function in the same file.
--- tools/perf/util/dwarf-aux.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
tools/perf/util/dwarf-aux.c +9 -5
@@ -664,10 +664,9 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data)if (lw->retval !=0 )return DIE_FIND_CB_END ; } +if (!lw->recursive) +return DIE_FIND_CB_SIBLING ; } -if (!lw->recursive) -/* Don't need to search recursively */ -return DIE_FIND_CB_SIBLING ;if (addr) { fname =dwarf_decl_file (in_die);
@@ -714,6 +713,10 @@ static int __die_walk_culines_cb(Dwarf_Die *sp_die, void *data) {struct __line_walk_param *lw = data; +/* +* Since inlined function can include another inlined function in +* the same file, we need to walk in it recursively. +*/ lw->retval =__die_walk_funclines (sp_die, true, lw->callback, lw->data);if (lw->retval !=0 )return DWARF_CB_ABORT ;
@@ -803,8 +806,9 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)*/ if (rt_die != cu_die)/* -* Don't need walk functions recursively, because nested -* inlined functions don't have lines of the specified DIE. +* Don't need walk inlined functions recursively, because +* inner inlined functions don't have the lines of the +* specified function. */ ret =__die_walk_funclines (rt_die, false, callback, data);else {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 41/137 perf probe: Fix to probe an inline function which has no entry pc
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit eb6933b29d20bf2c3053883d409a53f462c1a3ac ]
Fix perf probe to probe an inlne function which has no entry pc or low pc but only has ranges attribute.
This seems very rare case, but I could find a few examples, as same as probe_point_search_cb(), use die_entrypc() to get the entry address in probe_point_inline_cb() too.
Without this patch:
# perf probe -D __amd_put_nb_event_constraints
Failed to get entry address of __amd_put_nb_event_constraints.
Probe point '__amd_put_nb_event_constraints' not found.
Error: Failed to add events.With this patch:
# perf probe -D __amd_put_nb_event_constraints p:probe/__amd_put_nb_event_constraints amd_put_event_constraints+43
Committer testing:
Before:
[root@quaco ~]# perf probe -D __amd_put_nb_event_constraints Failed to get entry address of __amd_put_nb_event_constraints. Probe point '__amd_put_nb_event_constraints' not found.
Error: Failed to add events.
[root@quaco ~]#
After:
[root@quaco ~]# perf probe -D __amd_put_nb_event_constraints p:probe/__amd_put_nb_event_constraints _text+33789 [root@quaco ~]#
--- tools/perf/util/probe-finder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/probe-finder.c +1 -1
@@ -900,7 +900,7 @@ static int probe_point_inline_cb(Dwarf_Die *in_die, void *data) ret =find_probe_point_lazy (in_die, pf); else {/* Get probe address */ -if (dwarf_entrypc (in_die, &addr) !=0 ) { +if (die_entrypc (in_die, &addr) !=0 ) {pr_warning ("Failed to get entry address of %s.\n" ,dwarf_diename (in_die));return -ENOENT ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 42/137 perf probe: Fix to show ranges of variables in functions without entry_pc
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit af04dd2f8ebaa8fbd46f698714acbf43da14da45 ]
Fix to show ranges of variables (--range and --vars option) in functions which DIE has only ranges but no entry_pc attribute.
Without this fix:
# perf probe --range -V clear_tasks_mm_cpumask Available variables at clear_tasks_mm_cpumask @<clear_tasks_mm_cpumask+0> (No matched variables)
With this fix:
# perf probe --range -V clear_tasks_mm_cpumask Available variables at clear_tasks_mm_cpumask @<clear_tasks_mm_cpumask+0> [VAL] int cpu @<clear_tasks_mm_cpumask+[0-35,317-317,2052-2059]>
Committer testing:
Before:
[root@quaco ~]# perf probe --range -V clear_tasks_mm_cpumask
Available variables at clear_tasks_mm_cpumask
@<clear_tasks_mm_cpumask+0>
(No matched variables)
[root@quaco ~]#After:
[root@quaco ~]# perf probe --range -V clear_tasks_mm_cpumask
Available variables at clear_tasks_mm_cpumask
@<clear_tasks_mm_cpumask+0>
[VAL] int cpu @<clear_tasks_mm_cpumask+[0-23,23-105,105-106,106-106,1843-1850,1850-1862]>
[root@quaco ~]#Using it:
[root@quaco ~]# perf probe clear_tasks_mm_cpumask cpu Added new event:
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask with cpu)
You can now use it in all perf tools, such as:
perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1
[root@quaco ~]# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c with cpu)
[root@quaco ~]#
[root@quaco ~]# perf trace -e probe:*cpumask
^C[root@quaco ~]#
--- tools/perf/util/dwarf-aux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/dwarf-aux.c +2 -2
@@ -989,7 +989,7 @@ static int die_get_var_innermost_scope(Dwarf_Die *sp_die, Dwarf_Die *vr_die,bool first = true;const char *name; - ret =dwarf_entrypc (sp_die, &entry); + ret =die_entrypc (sp_die, &entry);if (ret)return ret;
@@ -1050,7 +1050,7 @@ int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf)bool first = true;const char *name; - ret =dwarf_entrypc (sp_die, &entry); + ret =die_entrypc (sp_die, &entry);if (ret)return ret;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 43/137 perf probe: Fix to show inlined function callsite without entry_pc
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 18e21eb671dc87a4f0546ba505a89ea93598a634 ]
Fix 'perf probe --line' option to show inlined function callsite lines even if the function DIE has only ranges.
Without this:
# perf probe -L amd_put_event_constraints
...
2 {
3 if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
__amd_put_nb_event_constraints(cpuc, event);
5 }With this patch:
# perf probe -L amd_put_event_constraints
...
2 {
3 if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
4 __amd_put_nb_event_constraints(cpuc, event);
5 }Committer testing:
Before:
[root@quaco ~]# perf probe -L amd_put_event_constraints
<amd_put_event_constraints@/usr/src/debug/kernel-5.2.fc30/linux-5.2.18-200.fc30.x86_64/arch/x86/events/amd/core.c:0>
0 static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
struct perf_event *event)
2 {
3 if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
__amd_put_nb_event_constraints(cpuc, event);
5 } PMU_FORMAT_ATTR(event, "config:0-7,32-35");
PMU_FORMAT_ATTR(umask, "config:8-15" );[root@quaco ~]#
After:
[root@quaco ~]# perf probe -L amd_put_event_constraints
<amd_put_event_constraints@/usr/src/debug/kernel-5.2.fc30/linux-5.2.18-200.fc30.x86_64/arch/x86/events/amd/core.c:0>
0 static void amd_put_event_constraints(struct cpu_hw_events *cpuc,
struct perf_event *event)
2 {
3 if (amd_has_nb(cpuc) && amd_is_nb_event(&event->hw))
4 __amd_put_nb_event_constraints(cpuc, event);
5 } PMU_FORMAT_ATTR(event, "config:0-7,32-35");
PMU_FORMAT_ATTR(umask, "config:8-15" ); [root@quaco ~]# perf probe amd_put_event_constraints:4 Added new event:
probe:amd_put_event_constraints (on amd_put_event_constraints:4)
You can now use it in all perf tools, such as:
perf record -e probe:amd_put_event_constraints -aR sleep 1
[root@quaco ~]#
[root@quaco ~]# perf probe -l
probe:amd_put_event_constraints (on amd_put_event_constraints:4@arch/x86/events/amd/core.c) probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
[root@quaco ~]#
Using it:
[root@quaco ~]# perf trace -e probe:*
^C[root@quaco ~]#
Ok, Intel system here... :-)
--- tools/perf/util/dwarf-aux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/dwarf-aux.c +1 -1
@@ -659,7 +659,7 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data)if (dwarf_tag (in_die) == DW_TAG_inlined_subroutine) { fname =die_get_call_file (in_die); lineno =die_get_call_lineno (in_die); -if (fname && lineno >0 &&dwarf_entrypc (in_die, &addr) ==0 ) { +if (fname && lineno >0 &&die_entrypc (in_die, &addr) ==0 ) { lw->retval = lw->callback (fname, lineno, addr, lw->data);if (lw->retval !=0 )return DIE_FIND_CB_END ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 44/137 perf probe: Skip overlapped location on searching variables
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit dee36a2abb67c175265d49b9a8c7dfa564463d9a ]
Since debuginfo__find_probes() callback function can be called with the location which already passed, the callback function must filter out such overlapped locations.
add_probe_trace_event() has already done it by commit 1a375ae7659a ("perf probe: Skip same probe address for a given line"), but add_available_vars() doesn't. Thus perf probe -v shows same address repeatedly as below:
# perf probe -V vfs_read:18
Available variables at vfs_read:18
@<vfs_read+217>
char* buf
loff_t* pos
ssize_t ret
struct file* file
@<vfs_read+217>
char* buf
loff_t* pos
ssize_t ret
struct file* file
@<vfs_read+226>
char* buf
loff_t* pos
ssize_t ret
struct file* fileWith this fix, perf probe -V shows it correctly:
# perf probe -V vfs_read:18
Available variables at vfs_read:18
@<vfs_read+217>
char* buf
loff_t* pos
ssize_t ret
struct file* file
@<vfs_read+226>
char* buf
loff_t* pos
ssize_t ret
struct file* file--- tools/perf/util/probe-finder.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
tools/perf/util/probe-finder.c +20 -0
@@ -1331,6 +1331,18 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data)return DIE_FIND_CB_SIBLING ; } +static bool available_var_finder_overlap (struct available_var_finder *af) +{ +int i; + +for (i =0 ; i < af->nvls; i++) { +if (af->pf.addr == af->vls[i].point.address) +return true; + } +return false; + +} +/* Add a found vars into available variables list */ static int add_available_vars (Dwarf_Die *sc_die,struct probe_finder *pf) {
@@ -1341,6 +1353,14 @@ static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)Dwarf_Die die_mem;int ret; +/* +* For some reason (e.g. different column assigned to same address), +* this callback can be called with the address which already passed. +* Ignore it first. +*/ +if (available_var_finder_overlap (af)) +return 0 ; +/* Check number of tevs */ if (af->nvls == af->max_vls) {pr_warning ("Too many( > %d) probe point found.\n" , af->max_vls);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 45/137 perf probe: Return a better scope DIE if there is no best scope
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit c701636aeec4c173208697d68da6e4271125564b ]
Make find_best_scope() returns innermost DIE at given address if there is no best matched scope DIE. Since Gcc sometimes generates intuitively strange line info which is out of inlined function address range, we need this fixup.
Without this, sometimes perf probe failed to probe on a line inside an inlined function:
# perf probe -D ksys_open:3
Failed to find scope of probe point.
Error: Failed to add events.With this fix, 'perf probe' can probe it:
# perf probe -D ksys_open:3 p:probe/ksys_open _text+25707308 p:probe/ksys_open_1 _text+25710596 p:probe/ksys_open_2 _text+25711114 p:probe/ksys_open_3 _text+25711343 p:probe/ksys_open_4 _text+25714058 p:probe/ksys_open_5 _text+2819653 p:probe/ksys_open_6 _text+2819701
--- tools/perf/util/probe-finder.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
tools/perf/util/probe-finder.c +16 -1
@@ -746,6 +746,16 @@ static int find_best_scope_cb(Dwarf_Die *fn_die, void *data)return 0 ; } +/* Return innermost DIE */ +static int find_inner_scope_cb (Dwarf_Die *fn_die,void *data) +{ +struct find_scope_param *fsp = data; + +memcpy (fsp->die_mem, fn_die,sizeof (Dwarf_Die)); + fsp->found = true; +return 1 ; +} +/* Find an appropriate scope fits to given conditions */ static Dwarf_Die *find_best_scope (struct probe_finder *pf,Dwarf_Die *die_mem) {
@@ -757,8 +767,13 @@ static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) .die_mem = die_mem, .found = false, }; +int ret; -cu_walk_functions_at (&pf->cu_die, pf->addr, find_best_scope_cb, &fsp); + ret =cu_walk_functions_at (&pf->cu_die, pf->addr, find_best_scope_cb, + &fsp); +if (!ret && !fsp.found) +cu_walk_functions_at (&pf->cu_die, pf->addr, + find_inner_scope_cb, &fsp);return fsp.found ? die_mem :NULL ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 46/137 perf probe: Fix to show calling lines of inlined functions
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit 86c0bf8539e7f46d91bd105e55eda96e0064caef ]
Fix to show calling lines of inlined functions (where an inline function is called).
die_walk_lines() filtered out the lines inside inlined functions based on the address. However this also filtered out the lines which call those inlined functions from the target function.
To solve this issue, check the call_file and call_line attributes and do not filter out if it matches to the line information.
Without this fix, perf probe -L doesn't show some lines correctly. (don't see the lines after 17)
# perf probe -L vfs_read
<vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
0 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
1 {
2 ssize_t ret; 4 if (!(file->f_mode & FMODE_READ))
return -EBADF;
6 if (!(file->f_mode & FMODE_CAN_READ))
return -EINVAL;
8 if (unlikely(!access_ok(buf, count)))
return -EFAULT;
11 ret = rw_verify_area(READ, file, pos, count);
12 if (!ret) {
13 if (count > MAX_RW_COUNT)
count = MAX_RW_COUNT;
15 ret = __vfs_read(file, buf, count, pos);
16 if (ret > 0) {
fsnotify_access(file);
add_rchar(current, ret);
}With this fix:
# perf probe -L vfs_read
<vfs_read@/home/mhiramat/ksrc/linux/fs/read_write.c:0>
0 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
1 {
2 ssize_t ret; 4 if (!(file->f_mode & FMODE_READ))
return -EBADF;
6 if (!(file->f_mode & FMODE_CAN_READ))
return -EINVAL;
8 if (unlikely(!access_ok(buf, count)))
return -EFAULT;
11 ret = rw_verify_area(READ, file, pos, count);
12 if (!ret) {
13 if (count > MAX_RW_COUNT)
count = MAX_RW_COUNT;
15 ret = __vfs_read(file, buf, count, pos);
16 if (ret > 0) {
17 fsnotify_access(file);
18 add_rchar(current, ret);
}
20 inc_syscr(current);
}--- tools/perf/util/dwarf-aux.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
tools/perf/util/dwarf-aux.c +9 -1
@@ -741,7 +741,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)Dwarf_Lines *lines;Dwarf_Line *line;Dwarf_Addr addr; -const char *fname, *decf =NULL ; +const char *fname, *decf =NULL , *inf =NULL ;int lineno, ret =0 ;int decl =0 , inl;Dwarf_Die die_mem, *cu_die;
@@ -785,13 +785,21 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)*/ if (!dwarf_haspc (rt_die, addr))continue ; +if (die_find_inlinefunc (rt_die, addr, &die_mem)) { +/* Call-site check */ + inf =die_get_call_file (&die_mem); +if ((inf && !strcmp (inf, decf)) && +die_get_call_lineno (&die_mem) == lineno) + goto found; +dwarf_decl_line (&die_mem, &inl);if (inl != decl || decf !=dwarf_decl_file (&die_mem))continue ; } } +found:/* Get source line */ fname =dwarf_linesrc (line,NULL ,NULL );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 47/137 perf probe: Skip end-of-sequence and non statement lines
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit f4d99bdfd124823a81878b44b5e8750b97f73902 ]
Skip end-of-sequence and non-statement lines while walking through lines list.
The "end-of-sequence" line information means:
"the current address is that of the first byte after the
end of a sequence of target machine instructions."
(DWARF version 4 spec 6.2.2)
This actually means out of scope and we can not probe on it.
On the other hand, the statement lines (is_stmt) means:
"the current instruction is a recommended breakpoint location.
A recommended breakpoint location is intended to “represent” a line, a statement and/or a semantically distinct subpart of a statement."
(DWARF version 4 spec 6.2.2)
So, non-statement line info also should be skipped.
These can reduce unneeded probe points and also avoid an error.
E.g. without this patch:
# perf probe -a "clear_tasks_mm_cpumask:1"
Added new events:
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_2 (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_3 (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_4 (on clear_tasks_mm_cpumask:1)You can now use it in all perf tools, such as:
perf record -e probe:clear_tasks_mm_cpumask_4 -aR sleep 1
#
This puts 5 probes on one line, but acutally it's not inlined function. This is because there are many non statement instructions at the function prologue.
With this patch:
# perf probe -a "clear_tasks_mm_cpumask:1"
Added new event:
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)You can now use it in all perf tools, such as:
perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1
#
Now perf-probe skips unneeded addresses.
Committer testing:
Slightly different results, but similar:
Before:
# uname -a
Linux quaco 5.3.8-200.fc30.x86_64 #1 SMP Tue Oct 29 14:46:22 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
#
# perf probe -a "clear_tasks_mm_cpumask:1"
Added new events:
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_1 (on clear_tasks_mm_cpumask:1)
probe:clear_tasks_mm_cpumask_2 (on clear_tasks_mm_cpumask:1)You can now use it in all perf tools, such as:
perf record -e probe:clear_tasks_mm_cpumask_2 -aR sleep 1
#
After:
# perf probe -a "clear_tasks_mm_cpumask:1"
Added new event:
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask:1)You can now use it in all perf tools, such as:
perf record -e probe:clear_tasks_mm_cpumask -aR sleep 1
# perf probe -l
probe:clear_tasks_mm_cpumask (on clear_tasks_mm_cpumask@kernel/cpu.c)
#--- tools/perf/util/dwarf-aux.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/util/dwarf-aux.c +7 -0
@@ -746,6 +746,7 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)int decl =0 , inl;Dwarf_Die die_mem, *cu_die;size_t nlines, i; +bool flag;/* Get the CU die */ if (dwarf_tag (rt_die) != DW_TAG_compile_unit) {
@@ -776,6 +777,12 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) "Possible error in debuginfo.\n");continue ; } +/* Skip end-of-sequence */ +if (dwarf_lineendsequence (line, &flag) !=0 || flag) +continue ; +/* Skip Non statement line-info */ +if (dwarf_linebeginstatement (line, &flag) !=0 || !flag) +continue ;/* Filter lines based on address */ if (rt_die != cu_die) {/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 48/137 perf probe: Filter out instances except for inlined subroutine and subprogram
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit da6cb952a89efe24bb76c4971370d485737a2d85 ]
Filter out instances except for inlined_subroutine and subprogram DIE in die_walk_instances() and die_is_func_instance().
This fixes an issue that perf probe sets some probes on calling address instead of a target function itself.
When perf probe walks on instances of an abstruct origin (a kind of function prototype of inlined function), die_walk_instances() can also pass a GNU_call_site (a GNU extension for call site) to callback. Since it is not an inlined instance of target function, we have to filter out when searching a probe point.
Without this patch, perf probe sets probes on call site address too.This can happen on some function which is marked "inlined", but has actual symbol. (I'm not sure why GCC mark it "inlined"):
# perf probe -D vfs_read p:probe/vfs_read _text+2500017 p:probe/vfs_read_1 _text+2499468 p:probe/vfs_read_2 _text+2499563 p:probe/vfs_read_3 _text+2498876 p:probe/vfs_read_4 _text+2498512 p:probe/vfs_read_5 _text+2498627
With this patch:
Slightly different results, similar tho:
# perf probe -D vfs_read p:probe/vfs_read _text+2498512
Committer testing:
# uname -a Linux quaco 5.3.8-200.fc30.x86_64 #1 SMP Tue Oct 29 14:46:22 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Before:
# perf probe -D vfs_read p:probe/vfs_read _text+3131557 p:probe/vfs_read_1 _text+3130975 p:probe/vfs_read_2 _text+3131047 p:probe/vfs_read_3 _text+3130380 p:probe/vfs_read_4 _text+3130000 # uname -a Linux quaco 5.3.8-200.fc30.x86_64 #1 SMP Tue Oct 29 14:46:22 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux #
After:
# perf probe -D vfs_read p:probe/vfs_read _text+3130000 #
--- tools/perf/util/dwarf-aux.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
tools/perf/util/dwarf-aux.c +13 -6
@@ -298,18 +298,22 @@ bool die_is_func_def(Dwarf_Die *dw_die)* @dw_die: a DIE * * Ensure that this DIE is an instance (which has an entry address). -* This returns true if @dw_die is a function instance. If not, you need to -* call die_walk_instances() to find actual instances. +* This returns true if @dw_die is a function instance. If not, the @dw_die +* must be a prototype. You can use die_walk_instances() to find actual +* instances. **/ bool die_is_func_instance (Dwarf_Die *dw_die) {Dwarf_Addr tmp;Dwarf_Attribute attr_mem; +int tag =dwarf_tag (dw_die); -/* Actually gcc optimizes non-inline as like as inlined */ -return !dwarf_func_inline (dw_die) && - (dwarf_entrypc (dw_die, &tmp) ==0 || -dwarf_attr (dw_die, DW_AT_ranges, &attr_mem) !=NULL ); +if (tag != DW_TAG_subprogram && + tag != DW_TAG_inlined_subroutine) +return false; + +return dwarf_entrypc (dw_die, &tmp) ==0 || +dwarf_attr (dw_die, DW_AT_ranges, &attr_mem) !=NULL ; }/**
@@ -588,6 +592,9 @@ static int __die_walk_instances_cb(Dwarf_Die *inst, void *data)Dwarf_Die *origin;int tmp; +if (!die_is_func_instance (inst)) +return DIE_FIND_CB_CONTINUE ; + attr =dwarf_attr (inst, DW_AT_abstract_origin, &attr_mem);if (attr ==NULL )return DIE_FIND_CB_CONTINUE ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 49/137 ath10k: fix get invalid tx rate for Mesh metric
In reply to Greg Kroah-HartmanFrom: Miaoqing Pan <[email protected]>
[ Upstream commit 05a11003a56507023f18d3249a4d4d119c0a3e9c ]
ath10k does not provide transmit rate info per MSDU in tx completion, mark that as -1 so mac80211 will ignore the rates. This fixes mac80211 update Mesh link metric with invalid transmit rate info.
Tested HW: QCA9984
Tested FW: 10.4-3.9.0.2-00035
--- drivers/net/wireless/ath/ath10k/txrx.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/ath/ath10k/txrx.c +2 -0
@@ -96,6 +96,8 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt, info =IEEE80211_SKB_CB (msdu);memset (&info->status,0 ,sizeof (info->status)); + info->status.rates[0 ].idx =-1 ; +trace_ath10k_txrx_tx_unref (ar, tx_done->msdu_id);if (tx_done->discard) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 50/137 media: pvrusb2: Fix oops on tear-down when radio support is not present
In reply to Greg Kroah-HartmanFrom: Mike Isely <[email protected]>
[ Upstream commit 7f404ae9cf2a285f73b3c18ab9303d54b7a3d8e1 ]
In some device configurations there's no radio or radio support in the driver. That's OK, as the driver sets itself up accordingly. However on tear-down in these caes it's still trying to tear down radio related context when there isn't anything there, leading to dereferences through a null pointer and chaos follows.
How this bug survived unfixed for 11 years in the pvrusb2 driver is a mystery to me.
[hverkuil: fix two checkpatch warnings]
--- drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/media/usb/pvrusb2/pvrusb2-v4l2.c +7 -2
@@ -886,8 +886,12 @@ static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)pvr2_v4l2_dev_disassociate_parent (vp->dev_video);pvr2_v4l2_dev_disassociate_parent (vp->dev_radio);if (!list_empty (&vp->dev_video->devbase.fh_list) || - !list_empty (&vp->dev_radio->devbase.fh_list)) + (vp->dev_radio && + !list_empty (&vp->dev_radio->devbase.fh_list))) { +pvr2_trace (PVR2_TRACE_STRUCT , +"pvr2_v4l2 internal_check exit-empty id=%p" , vp);return ; + }pvr2_v4l2_destroy_no_lock (vp); }
@@ -961,7 +965,8 @@ static int pvr2_v4l2_release(struct file *file)kfree (fhp);if (vp->channel.mc_head->disconnect_flag &&list_empty (&vp->dev_video->devbase.fh_list) && -list_empty (&vp->dev_radio->devbase.fh_list)) { + (!vp->dev_radio || +list_empty (&vp->dev_radio->devbase.fh_list))) {pvr2_v4l2_destroy_no_lock (vp); }return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 51/137 media: si470x-i2c: add missed operations in remove
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit 2df200ab234a86836a8879a05a8007d6b884eb14 ]
The driver misses calling v4l2_ctrl_handler_free and v4l2_device_unregister in remove like what is done in probe failure. Add the calls to fix it.
--- drivers/media/radio/si470x/radio-si470x-i2c.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/radio/si470x/radio-si470x-i2c.c +2 -0
@@ -460,6 +460,8 @@ static int si470x_i2c_remove(struct i2c_client *client)video_unregister_device (&radio->videodev);kfree (radio); +v4l2_ctrl_handler_free (&radio->hdl); +v4l2_device_unregister (&radio->v4l2_dev);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 52/137 EDAC/ghes: Fix grain calculation
In reply to Greg Kroah-HartmanFrom: Robert Richter <[email protected]>
[ Upstream commit 7088e29e0423d3195e09079b4f849ec4837e5a75 ]
The current code to convert a physical address mask to a grain (defined as granularity in bytes) is:
e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK);
This is broken in several ways:
1) It calculates to wrong grain values. E.g., a physical address mask of ~0xfff should give a grain of 0x1000. Without considering PAGE_MASK, there is an off-by-one. Things are worse when also filtering it with ~PAGE_MASK. This will calculate to a grain with the upper bits set. In the example it even calculates to ~0.
2) The grain does not depend on and is unrelated to the kernel's page-size. The page-size only matters when unmapping memory in memory_failure(). Smaller grains are wrongly rounded up to the page-size, on architectures with a configurable page-size (e.g. arm64) this could round up to the even bigger page-size of the hypervisor.
Fix this with:
e->grain = ~mem_err->physical_addr_mask + 1;
The grain_bits are defined as:
grain = 1 << grain_bits;
Change also the grain_bits calculation accordingly, it is the same formula as in edac_mc.c now and the code can be unified.
The value in ->physical_addr_mask coming from firmware is assumed to be contiguous, but this is not sanity-checked. However, in case the mask is non-contiguous, a conversion to grain_bits effectively converts the grain bit mask to a power of 2 by rounding it up.
--- drivers/edac/ghes_edac.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/edac/ghes_edac.c +8 -2
@@ -189,6 +189,7 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,/* Cleans the error report buffer */ memset (e,0 ,sizeof (*e)); e->error_count =1 ; + e->grain =1 ;strcpy (e->label,"unknown label" ); e->msg = pvt->msg; e->other_detail = pvt->other_detail;
@@ -284,7 +285,7 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,/* Error grain */ if (mem_err->validation_bits &CPER_MEM_VALID_PA_MASK ) - e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK ); + e->grain = ~mem_err->physical_addr_mask +1 ;/* Memory error location, mapped on e->location */ p = e->location;
@@ -391,8 +392,13 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,if (p > pvt->other_detail) *(p -1 ) ='\0' ; +/* Sanity-check driver-supplied grain value. */ +if (WARN_ON_ONCE (!e->grain)) + e->grain =1 ; + + grain_bits =fls_long (e->grain -1 ); +/* Generate the trace event */ - grain_bits =fls_long (e->grain);snprintf (pvt->detail_location,sizeof (pvt->detail_location),"APEI location: %s %s" , e->location, e->other_detail); trace_mc_event(type, e->msg, e->label, e->error_count,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 53/137 spi: pxa2xx: Add missed security checks
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit 5eb263ef08b5014cfc2539a838f39d2fd3531423 ]
pxa2xx_spi_init_pdata misses checks for devm_clk_get and platform_get_irq.
Add checks for them to fix the bugs.
Since ssp->clk and ssp->irq are used in probe, they are mandatory here. So we cannot use _optional() for devm_clk_get and platform_get_irq.
--- drivers/spi/spi-pxa2xx.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/spi/spi-pxa2xx.c +6 -0
@@ -1425,7 +1425,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) } ssp->clk =devm_clk_get (&pdev->dev,NULL ); +if (IS_ERR (ssp->clk)) +return NULL ; + ssp->irq =platform_get_irq (pdev,0 ); +if (ssp->irq <0 ) +return NULL ; + ssp->type = type; ssp->pdev = pdev; ssp->port_id =pxa2xx_spi_get_port_id (adev);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 54/137 ASoC: rt5677: Mark reg RT5677_PWR_ANLG2 as volatile
In reply to Greg Kroah-HartmanFrom: Ben Zhang <[email protected]>
[ Upstream commit eabf424f7b60246c76dcb0ea6f1e83ef9abbeaa6 ]
The codec dies when RT5677_PWR_ANLG2(MX-64h) is set to 0xACE1 while it's streaming audio over SPI. The DSP firmware turns on PLL2 (MX-64 bit 8) when SPI streaming starts. However regmap does not believe that register can change by itself. When BST1 (bit 15) is turned on with regmap_update_bits(), it doesn't read the register first before write, so PLL2 power bit is cleared by accident.
Marking MX-64h as volatile in regmap solved the issue.
--- sound/soc/codecs/rt5677.c | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/rt5677.c +1 -0
@@ -295,6 +295,7 @@ static bool rt5677_volatile_register(struct device *dev, unsigned int reg)case RT5677_I2C_MASTER_CTRL7 :case RT5677_I2C_MASTER_CTRL8 :case RT5677_HAP_GENE_CTRL2 : +case RT5677_PWR_ANLG2 :/* Modified by DSP firmware */ case RT5677_PWR_DSP_ST :case RT5677_PRIV_DATA :case RT5677_PLL1_CTRL2 :
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 55/137 parport: load lowlevel driver if ports not found
In reply to Greg Kroah-HartmanFrom: Sudip Mukherjee <[email protected]>
[ Upstream commit 231ec2f24dad18d021b361045bbd618ba62a274e ]
Usually all the distro will load the parport low level driver as part of their initialization. But we can get into a situation where all the parallel port drivers are built as module and we unload all the modules at a later time. Then if we just do "modprobe parport" it will only load the parport module and will not load the low level driver which will actually register the ports. So, check the bus if there is any parport registered, if not, load the low level driver.
We can get into the above situation with all distro but only Suse has setup the alias for "parport_lowlevel" and so it only works in Suse. Users of Debian based distro will need to load the lowlevel module manually.
--- drivers/parport/share.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/parport/share.c +21 -0
@@ -228,6 +228,18 @@ static int port_check(struct device *dev, void *dev_drv)return 0 ; } +/* +* Iterates through all the devices connected to the bus and return 1 +* if the device is a parallel port. +*/ + +static int port_detect (struct device *dev,void *dev_drv) +{ +if (is_parport (dev)) +return 1 ; +return 0 ; +} +/** * parport_register_driver - register a parallel port device driver * @drv: structure describing the driver
@@ -280,6 +292,15 @@ int __parport_register_driver(struct parport_driver *drv, struct module *owner,if (ret)return ret; +/* +* check if bus has any parallel port registered, if +* none is found then load the lowlevel driver. +*/ + ret =bus_for_each_dev (&parport_bus_type,NULL ,NULL , + port_detect); +if (!ret) +get_lowlevel_driver (); +mutex_lock (®istration_lock);if (drv->match_port) bus_for_each_dev(&parport_bus_type, NULL, drv,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 56/137 cpufreq: Register drivers only after CPU devices have been registered
In reply to Greg Kroah-HartmanFrom: Viresh Kumar <[email protected]>
[ Upstream commit 46770be0cf94149ca48be87719bda1d951066644 ]
The cpufreq core heavily depends on the availability of the struct device for CPUs and if they aren't available at the time cpufreq driver is registered, we will never succeed in making cpufreq work.
This happens due to following sequence of events:
- cpufreq_register_driver()
- subsys_interface_register()
- return 0; //successful registration of driver
... at a later point of time
- register_cpu();
- device_register();
- bus_probe_device();
- sif->add_dev();
- cpufreq_add_dev();
- get_cpu_device(); //FAILS
- per_cpu(cpu_sys_devices, num) = &cpu->dev; //used by get_cpu_device()
- return 0; //CPU registered successfully
Because the per-cpu variable cpu_sys_devices is set only after the CPU device is regsitered, cpufreq will never be able to get it when cpufreq_add_dev() is called.
This patch avoids this failure by making sure device structure of at least CPU0 is available when the cpufreq driver is registered, else return -EPROBE_DEFER.
--- drivers/cpufreq/cpufreq.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/cpufreq/cpufreq.c +7 -0
@@ -2426,6 +2426,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)if (cpufreq_disabled ())return -ENODEV ; +/* +* The cpufreq core depends heavily on the availability of device +* structure, make sure they are available before proceeding further. +*/ +if (!get_cpu_device (0 )) +return -EPROBE_DEFER ; + if (!driver_data || !driver_data->verify || !driver_data->init || !(driver_data->setpolicy || driver_data->target_index || driver_data->target) ||
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 57/137 x86/crash: Add a forward declaration of struct kimage
In reply to Greg Kroah-HartmanFrom: Lianbo Jiang <[email protected]>
[ Upstream commit 112eee5d06007dae561f14458bde7f2a4879ef4e ]
Add a forward declaration of struct kimage to the crash.h header because future changes will invoke a crash-specific function from the realmode init path and the compiler will complain otherwise like this:
In file included from arch/x86/realmode/init.c:11:
./arch/x86/include/asm/crash.h:5:32: warning: ‘struct kimage’ declared inside\
parameter list will not be visible outside of this definition or declaration
5 | int crash_load_segments(struct kimage *image);
| ^~~~~~
./arch/x86/include/asm/crash.h:6:37: warning: ‘struct kimage’ declared inside\
parameter list will not be visible outside of this definition or declaration
6 | int crash_copy_backup_region(struct kimage *image);
| ^~~~~~ ./arch/x86/include/asm/crash.h:7:39: warning: ‘struct kimage’ declared inside\
parameter list will not be visible outside of this definition or declaration
7 | int crash_setup_memmap_entries(struct kimage *image,
|
[ bp: Rewrite the commit message. ]
--- arch/x86/include/asm/crash.h | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/include/asm/crash.h +2 -0
@@ -1,6 +1,8 @@#ifndef _ASM_X86_CRASH_H#define _ASM_X86_CRASH_H +struct kimage ; +int crash_load_segments (struct kimage *image);int crash_copy_backup_region (struct kimage *image); int crash_setup_memmap_entries(struct kimage *image,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 58/137 spi: tegra20-slink: add missed clk_unprepare
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit 04358e40ba96d687c0811c21d9dede73f5244a98 ]
The driver misses calling clk_unprepare in probe failure and remove. Add the calls to fix it.
--- drivers/spi/spi-tegra20-slink.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/spi/spi-tegra20-slink.c +4 -1
@@ -1078,7 +1078,7 @@ static int tegra_slink_probe(struct platform_device *pdev) ret =clk_enable (tspi->clk);if (ret <0 ) {dev_err (&pdev->dev,"Clock enable failed %d\n" , ret); - goto exit_free_master; + goto exit_clk_unprepare; } spi_irq =platform_get_irq (pdev,0 );
@@ -1151,6 +1151,8 @@ exit_free_irq:free_irq (spi_irq, tspi); exit_clk_disable:clk_disable (tspi->clk); +exit_clk_unprepare: +clk_unprepare (tspi->clk); exit_free_master:spi_master_put (master);return ret;
@@ -1164,6 +1166,7 @@ static int tegra_slink_remove(struct platform_device *pdev)free_irq (tspi->irq, tspi);clk_disable (tspi->clk); +clk_unprepare (tspi->clk);if (tspi->tx_dma_chan)tegra_slink_deinit_dma_param (tspi, false);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 59/137 btrfs: dont prematurely free work in end_workqueue_fn()
In reply to Greg Kroah-HartmanFrom: Omar Sandoval <[email protected]>
[ Upstream commit 9be490f1e15c34193b1aae17da58e14dd9f55a95 ]
Currently, end_workqueue_fn() frees the end_io_wq entry (which embeds the work item) and then calls bio_endio(). This is another potential instance of the bug in "btrfs: don't prematurely free work in run_ordered_work()".
In particular, the endio call may depend on other work items. For example, btrfs_end_dio_bio() can call btrfs_subio_endio_read() -> __btrfs_correct_data_nocsum() -> dio_read_error() -> submit_dio_repair_bio(), which submits a bio that is also completed through a end_workqueue_fn() work item. However, __btrfs_correct_data_nocsum() waits for the newly submitted bio to complete, thus it depends on another work item.
This example currently usually works because we use different workqueue helper functions for BTRFS_WQ_ENDIO_DATA and BTRFS_WQ_ENDIO_DIO_REPAIR. However, it may deadlock with stacked filesystems and is fragile overall. The proper fix is to free the work item at the very end of the work function, so let's do that.
--- fs/btrfs/disk-io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/disk-io.c +1 -1
@@ -1698,8 +1698,8 @@ static void end_workqueue_fn(struct btrfs_work *work) bio->bi_error = end_io_wq->error; bio->bi_private = end_io_wq->private; bio->bi_end_io = end_io_wq->end_io; -kmem_cache_free (btrfs_end_io_wq_cache, end_io_wq);bio_endio (bio); +kmem_cache_free (btrfs_end_io_wq_cache, end_io_wq); }static int cleaner_kthread (void *arg)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 60/137 iwlwifi: check kasprintf() return value
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit 5974fbb5e10b018fdbe3c3b81cb4cc54e1105ab9 ]
kasprintf() can fail, we should check the return value.
--- drivers/net/wireless/iwlwifi/dvm/led.c | 3 +++ drivers/net/wireless/iwlwifi/mvm/led.c | 3 +++ 2 files changed, 6 insertions(+)
drivers/net/wireless/iwlwifi/dvm/led.c +3 -0
@@ -184,6 +184,9 @@ void iwl_leds_init(struct iwl_priv *priv) priv->led.name =kasprintf (GFP_KERNEL ,"%s-led" ,wiphy_name (priv->hw->wiphy)); +if (!priv->led.name) +return ; + priv->led.brightness_set = iwl_led_brightness_set; priv->led.blink_set = iwl_led_blink_set; priv->led.max_brightness =1 ;
drivers/net/wireless/iwlwifi/mvm/led.c +3 -0
@@ -109,6 +109,9 @@ int iwl_mvm_leds_init(struct iwl_mvm *mvm) mvm->led.name =kasprintf (GFP_KERNEL ,"%s-led" ,wiphy_name (mvm->hw->wiphy)); +if (!mvm->led.name) +return -ENOMEM ; + mvm->led.brightness_set = iwl_led_brightness_set; mvm->led.max_brightness =1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 61/137 fbtft: Make sure string is NULL terminated
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit 21f585480deb4bcf0d92b08879c35d066dfee030 ]
New GCC warns about inappropriate use of strncpy():
drivers/staging/fbtft/fbtft-core.c: In function ‘fbtft_framebuffer_alloc’:drivers/staging/fbtft/fbtft-core.c:665:2: warning: ‘strncpy’ specified bound 16 equals destination size [-Wstringop-truncation]
665 | strncpy(info->fix.id, dev->driver->name, 16);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Later on the copy is being used with the assumption to be NULL terminated. Make sure string is NULL terminated by switching to snprintf().
--- drivers/staging/fbtft/fbtft-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/fbtft/fbtft-core.c +1 -1
@@ -765,7 +765,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display, fbdefio->deferred_io = fbtft_deferred_io;fb_deferred_io_init (info); -strncpy (info->fix.id, dev->driver->name,16 ); +snprintf (info->fix.id,sizeof (info->fix.id),"%s" , dev->driver->name); info->fix.type =FB_TYPE_PACKED_PIXELS ; info->fix.visual =FB_VISUAL_TRUECOLOR ; info->fix.xpanstep =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 62/137 crypto: sun4i-ss - Fix 64-bit size_t warnings on sun4i-ss-hash.c
In reply to Greg Kroah-HartmanFrom: Corentin Labbe <[email protected]>
[ Upstream commit a7126603d46fe8f01aeedf589e071c6aaa6c6c39 ]
If you try to compile this driver on a 64-bit platform then you will get warnings because it mixes size_t with unsigned int which only works on 32-bit.
This patch fixes all of the warnings on sun4i-ss-hash.c.
--- drivers/crypto/sunxi-ss/sun4i-ss-hash.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/crypto/sunxi-ss/sun4i-ss-hash.c +6 -6
@@ -245,8 +245,8 @@ int sun4i_hash_update(struct ahash_request *areq)*/ while (op->len <64 && i < end) {/* how many bytes we can read from current SG */ - in_r =min3 (mi.length - in_i, end - i, -64 - op->len); + in_r =min (end - i,64 - op->len); + in_r =min_t (size_t, mi.length - in_i, in_r);memcpy (op->buf + op->len, mi.addr + in_i, in_r); op->len += in_r; i += in_r;
@@ -266,8 +266,8 @@ int sun4i_hash_update(struct ahash_request *areq) }if (mi.length - in_i >3 && i < end) {/* how many bytes we can read from current SG */ - in_r =min3 (mi.length - in_i, areq->nbytes - i, - ((mi.length - in_i) /4 ) *4 ); + in_r =min_t (size_t, mi.length - in_i, areq->nbytes - i); + in_r =min_t (size_t, ((mi.length - in_i) /4 ) *4 , in_r);/* how many bytes we can write in the device*/ todo =min3 ((u32)(end - i) /4 , rx_cnt, (u32 )in_r /4 );writesl (ss->base +SS_RXFIFO , mi.addr + in_i, todo);
@@ -289,8 +289,8 @@ int sun4i_hash_update(struct ahash_request *areq)if ((areq->nbytes - i) <64 ) {while (i < areq->nbytes && in_i < mi.length && op->len <64 ) {/* how many bytes we can read from current SG */ - in_r =min3 (mi.length - in_i, areq->nbytes - i, -64 - op->len); + in_r =min (areq->nbytes - i,64 - op->len); + in_r =min_t (size_t, mi.length - in_i, in_r);memcpy (op->buf + op->len, mi.addr + in_i, in_r); op->len += in_r; i += in_r;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 63/137 crypto: vmx - Avoid weird build failures
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit 4ee812f6143d78d8ba1399671d78c8d78bf2817c ]
In the vmx crypto Makefile we assign to a variable called TARGET and pass that to the aesp8-ppc.pl and ghashp8-ppc.pl scripts.
The variable is meant to describe what flavour of powerpc we're building for, eg. either 32 or 64-bit, and big or little endian.
Unfortunately TARGET is a fairly common name for a make variable, and if it happens that TARGET is specified as a command line parameter to make, the value specified on the command line will override our value.
In particular this can happen if the kernel Makefile is driven by an external Makefile that uses TARGET for something.
This leads to weird build failures, eg:
nonsense at /build/linux/drivers/crypto/vmx/ghashp8-ppc.pl line 45. /linux/drivers/crypto/vmx/Makefile:20: recipe for target 'drivers/crypto/vmx/ghashp8-ppc.S' failed
Which shows that we passed an empty value for $(TARGET) to the perl script, confirmed with make V=1:
perl /linux/drivers/crypto/vmx/ghashp8-ppc.pl > drivers/crypto/vmx/ghashp8-ppc.S
We can avoid this confusion by using override, to tell make that we don't want anything to override our variable, even a value specified on the command line. We can also use a less common name, given the script calls it "flavour", let's use that.
--- drivers/crypto/vmx/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/crypto/vmx/Makefile +3 -3
@@ -2,13 +2,13 @@ obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o ghash.o ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) -TARGET := linux-ppc64le +override flavour := linux-ppc64le else -TARGET := linux-ppc64 +override flavour := linux-ppc64 endif quiet_cmd_perl = PERL $@ - cmd_perl = $(PERL) $(<) $(TARGET) > $(@) + cmd_perl = $(PERL) $(<) $(flavour) > $(@) $(src)/aesp8-ppc.S: $(src)/aesp8-ppc.pl $(call cmd,perl)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 64/137 libtraceevent: Fix memory leakage in copy_filter_type
In reply to Greg Kroah-HartmanFrom: Hewenliang <[email protected]>
[ Upstream commit 10992af6bf46a2048ad964985a5b77464e5563b1 ]
It is necessary to free the memory that we have allocated when error occurs.
--- tools/lib/traceevent/parse-filter.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
tools/lib/traceevent/parse-filter.c +7 -2
@@ -1484,8 +1484,10 @@ static int copy_filter_type(struct event_filter *filter,if (strcmp (str,"TRUE" ) ==0 ||strcmp (str,"FALSE" ) ==0 ) {/* Add trivial event */ arg =allocate_arg (); -if (arg ==NULL ) +if (arg ==NULL ) { +free (str);return -1 ; + } arg->type =FILTER_ARG_BOOLEAN ;if (strcmp (str,"TRUE" ) ==0 )
@@ -1494,8 +1496,11 @@ static int copy_filter_type(struct event_filter *filter, arg->boolean.value =0 ; filter_type =add_filter_type (filter, event->id); -if (filter_type ==NULL ) +if (filter_type ==NULL ) { +free (str); +free_arg (arg);return -1 ; + } filter_type->filter = arg;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 65/137 net: phy: initialise phydev speed and duplex sanely
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit a5d66f810061e2dd70fb7a108dcd14e535bc639f ]
When a phydev is created, the speed and duplex are set to zero and -1 respectively, rather than using the predefined SPEED_UNKNOWN and DUPLEX_UNKNOWN constants.
There is a window at initialisation time where we may report link down using the 0/-1 values. Tidy this up and use the predefined constants, so debug doesn't complain with:
"Unsupported (update phy-core.c)/Unsupported (update phy-core.c)"
when the speed and duplex settings are printed.
--- drivers/net/phy/phy_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/phy/phy_device.c +2 -2
@@ -161,8 +161,8 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, dev->dev.release = phy_device_release; - dev->speed =0 ; - dev->duplex =-1 ; + dev->speed =SPEED_UNKNOWN ; + dev->duplex =DUPLEX_UNKNOWN ; dev->pause =0 ; dev->asym_pause =0 ; dev->link =1 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 66/137 Revert "mmc: sdhci: Fix incorrect switch to HS mode"
In reply to Greg Kroah-HartmanFrom: Faiz Abbas <[email protected]>
commit 07bcc411567cb96f9d1fc84fff8d387118a2920d upstream.
This reverts commit c894e33ddc1910e14d6f2a2016f60ab613fd8b37.
This commit aims to treat SD High speed and SDR25 as the same while setting UHS Timings in HOST_CONTROL2 which leads to failures with some SD cards in AM65x. Revert this commit.
The issue this commit was trying to fix can be implemented in a platform specific callback instead of common sdhci code.
--- drivers/mmc/host/sdhci.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/mmc/host/sdhci.c +1 -3
@@ -1452,9 +1452,7 @@ void sdhci_set_uhs_signaling(struct sdhc ctrl_2 |=SDHCI_CTRL_UHS_SDR104 ; else if (timing == MMC_TIMING_UHS_SDR12) ctrl_2 |= SDHCI_CTRL_UHS_SDR12; - else if (timing == MMC_TIMING_SD_HS || - timing == MMC_TIMING_MMC_HS || - timing == MMC_TIMING_UHS_SDR25) + else if (timing == MMC_TIMING_UHS_SDR25) ctrl_2 |= SDHCI_CTRL_UHS_SDR25; else if (timing == MMC_TIMING_UHS_SDR50) ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
Greg Kroah-Hartman
maintainerPATCH 67/137 usb: xhci: Fix build warning seen with CONFIG_PM=n
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit 6056a0f8ede27b296d10ef46f7f677cc9d715371 ]
The following build warning is seen if CONFIG_PM is disabled.
drivers/usb/host/xhci-pci.c:498:13: warning:
unused function 'xhci_pci_shutdown'
--- drivers/usb/host/xhci-pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-pci.c +1 -1
@@ -444,7 +444,6 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) retval =xhci_resume (xhci, hibernated);return retval; } -#endif /* CONFIG_PM */ static void xhci_pci_shutdown (struct usb_hcd *hcd) {
@@ -457,6 +456,7 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd)if (xhci->quirks &XHCI_SPURIOUS_WAKEUP ) pci_set_power_state(pdev, PCI_D3hot); } +#endif /* CONFIG_PM */ /*-------------------------------------------------------------------------*/
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 68/137 btrfs: do not call synchronize_srcu() in inode_tree_del
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
[ Upstream commit f72ff01df9cf5db25c76674cac16605992d15467 ]
Testing with the new fsstress uncovered a pretty nasty deadlock with lookup and snapshot deletion.
Process A
unlink
-> final iput
-> inode_tree_del
-> synchronize_srcu(subvol_srcu)
Process Bbtrfs_lookup <- srcu_read_lock() acquired here
-> btrfs_iget
-> find inode that has I_FREEING set
-> __wait_on_freeing_inode()We're holding the srcu_read_lock() while doing the iget in order to make sure our fs root doesn't go away, and then we are waiting for the inode to finish freeing. However because the free'ing process is doing a synchronize_srcu() we deadlock.
Fix this by dropping the synchronize_srcu() in inode_tree_del(). We don't need people to stop accessing the fs root at this point, we're only adding our empty root to the dead roots list.
A larger much more invasive fix is forthcoming to address how we deal with fs roots, but this fixes the immediate problem.
--- fs/btrfs/inode.c | 1 - 1 file changed, 1 deletion(-)
fs/btrfs/inode.c +0 -1
@@ -5506,7 +5506,6 @@ static void inode_tree_del(struct inode *inode)spin_unlock (&root->inode_lock);if (empty &&btrfs_root_refs (&root->root_item) ==0 ) { -synchronize_srcu (&root->fs_info->subvol_srcu);spin_lock (&root->inode_lock); empty =RB_EMPTY_ROOT (&root->inode_tree);spin_unlock (&root->inode_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 69/137 btrfs: return error pointer from alloc_test_extent_buffer
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit b6293c821ea8fa2a631a2112cd86cd435effeb8b ]
Callers of alloc_test_extent_buffer have not correctly interpreted the return value as error pointer, as alloc_test_extent_buffer should behave as alloc_extent_buffer. The self-tests were unaffected but btrfs_find_create_tree_block could call both functions and that would cause problems up in the call chain.
--- fs/btrfs/extent_io.c | 6 ++++-- fs/btrfs/tests/qgroup-tests.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-)
fs/btrfs/extent_io.c +4 -2
@@ -4948,12 +4948,14 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,return eb; eb =alloc_dummy_extent_buffer (fs_info, start);if (!eb) -return NULL ; +return ERR_PTR (-ENOMEM ); eb->fs_info = fs_info; again: ret =radix_tree_preload (GFP_NOFS & ~__GFP_HIGHMEM); -if (ret) +if (ret) { + exists =ERR_PTR (ret); goto free_eb; + }spin_lock (&fs_info->buffer_lock); ret =radix_tree_insert (&fs_info->buffer_radix, start >>PAGE_CACHE_SHIFT , eb);
fs/btrfs/tests/qgroup-tests.c +2 -2
@@ -477,9 +477,9 @@ int btrfs_test_qgroups(void)* *cough*backref walking code*cough* */ root->node =alloc_test_extent_buffer (root->fs_info,4096 ); -if (!root->node) { +if (IS_ERR (root->node)) {test_msg ("Couldn't allocate dummy buffer\n" ); - ret = -ENOMEM ; + ret =PTR_ERR (root->node); goto out; }btrfs_set_header_level (root->node,0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 70/137 btrfs: abort transaction after failed inode updates in create_subvol
In reply to Greg Kroah-HartmanFrom: Josef Bacik <[email protected]>
[ Upstream commit c7e54b5102bf3614cadb9ca32d7be73bad6cecf0 ]
We can just abort the transaction here, and in fact do that for every other failure in this function except these two cases.
--- fs/btrfs/ioctl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
fs/btrfs/ioctl.c +8 -2
@@ -594,12 +594,18 @@ static noinline int create_subvol(struct inode *dir,btrfs_i_size_write (dir, dir->i_size + namelen *2 ); ret =btrfs_update_inode (trans, root, dir); -BUG_ON (ret); +if (ret) { +btrfs_abort_transaction (trans, root, ret); + goto fail; + } ret =btrfs_add_root_ref (trans, root->fs_info->tree_root, objectid, root->root_key.objectid,btrfs_ino (dir), index, name, namelen); -BUG_ON (ret); +if (ret) { +btrfs_abort_transaction (trans, root, ret); + goto fail; + } ret = btrfs_uuid_tree_add(trans, root->fs_info->uuid_root, root_item.uuid, BTRFS_UUID_KEY_SUBVOL,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 71/137 Btrfs: fix removal logic of the tree mod log that leads to use-after-free issues
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit 6609fee8897ac475378388238456c84298bff802 ]
When a tree mod log user no longer needs to use the tree it calls btrfs_put_tree_mod_seq() to remove itself from the list of users and delete all no longer used elements of the tree's red black tree, which should be all elements with a sequence number less then our equals to the caller's sequence number. However the logic is broken because it can delete and free elements from the red black tree that have a sequence number greater then the caller's sequence number:
1) At a point in time we have sequence numbers 1, 2, 3 and 4 in the tree mod log;
2) The task which got assigned the sequence number 1 calls btrfs_put_tree_mod_seq();
3) Sequence number 1 is deleted from the list of sequence numbers;
4) The current minimum sequence number is computed to be the sequence number 2;
5) A task using sequence number 2 is at tree_mod_log_rewind() and gets a pointer to one of its elements from the red black tree through a call to tree_mod_log_search();
6) The task with sequence number 1 iterates the red black tree of tree modification elements and deletes (and frees) all elements with a sequence number less then or equals to 2 (the computed minimum sequence number) - it ends up only leaving elements with sequence numbers of 3 and 4;
7) The task with sequence number 2 now uses the pointer to its element, already freed by the other task, at __tree_mod_log_rewind(), resulting in a use-after-free issue. When CONFIG_DEBUG_PAGEALLOC=y it produces a trace like the following:
[16804.546854] general protection fault: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC PTI [16804.547451] CPU: 0 PID: 28257 Comm: pool Tainted: G W 5.4.0-rc8-btrfs-next-51 #1 [16804.548059] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.0-0-ga698c8995f-prebuilt.qemu.org 04/01/2014 [16804.548666] RIP: 0010:rb_next+0x16/0x50 (...) [16804.550581] RSP: 0018:ffffb948418ef9b0 EFLAGS: 00010202 [16804.551227] RAX: 6b6b6b6b6b6b6b6b RBX: ffff90e0247f6600 RCX: 6b6b6b6b6b6b6b6b [16804.551873] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff90e0247f6600 [16804.552504] RBP: ffff90dffe0d4688 R08: 0000000000000001 R09: 0000000000000000 [16804.553136] R10: ffff90dffa4a0040 R11: 0000000000000000 R12: 000000000000002e [16804.553768] R13: ffff90e0247f6600 R14: 0000000000001663 R15: ffff90dff77862b8 [16804.554399] FS: 00007f4b197ae700(0000) GS:ffff90e036a00000(0000) knlGS:0000000000000000 [16804.555039] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [16804.555683] CR2: 00007f4b10022000 CR3: 00000002060e2004 CR4: 00000000003606f0 [16804.556336] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [16804.556968] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [16804.557583] Call Trace: [16804.558207] __tree_mod_log_rewind+0xbf/0x280 [btrfs] [16804.558835] btrfs_search_old_slot+0x105/0xd00 [btrfs] [16804.559468] resolve_indirect_refs+0x1eb/0xc70 [btrfs] [16804.560087] ? free_extent_buffer.part.19+0x5a/0xc0 [btrfs] [16804.560700] find_parent_nodes+0x388/0x1120 [btrfs] [16804.561310] btrfs_check_shared+0x115/0x1c0 [btrfs] [16804.561916] ? extent_fiemap+0x59d/0x6d0 [btrfs] [16804.562518] extent_fiemap+0x59d/0x6d0 [btrfs] [16804.563112] ? __might_fault+0x11/0x90 [16804.563706] do_vfs_ioctl+0x45a/0x700 [16804.564299] ksys_ioctl+0x70/0x80 [16804.564885] ? trace_hardirqs_off_thunk+0x1a/0x20 [16804.565461] __x64_sys_ioctl+0x16/0x20 [16804.566020] do_syscall_64+0x5c/0x250 [16804.566580] entry_SYSCALL_64_after_hwframe+0x49/0xbe [16804.567153] RIP: 0033:0x7f4b1ba2add7 (...) [16804.568907] RSP: 002b:00007f4b197adc88 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 [16804.569513] RAX: ffffffffffffffda RBX: 00007f4b100210d8 RCX: 00007f4b1ba2add7 [16804.570133] RDX: 00007f4b100210d8 RSI: 00000000c020660b RDI: 0000000000000003 [16804.570726] RBP: 000055de05a6cfe0 R08: 0000000000000000 R09: 00007f4b197add44 [16804.571314] R10: 0000000000000000 R11: 0000000000000246 R12: 00007f4b197add48 [16804.571905] R13: 00007f4b197add40 R14: 00007f4b100210d0 R15: 00007f4b197add50 (...) [16804.575623] ---[ end trace 87317359aad4ba50 ]---
Fix this by making btrfs_put_tree_mod_seq() skip deletion of elements that have a sequence number equals to the computed minimum sequence number, and not just elements with a sequence number greater then that minimum.
--- fs/btrfs/ctree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/ctree.c +1 -1
@@ -425,7 +425,7 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info,for (node =rb_first (tm_root); node; node = next) { next =rb_next (node); tm = container_of(node, struct tree_mod_elem, node); -if (tm->seq > min_seq) +if (tm->seq >= min_seq)continue ;rb_erase (node, tm_root);kfree (tm);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 72/137 ALSA: pcm: Avoid possible info leaks from PCM stream buffers
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit add9d56d7b3781532208afbff5509d7382fb6efe upstream.
The current PCM code doesn't initialize explicitly the buffers allocated for PCM streams, hence it might leak some uninitialized kernel data or previous stream contents by mmapping or reading the buffer before actually starting the stream.
Since this is a common problem, this patch simply adds the clearance of the buffer data at hw_params callback. Although this does only zero-clear no matter which format is used, which doesn't mean the silence for some formats, but it should be OK because the intention is just to clear the previous data on the buffer.
--- sound/core/pcm_native.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/core/pcm_native.c +4 -0
@@ -587,6 +587,10 @@ static int snd_pcm_hw_params(struct snd_while (runtime->boundary *2 <=LONG_MAX - runtime->buffer_size) runtime->boundary *=2 ; +/* clear the buffer for avoiding possible kernel info leaks */ +if (runtime->dma_area) +memset (runtime->dma_area,0 , runtime->dma_bytes); +snd_pcm_timer_resolution_change (substream);snd_pcm_set_state (substream,SNDRV_PCM_STATE_SETUP );
Greg Kroah-Hartman
maintainerPATCH 73/137 af_packet: set defaule value for tmo
In reply to Greg Kroah-HartmanFrom: Mao Wenan <[email protected]>
[ Upstream commit b43d1f9f7067c6759b1051e8ecb84e82cef569fe ]
There is softlockup when using TPACKET_V3:
...
NMI watchdog: BUG: soft lockup - CPU#2 stuck for 60010ms! (__irq_svc) from [<c0558a0c>] (_raw_spin_unlock_irqrestore+0x44/0x54) (_raw_spin_unlock_irqrestore) from [<c027b7e8>] (mod_timer+0x210/0x25c) (mod_timer) from [<c0549c30>] (prb_retire_rx_blk_timer_expired+0x68/0x11c) (prb_retire_rx_blk_timer_expired) from [<c027a7ac>] (call_timer_fn+0x90/0x17c)
(call_timer_fn) from [<c027ab6c>] (run_timer_softirq+0x2d4/0x2fc) (run_timer_softirq) from [<c021eaf4>] (__do_softirq+0x218/0x318) (__do_softirq) from [<c021eea0>] (irq_exit+0x88/0xac) (irq_exit) from [<c0240130>] (msa_irq_exit+0x11c/0x1d4) (msa_irq_exit) from [<c0209cf0>] (handle_IPI+0x650/0x7f4) (handle_IPI) from [<c02015bc>] (gic_handle_irq+0x108/0x118) (gic_handle_irq) from [<c0558ee4>] (__irq_usr+0x44/0x5c)
...
If __ethtool_get_link_ksettings() is failed in prb_calc_retire_blk_tmo(), msec and tmo will be zero, so tov_in_jiffies is zero and the timer expire for retire_blk_timer is turn to mod_timer(&pkc->retire_blk_timer, jiffies + 0),
which will trigger cpu usage of softirq is 100%.
--- net/packet/af_packet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/packet/af_packet.c +2 -1
@@ -587,7 +587,8 @@ static int prb_calc_retire_blk_tmo(struc msec =1 ; div = speed /1000 ; } - } + }else +return DEFAULT_PRB_RETIRE_TOV ; mbits = (blk_size_in_bytes *8 ) / (1024 *1024 );
Greg Kroah-Hartman
maintainerPATCH 74/137 fjes: fix missed check in fjes_acpi_add
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit a288f105a03a7e0e629a8da2b31f34ebf0343ee2 ]
fjes_acpi_add() misses a check for platform_device_register_simple(). Add a check to fix it.
--- drivers/net/fjes/fjes_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/fjes/fjes_main.c +3 -0
@@ -149,6 +149,9 @@ static int fjes_acpi_add(struct acpi_dev/* create platform_device */ plat_dev =platform_device_register_simple (DRV_NAME ,0 , fjes_resource,ARRAY_SIZE (fjes_resource)); +if (IS_ERR (plat_dev)) +return PTR_ERR (plat_dev); + device->driver_data = plat_dev;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 75/137 mod_devicetable: fix PHY module format
In reply to Greg Kroah-HartmanFrom: Russell King <[email protected]>
[ Upstream commit d2ed49cf6c13e379c5819aa5ac20e1f9674ebc89 ]
When a PHY is probed, if the top bit is set, we end up requesting a module with the string "mdio:-10101110000000100101000101010001" - the top bit is printed to a signed -1 value. This leads to the module not being loaded.
Fix the module format string and the macro generating the values for it to ensure that we only print unsigned types and the top bit is always 0/1. We correctly end up with "mdio:10101110000000100101000101010001".
--- include/linux/mod_devicetable.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/mod_devicetable.h +2 -2
@@ -502,9 +502,9 @@ struct platform_device_id {#define MDIO_MODULE_PREFIX "mdio:" -#define MDIO_ID_FMT "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d" +#define MDIO_ID_FMT "%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u"#define MDIO_ID_ARGS (_id) \ - (_id)>>31, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1, \ + ((_id)>>31) & 1, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1, \ ((_id)>>27) & 1, ((_id)>>26) & 1, ((_id)>>25) & 1, ((_id)>>24) & 1, \ ((_id)>>23) & 1, ((_id)>>22) & 1, ((_id)>>21) & 1, ((_id)>>20) & 1, \ ((_id)>>19) & 1, ((_id)>>18) & 1, ((_id)>>17) & 1, ((_id)>>16) & 1, \
Greg Kroah-Hartman
maintainerPATCH 76/137 net: hisilicon: Fix a BUG trigered by wrong bytes_compl
In reply to Greg Kroah-HartmanFrom: Jiangfeng Xiao <[email protected]>
[ Upstream commit 90b3b339364c76baa2436445401ea9ade040c216 ]
When doing stress test, we get the following trace:
kernel BUG at lib/dynamic_queue_limits.c:26!
Internal error: Oops - BUG: 0 [#1] SMP ARM Modules linked in: hip04_eth CPU: 0 PID: 2003 Comm: tDblStackPcap0 Tainted: G O L 4.4.197 #1 Hardware name: Hisilicon A15 task: c3637668 task.stack: de3bc000 PC is at dql_completed+0x18/0x154 LR is at hip04_tx_reclaim+0x110/0x174 [hip04_eth] pc : [<c041abfc>] lr : [<bf0003a8>] psr: 800f0313
sp : de3bdc2c ip : 00000000 fp : c020fb10
r10: 00000000 r9 : c39b4224 r8 : 00000001
r7 : 00000046 r6 : c39b4000 r5 : 0078f392 r4 : 0078f392 r3 : 00000047 r2 : 00000000 r1 : 00000046 r0 : df5d5c80
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 32c5387d Table: 1e189b80 DAC: 55555555 Process tDblStackPcap0 (pid: 2003, stack limit = 0xde3bc190)
Stack: (0xde3bdc2c to 0xde3be000) [<c041abfc>] (dql_completed) from [<bf0003a8>] (hip04_tx_reclaim+0x110/0x174 [hip04_eth]) [<bf0003a8>] (hip04_tx_reclaim [hip04_eth]) from [<bf0012c0>] (hip04_rx_poll+0x20/0x388 [hip04_eth]) [<bf0012c0>] (hip04_rx_poll [hip04_eth]) from [<c04c8d9c>] (net_rx_action+0x120/0x374) [<c04c8d9c>] (net_rx_action) from [<c021eaf4>] (__do_softirq+0x218/0x318) [<c021eaf4>] (__do_softirq) from [<c021eea0>] (irq_exit+0x88/0xac) [<c021eea0>] (irq_exit) from [<c0240130>] (msa_irq_exit+0x11c/0x1d4) [<c0240130>] (msa_irq_exit) from [<c0267ba8>] (__handle_domain_irq+0x110/0x148) [<c0267ba8>] (__handle_domain_irq) from [<c0201588>] (gic_handle_irq+0xd4/0x118) [<c0201588>] (gic_handle_irq) from [<c0558360>] (__irq_svc+0x40/0x58) Exception stack(0xde3bdde0 to 0xde3bde28)
dde0: 00000000 00008001 c3637668 00000000 00000000 a00f0213 dd3627a0 c0af6380
de00: c086d380 a00f0213 c0a22a50 de3bde6c 00000002 de3bde30 c0558138 c055813c
de20: 600f0213 ffffffff
[<c0558360>] (__irq_svc) from [<c055813c>] (_raw_spin_unlock_irqrestore+0x44/0x54)
Kernel panic - not syncing: Fatal exception in interrupt
Pre-modification code:
int hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev) {
[...]
[1] priv->tx_head = TX_NEXT(tx_head);
[2] count++;
[3] netdev_sent_queue(ndev, skb->len);
[...]
}
An rx interrupt occurs if hip04_mac_start_xmit just executes to the line 2, tx_head has been updated, but corresponding 'skb->len' has not been added to dql_queue.
And then hip04_mac_interrupt->__napi_schedule->hip04_rx_poll->hip04_tx_reclaim
In hip04_tx_reclaim, because tx_head has been updated, bytes_compl will plus an additional "skb-> len"
which has not been added to dql_queue. And then
trigger the BUG_ON(bytes_compl > num_queued - dql->num_completed).
To solve the problem described above, we put
"netdev_sent_queue(ndev, skb->len);"
before
"priv->tx_head = TX_NEXT(tx_head);"
--- drivers/net/ethernet/hisilicon/hip04_eth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/hisilicon/hip04_eth.c +1 -1
@@ -455,9 +455,9 @@ static int hip04_mac_start_xmit(struct sskb_tx_timestamp (skb);hip04_set_xmit_desc (priv, phys); - priv->tx_head =TX_NEXT (tx_head); count++;netdev_sent_queue (ndev, skb->len); + priv->tx_head =TX_NEXT (tx_head); stats->tx_bytes += skb->len; stats->tx_packets++;
Greg Kroah-Hartman
maintainerPATCH 77/137 net: nfc: nci: fix a possible sleep-in-atomic-context bug in nci_uart_tty_receive()
In reply to Greg Kroah-HartmanFrom: Jia-Ju Bai <[email protected]>
[ Upstream commit b7ac893652cafadcf669f78452329727e4e255cc ]
The kernel may sleep while holding a spinlock.
The function call path (from bottom to top) in Linux 4.19 is:
net/nfc/nci/uart.c, 349:
nci_skb_alloc in nci_uart_default_recv_bufnet/nfc/nci/uart.c, 255:
(FUNC_PTR)nci_uart_default_recv_buf in nci_uart_tty_receivenet/nfc/nci/uart.c, 254:
spin_lock in nci_uart_tty_receive
nci_skb_alloc(GFP_KERNEL) can sleep at runtime. (FUNC_PTR) means a function pointer is called.
To fix this bug, GFP_KERNEL is replaced with GFP_ATOMIC for nci_skb_alloc().
This bug is found by a static analysis tool STCheck written by myself.
--- net/nfc/nci/uart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/nfc/nci/uart.c +1 -1
@@ -355,7 +355,7 @@ static int nci_uart_default_recv_buf(str nu->rx_packet_len =-1 ; nu->rx_skb =nci_skb_alloc (nu->ndev,NCI_MAX_PACKET_SIZE , -GFP_KERNEL ); +GFP_ATOMIC );if (!nu->rx_skb)return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 78/137 net: qlogic: Fix error paths in ql_alloc_large_buffers()
In reply to Greg Kroah-HartmanFrom: Ben Hutchings <[email protected]>
[ Upstream commit cad46039e4c99812db067c8ac22a864960e7acc4 ]
ql_alloc_large_buffers() has the usual RX buffer allocation loop where it allocates skbs and maps them for DMA. It also treats failure as a fatal error.
There are (at least) three bugs in the error paths:
1. ql_free_large_buffers() assumes that the lrg_buf[] entry for the first buffer that couldn't be allocated will have .skb == NULL. But the qla_buf[] array is not zero-initialised.
2. ql_free_large_buffers() DMA-unmaps all skbs in lrg_buf[]. This is incorrect for the last allocated skb, if DMA mapping failed.
3. Commit 1acb8f2a7a9f ("net: qlogic: Fix memory leak in ql_alloc_large_buffers") added a direct call to dev_kfree_skb_any() after the skb is recorded in lrg_buf[], so ql_free_large_buffers() will double-free it.
The bugs are somewhat inter-twined, so fix them all at once:
* Clear each entry in qla_buf[] before attempting to allocate an skb for it. This goes half-way to fixing bug 1.
* Set the .skb field only after the skb is DMA-mapped. This fixes the rest.
--- drivers/net/ethernet/qlogic/qla3xxx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/qlogic/qla3xxx.c +4 -4
@@ -2752,6 +2752,9 @@ static int ql_alloc_large_buffers(structint err;for (i =0 ; i < qdev->num_large_buffers; i++) { + lrg_buf_cb = &qdev->lrg_buf[i]; +memset (lrg_buf_cb,0 ,sizeof (struct ql_rcv_buf_cb )); + skb =netdev_alloc_skb (qdev->ndev, qdev->lrg_buffer_len);if (unlikely (!skb)) {
@@ -2762,11 +2765,7 @@ static int ql_alloc_large_buffers(structql_free_large_buffers (qdev);return -ENOMEM ; }else { - - lrg_buf_cb = &qdev->lrg_buf[i]; -memset (lrg_buf_cb,0 ,sizeof (struct ql_rcv_buf_cb )); lrg_buf_cb->index = i; - lrg_buf_cb->skb = skb;/* * We save some space to copy the ethhdr from first * buffer
@@ -2788,6 +2787,7 @@ static int ql_alloc_large_buffers(structreturn -ENOMEM ; } + lrg_buf_cb->skb = skb;dma_unmap_addr_set (lrg_buf_cb, mapaddr, map); dma_unmap_len_set(lrg_buf_cb, maplen, qdev->lrg_buffer_len -
Greg Kroah-Hartman
maintainerPATCH 79/137 net: usb: lan78xx: Fix suspend/resume PHY register access error
In reply to Greg Kroah-HartmanFrom: Cristian Birsan <[email protected]>
[ Upstream commit 20032b63586ac6c28c936dff696981159913a13f ]
Lan78xx driver accesses the PHY registers through MDIO bus over USB connection. When performing a suspend/resume, the PHY registers can be accessed before the USB connection is resumed. This will generate an error and will prevent the device to resume correctly.
This patch adds the dependency between the MDIO bus and USB device to allow correct handling of suspend/resume.
--- drivers/net/usb/lan78xx.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/lan78xx.c +1 -0
@@ -1448,6 +1448,7 @@ static int lan78xx_mdio_init(struct lan7 dev->mdiobus->read = lan78xx_mdiobus_read; dev->mdiobus->write = lan78xx_mdiobus_write; dev->mdiobus->name ="lan78xx-mdiobus" ; + dev->mdiobus->parent = &dev->udev->dev;snprintf (dev->mdiobus->id,MII_BUS_ID_SIZE ,"usb-%03d:%03d" , dev->udev->bus->busnum, dev->udev->devnum);
Greg Kroah-Hartman
maintainerPATCH 80/137 sctp: fully initialize v4 addr in some functions
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit b6f3320b1d5267e7b583a6d0c88dda518101740c ]
Syzbot found a crash:
BUG: KMSAN: uninit-value in crc32_body lib/crc32.c:112 [inline]
BUG: KMSAN: uninit-value in crc32_le_generic lib/crc32.c:179 [inline]
BUG: KMSAN: uninit-value in __crc32c_le_base+0x4fa/0xd30 lib/crc32.c:202
Call Trace:
crc32_body lib/crc32.c:112 [inline]
crc32_le_generic lib/crc32.c:179 [inline]
__crc32c_le_base+0x4fa/0xd30 lib/crc32.c:202
chksum_update+0xb2/0x110 crypto/crc32c_generic.c:90
crypto_shash_update+0x4c5/0x530 crypto/shash.c:107
crc32c+0x150/0x220 lib/libcrc32c.c:47
sctp_csum_update+0x89/0xa0 include/net/sctp/checksum.h:36
__skb_checksum+0x1297/0x12a0 net/core/skbuff.c:2640
sctp_compute_cksum include/net/sctp/checksum.h:59 [inline]
sctp_packet_pack net/sctp/output.c:528 [inline]
sctp_packet_transmit+0x40fb/0x4250 net/sctp/output.c:597
sctp_outq_flush_transports net/sctp/outqueue.c:1146 [inline]
sctp_outq_flush+0x1823/0x5d80 net/sctp/outqueue.c:1194
sctp_outq_uncork+0xd0/0xf0 net/sctp/outqueue.c:757
sctp_cmd_interpreter net/sctp/sm_sideeffect.c:1781 [inline]
sctp_side_effects net/sctp/sm_sideeffect.c:1184 [inline]
sctp_do_sm+0x8fe1/0x9720 net/sctp/sm_sideeffect.c:1155
sctp_primitive_REQUESTHEARTBEAT+0x175/0x1a0 net/sctp/primitive.c:185
sctp_apply_peer_addr_params+0x212/0x1d40 net/sctp/socket.c:2433
sctp_setsockopt_peer_addr_params net/sctp/socket.c:2686 [inline]
sctp_setsockopt+0x189bb/0x19090 net/sctp/socket.c:4672The issue was caused by transport->ipaddr set with uninit addr param, which was passed by:
sctp_transport_init net/sctp/transport.c:47 [inline] sctp_transport_new+0x248/0xa00 net/sctp/transport.c:100 sctp_assoc_add_peer+0x5ba/0x2030 net/sctp/associola.c:611 sctp_process_param net/sctp/sm_make_chunk.c:2524 [inline]
where 'addr' is set by sctp_v4_from_addr_param(), and it doesn't initialize the padding of addr->v4.
Later when calling sctp_make_heartbeat(), hbinfo.daddr(=transport->ipaddr) will become the part of skb, and the issue occurs.
This patch is to fix it by initializing the padding of addr->v4 in sctp_v4_from_addr_param(), as well as other functions that do the similar thing, and these functions shouldn't trust that the caller initializes the memory, as Marcelo suggested.
--- net/sctp/protocol.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sctp/protocol.c +4 -0
@@ -255,6 +255,7 @@ static void sctp_v4_from_sk(union sctp_a addr->v4.sin_family =AF_INET ; addr->v4.sin_port =0 ; addr->v4.sin_addr.s_addr =inet_sk (sk)->inet_rcv_saddr; +memset (addr->v4.sin_zero,0 ,sizeof (addr->v4.sin_zero)); }/* Initialize sk->sk_rcv_saddr from sctp_addr. */
@@ -277,6 +278,7 @@ static void sctp_v4_from_addr_param(unio addr->v4.sin_family =AF_INET ; addr->v4.sin_port = port; addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; +memset (addr->v4.sin_zero,0 ,sizeof (addr->v4.sin_zero)); }/* Initialize an address parameter from a sctp_addr and return the length
@@ -301,6 +303,7 @@ static void sctp_v4_dst_saddr(union sctp saddr->v4.sin_family =AF_INET ; saddr->v4.sin_port = port; saddr->v4.sin_addr.s_addr = fl4->saddr; +memset (saddr->v4.sin_zero,0 ,sizeof (saddr->v4.sin_zero)); }/* Compare two addresses exactly. */
@@ -323,6 +326,7 @@ static void sctp_v4_inaddr_any(union sct addr->v4.sin_family =AF_INET ; addr->v4.sin_addr.s_addr =htonl (INADDR_ANY ); addr->v4.sin_port = port; +memset (addr->v4.sin_zero,0 ,sizeof (addr->v4.sin_zero)); }/* Is this a wildcard address? */
Greg Kroah-Hartman
maintainerPATCH 81/137 net: dst: Force 4-byte alignment of dst_metrics
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 258a980d1ec23e2c786e9536a7dd260bea74bae6 ]
When storing a pointer to a dst_metrics structure in dst_entry._metrics, two flags are added in the least significant bits of the pointer value. Hence this assumes all pointers to dst_metrics structures have at least 4-byte alignment.
However, on m68k, the minimum alignment of 32-bit values is 2 bytes, not 4 bytes. Hence in some kernel builds, dst_default_metrics may be only 2-byte aligned, leading to obscure boot warnings like:
WARNING: CPU: 0 PID: 7 at lib/refcount.c:28 refcount_warn_saturate+0x44/0x9a
refcount_t: underflow; use-after-free.
Modules linked in:
CPU: 0 PID: 7 Comm: ksoftirqd/0 Tainted: G W 5.5.0-rc2-atari-01448-g114a1a1038af891d-dirty #261
Stack from 10835e6c:
10835e6c 0038134f 00023fa6 00394b0f 0000001c 00000009 00321560 00023fea
00394b0f 0000001c 001a70f8 00000009 00000000 10835eb4 00000001 00000000
04208040 0000000a 00394b4a 10835ed4 00043aa8 001a70f8 00394b0f 0000001c
00000009 00394b4a 0026aba8 003215a4 00000003 00000000 0026d5a8 00000001
003215a4 003a4361 003238d6 000001f0 00000000 003215a4 10aa3b00 00025e84
003ddb00 10834000 002416a8 10aa3b00 00000000 00000080 000aa038 0004854a
Call Trace: [<00023fa6>] __warn+0xb2/0xb4
[<00023fea>] warn_slowpath_fmt+0x42/0x64
[<001a70f8>] refcount_warn_saturate+0x44/0x9a
[<00043aa8>] printk+0x0/0x18
[<001a70f8>] refcount_warn_saturate+0x44/0x9a
[<0026aba8>] refcount_sub_and_test.constprop.73+0x38/0x3e
[<0026d5a8>] ipv4_dst_destroy+0x5e/0x7e
[<00025e84>] __local_bh_enable_ip+0x0/0x8e
[<002416a8>] dst_destroy+0x40/0xaeFix this by forcing 4-byte alignment of all dst_metrics structures.
--- include/net/dst.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/dst.h +1 -1
@@ -113,7 +113,7 @@ struct dst_entry {struct dst_metrics {u32 metrics[RTAX_MAX ];atomic_t refcnt; -}; +}__aligned(4) ;/* Low pointer bits contain DST_METRICS_FLAGS */ extern const struct dst_metrics dst_default_metrics;u32 *dst_cow_metrics_generic (struct dst_entry *dst,unsigned long old);
Greg Kroah-Hartman
maintainerPATCH 82/137 usbip: Fix error path of vhci_recv_ret_submit()
In reply to Greg Kroah-HartmanFrom: Suwan Kim <[email protected]>
commit aabb5b833872524eaf28f52187e5987984982264 upstream.
If a transaction error happens in vhci_recv_ret_submit(), event handler closes connection and changes port status to kick hub_event. Then hub tries to flush the endpoint URBs, but that causes infinite loop between usb_hub_flush_endpoint() and vhci_urb_dequeue() because "vhci_priv" in vhci_urb_dequeue() was already released by vhci_recv_ret_submit() before a transmission error occurred. Thus, vhci_urb_dequeue() terminates early and usb_hub_flush_endpoint() continuously calls vhci_urb_dequeue().
The root cause of this issue is that vhci_recv_ret_submit() terminates early without giving back URB when transaction error occurs in vhci_recv_ret_submit(). That causes the error URB to still be linked at endpoint list without “vhci_priv".
So, in the case of transaction error in vhci_recv_ret_submit(), unlink URB from the endpoint, insert proper error code in urb->status and give back URB.
--- drivers/usb/usbip/vhci_rx.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/usb/usbip/vhci_rx.c +9 -4
@@ -89,16 +89,21 @@ static void vhci_recv_ret_submit(structusbip_pack_pdu (pdu, urb,USBIP_RET_SUBMIT ,0 );/* recv transfer buffer */ -if (usbip_recv_xbuff (ud, urb) <0 ) -return ; +if (usbip_recv_xbuff (ud, urb) <0 ) { + urb->status = -EPROTO ; + goto error; + }/* recv iso_packet_descriptor */ -if (usbip_recv_iso (ud, urb) <0 ) -return ; +if (usbip_recv_iso (ud, urb) <0 ) { + urb->status = -EPROTO ; + goto error; + }/* restore the padding in iso packets */ usbip_pad_iso (ud, urb); +error:if (usbip_dbg_flag_vhci_rx)usbip_dump_urb (urb);
Greg Kroah-Hartman
maintainerPATCH 83/137 USB: EHCI: Do not return -EPIPE when hub is disconnected
In reply to Greg Kroah-HartmanFrom: Erkka Talvitie <[email protected]>
commit 64cc3f12d1c7dd054a215bc1ff9cc2abcfe35832 upstream.
When disconnecting a USB hub that has some child device(s) connected to it (such as a USB mouse), then the stack tries to clear halt and reset device(s) which are _already_ physically disconnected.
The issue has been reproduced with:
CPU: IMX6D5EYM10AD or MCIMX6D5EYM10AE.
SW: U-Boot 2019.07 and kernel 4.19.40.
CPU: HP Proliant Microserver Gen8.
SW: Linux version 4.2.3-300.fc23.x86_64
In this situation there will be error bit for MMF active yet the CERR equals EHCI_TUNE_CERR + halt. Existing implementation interprets this as a stall [1] (chapter 8.4.5).
The possible conditions when the MMF will be active + halt can be found from [2] (Table 4-13).
Fix for the issue is to check whether MMF is active and PID Code is IN before checking for the stall. If these conditions are true then it is not a stall.
What happens after the fix is that when disconnecting a hub with attached device(s) the situation is not interpret as a stall.
[1] [https://www.usb.org/document-library/usb-20-specification, usb_20.pdf]
[2] [https://www.intel.com/content/dam/www/public/us/en/documents/
technical-specifications/ehci-specification-for-usb.pdf]
--- drivers/usb/host/ehci-q.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/usb/host/ehci-q.c +12 -1
@@ -40,6 +40,10 @@/*-------------------------------------------------------------------------*/ +/* PID Codes that are used here, from EHCI specification, Table 3-16. */ +#define PID_CODE_IN 1 +#define PID_CODE_SETUP 2 +/* fill a qtd, returning how much of the buffer we were able to queue up */ static int
@@ -199,7 +203,7 @@ static int qtd_copy_status (int status = -EINPROGRESS ;/* count IN/OUT bytes, not SETUP (even short packets) */ -if (likely (QTD_PID (token) !=2 )) +if (likely (QTD_PID (token) !=PID_CODE_SETUP )) urb->actual_length += length -QTD_LENGTH (token);/* don't modify error codes */
@@ -215,6 +219,13 @@ static int qtd_copy_status (if (token &QTD_STS_BABBLE ) {/* FIXME "must" disable babbling device's port too */ status = -EOVERFLOW ; +/* +* When MMF is active and PID Code is IN, queue is halted. +* EHCI Specification, Table 4-13. +*/ + }else if ((token &QTD_STS_MMF ) && + (QTD_PID (token) ==PID_CODE_IN )) { + status = -EPROTO ;/* CERR nonzero + halt --> stall */ }else if (QTD_CERR (token)) { status = -EPIPE ;
Greg Kroah-Hartman
maintainerPATCH 84/137 platform/x86: hp-wmi: Make buffer for HPWMI_FEATURE2_QUERY 128 bytes
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 133b2acee3871ae6bf123b8fe34be14464aa3d2c upstream.
At least on the HP Envy x360 15-cp0xxx model the WMI interface for HPWMI_FEATURE2_QUERY requires an outsize of at least 128 bytes, otherwise it fails with an error code 5 (HPWMI_RET_INVALID_PARAMETERS):
Dec 06 00:59:38 kernel: hp_wmi: query 0xd returned error 0x5
We do not care about the contents of the buffer, we just want to know if the HPWMI_FEATURE2_QUERY command is supported.
This commits bumps the buffer size, fixing the error.
--- drivers/platform/x86/hp-wmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/hp-wmi.c +1 -1
@@ -309,7 +309,7 @@ static int __init hp_wmi_bios_2008_laterstatic int __init hp_wmi_bios_2009_later (void ) { -int state =0 ; +u8 state[128 ];int ret =hp_wmi_perform_query (HPWMI_FEATURE2_QUERY ,0 , &state,sizeof (state),sizeof (state));if (!ret)
Greg Kroah-Hartman
maintainerPATCH 85/137 staging: comedi: gsc_hpdi: check dma_alloc_coherent() return value
In reply to Greg Kroah-HartmanFrom: Ian Abbott <[email protected]>
commit ab42b48f32d4c766420c3499ee9c0289b7028182 upstream.
The "auto-attach" handler function gsc_hpdi_auto_attach() calls dma_alloc_coherent() in a loop to allocate some DMA data buffers, and also calls it to allocate a buffer for a DMA descriptor chain. However, it does not check the return value of any of these calls. Change gsc_hpdi_auto_attach() to return -ENOMEM if any of these dma_alloc_coherent() calls fail. This will result in the comedi core calling the "detach" handler gsc_hpdi_detach() as part of the clean-up, which will call gsc_hpdi_free_dma() to free any allocated DMA coherent memory buffers.
--- drivers/staging/comedi/drivers/gsc_hpdi.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/staging/comedi/drivers/gsc_hpdi.c +10 -0
@@ -632,12 +632,22 @@ static int gsc_hpdi_auto_attach(struct c devpriv->dio_buffer[i] =pci_alloc_consistent (pcidev,DMA_BUFFER_SIZE , &devpriv->dio_buffer_phys_addr[i]); +if (!devpriv->dio_buffer[i]) { +dev_warn (dev->class_dev, +"failed to allocate DMA buffer\n" ); +return -ENOMEM ; + } }/* allocate dma descriptors */ devpriv->dma_desc =pci_alloc_consistent (pcidev,sizeof (struct plx_dma_desc ) *NUM_DMA_DESCRIPTORS , &devpriv->dma_desc_phys_addr); +if (!devpriv->dma_desc) { +dev_warn (dev->class_dev, +"failed to allocate DMA descriptors\n" ); +return -ENOMEM ; + }if (devpriv->dma_desc_phys_addr &0xf ) {dev_warn (dev->class_dev," dma descriptors not quad-word aligned (bug)\n" );
Greg Kroah-Hartman
maintainerPATCH 86/137 ext4: check for directory entries too close to block end
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
commit 109ba779d6cca2d519c5dd624a3276d03e21948e upstream.
ext4_check_dir_entry() currently does not catch a case when a directory entry ends so close to the block end that the header of the next directory entry would not fit in the remaining space. This can lead to directory iteration code trying to access address beyond end of current buffer head leading to oops.
--- fs/ext4/dir.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/ext4/dir.c +5 -0
@@ -75,6 +75,11 @@ int __ext4_check_dir_entry(const char *f error_msg ="rec_len is too small for name_len" ; else if (unlikely(((char *) de - buf) + rlen > size)) error_msg ="directory entry overrun" ; + else if (unlikely(((char *) de - buf) + rlen > + size - EXT4_DIR_REC_LEN(1) && + ((char *) de - buf) + rlen != size)) { + error_msg ="directory entry too close to block end" ; + } else if (unlikely(le32_to_cpu(de->inode) > le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))) error_msg ="inode out of bounds" ;
Greg Kroah-Hartman
maintainerPATCH 87/137 powerpc/irq: fix stack overflow verification
In reply to Greg Kroah-HartmanFrom: Christophe Leroy <[email protected]>
commit 099bc4812f09155da77eeb960a983470249c9ce1 upstream.
Before commit 0366a1c70b89 ("powerpc/irq: Run softirqs off the top of the irq stack"), check_stack_overflow() was called by do_IRQ(), before switching to the irq stack.
In that commit, do_IRQ() was renamed __do_irq(), and is now executing on the irq stack, so check_stack_overflow() has just become almost useless.
Move check_stack_overflow() call in do_IRQ() to do the check while still on the current stack.
--- arch/powerpc/kernel/irq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/irq.c +2 -2
@@ -484,8 +484,6 @@ void __do_irq(struct pt_regs *regs)trace_irq_entry (regs); -check_stack_overflow (); -/* * Query the platform PIC for the interrupt & ack it. *
@@ -517,6 +515,8 @@ void do_IRQ(struct pt_regs *regs) irqtp = hardirq_ctx[raw_smp_processor_id ()]; sirqtp = softirq_ctx[raw_smp_processor_id ()]; +check_stack_overflow (); +/* Already there ? */ if (unlikely (curtp == irqtp || curtp == sirqtp)) {__do_irq (regs);
Greg Kroah-Hartman
maintainerPATCH 88/137 mmc: sdhci-of-esdhc: fix P2020 errata handling
In reply to Greg Kroah-HartmanFrom: Yangbo Lu <[email protected]>
commit fe0acab448f68c3146235afe03fb932e242ec94c upstream.
Two previous patches introduced below quirks for P2020 platforms.
- SDHCI_QUIRK_RESET_AFTER_REQUEST
- SDHCI_QUIRK_BROKEN_TIMEOUT_VAL
The patches made a mistake to add them in quirks2 of sdhci_host structure, while they were defined for quirks.
host->quirks2 |= SDHCI_QUIRK_RESET_AFTER_REQUEST; host->quirks2 |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
This patch is to fix them.
host->quirks |= SDHCI_QUIRK_RESET_AFTER_REQUEST; host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
--- drivers/mmc/host/sdhci-of-esdhc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mmc/host/sdhci-of-esdhc.c +2 -2
@@ -625,8 +625,8 @@ static int sdhci_esdhc_probe(struct plat host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ ;if (of_find_compatible_node (NULL ,NULL ,"fsl,p2020-esdhc" )) { - host->quirks2 |=SDHCI_QUIRK_RESET_AFTER_REQUEST ; - host->quirks2 |=SDHCI_QUIRK_BROKEN_TIMEOUT_VAL ; + host->quirks |=SDHCI_QUIRK_RESET_AFTER_REQUEST ; + host->quirks |=SDHCI_QUIRK_BROKEN_TIMEOUT_VAL ; } if (of_device_is_compatible(np, "fsl,p5040-esdhc") ||
Greg Kroah-Hartman
maintainerPATCH 89/137 perf probe: Fix to show function entry line as probe-able
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 91e2f539eeda26ab00bd03fae8dc434c128c85ed upstream.
Fix die_walk_lines() to list the function entry line correctly. Since the dwarf_entrypc() does not return the entry pc if the DIE has only range attribute, __die_walk_funclines() fails to list the declaration line (entry line) in that case.
To solve this issue, this introduces die_entrypc() which correctly returns the entry PC (the first address range) even if the DIE has only range attribute. With this fix die_walk_lines() shows the function entry line is able to probe correctly.
--- tools/perf/util/dwarf-aux.c | 24 +++++++++++++++++++++++- tools/perf/util/dwarf-aux.h | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-)
tools/perf/util/dwarf-aux.c +23 -1
@@ -294,6 +294,28 @@ bool die_is_func_def(Dwarf_Die *dw_die) }/** +* die_entrypc - Returns entry PC (the lowest address) of a DIE +* @dw_die: a DIE +* @addr: where to store entry PC +* +* Since dwarf_entrypc() does not return entry PC if the DIE has only address +* range, we have to use this to retrieve the lowest address from the address +* range attribute. +*/ +int die_entrypc (Dwarf_Die *dw_die,Dwarf_Addr *addr) +{ +Dwarf_Addr base, end; + +if (!addr) +return -EINVAL ; + +if (dwarf_entrypc (dw_die, addr) ==0 ) +return 0 ; + +return dwarf_ranges (dw_die,0 , &base, addr, &end) <0 ? -ENOENT :0 ; +} + +/** * die_is_func_instance - Ensure that this DIE is an instance of a subprogram * @dw_die: a DIE *
@@ -706,7 +728,7 @@ static int __die_walk_funclines(Dwarf_Di/* Handle function declaration line */ fname =dwarf_decl_file (sp_die);if (fname &&dwarf_decl_line (sp_die, &lineno) ==0 && -dwarf_entrypc (sp_die, &addr) ==0 ) { +die_entrypc (sp_die, &addr) ==0 ) { lw.retval =callback (fname, lineno, addr, data);if (lw.retval !=0 ) goto done;
tools/perf/util/dwarf-aux.h +3 -0
@@ -38,6 +38,9 @@ extern int cu_find_lineinfo(Dwarf_Die *cextern int cu_walk_functions_at (Dwarf_Die *cu_die,Dwarf_Addr addr,int (*callback)(Dwarf_Die *,void *),void *data); +/* Get the lowest PC in DIE (including range list) */ +int die_entrypc (Dwarf_Die *dw_die,Dwarf_Addr *addr); +/* Ensure that this DIE is a subprogram and definition (not declaration) */ extern bool die_is_func_def (Dwarf_Die *dw_die);
Greg Kroah-Hartman
maintainerPATCH 90/137 scsi: mpt3sas: Fix clear pending bit in ioctl status
In reply to Greg Kroah-HartmanFrom: Sreekanth Reddy <[email protected]>
[ Upstream commit 782b281883caf70289ba6a186af29441a117d23e ]
When user issues diag register command from application with required size, and if driver unable to allocate the memory, then it will fail the register command. While failing the register command, driver is not currently clearing MPT3_CMD_PENDING bit in ctl_cmds.status variable which was set before trying to allocate the memory. As this bit is set, subsequent register command will be failed with BUSY status even when user wants to register the trace buffer will less memory.
Clear MPT3_CMD_PENDING bit in ctl_cmds.status before returning the diag register command with no memory status.
--- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/mpt3sas/mpt3sas_ctl.c +2 -1
@@ -1456,7 +1456,8 @@ _ctl_diag_register_2(struct MPT3SAS_ADAPTER *ioc," for diag buffers, requested size(%d)\n" , ioc->name, __func__, request_data_sz);mpt3sas_base_free_smid (ioc, smid); -return -ENOMEM ; + rc = -ENOMEM ; + goto out; } ioc->diag_buffer[buffer_type] = request_data; ioc->diag_buffer_sz[buffer_type] = request_data_sz;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 91/137 scsi: lpfc: Fix locking on mailbox command completion
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit 07b8582430370097238b589f4e24da7613ca6dd3 ]
Symptoms were seen of the driver not having valid data for mailbox commands. After debugging, the following sequence was found:
The driver maintains a port-wide pointer of the mailbox command that is currently in execution. Once finished, the port-wide pointer is cleared (done in lpfc_sli4_mq_release()). The next mailbox command issued will set the next pointer and so on.
The mailbox response data is only copied if there is a valid port-wide pointer.
In the failing case, it was seen that a new mailbox command was being attempted in parallel with the completion. The parallel path was seeing the mailbox no long in use (flag check under lock) and thus set the port pointer. The completion path had cleared the active flag under lock, but had not touched the port pointer. The port pointer is cleared after the lock is released. In this case, the completion path cleared the just-set value by the parallel path.
Fix by making the calls that clear mbox state/port pointer while under lock. Also slightly cleaned up the error path.
--- drivers/scsi/lpfc/lpfc_sli.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_sli.c +7 -1
@@ -11759,13 +11759,19 @@ send_current_mbox: phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE ;/* Setting active mailbox pointer need to be in sync to flag clear */ phba->sli.mbox_active =NULL ; +if (bf_get (lpfc_trailer_consumed, mcqe)) +lpfc_sli4_mq_release (phba->sli4_hba.mbx_wq);spin_unlock_irqrestore (&phba->hbalock, iflags);/* Wake up worker thread to post the next pending mailbox command */ lpfc_worker_wake_up (phba); +return workposted; + out_no_mqe_complete: +spin_lock_irqsave (&phba->hbalock, iflags);if (bf_get (lpfc_trailer_consumed, mcqe))lpfc_sli4_mq_release (phba->sli4_hba.mbx_wq); -return workposted; +spin_unlock_irqrestore (&phba->hbalock, iflags); +return false; }/**
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 92/137 Input: atmel_mxt_ts - disable IRQ across suspend
In reply to Greg Kroah-HartmanFrom: Evan Green <[email protected]>
[ Upstream commit 463fa44eec2fef50d111ed0199cf593235065c04 ]
Across suspend and resume, we are seeing error messages like the following:
atmel_mxt_ts i2c-PRP0001:00: __mxt_read_reg: i2c transfer failed (-121) atmel_mxt_ts i2c-PRP0001:00: Failed to read T44 and T5 (-121)
This occurs because the driver leaves its IRQ enabled. Upon resume, there is an IRQ pending, but the interrupt is serviced before both the driver and the underlying I2C bus have been resumed. This causes EREMOTEIO errors.
Disable the IRQ in suspend, and re-enable it on resume. If there are cases where the driver enters suspend with interrupts disabled, that's a bug we should fix separately.
--- drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/input/touchscreen/atmel_mxt_ts.c +4 -0
@@ -2701,6 +2701,8 @@ static int __maybe_unused mxt_suspend(struct device *dev)mutex_unlock (&input_dev->mutex); +disable_irq (data->irq); +return 0 ; }
@@ -2713,6 +2715,8 @@ static int __maybe_unused mxt_resume(struct device *dev)if (!input_dev)return 0 ; +enable_irq (data->irq); +mutex_lock (&input_dev->mutex);if (input_dev->users)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 93/137 iommu/tegra-smmu: Fix page tables in > 4 GiB memory
In reply to Greg Kroah-HartmanFrom: Thierry Reding <[email protected]>
[ Upstream commit 96d3ab802e4930a29a33934373157d6dff1b2c7e ]
Page tables that reside in physical memory beyond the 4 GiB boundary are currently not working properly. The reason is that when the physical address for page directory entries is read, it gets truncated at 32 bits and can cause crashes when passing that address to the DMA API.
Fix this by first casting the PDE value to a dma_addr_t and then using the page frame number mask for the SMMU instance to mask out the invalid bits, which are typically used for mapping attributes, etc.
--- drivers/iommu/tegra-smmu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/iommu/tegra-smmu.c +6 -5
@@ -153,9 +153,9 @@ static bool smmu_dma_addr_valid(struct tegra_smmu *smmu, dma_addr_t addr)return (addr & smmu->pfn_mask) == addr; } -static dma_addr_t smmu_pde_to_dma (u32 pde) +static dma_addr_t smmu_pde_to_dma (struct tegra_smmu *smmu,u32 pde) { -return pde <<12 ; +return (dma_addr_t)(pde & smmu->pfn_mask) <<12 ; }static void smmu_flush_ptc_all (struct tegra_smmu *smmu)
@@ -540,6 +540,7 @@ static u32 *tegra_smmu_pte_lookup(struct tegra_smmu_as *as, unsigned long iova, dma_addr_t *dmap) {unsigned int pd_index =iova_pd_index (iova); +struct tegra_smmu *smmu = as->smmu;struct page *pt_page;u32 *pd;
@@ -548,7 +549,7 @@ static u32 *tegra_smmu_pte_lookup(struct tegra_smmu_as *as, unsigned long iova,return NULL ; pd =page_address (as->pd); - *dmap =smmu_pde_to_dma (pd[pd_index]); + *dmap =smmu_pde_to_dma (smmu, pd[pd_index]);return tegra_smmu_pte_offset (pt_page, iova); }
@@ -590,7 +591,7 @@ static u32 *as_get_pte(struct tegra_smmu_as *as, dma_addr_t iova, }else {u32 *pd =page_address (as->pd); - *dmap =smmu_pde_to_dma (pd[pde]); + *dmap =smmu_pde_to_dma (smmu, pd[pde]); }return tegra_smmu_pte_offset (as->pts[pde], iova);
@@ -615,7 +616,7 @@ static void tegra_smmu_pte_put_use(struct tegra_smmu_as *as, unsigned long iova)if (--as->count[pde] ==0 ) {struct tegra_smmu *smmu = as->smmu;u32 *pd =page_address (as->pd); -dma_addr_t pte_dma =smmu_pde_to_dma (pd[pde]); +dma_addr_t pte_dma =smmu_pde_to_dma (smmu, pd[pde]);tegra_smmu_set_pde (as, iova,0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 94/137 scsi: target: compare full CHAP_A Algorithm strings
In reply to Greg Kroah-HartmanFrom: David Disseldorp <[email protected]>
[ Upstream commit 9cef2a7955f2754257a7cddedec16edae7b587d0 ]
RFC 2307 states:
For CHAP [RFC1994], in the first step, the initiator MUST send:
CHAP_A=<A1,A2...>
Where A1,A2... are proposed algorithms, in order of preference.
...
For the Algorithm, as stated in [RFC1994], one value is required to be implemented:
5 (CHAP with MD5)
LIO currently checks for this value by only comparing a single byte in the tokenized Algorithm string, which means that any value starting with a '5' (e.g. "55") is interpreted as "CHAP with MD5". Fix this by comparing the entire tokenized string.
--- drivers/target/iscsi/iscsi_target_auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/target/iscsi/iscsi_target_auth.c +1 -1
@@ -74,7 +74,7 @@ static int chap_check_algorithm(const char *a_str)if (!token) goto out; -if (!strncmp (token,"5" ,1 )) { +if (!strcmp (token,"5" )) {pr_debug ("Selected MD5 Algorithm\n" );kfree (orig);return CHAP_DIGEST_MD5 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 95/137 scsi: lpfc: Fix SLI3 hba in loop mode not discovering devices
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit feff8b3d84d3d9570f893b4d83e5eab6693d6a52 ]
When operating in private loop mode, PLOGI exchanges are racing and the driver tries to abort it's PLOGI. But the PLOGI abort ends up terminating the login with the other end causing the other end to abort its PLOGI as well. Discovery never fully completes.
Fix by disabling the PLOGI abort when private loop and letting the state machine play out.
--- drivers/scsi/lpfc/lpfc_nportdisc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_nportdisc.c +3 -1
@@ -454,8 +454,10 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,* single discovery thread, this will cause a huge delay in * discovery. Also this will cause multiple state machines * running in parallel for this node. +* This only applies to a fabric environment. */ -if (ndlp->nlp_state ==NLP_STE_PLOGI_ISSUE ) { +if ((ndlp->nlp_state ==NLP_STE_PLOGI_ISSUE ) && + (vport->fc_flag &FC_FABRIC )) {/* software abort outstanding PLOGI */ lpfc_els_abort (phba, ndlp); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 96/137 scsi: csiostor: Dont enable IRQs too early
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit d6c9b31ac3064fbedf8961f120a4c117daa59932 ]
These are called with IRQs disabled from csio_mgmt_tmo_handler() so we can't call spin_unlock_irq() or it will enable IRQs prematurely.
--- drivers/scsi/csiostor/csio_lnode.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/scsi/csiostor/csio_lnode.c +9 -6
@@ -301,6 +301,7 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)struct fc_fdmi_port_name *port_name;uint8_t buf[64 ];uint8_t *fc4_type; +unsigned long flags;if (fdmi_req->wr_status !=FW_SUCCESS ) { csio_ln_dbg(ln, "WR error:%x in processing fdmi rhba cmd\n",
@@ -377,13 +378,13 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) len = (uint32_t )(pld - (uint8_t *)cmd);/* Submit FDMI RPA request */ -spin_lock_irq (&hw->lock); +spin_lock_irqsave (&hw->lock, flags);if (csio_ln_mgmt_submit_req (fdmi_req, csio_ln_fdmi_done,FCOE_CT , &fdmi_req->dma_buf, len)) {CSIO_INC_STATS (ln, n_fdmi_err);csio_ln_dbg (ln,"Failed to issue fdmi rpa req\n" ); } -spin_unlock_irq (&hw->lock); +spin_unlock_irqrestore (&hw->lock, flags); }/*
@@ -404,6 +405,7 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)struct fc_fdmi_rpl *reg_pl;struct fs_fdmi_attrs *attrib_blk;uint8_t buf[64 ]; +unsigned long flags;if (fdmi_req->wr_status !=FW_SUCCESS ) { csio_ln_dbg(ln, "WR error:%x in processing fdmi dprt cmd\n",
@@ -483,13 +485,13 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) attrib_blk->numattrs =htonl (numattrs);/* Submit FDMI RHBA request */ -spin_lock_irq (&hw->lock); +spin_lock_irqsave (&hw->lock, flags);if (csio_ln_mgmt_submit_req (fdmi_req, csio_ln_fdmi_rhba_cbfn,FCOE_CT , &fdmi_req->dma_buf, len)) {CSIO_INC_STATS (ln, n_fdmi_err);csio_ln_dbg (ln,"Failed to issue fdmi rhba req\n" ); } -spin_unlock_irq (&hw->lock); +spin_unlock_irqrestore (&hw->lock, flags); }/*
@@ -504,6 +506,7 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)void *cmd;struct fc_fdmi_port_name *port_name;uint32_t len; +unsigned long flags;if (fdmi_req->wr_status !=FW_SUCCESS ) { csio_ln_dbg(ln, "WR error:%x in processing fdmi dhba cmd\n",
@@ -534,13 +537,13 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) len +=sizeof (*port_name);/* Submit FDMI request */ -spin_lock_irq (&hw->lock); +spin_lock_irqsave (&hw->lock, flags);if (csio_ln_mgmt_submit_req (fdmi_req, csio_ln_fdmi_dprt_cbfn,FCOE_CT , &fdmi_req->dma_buf, len)) {CSIO_INC_STATS (ln, n_fdmi_err);csio_ln_dbg (ln,"Failed to issue fdmi dprt req\n" ); } -spin_unlock_irq (&hw->lock); +spin_unlock_irqrestore (&hw->lock, flags); }/**
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 97/137 powerpc/pseries: Mark accumulate_stolen_time() as notrace
In reply to Greg Kroah-HartmanFrom: Michael Ellerman <[email protected]>
[ Upstream commit eb8e20f89093b64f48975c74ccb114e6775cee22 ]
accumulate_stolen_time() is called prior to interrupt state being reconciled, which can trip the warning in arch_local_irq_restore():
WARNING: CPU: 5 PID: 1017 at arch/powerpc/kernel/irq.c:258 .arch_local_irq_restore+0x9c/0x130
...
NIP .arch_local_irq_restore+0x9c/0x130
LR .rb_start_commit+0x38/0x80
Call Trace:
.ring_buffer_lock_reserve+0xe4/0x620
.trace_function+0x44/0x210
.function_trace_call+0x148/0x170
.ftrace_ops_no_ops+0x180/0x1d0
ftrace_call+0x4/0x8
.accumulate_stolen_time+0x1c/0xb0
decrementer_common+0x124/0x160For now just mark it as notrace. We may change the ordering to call it after interrupt state has been reconciled, but that is a larger change.
--- arch/powerpc/kernel/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kernel/time.c +1 -1
@@ -245,7 +245,7 @@ static u64 scan_dispatch_log(u64 stop_tb)* Accumulate stolen time by scanning the dispatch trace log. * Called on entry from user mode. */ -void accumulate_stolen_time (void ) +void notrace accumulate_stolen_time(void) {u64 sst, ust;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 98/137 dma-debug: add a schedule point in debug_dma_dump_mappings()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 9ff6aa027dbb98755f0265695354f2dd07c0d1ce ]
debug_dma_dump_mappings() can take a lot of cpu cycles :
lpk43:/# time wc -l /sys/kernel/debug/dma-api/dump 163435 /sys/kernel/debug/dma-api/dump
real 0m0.463s
user 0m0.003s
sys 0m0.459s
Let's add a cond_resched() to avoid holding cpu for too long.
--- lib/dma-debug.c | 1 + 1 file changed, 1 insertion(+)
lib/dma-debug.c +1 -0
@@ -427,6 +427,7 @@ void debug_dma_dump_mappings(struct device *dev) }spin_unlock_irqrestore (&bucket->lock, flags); +cond_resched (); } }EXPORT_SYMBOL (debug_dma_dump_mappings);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 99/137 clocksource/drivers/asm9260: Add a check for of_clk_get
In reply to Greg Kroah-HartmanFrom: Chuhong Yuan <[email protected]>
[ Upstream commit 6e001f6a4cc73cd06fc7b8c633bc4906c33dd8ad ]
asm9260_timer_init misses a check for of_clk_get.
Add a check for it and print errors like other clocksource drivers.
--- drivers/clocksource/asm9260_timer.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clocksource/asm9260_timer.c +4 -0
@@ -196,6 +196,10 @@ static void __init asm9260_timer_init(struct device_node *np)panic ("%s: unable to map resource" , np->name); clk =of_clk_get (np,0 ); +if (IS_ERR (clk)) { +pr_err ("Failed to get clk!\n" ); +return PTR_ERR (clk); + } ret =clk_prepare_enable (clk);if (ret)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 100/137 powerpc/security/book3s64: Report L1TF status in sysfs
In reply to Greg Kroah-HartmanFrom: Anthony Steinhauser <[email protected]>
[ Upstream commit 8e6b6da91ac9b9ec5a925b6cb13f287a54bd547d ]
Some PowerPC CPUs are vulnerable to L1TF to the same extent as to Meltdown. It is also mitigated by flushing the L1D on privilege transition.
Currently the sysfs gives a false negative on L1TF on CPUs that I verified to be vulnerable, a Power9 Talos II Boston 004e 1202, PowerNV T2P9D01.
--- arch/powerpc/kernel/security.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/powerpc/kernel/security.c +5 -0
@@ -161,6 +161,11 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha return sprintf(buf, "Vulnerable\n"); } + +ssize_t cpu_show_l1tf (struct device *dev,struct device_attribute *attr,char *buf) +{ +return cpu_show_meltdown (dev, attr, buf); +}#endif ssize_t cpu_show_spectre_v1 (struct device *dev,struct device_attribute *attr,char *buf)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 101/137 jbd2: Fix statistics for the number of logged blocks
In reply to Greg Kroah-HartmanFrom: Jan Kara <[email protected]>
[ Upstream commit 015c6033068208d6227612c878877919f3fcf6b6 ]
jbd2 statistics counting number of blocks logged in a transaction was wrong. It didn't count the commit block and more importantly it didn't count revoke descriptor blocks. Make sure these get properly counted.
--- fs/jbd2/commit.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/jbd2/commit.c +3 -1
@@ -740,7 +740,6 @@ start_journal_io:submit_bh (WRITE_SYNC , bh); }cond_resched (); - stats.run.rs_blocks_logged += bufs;/* Force a new descriptor to be generated next time round the loop. */
@@ -827,6 +826,7 @@ start_journal_io:if (unlikely (!buffer_uptodate (bh))) err = -EIO ;jbd2_unfile_log_bh (bh); + stats.run.rs_blocks_logged++;/* * The list contains temporary buffer heads created by
@@ -872,6 +872,7 @@ start_journal_io:BUFFER_TRACE (bh,"ph5: control buffer writeout done: unfile" );clear_buffer_jwrite (bh);jbd2_unfile_log_bh (bh); + stats.run.rs_blocks_logged++;__brelse (bh);/* One for getblk */ /* AKPM: bforget here */ }
@@ -893,6 +894,7 @@ start_journal_io: }if (cbh) err =journal_wait_on_commit_record (journal, cbh); + stats.run.rs_blocks_logged++;if (jbd2_has_feature_async_commit (journal) && journal->j_flags &JBD2_BARRIER ) {blkdev_issue_flush (journal->j_dev,GFP_NOFS ,NULL );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 102/137 scsi: tracing: Fix handling of TRANSFER LENGTH == 0 for READ(6) and WRITE(6)
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
[ Upstream commit f6b8540f40201bff91062dd64db8e29e4ddaaa9d ]
According to SBC-2 a TRANSFER LENGTH field of zero means that 256 logical blocks must be transferred. Make the SCSI tracing code follow SBC-2.
--- drivers/scsi/scsi_trace.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/scsi/scsi_trace.c +7 -4
@@ -29,15 +29,18 @@ static const char * scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len) { const char *ret = trace_seq_buffer_ptr(p); -sector_t lba =0 , txlen =0 ; +u32 lba =0 , txlen; lba |= ((cdb[1 ] &0x1F ) <<16 ); lba |= (cdb[2 ] <<8 ); lba |= cdb[3 ]; - txlen = cdb[4 ]; +/* +* From SBC-2: a TRANSFER LENGTH field set to zero specifies that 256 +* logical blocks shall be read (READ(6)) or written (WRITE(6)). +*/ + txlen = cdb[4 ] ? cdb[4 ] :256 ; -trace_seq_printf (p,"lba=%llu txlen=%llu" , - (unsigned long long )lba, (unsigned long long )txlen); +trace_seq_printf (p,"lba=%u txlen=%u" , lba, txlen);trace_seq_putc (p,0 );return ret;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 103/137 scsi: lpfc: Fix duplicate unreg_rpi error in port offline flow
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit 7cfd5639d99bec0d27af089d0c8c114330e43a72 ]
If the driver receives a login that is later then LOGO'd by the remote port (aka ndlp), the driver, upon the completion of the LOGO ACC transmission, will logout the node and unregister the rpi that is being used for the node. As part of the unreg, the node's rpi value is replaced by the LPFC_RPI_ALLOC_ERROR value. If the port is subsequently offlined, the offline walks the nodes and ensures they are logged out, which possibly entails unreg'ing their rpi values. This path does not validate the node's rpi value, thus doesn't detect that it has been unreg'd already. The replaced rpi value is then used when accessing the rpi bitmask array which tracks active rpi values. As the LPFC_RPI_ALLOC_ERROR value is not a valid index for the bitmask, it may fault the system.
Revise the rpi release code to detect when the rpi value is the replaced RPI_ALLOC_ERROR value and ignore further release steps.
--- drivers/scsi/lpfc/lpfc_sli.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/scsi/lpfc/lpfc_sli.c +7 -0
@@ -15792,6 +15792,13 @@ lpfc_sli4_alloc_rpi(struct lpfc_hba *phba)static void __lpfc_sli4_free_rpi (struct lpfc_hba *phba,int rpi) { +/* +* if the rpi value indicates a prior unreg has already +* been done, skip the unreg. +*/ +if (rpi ==LPFC_RPI_ALLOC_ERROR ) +return ; +if (test_and_clear_bit (rpi, phba->sli4_hba.rpi_bmask)) { phba->sli4_hba.rpi_count--; phba->sli4_hba.max_cfg_param.rpi_used--;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 104/137 clk: qcom: Allow constant ratio freq tables for rcg
In reply to Greg Kroah-HartmanFrom: Jeffrey Hugo <[email protected]>
[ Upstream commit efd164b5520afd6fb2883b68e0d408a7de29c491 ]
Some RCGs (the gfx_3d_src_clk in msm8998 for example) are basically just some constant ratio from the input across the entire frequency range. It would be great if we could specify the frequency table as a single entry constant ratio instead of a long list, ie:
{ .src = P_GPUPLL0_OUT_EVEN, .pre_div = 3 },
{ }So, lets support that.
We need to fix a corner case in qcom_find_freq() where if the freq table is non-null, but has no frequencies, we end up returning an "entry" before the table array, which is bad. Then, we need ignore the freq from the table, and instead base everything on the requested freq.
--- drivers/clk/qcom/clk-rcg2.c | 2 ++ drivers/clk/qcom/common.c | 3 +++ 2 files changed, 5 insertions(+)
drivers/clk/qcom/clk-rcg2.c +2 -0
@@ -196,6 +196,8 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw, p =clk_hw_get_parent_by_index (hw, index);if (clk_flags &CLK_SET_RATE_PARENT ) {if (f->pre_div) { +if (!rate) + rate = req->rate; rate /=2 ; rate *= f->pre_div +1 ; }
drivers/clk/qcom/common.c +3 -0
@@ -36,6 +36,9 @@ struct freq_tbl *qcom_find_freq(const struct freq_tbl *f, unsigned long rate)if (!f)return NULL ; +if (!f->freq) +return f; +for (; f->freq; f++)if (rate <= f->freq)return f;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 105/137 irqchip/irq-bcm7038-l1: Enable parent IRQ if necessary
In reply to Greg Kroah-HartmanFrom: Florian Fainelli <[email protected]>
[ Upstream commit 27eebb60357ed5aa6659442f92907c0f7368d6ae ]
If the 'brcm,irq-can-wake' property is specified, make sure we also enable the corresponding parent interrupt we are attached to.
--- drivers/irqchip/irq-bcm7038-l1.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/irqchip/irq-bcm7038-l1.c +4 -0
@@ -283,6 +283,10 @@ static int __init bcm7038_l1_init_one(struct device_node *dn,pr_err ("failed to map parent interrupt %d\n" , parent_irq);return -EINVAL ; } + +if (of_property_read_bool (dn,"brcm,irq-can-wake" )) +enable_irq_wake (parent_irq); +irq_set_chained_handler_and_data (parent_irq, bcm7038_l1_irq_handle, intc);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 106/137 irqchip: ingenic: Error out if IRQ domain creation failed
In reply to Greg Kroah-HartmanFrom: Paul Cercueil <[email protected]>
[ Upstream commit 52ecc87642f273a599c9913b29fd179c13de457b ]
If we cannot create the IRQ domain, the driver should fail to probe instead of succeeding with just a warning message.
--- drivers/irqchip/irq-ingenic.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/irqchip/irq-ingenic.c +10 -5
@@ -117,6 +117,14 @@ static int __init ingenic_intc_of_init(struct device_node *node, goto out_unmap_irq; } + domain =irq_domain_add_legacy (node, num_chips *32 , +JZ4740_IRQ_BASE ,0 , + &irq_domain_simple_ops,NULL ); +if (!domain) { + err = -ENOMEM ; + goto out_unmap_base; + } +for (i =0 ; i < num_chips; i++) {/* Mask all irqs */ writel(0xffffffff, intc->base + (i * CHIP_SIZE) +
@@ -143,14 +151,11 @@ static int __init ingenic_intc_of_init(struct device_node *node, IRQ_NOPROBE | IRQ_LEVEL); } - domain =irq_domain_add_legacy (node, num_chips *32 ,JZ4740_IRQ_BASE ,0 , - &irq_domain_simple_ops,NULL ); -if (!domain) -pr_warn ("unable to register IRQ domain\n" ); -setup_irq (parent_irq, &intc_cascade_action);return 0 ; +out_unmap_base: +iounmap (intc->base); out_unmap_irq:irq_dispose_mapping (parent_irq); out_free:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 107/137 mfd: mfd-core: Honour Device Trees request to disable a child-device
In reply to Greg Kroah-HartmanFrom: Lee Jones <[email protected]>
[ Upstream commit 6b5c350648b857047b47acf74a57087ad27d6183 ]
Until now, MFD has assumed all child devices passed to it (via mfd_cells) are to be registered. It does not take into account requests from Device Tree and the like to disable child devices on a per-platform basis.
Well now it does.
--- drivers/mfd/mfd-core.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/mfd/mfd-core.c +5 -0
@@ -177,6 +177,11 @@ static int mfd_add_device(struct device *parent, int id,if (parent->of_node && cell->of_compatible) {for_each_child_of_node (parent->of_node, np) {if (of_device_is_compatible (np, cell->of_compatible)) { +if (!of_device_is_available (np)) { +/* Ignore disabled devices error free */ + ret =0 ; + goto fail_alias; + } pdev->dev.of_node = np; pdev->dev.fwnode = &np->fwnode;break ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 108/137 fs/quota: handle overflows of sysctl fs.quota.* and report as unsigned long
In reply to Greg Kroah-HartmanFrom: Konstantin Khlebnikov <[email protected]>
[ Upstream commit 6fcbcec9cfc7b3c6a2c1f1a23ebacedff7073e0a ]
Quota statistics counted as 64-bit per-cpu counter. Reading sums per-cpu fractions as signed 64-bit int, filters negative values and then reports lower half as signed 32-bit int.
Result may looks like:
fs.quota.allocated_dquots = 22327
fs.quota.cache_hits = -489852115
fs.quota.drops = -487288718
fs.quota.free_dquots = 22083
fs.quota.lookups = -486883485
fs.quota.reads = 22327
fs.quota.syncs = 335064
fs.quota.writes = 3088689
Values bigger than 2^31-1 reported as negative.
All counters except "allocated_dquots" and "free_dquots" are monotonic, thus they should be reported as is without filtering negative values.
Kernel doesn't have generic helper for 64-bit sysctl yet, let's use at least unsigned long.
--- fs/quota/dquot.c | 29 +++++++++++++++++------------ include/linux/quota.h | 2 +- 2 files changed, 18 insertions(+), 13 deletions(-)
fs/quota/dquot.c +17 -12
@@ -2783,68 +2783,73 @@ EXPORT_SYMBOL(dquot_quotactl_sysfile_ops);static int do_proc_dqstats (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos) { -unsigned int type = (int *)table->data - dqstats.stat; +unsigned int type = (unsigned long *)table->data - dqstats.stat; +s64 value =percpu_counter_sum (&dqstats.counter[type]); + +/* Filter negative values for non-monotonic counters */ +if (value <0 && (type ==DQST_ALLOC_DQUOTS || + type ==DQST_FREE_DQUOTS )) + value =0 ;/* Update global table */ - dqstats.stat[type] = -percpu_counter_sum_positive (&dqstats.counter[type]); -return proc_dointvec (table, write, buffer, lenp, ppos); + dqstats.stat[type] = value; +return proc_doulongvec_minmax (table, write, buffer, lenp, ppos); }static struct ctl_table fs_dqstats_table[] = { { .procname ="lookups" , .data = &dqstats.stat[DQST_LOOKUPS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="drops" , .data = &dqstats.stat[DQST_DROPS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="reads" , .data = &dqstats.stat[DQST_READS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="writes" , .data = &dqstats.stat[DQST_WRITES ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="cache_hits" , .data = &dqstats.stat[DQST_CACHE_HITS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="allocated_dquots" , .data = &dqstats.stat[DQST_ALLOC_DQUOTS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="free_dquots" , .data = &dqstats.stat[DQST_FREE_DQUOTS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, }, { .procname ="syncs" , .data = &dqstats.stat[DQST_SYNCS ], - .maxlen =sizeof (int ), + .maxlen =sizeof (unsigned long ), .mode =0444 , .proc_handler = do_proc_dqstats, },
include/linux/quota.h +1 -1
@@ -253,7 +253,7 @@ enum { };struct dqstats { -int stat[_DQST_DQSTAT_LAST]; +unsigned long stat[_DQST_DQSTAT_LAST];struct percpu_counter counter[_DQST_DQSTAT_LAST]; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 109/137 scsi: lpfc: fix: Coverity: lpfc_cmpl_els_rsp(): Null pointer dereferences
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
[ Upstream commit 6c6d59e0fe5b86cf273d6d744a6a9768c4ecc756 ]
Coverity reported the following:
*** CID 101747: Null pointer dereferences (FORWARD_NULL) /drivers/scsi/lpfc/lpfc_els.c: 4439 in lpfc_cmpl_els_rsp()
4433 kfree(mp);
4434 }
4435 mempool_free(mbox, phba->mbox_mem_pool);
4436 }
4437 out:
4438 if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
vvv CID 101747: Null pointer dereferences (FORWARD_NULL)
vvv Dereferencing null pointer "shost".
4439 spin_lock_irq(shost->host_lock);
4440 ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
4441 spin_unlock_irq(shost->host_lock);4442
4443 /* If the node is not being used by another discovery thread,
4444 * and we are sending a reject, we are done with it.
Fix by adding a check for non-null shost in line 4438. The scenario when shost is set to null is when ndlp is null. As such, the ndlp check present was sufficient. But better safe than sorry so add the shost check.
Addresses-Coverity-ID: 101747 ("Null pointer dereferences")
--- drivers/scsi/lpfc/lpfc_els.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/lpfc/lpfc_els.c +1 -1
@@ -3839,7 +3839,7 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,mempool_free (mbox, phba->mbox_mem_pool); } out: -if (ndlp &&NLP_CHK_NODE_ACT (ndlp)) { +if (ndlp &&NLP_CHK_NODE_ACT (ndlp) && shost) {spin_lock_irq (shost->host_lock); ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN |NLP_RM_DFLT_RPI );spin_unlock_irq (shost->host_lock);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 110/137 scsi: ufs: fix potential bug which ends in system hang
In reply to Greg Kroah-HartmanFrom: Bean Huo <[email protected]>
[ Upstream commit cfcbae3895b86c390ede57b2a8f601dd5972b47b ]
In function __ufshcd_query_descriptor(), in the event of an error happening, we directly goto out_unlock and forget to invaliate hba->dev_cmd.query.descriptor pointer. This results in this pointer still valid in ufshcd_copy_query_response() for other query requests which go through ufshcd_exec_raw_upiu_cmd(). This will cause __memcpy() crash and system hangs. Log as shown below:
Unable to handle kernel paging request at virtual address
ffff000012233c40
Mem abort info:
ESR = 0x96000047
Exception class = DABT (current EL), IL = 32 bits SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000047
CM = 0, WnR = 1
swapper pgtable: 4k pages, 48-bit VAs, pgdp = 0000000028cc735c [ffff000012233c40] pgd=00000000bffff003, pud=00000000bfffe003, pmd=00000000ba8b8003, pte=0000000000000000
Internal error: Oops: 96000047 [#2] PREEMPT SMP ... Call trace: __memcpy+0x74/0x180 ufshcd_issue_devman_upiu_cmd+0x250/0x3c0 ufshcd_exec_raw_upiu_cmd+0xfc/0x1a8 ufs_bsg_request+0x178/0x3b0 bsg_queue_rq+0xc0/0x118 blk_mq_dispatch_rq_list+0xb0/0x538 blk_mq_sched_dispatch_requests+0x18c/0x1d8 __blk_mq_run_hw_queue+0xb4/0x118 blk_mq_run_work_fn+0x28/0x38 process_one_work+0x1ec/0x470 worker_thread+0x48/0x458 kthread+0x130/0x138 ret_from_fork+0x10/0x1c Code: 540000ab a8c12027 a88120c7 a8c12027 (a88120c7) ---[ end trace 793e1eb5dff69f2d ]--- note: kworker/0:2H[2054] exited with preempt_count 1
This patch is to move "descriptor = NULL" down to below the label "out_unlock".
--- drivers/scsi/ufs/ufshcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ufs/ufshcd.c +1 -1
@@ -1809,10 +1809,10 @@ static int ufshcd_query_descriptor(struct ufs_hba *hba, goto out_unlock; } - hba->dev_cmd.query.descriptor =NULL ; *buf_len =be16_to_cpu (response->upiu_res.length); out_unlock: + hba->dev_cmd.query.descriptor =NULL ;mutex_unlock (&hba->dev_cmd.lock); out:ufshcd_release (hba);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 111/137 powerpc/pseries/cmm: Implement release() function for sysfs device
In reply to Greg Kroah-HartmanFrom: David Hildenbrand <[email protected]>
[ Upstream commit 7d8212747435c534c8d564fbef4541a463c976ff ]
When unloading the module, one gets
------------[ cut here ]------------ Device 'cmm0' does not have a release() function, it is broken and must be fixed. See Documentation/kobject.txt. WARNING: CPU: 0 PID: 19308 at drivers/base/core.c:1244 .device_release+0xcc/0xf0 ...
We only have one static fake device. There is nothing to do when releasing the device (via cmm_exit()).
--- arch/powerpc/platforms/pseries/cmm.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/powerpc/platforms/pseries/cmm.c +5 -0
@@ -391,6 +391,10 @@ static struct bus_type cmm_subsys = { .dev_name = "cmm", }; +static void cmm_release_device (struct device *dev) +{ +} +/** * cmm_sysfs_register - Register with sysfs *
@@ -406,6 +410,7 @@ static int cmm_sysfs_register(struct device *dev) dev->id =0 ; dev->bus = &cmm_subsys; + dev->release = cmm_release_device;if ((rc =device_register (dev))) goto subsys_unregister;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 112/137 powerpc/security: Fix wrong message when RFI Flush is disable
In reply to Greg Kroah-HartmanFrom: Gustavo L. F. Walbon <[email protected]>
[ Upstream commit 4e706af3cd8e1d0503c25332b30cad33c97ed442 ]
The issue was showing "Mitigation" message via sysfs whatever the state of "RFI Flush", but it should show "Vulnerable" when it is disabled.
If you have "L1D private" feature enabled and not "RFI Flush" you are vulnerable to meltdown attacks.
"RFI Flush" is the key feature to mitigate the meltdown whatever the "L1D private" state.
SEC_FTR_L1D_THREAD_PRIV is a feature for Power9 only.
So the message should be as the truth table shows:
CPU | L1D private | RFI Flush | sysfs ----|-------------|-----------|------------------------------------- P9 | False | False | Vulnerable P9 | False | True | Mitigation: RFI Flush P9 | True | False | Vulnerable: L1D private per thread P9 | True | True | Mitigation: RFI Flush, L1D private per thread P8 | False | False | Vulnerable P8 | False | True | Mitigation: RFI Flush
Output before this fix:
# cat /sys/devices/system/cpu/vulnerabilities/meltdown Mitigation: RFI Flush, L1D private per thread # echo 0 > /sys/kernel/debug/powerpc/rfi_flush # cat /sys/devices/system/cpu/vulnerabilities/meltdown Mitigation: L1D private per thread
Output after fix:
# cat /sys/devices/system/cpu/vulnerabilities/meltdown Mitigation: RFI Flush, L1D private per thread # echo 0 > /sys/kernel/debug/powerpc/rfi_flush # cat /sys/devices/system/cpu/vulnerabilities/meltdown Vulnerable: L1D private per thread
--- arch/powerpc/kernel/security.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)
arch/powerpc/kernel/security.c +6 -10
@@ -135,26 +135,22 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha thread_priv =security_ftr_enabled (SEC_FTR_L1D_THREAD_PRIV ); -if (rfi_flush || thread_priv) { +if (rfi_flush) {struct seq_buf s;seq_buf_init (&s, buf,PAGE_SIZE -1 ); -seq_buf_printf (&s,"Mitigation: " ); - -if (rfi_flush) -seq_buf_printf (&s,"RFI Flush" ); - -if (rfi_flush && thread_priv) -seq_buf_printf (&s,", " ); - +seq_buf_printf (&s,"Mitigation: RFI Flush" );if (thread_priv) -seq_buf_printf (&s,"L1D private per thread" ); +seq_buf_printf (&s,", L1D private per thread" );seq_buf_printf (&s,"\n" );return s.len; } +if (thread_priv) +return sprintf (buf,"Vulnerable: L1D private per thread\n" ); +if (!security_ftr_enabled (SEC_FTR_L1D_FLUSH_HV ) && !security_ftr_enabled (SEC_FTR_L1D_FLUSH_PR ))return sprintf (buf,"Not affected\n" );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 113/137 clk: pxa: fix one of the pxa RTC clocks
In reply to Greg Kroah-HartmanFrom: Robert Jarzmik <[email protected]>
[ Upstream commit 46acbcb4849b2ca2e6e975e7c8130c1d61c8fd0c ]
The pxa27x platforms have a single IP with 2 drivers, sa1100-rtc and rtc-pxa drivers.
A previous patch fixed the sa1100-rtc case, but the pxa-rtc wasn't fixed. This patch completes the previous one.
--- drivers/clk/pxa/clk-pxa27x.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/pxa/clk-pxa27x.c +1 -0
@@ -362,6 +362,7 @@ struct dummy_clk { };static struct dummy_clk dummy_clks[]__initdata = {DUMMY_CLK (NULL ,"pxa27x-gpio" ,"osc_32_768khz" ), +DUMMY_CLK (NULL ,"pxa-rtc" ,"osc_32_768khz" ),DUMMY_CLK (NULL ,"sa1100-rtc" ,"osc_32_768khz" ),DUMMY_CLK ("UARTCLK" ,"pxa2xx-ir" ,"STUART" ), };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 114/137 bcache: at least try to shrink 1 node in bch_mca_scan()
In reply to Greg Kroah-HartmanFrom: Coly Li <[email protected]>
[ Upstream commit 9fcc34b1a6dd4b8e5337e2b6ef45e428897eca6b ]
In bch_mca_scan(), the number of shrinking btree node is calculated by code like this,
unsigned long nr = sc->nr_to_scan;
nr /= c->btree_pages;
nr = min_t(unsigned long, nr, mca_can_free(c));variable sc->nr_to_scan is number of objects (here is bcache B+tree nodes' number) to shrink, and pointer variable sc is sent from memory management code as parametr of a callback.
If sc->nr_to_scan is smaller than c->btree_pages, after the above calculation, variable 'nr' will be 0 and nothing will be shrunk. It is frequeently observed that only 1 or 2 is set to sc->nr_to_scan and make nr to be zero. Then bch_mca_scan() will do nothing more then acquiring and releasing mutex c->bucket_lock.
This patch checkes whether nr is 0 after the above calculation, if 0 is the result then set 1 to variable 'n'. Then at least bch_mca_scan() will try to shrink a single B+tree node.
--- drivers/md/bcache/btree.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/bcache/btree.c +2 -0
@@ -686,6 +686,8 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,* IO can always make forward progress: */ nr /= c->btree_pages; +if (nr ==0 ) + nr =1 ; nr = min_t(unsigned long, nr, mca_can_free(c)); i =0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 115/137 HID: Improve Windows Precision Touchpad detection.
In reply to Greg Kroah-HartmanFrom: Blaž Hrastnik <[email protected]>
[ Upstream commit 2dbc6f113acd74c66b04bf49fb027efd830b1c5a ]
Per Microsoft spec, usage 0xC5 (page 0xFF) returns a blob containing data used to verify the touchpad as a Windows Precision Touchpad.
0x85, REPORTID_PTPHQA, // REPORT_ID (PTPHQA)
0x09, 0xC5, // USAGE (Vendor Usage 0xC5)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (0xff)
0x75, 0x08, // REPORT_SIZE (8)
0x96, 0x00, 0x01, // REPORT_COUNT (0x100 (256))
0xb1, 0x02, // FEATURE (Data,Var,Abs)However, some devices, namely Microsoft's Surface line of products instead implement a "segmented device certification report" (usage 0xC6) which returns the same report, but in smaller chunks.
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined)
0x85, REPORTID_PTPHQA, // REPORT_ID (PTPHQA)
0x09, 0xC6, // USAGE (Vendor usage for segment #)
0x25, 0x08, // LOGICAL_MAXIMUM (8)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0xb1, 0x02, // FEATURE (Data,Var,Abs)
0x09, 0xC7, // USAGE (Vendor Usage)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (0xff)
0x95, 0x20, // REPORT_COUNT (32)
0xb1, 0x02, // FEATURE (Data,Var,Abs)By expanding Win8 touchpad detection to also look for the segmented report, all Surface touchpads are now properly recognized by hid-multitouch.
--- drivers/hid/hid-core.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/hid/hid-core.c +4 -0
@@ -761,6 +761,10 @@ static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)if (usage ==0xff0000c5 && parser->global.report_count ==256 && parser->global.report_size ==8 ) parser->scan_flags |=HID_SCAN_FLAG_MT_WIN_8 ; + +if (usage ==0xff0000c6 && parser->global.report_count ==1 && + parser->global.report_size ==8 ) + parser->scan_flags |=HID_SCAN_FLAG_MT_WIN_8 ; }static void hid_scan_collection (struct hid_parser *parser,unsigned type)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 116/137 ext4: work around deleting a file with i_nlink == 0 safely
In reply to Greg Kroah-HartmanFrom: Theodore Ts'o <[email protected]>
[ Upstream commit c7df4a1ecb8579838ec8c56b2bb6a6716e974f37 ]
If the file system is corrupted such that a file's i_links_count is too small, then it's possible that when unlinking that file, i_nlink will already be zero. Previously we were working around this kind of corruption by forcing i_nlink to one; but we were doing this before trying to delete the directory entry --- and if the file system is corrupted enough that ext4_delete_entry() fails, then we exit with i_nlink elevated, and this causes the orphan inode list handling to be FUBAR'ed, such that when we unmount the file system, the orphan inode list can get corrupted.
A better way to fix this is to simply skip trying to call drop_nlink() if i_nlink is already zero, thus moving the check to the place where it makes the most sense.
https://bugzilla.kernel.org/show_bug.cgi?id=205433
--- fs/ext4/namei.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
fs/ext4/namei.c +5 -6
@@ -3040,18 +3040,17 @@ static int ext4_unlink(struct inode *dir, struct dentry *dentry)if (IS_DIRSYNC (dir))ext4_handle_sync (handle); -if (inode->i_nlink ==0 ) { -ext4_warning_inode (inode,"Deleting file '%.*s' with no links" , - dentry->d_name.len, dentry->d_name.name); -set_nlink (inode,1 ); - } retval =ext4_delete_entry (handle, dir, de, bh);if (retval) goto end_unlink; dir->i_ctime = dir->i_mtime =ext4_current_time (dir);ext4_update_dx_flag (dir);ext4_mark_inode_dirty (handle, dir); -drop_nlink (inode); +if (inode->i_nlink ==0 ) +ext4_warning_inode (inode,"Deleting file '%.*s' with no links" , + dentry->d_name.len, dentry->d_name.name); +else +drop_nlink (inode);if (!inode->i_nlink)ext4_orphan_add (handle, inode); inode->i_ctime =ext4_current_time (inode);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 117/137 scsi: pm80xx: Fix for SATA device discovery
In reply to Greg Kroah-HartmanFrom: peter chang <[email protected]>
[ Upstream commit ce21c63ee995b7a8b7b81245f2cee521f8c3c220 ]
Driver was missing complete() call in mpi_sata_completion which result in SATA abort error handling timing out. That causes the device to be left in the in_recovery state so subsequent commands sent to the device fail and the OS removes access to it.
--- drivers/scsi/pm8001/pm80xx_hwi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/pm8001/pm80xx_hwi.c +2 -0
@@ -2368,6 +2368,8 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)pm8001_printk ("task 0x%p done with io_status 0x%x" " resp 0x%x stat 0x%x but aborted by upper layer!\n" , t, status, ts->resp, ts->stat)); +if (t->slow_task) +complete (&t->slow_task->completion);pm8001_ccb_task_free (pm8001_ha, t, ccb, tag); }else {spin_unlock_irqrestore (&t->task_state_lock, flags);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 118/137 scsi: target: iscsi: Wait for all commands to finish before freeing a session
In reply to Greg Kroah-HartmanFrom: Bart Van Assche <[email protected]>
[ Upstream commit e9d3009cb936bd0faf0719f68d98ad8afb1e613b ]
The iSCSI target driver is the only target driver that does not wait for ongoing commands to finish before freeing a session. Make the iSCSI target driver wait for ongoing commands to finish before freeing a session. This patch fixes the following KASAN complaint:
BUG: KASAN: use-after-free in __lock_acquire+0xb1a/0x2710
Read of size 8 at addr ffff8881154eca70 by task kworker/0:2/247
CPU: 0 PID: 247 Comm: kworker/0:2 Not tainted 5.4.0-rc1-dbg+ #6
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-1 04/01/2014
Workqueue: target_completion target_complete_ok_work [target_core_mod]
Call Trace:
dump_stack+0x8a/0xd6
print_address_description.constprop.0+0x40/0x60
__kasan_report.cold+0x1b/0x33
kasan_report+0x16/0x20
__asan_load8+0x58/0x90
__lock_acquire+0xb1a/0x2710
lock_acquire+0xd3/0x200
_raw_spin_lock_irqsave+0x43/0x60
target_release_cmd_kref+0x162/0x7f0 [target_core_mod]
target_put_sess_cmd+0x2e/0x40 [target_core_mod]
lio_check_stop_free+0x12/0x20 [iscsi_target_mod]
transport_cmd_check_stop_to_fabric+0xd8/0xe0 [target_core_mod]
target_complete_ok_work+0x1b0/0x790 [target_core_mod]
process_one_work+0x549/0xa40
worker_thread+0x7a/0x5d0
kthread+0x1bc/0x210
ret_from_fork+0x24/0x30
Allocated by task 889:
save_stack+0x23/0x90
__kasan_kmalloc.constprop.0+0xcf/0xe0
kasan_slab_alloc+0x12/0x20
kmem_cache_alloc+0xf6/0x360
transport_alloc_session+0x29/0x80 [target_core_mod]
iscsi_target_login_thread+0xcd6/0x18f0 [iscsi_target_mod]
kthread+0x1bc/0x210
ret_from_fork+0x24/0x30
Freed by task 1025:
save_stack+0x23/0x90
__kasan_slab_free+0x13a/0x190
kasan_slab_free+0x12/0x20
kmem_cache_free+0x146/0x400
transport_free_session+0x179/0x2f0 [target_core_mod]
transport_deregister_session+0x130/0x180 [target_core_mod]
iscsit_close_session+0x12c/0x350 [iscsi_target_mod]
iscsit_logout_post_handler+0x136/0x380 [iscsi_target_mod]
iscsit_response_queue+0x8de/0xbe0 [iscsi_target_mod]
iscsi_target_tx_thread+0x27f/0x370 [iscsi_target_mod]
kthread+0x1bc/0x210
ret_from_fork+0x24/0x30
The buggy address belongs to the object at ffff8881154ec9c0
which belongs to the cache se_sess_cache of size 352
The buggy address is located 176 bytes inside of
352-byte region [ffff8881154ec9c0, ffff8881154ecb20)
The buggy address belongs to the page:
page:ffffea0004553b00 refcount:1 mapcount:0 mapping:ffff888101755400 index:0x0 compound_mapcount: 0
flags: 0x2fff000000010200(slab|head)
raw: 2fff000000010200 dead000000000100 dead000000000122 ffff888101755400
raw: 0000000000000000 0000000080130013 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff8881154ec900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff8881154ec980: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
>ffff8881154eca00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8881154eca80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8881154ecb00: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc--- drivers/target/iscsi/iscsi_target.c | 10 ++++++++-- include/scsi/iscsi_proto.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-)
drivers/target/iscsi/iscsi_target.c +8 -2
@@ -993,7 +993,9 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, hdr->cmdsn,be32_to_cpu (hdr->data_length), payload_length, conn->cid); -target_get_sess_cmd (&cmd->se_cmd, true); +if (target_get_sess_cmd (&cmd->se_cmd, true) <0 ) +return iscsit_add_reject_cmd (cmd, +ISCSI_REASON_WAITING_FOR_LOGOUT , buf); cmd->sense_reason =transport_lookup_cmd_lun (&cmd->se_cmd,scsilun_to_int (&hdr->lun));
@@ -1804,7 +1806,9 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd, conn->sess->se_sess,0 ,DMA_NONE , TCM_SIMPLE_TAG, cmd->sense_buffer + 2); -target_get_sess_cmd (&cmd->se_cmd, true); +if (target_get_sess_cmd (&cmd->se_cmd, true) <0 ) +return iscsit_add_reject_cmd (cmd, +ISCSI_REASON_WAITING_FOR_LOGOUT , buf);/* * TASK_REASSIGN for ERL=2 / connection stays inside of
@@ -4390,6 +4394,8 @@ int iscsit_close_connection(* must wait until they have completed. */ iscsit_check_conn_usage_count (conn); +target_sess_cmd_list_set_waiting (sess->se_sess); +target_wait_for_sess_cmds (sess->se_sess);if (conn->conn_rx_hash.tfm)crypto_free_hash (conn->conn_rx_hash.tfm);
include/scsi/iscsi_proto.h +1 -0
@@ -638,6 +638,7 @@ struct iscsi_reject {#define ISCSI_REASON_BOOKMARK_INVALID 9#define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10#define ISCSI_REASON_NEGOTIATION_RESET 11 +#define ISCSI_REASON_WAITING_FOR_LOGOUT 12/* Max. number of Key=Value pairs in a text message */ #define MAX_KEY_VALUE_PAIRS 8192
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 119/137 gpio: mpc8xxx: Dont overwrite default irq_set_type callback
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
[ Upstream commit 4e50573f39229d5e9c985fa3b4923a8b29619ade ]
The per-SoC devtype structures can contain their own callbacks that overwrite mpc8xxx_gpio_devtype_default.
The clear intention is that mpc8xxx_irq_set_type is used in case the SoC does not specify a more specific callback. But what happens is that if the SoC doesn't specify one, its .irq_set_type is de-facto NULL, and this overwrites mpc8xxx_irq_set_type to a no-op. This means that the following SoCs are affected:
- fsl,mpc8572-gpio
- fsl,ls1028a-gpio
- fsl,ls1088a-gpio
On these boards, the irq_set_type does exactly nothing, and the GPIO controller keeps its GPICR register in the hardware-default state. On the LS1028A, that is ACTIVE_BOTH, which means 2 interrupts are raised even if the IRQ client requests LEVEL_HIGH. Another implication is that the IRQs are not checked (e.g. level-triggered interrupts are not rejected, although they are not supported).
--- drivers/gpio/gpio-mpc8xxx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpio/gpio-mpc8xxx.c +2 -1
@@ -409,7 +409,8 @@ static int mpc8xxx_probe(struct platform_device *pdev)* It's assumed that only a single type of gpio controller is available * on the current machine, so overwriting global data is fine. */ - mpc8xxx_irq_chip.irq_set_type = devtype->irq_set_type; +if (devtype->irq_set_type) + mpc8xxx_irq_chip.irq_set_type = devtype->irq_set_type; gc->direction_output = devtype->gpio_dir_out ?: mpc8xxx_gpio_dir_out; gc->get = devtype->gpio_get ?: mpc8xxx_gpio_get;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 120/137 scripts/kallsyms: fix definitely-lost memory leak
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 21915eca088dc271c970e8351290e83d938114ac ]
build_initial_tok_table() overwrites unused sym_entry to shrink the table size. Before the entry is overwritten, table[i].sym must be freed since it is malloc'ed data.
This fixes the 'definitely lost' report from valgrind. I ran valgrind against x86_64_defconfig of v5.4-rc8 kernel, and here is the summary:
[Before the fix]
LEAK SUMMARY:
definitely lost: 53,184 bytes in 2,874 blocks
[After the fix]
LEAK SUMMARY:
definitely lost: 0 bytes in 0 blocks
--- scripts/kallsyms.c | 2 ++ 1 file changed, 2 insertions(+)
scripts/kallsyms.c +2 -0
@@ -455,6 +455,8 @@ static void build_initial_tok_table(void) table[pos] = table[i];learn_symbol (table[pos].sym, table[pos].len); pos++; + }else { +free (table[i].sym); } } table_cnt = pos;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 121/137 cdrom: respect device capabilities during opening action
In reply to Greg Kroah-HartmanFrom: Diego Elio Pettenò <[email protected]>
[ Upstream commit 366ba7c71ef77c08d06b18ad61b26e2df7352338 ]
Reading the TOC only works if the device can play audio, otherwise these commands fail (and possibly bring the device to an unhealthy state.)
Similarly, cdrom_mmc3_profile() should only be called if the device supports generic packet commands.
To: Jens Axboe <[email protected]>
--- drivers/cdrom/cdrom.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/cdrom/cdrom.c +11 -1
@@ -998,6 +998,12 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks) tracks->xa =0 ; tracks->error =0 ;cd_dbg (CD_COUNT_TRACKS ,"entering cdrom_count_tracks\n" ); + +if (!CDROM_CAN (CDC_PLAY_AUDIO )) { + tracks->error =CDS_NO_INFO ; +return ; + } +/* Grab the TOC header so we can see how many tracks there are */ ret = cdi->ops->audio_ioctl (cdi,CDROMREADTOCHDR , &header);if (ret) {
@@ -1164,7 +1170,8 @@ int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, ret =open_for_data (cdi);if (ret) goto err; -cdrom_mmc3_profile (cdi); +if (CDROM_CAN (CDC_GENERIC_PACKET )) +cdrom_mmc3_profile (cdi);if (mode &FMODE_WRITE ) { ret = -EROFS ;if (cdrom_open_write (cdi))
@@ -2863,6 +2870,9 @@ int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)it doesn't give enough information or fails. then we return the toc contents. */ use_toc: +if (!CDROM_CAN (CDC_PLAY_AUDIO )) +return -ENOSYS ; + toc.cdte_format =CDROM_MSF ; toc.cdte_track =CDROM_LEADOUT ;if ((ret = cdi->ops->audio_ioctl (cdi,CDROMREADTOCENTRY , &toc)))
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 122/137 perf regs: Make perf_reg_name() return "unknown" instead of NULL
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 5b596e0ff0e1852197d4c82d3314db5e43126bf7 ]
To avoid breaking the build on arches where this is not wired up, at least all the other features should be made available and when using this specific routine, the "unknown" should point the user/developer to the need to wire this up on this particular hardware architecture.
Detected in a container mipsel debian cross build environment, where it shows up as:
In file included from /usr/mipsel-linux-gnu/include/stdio.h:867,
from /git/linux/tools/perf/lib/include/perf/cpumap.h:6,
from util/session.c:13:
In function 'printf',
inlined from 'regs_dump__printf' at util/session.c:1103:3,
inlined from 'regs__printf' at util/session.c:1131:2:
/usr/mipsel-linux-gnu/include/bits/stdio2.h:107:10: error: '%-5s' directive argument is null [-Werror=format-overflow=]
107 | return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cross compiler details:
mipsel-linux-gnu-gcc (Debian 9.2.1-8) 9.2.1 20190909
Also on mips64:
In file included from /usr/mips64-linux-gnuabi64/include/stdio.h:867,
from /git/linux/tools/perf/lib/include/perf/cpumap.h:6,
from util/session.c:13:
In function 'printf',
inlined from 'regs_dump__printf' at util/session.c:1103:3,
inlined from 'regs__printf' at util/session.c:1131:2,
inlined from 'regs_user__printf' at util/session.c:1139:3,
inlined from 'dump_sample' at util/session.c:1246:3,
inlined from 'machines__deliver_event' at util/session.c:1421:3:
/usr/mips64-linux-gnuabi64/include/bits/stdio2.h:107:10: error: '%-5s' directive argument is null [-Werror=format-overflow=]
107 | return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'printf',
inlined from 'regs_dump__printf' at util/session.c:1103:3,
inlined from 'regs__printf' at util/session.c:1131:2,
inlined from 'regs_intr__printf' at util/session.c:1147:3,
inlined from 'dump_sample' at util/session.c:1249:3,
inlined from 'machines__deliver_event' at util/session.c:1421:3:
/usr/mips64-linux-gnuabi64/include/bits/stdio2.h:107:10: error: '%-5s' directive argument is null [-Werror=format-overflow=]
107 | return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cross compiler details:
mips64-linux-gnuabi64-gcc (Debian 9.2.1-8) 9.2.1 20190909
--- tools/perf/util/perf_regs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/perf_regs.h +1 -1
@@ -26,7 +26,7 @@ int perf_reg_value(u64 *valp, struct regs_dump *regs, int id);static inline const char *perf_reg_name (int id__maybe_unused ) { -return NULL ; +return "unknown" ; } static inline int perf_reg_value(u64 *valp __maybe_unused,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 123/137 libfdt: define INT32_MAX and UINT32_MAX in libfdt_env.h
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit a8de1304b7df30e3a14f2a8b9709bb4ff31a0385 ]
The DTC v1.5.1 added references to (U)INT32_MAX.
This is no problem for user-space programs since <stdint.h> defines (U)INT32_MAX along with (u)int32_t.
For the kernel space, libfdt_env.h needs to be adjusted before we pull in the changes.
In the kernel, we usually use s/u32 instead of (u)int32_t for the fixed-width types.
Accordingly, we already have S/U32_MAX for their max values. So, we should not add (U)INT32_MAX to <linux/limits.h> any more.
Instead, add them to the in-kernel libfdt_env.h to compile the latest libfdt.
--- arch/arm/boot/compressed/libfdt_env.h | 4 +++- arch/powerpc/boot/libfdt_env.h | 2 ++ include/linux/libfdt_env.h | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-)
arch/arm/boot/compressed/libfdt_env.h +3 -1
@@ -1,11 +1,13 @@#ifndef _ARM_LIBFDT_ENV_H#define _ARM_LIBFDT_ENV_H +#include <linux/limits.h> #include <linux/types.h> #include <linux/string.h> #include <asm/byteorder.h> -#define INT_MAX ((int)(~0U>>1)) +#define INT32_MAX S32_MAX +#define UINT32_MAX U32_MAXtypedef __be16 fdt16_t ;typedef __be32 fdt32_t ;
arch/powerpc/boot/libfdt_env.h +2 -0
@@ -5,6 +5,8 @@#include <string.h> #define INT_MAX ((int)(~0U>>1)) +#define UINT32_MAX ((u32)~0U) +#define INT32_MAX ((s32)(UINT32_MAX >> 1))#include "of.h"
include/linux/libfdt_env.h +3 -0
@@ -6,6 +6,9 @@#include <asm/byteorder.h> +#define INT32_MAX S32_MAX +#define UINT32_MAX U32_MAX +typedef __be16 fdt16_t ;typedef __be32 fdt32_t ;typedef __be64 fdt64_t ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 124/137 s390/cpum_sf: Check for SDBT and SDB consistency
In reply to Greg Kroah-HartmanFrom: Thomas Richter <[email protected]>
[ Upstream commit 247f265fa502e7b17a0cb0cc330e055a36aafce4 ]
Each SBDT is located at a 4KB page and contains 512 entries. Each entry of a SDBT points to a SDB, a 4KB page containing sampled data. The last entry is a link to another SDBT page.
When an event is created the function sequence executed is:
__hw_perf_event_init()
+--> allocate_buffers()
+--> realloc_sampling_buffers()
+---> alloc_sample_data_block()Both functions realloc_sampling_buffers() and alloc_sample_data_block() allocate pages and the allocation can fail. This is handled correctly and all allocated pages are freed and error -ENOMEM is returned to the top calling function. Finally the event is not created.
Once the event has been created, the amount of initially allocated SDBT and SDB can be too low. This is detected during measurement interrupt handling, where the amount of lost samples is calculated. If the number of lost samples is too high considering sampling frequency and already allocated SBDs, the number of SDBs is enlarged during the next execution of cpumsf_pmu_enable().
If more SBDs need to be allocated, functions
realloc_sampling_buffers()
+---> alloc-sample_data_block()are called to allocate more pages. Page allocation may fail and the returned error is ignored. A SDBT and SDB setup already exists.
However the modified SDBTs and SDBs might end up in a situation where the first entry of an SDBT does not point to an SDB, but another SDBT, basicly an SBDT without payload. This can not be handled by the interrupt handler, where an SDBT must have at least one entry pointing to an SBD.
Add a check to avoid SDBTs with out payload (SDBs) when enlarging the buffer setup.
--- arch/s390/kernel/perf_cpum_sf.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
arch/s390/kernel/perf_cpum_sf.c +15 -2
@@ -185,7 +185,7 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb, unsigned long num_sdb, gfp_t gfp_flags) { int i, rc; -unsigned long *new, *tail; +unsigned long *new, *tail, *tail_prev =NULL ;if (!sfb->sdbt || !sfb->tail)return -EINVAL ;
@@ -224,6 +224,7 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb, sfb->num_sdbt++;/* Link current page to tail of chain */ *tail = (unsigned long )(void *) new +1 ; + tail_prev = tail; tail = new; }
@@ -233,10 +234,22 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb,* issue, a new realloc call (if required) might succeed. */ rc =alloc_sample_data_block (tail, gfp_flags); -if (rc) +if (rc) { +/* Undo last SDBT. An SDBT with no SDB at its first +* entry but with an SDBT entry instead can not be +* handled by the interrupt handler code. +* Avoid this situation. +*/ +if (tail_prev) { + sfb->num_sdbt--; +free_page ((unsigned long ) new); + tail = tail_prev; + }break ; + } sfb->num_sdb++; tail++; + tail_prev = new =NULL ;/* Allocated at least one SBD */ }/* Link sampling buffer to its origin */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 125/137 ocfs2: fix passing zero to PTR_ERR warning
In reply to Greg Kroah-HartmanFrom: Ding Xiang <[email protected]>
[ Upstream commit 188c523e1c271d537f3c9f55b6b65bf4476de32f ]
Fix a static code checker warning:fs/ocfs2/acl.c:331
ocfs2_acl_chmod() warn: passing zero to 'PTR_ERR'
--- fs/ocfs2/acl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/ocfs2/acl.c +2 -2
@@ -338,8 +338,8 @@ int ocfs2_acl_chmod(struct inode *inode, struct buffer_head *bh)down_read (&OCFS2_I (inode)->ip_xattr_sem); acl =ocfs2_get_acl_nolock (inode,ACL_TYPE_ACCESS , bh);up_read (&OCFS2_I (inode)->ip_xattr_sem); -if (IS_ERR (acl) || !acl) -return PTR_ERR (acl); +if (IS_ERR_OR_NULL (acl)) +return PTR_ERR_OR_ZERO (acl); ret =__posix_acl_chmod (&acl,GFP_KERNEL , inode->i_mode);if (ret)return ret;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 126/137 kernel: sysctl: make drop_caches write-only
In reply to Greg Kroah-HartmanFrom: Johannes Weiner <[email protected]>
[ Upstream commit 204cb79ad42f015312a5bbd7012d09c93d9b46fb ]
Currently, the drop_caches proc file and sysctl read back the last value written, suggesting this is somehow a stateful setting instead of a one-time command. Make it write-only, like e.g. compact_memory.
While mitigating a VM problem at scale in our fleet, there was confusion about whether writing to this file will permanently switch the kernel into a non-caching mode. This influences the decision making in a tense situation, where tens of people are trying to fix tens of thousands of affected machines: Do we need a rollback strategy? What are the performance implications of operating in a non-caching state for several days? It also caused confusion when the kernel team said we may need to write the file several times to make sure it's effective ("But it already reads back 3?").
--- kernel/sysctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sysctl.c +1 -1
@@ -1357,7 +1357,7 @@ static struct ctl_table vm_table[] = { .procname = "drop_caches", .data = &sysctl_drop_caches, .maxlen = sizeof(int), - .mode = 0644, + .mode = 0200, .proc_handler = drop_caches_sysctl_handler, .extra1 = &one, .extra2 = &four,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 127/137 ALSA: hda - Downgrade error message for single-cmd fallback
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 475feec0c41ad71cb7d02f0310e56256606b57c5 ]
We made the error message for the CORB/RIRB communication clearer by upgrading to dev_WARN() so that user can notice better. But this struck us like a boomerang: now it caught syzbot and reported back as a fatal issue although it's not really any too serious bug that worth for stopping the whole system.
OK, OK, let's be softy, downgrade it to the standard dev_err() again.
--- sound/pci/hda/hda_controller.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/hda_controller.c +1 -1
@@ -673,7 +673,7 @@ static int azx_rirb_get_response(structreturn -EAGAIN ;/* give a chance to retry */ } -dev_WARN (chip->card->dev, +dev_err (chip->card->dev,"azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n" , bus->last_cmd[addr]); chip->single_cmd =1 ;
Greg Kroah-Hartman
maintainerPATCH 128/137 Make filldir[64]() verify the directory entry filename is valid
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 8a23eb804ca4f2be909e372cf5a9e7b30ae476cd upstream.
This has been discussed several times, and now filesystem people are talking about doing it individually at the filesystem layer, so head that off at the pass and just do it in getdents{64}().
This is partially based on a patch by Jann Horn, but checks for NUL bytes as well, and somewhat simplified.
There's also commentary about how it might be better if invalid names due to filesystem corruption don't cause an immediate failure, but only an error at the end of the readdir(), so that people can still see the filenames that are ok.
There's also been discussion about just how much POSIX strictly speaking requires this since it's about filesystem corruption. It's really more "protect user space from bad behavior" as pointed out by Jann. But since Eric Biederman looked up the POSIX wording, here it is for context:
"From readdir:
The readdir() function shall return a pointer to a structure representing the directory entry at the current position in the directory stream specified by the argument dirp, and position the directory stream at the next entry. It shall return a null pointer upon reaching the end of the directory stream. The structure dirent defined in the <dirent.h> header describes a directory entry.
From definitions:
3.129 Directory Entry (or Link)
An object that associates a filename with a file. Several directory entries can associate names with the same file.
...
3.169 Filename
A name consisting of 1 to {NAME_MAX} bytes used to name a file. The characters composing the name may be selected from the set of all character values excluding the slash character and the null byte. The filenames dot and dot-dot have special meaning. A filename is sometimes referred to as a 'pathname component'."
Note that I didn't bother adding the checks to any legacy interfaces that nobody uses.
Also note that if this ends up being noticeable as a performance regression, we can fix that to do a much more optimized model that checks for both NUL and '/' at the same time one word at a time.
We haven't really tended to optimize 'memchr()', and it only checks for one pattern at a time anyway, and we really _should_ check for NUL too (but see the comment about "soft errors" in the code about why it currently only checks for '/')
See the CONFIG_DCACHE_WORD_ACCESS case of hash_name() for how the name lookup code looks for pathname terminating characters in parallel.
--- fs/readdir.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
fs/readdir.c +40 -0
@@ -51,6 +51,40 @@ out:EXPORT_SYMBOL (iterate_dir);/* +* POSIX says that a dirent name cannot contain NULL or a '/'. +* +* It's not 100% clear what we should really do in this case. +* The filesystem is clearly corrupted, but returning a hard +* error means that you now don't see any of the other names +* either, so that isn't a perfect alternative. +* +* And if you return an error, what error do you use? Several +* filesystems seem to have decided on EUCLEAN being the error +* code for EFSCORRUPTED, and that may be the error to use. Or +* just EIO, which is perhaps more obvious to users. +* +* In order to see the other file names in the directory, the +* caller might want to make this a "soft" error: skip the +* entry, and return the error at the end instead. +* +* Note that this should likely do a "memchr(name, 0, len)" +* check too, since that would be filesystem corruption as +* well. However, that case can't actually confuse user space, +* which has to do a strlen() on the name anyway to find the +* filename length, and the above "soft error" worry means +* that it's probably better left alone until we have that +* issue clarified. +*/ +static int verify_dirent_name (const char *name,int len) +{ +if (WARN_ON_ONCE (!len)) +return -EIO ; +if (WARN_ON_ONCE (memchr (name,'/' , len))) +return -EIO ; +return 0 ; +} + +/* * Traditional linux readdir() handling.. * * "count=1" is a special case, meaning that the buffer is one
@@ -159,6 +193,9 @@ static int filldir(struct dir_context *cint reclen =ALIGN (offsetof(struct linux_dirent , d_name) + namlen +2 ,sizeof (long )); + buf->error =verify_dirent_name (name, namlen); +if (unlikely (buf->error)) +return buf->error; buf->error = -EINVAL ;/* only used if we fail.. */ if (reclen > buf->count)return -EINVAL ;
@@ -243,6 +280,9 @@ static int filldir64(struct dir_contextint reclen =ALIGN (offsetof(struct linux_dirent64 , d_name) + namlen +1 ,sizeof (u64)); + buf->error =verify_dirent_name (name, namlen); +if (unlikely (buf->error)) +return buf->error; buf->error = -EINVAL ;/* only used if we fail.. */ if (reclen > buf->count)return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 129/137 filldir[64]: remove WARN_ON_ONCE() for bad directory entries
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit b9959c7a347d6adbb558fba7e36e9fef3cba3b07 upstream.
This was always meant to be a temporary thing, just for testing and to see if it actually ever triggered.
The only thing that reported it was syzbot doing disk image fuzzing, and then that warning is expected. So let's just remove it before -rc4, because the extra sanity testing should probably go to -stable, but we don't want the warning to do so.
--- fs/readdir.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/readdir.c +2 -2
@@ -77,9 +77,9 @@ EXPORT_SYMBOL(iterate_dir);*/ static int verify_dirent_name (const char *name,int len) { -if (WARN_ON_ONCE (!len)) +if (!len)return -EIO ; -if (WARN_ON_ONCE (memchr (name,'/' , len))) +if (memchr (name,'/' , len))return -EIO ;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 130/137 net: davinci_cpdma: use dma_addr_t for DMA address
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 84092996673211f16ef3b942a191d7952e9dfea9 upstream.
The davinci_cpdma mixes up physical addresses as seen from the CPU and DMA addresses as seen from a DMA master, since it can operate on both normal memory or an on-chip buffer. If dma_addr_t is different from phys_addr_t, this means we get a compile-time warning about the type mismatch:
ethernet/ti/davinci_cpdma.c: In function 'cpdma_desc_pool_create':ethernet/ti/davinci_cpdma.c:182:48: error: passing argument 3 of 'dma_alloc_coherent' from incompatible pointer type [-Werror=incompatible-pointer-types]
pool->cpumap = dma_alloc_coherent(dev, size, &pool->phys,
In file included from ethernet/ti/davinci_cpdma.c:21:0:
dma-mapping.h:398:21: note: expected 'dma_addr_t * {aka long long unsigned int *}' but argument is of type 'phys_addr_t * {aka unsigned int *}'
static inline void *dma_alloc_coherent(struct device *dev, size_t size,
This slightly restructures the code so the address we use for mapping RAM into a DMA address is always a dma_addr_t, avoiding the warning. The code is correct even if both types are 32-bit because the DMA master in this device only supports 32-bit addressing anyway, independent of the types that are used.
We still assign this value to pool->phys, and that is wrong if the driver is ever used with an IOMMU, but that value appears to be never used, so there is no problem really. I've added a couple of comments about where we do things that are slightly violating the API.
--- drivers/net/ethernet/ti/davinci_cpdma.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/ti/davinci_cpdma.c +6 -6
@@ -82,7 +82,7 @@ struct cpdma_desc {struct cpdma_desc_pool {phys_addr_t phys; -u32 hw_addr; +dma_addr_t hw_addr;void __iomem *iomap;/* ioremap map */ void *cpumap;/* dma_alloc map */ int desc_size, mem_size;
@@ -152,7 +152,7 @@ struct cpdma_chan {* abstract out these details */ static struct cpdma_desc_pool * -cpdma_desc_pool_create (struct device *dev,u32 phys,u32 hw_addr, +cpdma_desc_pool_create (struct device *dev,u32 phys,dma_addr_t hw_addr,int size,int align) {int bitmap_size;
@@ -176,13 +176,13 @@ cpdma_desc_pool_create(struct device *deif (phys) { pool->phys = phys; - pool->iomap =ioremap (phys, size); + pool->iomap =ioremap (phys, size);/* should be memremap? */ pool->hw_addr = hw_addr; }else { - pool->cpumap =dma_alloc_coherent (dev, size, &pool->phys, + pool->cpumap =dma_alloc_coherent (dev, size, &pool->hw_addr,GFP_KERNEL ); - pool->iomap = pool->cpumap; - pool->hw_addr = pool->phys; + pool->iomap = (void __iomem __force *)pool->cpumap; + pool->phys = pool->hw_addr;/* assumes no IOMMU, don't use this value */ }if (pool->iomap)
Greg Kroah-Hartman
maintainerPATCH 131/137 netfilter: ebtables: compat: reject all padding in matches/watchers
In reply to Greg Kroah-HartmanFrom: Florian Westphal <[email protected]>
commit e608f631f0ba5f1fc5ee2e260a3a35d13107cbfe upstream.
syzbot reported following splat:
BUG: KASAN: vmalloc-out-of-bounds in size_entry_mwt net/bridge/netfilter/ebtables.c:2063 [inline] BUG: KASAN: vmalloc-out-of-bounds in compat_copy_entries+0x128b/0x1380 net/bridge/netfilter/ebtables.c:2155 Read of size 4 at addr ffffc900004461f4 by task syz-executor267/7937 CPU: 1 PID: 7937 Comm: syz-executor267 Not tainted 5.5.0-rc1-syzkaller #0 size_entry_mwt net/bridge/netfilter/ebtables.c:2063 [inline] compat_copy_entries+0x128b/0x1380 net/bridge/netfilter/ebtables.c:2155 compat_do_replace+0x344/0x720 net/bridge/netfilter/ebtables.c:2249 compat_do_ebt_set_ctl+0x22f/0x27e net/bridge/netfilter/ebtables.c:2333 [..]
Because padding isn't considered during computation of ->buf_user_offset, "total" is decremented by fewer bytes than it should.
Therefore, the first part of
if (*total < sizeof(*entry) || entry->next_offset < sizeof(*entry))
will pass, -- it should not have. This causes oob access:entry->next_offset is past the vmalloced size.
Reject padding and check that computed user offset (sum of ebt_entry structure plus all individual matches/watchers/targets) is same value that userspace gave us as the offset of the next entry.
--- net/bridge/netfilter/ebtables.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-)
net/bridge/netfilter/ebtables.c +16 -17
@@ -1883,7 +1883,7 @@ static int ebt_buf_count(struct ebt_entr }static int ebt_buf_add (struct ebt_entries_buf_state *state, -void *data,unsigned int sz) +const void *data,unsigned int sz) {if (state->buf_kern_start ==NULL ) goto count_only;
@@ -1917,7 +1917,7 @@ enum compat_mwt { EBT_COMPAT_TARGET, }; -static int compat_mtw_from_user (struct compat_ebt_entry_mwt *mwt, +static int compat_mtw_from_user (const struct compat_ebt_entry_mwt *mwt,enum compat_mwt compat_mwt,struct ebt_entries_buf_state *state,const unsigned char *base)
@@ -1994,22 +1994,23 @@ static int compat_mtw_from_user(struct c* return size of all matches, watchers or target, including necessary * alignment and padding. */ -static int ebt_size_mwt (struct compat_ebt_entry_mwt *match32, +static int ebt_size_mwt (const struct compat_ebt_entry_mwt *match32,unsigned int size_left,enum compat_mwt type,struct ebt_entries_buf_state *state,const void *base) { +const char *buf = (const char *)match32;int growth =0 ; -char *buf;if (size_left ==0 )return 0 ; - buf = (char *) match32; - -while (size_left >=sizeof (*match32)) { + do { struct ebt_entry_match *match_kern; int ret; + if (size_left < sizeof(*match32)) + return -EINVAL; + match_kern = (struct ebt_entry_match *) state->buf_kern_start; if (match_kern) { char *tmp;
@@ -2046,22 +2047,18 @@ static int ebt_size_mwt(struct compat_ebif (match_kern) match_kern->match_size = ret; -/* rule should have no remaining data after target */ -if (type ==EBT_COMPAT_TARGET && size_left) -return -EINVAL ; - match32 = (struct compat_ebt_entry_mwt *) buf; - } + }while (size_left);return growth; }/* called for all ebt_entry structures. */ -static int size_entry_mwt (struct ebt_entry *entry,const unsigned char *base, +static int size_entry_mwt (const struct ebt_entry *entry,const unsigned char *base,unsigned int *total,struct ebt_entries_buf_state *state) { -unsigned int i, j, startoff, new_offset =0 ; +unsigned int i, j, startoff, next_expected_off, new_offset =0 ;/* stores match/watchers/targets & offset of next struct ebt_entry: */ unsigned int offsets[4 ];unsigned int *offsets_update =NULL ;
@@ -2149,11 +2146,13 @@ static int size_entry_mwt(struct ebt_entreturn ret; } - startoff = state->buf_user_offset - startoff; + next_expected_off = state->buf_user_offset - startoff; +if (next_expected_off != entry->next_offset) +return -EINVAL ; -if (WARN_ON (*total < startoff)) +if (*total < entry->next_offset)return -EINVAL ; - *total -= startoff; + *total -= entry->next_offset;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 132/137 6pack,mkiss: fix possible deadlock
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 5c9934b6767b16ba60be22ec3cbd4379ad64170d upstream.
We got another syzbot report [1] that tells us we must use write_lock_irq()/write_unlock_irq() to avoid possible deadlock.
[1]
WARNING: inconsistent lock state
5.5.0-rc1-syzkaller #0 Not tainted
--------------------------------
inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-R} usage.
syz-executor826/9605 [HC1[1]:SC0[0]:HE0:SE1] takes:ffffffff8a128718 (disc_data_lock){+-..}, at: sp_get.isra.0+0x1d/0xf0 drivers/net/ppp/ppp_synctty.c:138 {HARDIRQ-ON-W} state was registered at:
lock_acquire+0x190/0x410 kernel/locking/lockdep.c:4485 __raw_write_lock_bh include/linux/rwlock_api_smp.h:203 [inline] _raw_write_lock_bh+0x33/0x50 kernel/locking/spinlock.c:319 sixpack_close+0x1d/0x250 drivers/net/hamradio/6pack.c:657 tty_ldisc_close.isra.0+0x119/0x1a0 drivers/tty/tty_ldisc.c:489 tty_set_ldisc+0x230/0x6b0 drivers/tty/tty_ldisc.c:585 tiocsetd drivers/tty/tty_io.c:2337 [inline] tty_ioctl+0xe8d/0x14f0 drivers/tty/tty_io.c:2597 vfs_ioctl fs/ioctl.c:47 [inline] file_ioctl fs/ioctl.c:545 [inline] do_vfs_ioctl+0x977/0x14e0 fs/ioctl.c:732 ksys_ioctl+0xab/0xd0 fs/ioctl.c:749 __do_sys_ioctl fs/ioctl.c:756 [inline] __se_sys_ioctl fs/ioctl.c:754 [inline] __x64_sys_ioctl+0x73/0xb0 fs/ioctl.c:754 do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294 entry_SYSCALL_64_after_hwframe+0x49/0xbe irq event stamp: 3946 hardirqs last enabled at (3945): [<ffffffff87c86e43>] __raw_spin_unlock_irq include/linux/spinlock_api_smp.h:168 [inline] hardirqs last enabled at (3945): [<ffffffff87c86e43>] _raw_spin_unlock_irq+0x23/0x80 kernel/locking/spinlock.c:199 hardirqs last disabled at (3946): [<ffffffff8100675f>] trace_hardirqs_off_thunk+0x1a/0x1c arch/x86/entry/thunk_64.S:42 softirqs last enabled at (2658): [<ffffffff86a8b4df>] spin_unlock_bh include/linux/spinlock.h:383 [inline] softirqs last enabled at (2658): [<ffffffff86a8b4df>] clusterip_netdev_event+0x46f/0x670 net/ipv4/netfilter/ipt_CLUSTERIP.c:222 softirqs last disabled at (2656): [<ffffffff86a8b22b>] spin_lock_bh include/linux/spinlock.h:343 [inline] softirqs last disabled at (2656): [<ffffffff86a8b22b>] clusterip_netdev_event+0x1bb/0x670 net/ipv4/netfilter/ipt_CLUSTERIP.c:196
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(disc_data_lock);
<Interrupt>
lock(disc_data_lock);*** DEADLOCK ***
5 locks held by syz-executor826/9605:
#0: ffff8880a905e198 (&tty->legacy_mutex){+.+.}, at: tty_lock+0xc7/0x130 drivers/tty/tty_mutex.c:19
#1: ffffffff899a56c0 (rcu_read_lock){....}, at: mutex_spin_on_owner+0x0/0x330 kernel/locking/mutex.c:413
#2: ffff8880a496a2b0 (&(&i->lock)->rlock){-.-.}, at: spin_lock include/linux/spinlock.h:338 [inline]
#2: ffff8880a496a2b0 (&(&i->lock)->rlock){-.-.}, at: serial8250_interrupt+0x2d/0x1a0 drivers/tty/serial/8250/8250_core.c:116 #3: ffffffff8c104048 (&port_lock_key){-.-.}, at: serial8250_handle_irq.part.0+0x24/0x330 drivers/tty/serial/8250/8250_port.c:1823 #4: ffff8880a905e090 (&tty->ldisc_sem){++++}, at: tty_ldisc_ref+0x22/0x90 drivers/tty/tty_ldisc.c:288
stack backtrace: CPU: 1 PID: 9605 Comm: syz-executor826 Not tainted 5.5.0-rc1-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x197/0x210 lib/dump_stack.c:118 print_usage_bug.cold+0x327/0x378 kernel/locking/lockdep.c:3101 valid_state kernel/locking/lockdep.c:3112 [inline] mark_lock_irq kernel/locking/lockdep.c:3309 [inline] mark_lock+0xbb4/0x1220 kernel/locking/lockdep.c:3666 mark_usage kernel/locking/lockdep.c:3554 [inline] __lock_acquire+0x1e55/0x4a00 kernel/locking/lockdep.c:3909 lock_acquire+0x190/0x410 kernel/locking/lockdep.c:4485 __raw_read_lock include/linux/rwlock_api_smp.h:149 [inline] _raw_read_lock+0x32/0x50 kernel/locking/spinlock.c:223 sp_get.isra.0+0x1d/0xf0 drivers/net/ppp/ppp_synctty.c:138 sixpack_write_wakeup+0x25/0x340 drivers/net/hamradio/6pack.c:402 tty_wakeup+0xe9/0x120 drivers/tty/tty_io.c:536 tty_port_default_wakeup+0x2b/0x40 drivers/tty/tty_port.c:50 tty_port_tty_wakeup+0x57/0x70 drivers/tty/tty_port.c:387 uart_write_wakeup+0x46/0x70 drivers/tty/serial/serial_core.c:104 serial8250_tx_chars+0x495/0xaf0 drivers/tty/serial/8250/8250_port.c:1761 serial8250_handle_irq.part.0+0x2a2/0x330 drivers/tty/serial/8250/8250_port.c:1834 serial8250_handle_irq drivers/tty/serial/8250/8250_port.c:1820 [inline] serial8250_default_handle_irq+0xc0/0x150 drivers/tty/serial/8250/8250_port.c:1850 serial8250_interrupt+0xf1/0x1a0 drivers/tty/serial/8250/8250_core.c:126 __handle_irq_event_percpu+0x15d/0x970 kernel/irq/handle.c:149 handle_irq_event_percpu+0x74/0x160 kernel/irq/handle.c:189 handle_irq_event+0xa7/0x134 kernel/irq/handle.c:206 handle_edge_irq+0x25e/0x8d0 kernel/irq/chip.c:830 generic_handle_irq_desc include/linux/irqdesc.h:156 [inline] do_IRQ+0xde/0x280 arch/x86/kernel/irq.c:250 common_interrupt+0xf/0xf arch/x86/entry/entry_64.S:607 </IRQ> RIP: 0010:cpu_relax arch/x86/include/asm/processor.h:685 [inline] RIP: 0010:mutex_spin_on_owner+0x247/0x330 kernel/locking/mutex.c:579 Code: c3 be 08 00 00 00 4c 89 e7 e8 e5 06 59 00 4c 89 e0 48 c1 e8 03 42 80 3c 38 00 0f 85 e1 00 00 00 49 8b 04 24 a8 01 75 96 f3 90 <e9> 2f fe ff ff 0f 0b e8 0d 19 09 00 84 c0 0f 85 ff fd ff ff 48 c7 RSP: 0018:ffffc90001eafa20 EFLAGS: 00000246 ORIG_RAX: ffffffffffffffd7 RAX: 0000000000000000 RBX: ffff88809fd9e0c0 RCX: 1ffffffff13266dd RDX: 0000000000000000 RSI: 0000000000000008 RDI: 0000000000000000 RBP: ffffc90001eafa60 R08: 1ffff11013d22898 R09: ffffed1013d22899 R10: ffffed1013d22898 R11: ffff88809e9144c7 R12: ffff8880a905e138 R13: ffff88809e9144c0 R14: 0000000000000000 R15: dffffc0000000000 mutex_optimistic_spin kernel/locking/mutex.c:673 [inline] __mutex_lock_common kernel/locking/mutex.c:962 [inline] __mutex_lock+0x32b/0x13c0 kernel/locking/mutex.c:1106 mutex_lock_nested+0x16/0x20 kernel/locking/mutex.c:1121 tty_lock+0xc7/0x130 drivers/tty/tty_mutex.c:19 tty_release+0xb5/0xe90 drivers/tty/tty_io.c:1665 __fput+0x2ff/0x890 fs/file_table.c:280 ____fput+0x16/0x20 fs/file_table.c:313 task_work_run+0x145/0x1c0 kernel/task_work.c:113 exit_task_work include/linux/task_work.h:22 [inline] do_exit+0x8e7/0x2ef0 kernel/exit.c:797 do_group_exit+0x135/0x360 kernel/exit.c:895 __do_sys_exit_group kernel/exit.c:906 [inline] __se_sys_exit_group kernel/exit.c:904 [inline] __x64_sys_exit_group+0x44/0x50 kernel/exit.c:904 do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x43fef8 Code: Bad RIP value. RSP: 002b:00007ffdb07d2338 EFLAGS: 00000246 ORIG_RAX: 00000000000000e7 RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 000000000043fef8 RDX: 0000000000000000 RSI: 000000000000003c RDI: 0000000000000000 RBP: 00000000004bf730 R08: 00000000000000e7 R09: ffffffffffffffd0 R10: 00000000004002c8 R11: 0000000000000246 R12: 0000000000000001 R13: 00000000006d1180 R14: 0000000000000000 R15: 0000000000000000
--- drivers/net/hamradio/6pack.c | 4 ++-- drivers/net/hamradio/mkiss.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/hamradio/6pack.c +2 -2
@@ -669,10 +669,10 @@ static void sixpack_close(struct tty_str {struct sixpack *sp; -write_lock_bh (&disc_data_lock); +write_lock_irq (&disc_data_lock); sp = tty->disc_data; tty->disc_data =NULL ; -write_unlock_bh (&disc_data_lock); +write_unlock_irq (&disc_data_lock);if (!sp)return ;
drivers/net/hamradio/mkiss.c +2 -2
@@ -783,10 +783,10 @@ static void mkiss_close(struct tty_struc {struct mkiss *ax; -write_lock_bh (&disc_data_lock); +write_lock_irq (&disc_data_lock); ax = tty->disc_data; tty->disc_data =NULL ; -write_unlock_bh (&disc_data_lock); +write_unlock_irq (&disc_data_lock);if (!ax)return ;
Greg Kroah-Hartman
maintainerPATCH 133/137 netfilter: bridge: make sure to pull arp header in br_nf_forward_arp()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 5604285839aaedfb23ebe297799c6e558939334d upstream.
syzbot is kind enough to remind us we need to call skb_may_pull()
BUG: KMSAN: uninit-value in br_nf_forward_arp+0xe61/0x1230 net/bridge/br_netfilter_hooks.c:665 CPU: 1 PID: 11631 Comm: syz-executor.1 Not tainted 5.4.0-rc8-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1c9/0x220 lib/dump_stack.c:118 kmsan_report+0x128/0x220 mm/kmsan/kmsan_report.c:108 __msan_warning+0x64/0xc0 mm/kmsan/kmsan_instr.c:245 br_nf_forward_arp+0xe61/0x1230 net/bridge/br_netfilter_hooks.c:665 nf_hook_entry_hookfn include/linux/netfilter.h:135 [inline] nf_hook_slow+0x18b/0x3f0 net/netfilter/core.c:512 nf_hook include/linux/netfilter.h:260 [inline] NF_HOOK include/linux/netfilter.h:303 [inline] __br_forward+0x78f/0xe30 net/bridge/br_forward.c:109 br_flood+0xef0/0xfe0 net/bridge/br_forward.c:234 br_handle_frame_finish+0x1a77/0x1c20 net/bridge/br_input.c:162 nf_hook_bridge_pre net/bridge/br_input.c:245 [inline] br_handle_frame+0xfb6/0x1eb0 net/bridge/br_input.c:348 __netif_receive_skb_core+0x20b9/0x51a0 net/core/dev.c:4830 __netif_receive_skb_one_core net/core/dev.c:4927 [inline] __netif_receive_skb net/core/dev.c:5043 [inline] process_backlog+0x610/0x13c0 net/core/dev.c:5874 napi_poll net/core/dev.c:6311 [inline] net_rx_action+0x7a6/0x1aa0 net/core/dev.c:6379 __do_softirq+0x4a1/0x83a kernel/softirq.c:293 do_softirq_own_stack+0x49/0x80 arch/x86/entry/entry_64.S:1091 </IRQ> do_softirq kernel/softirq.c:338 [inline] __local_bh_enable_ip+0x184/0x1d0 kernel/softirq.c:190 local_bh_enable+0x36/0x40 include/linux/bottom_half.h:32 rcu_read_unlock_bh include/linux/rcupdate.h:688 [inline] __dev_queue_xmit+0x38e8/0x4200 net/core/dev.c:3819 dev_queue_xmit+0x4b/0x60 net/core/dev.c:3825 packet_snd net/packet/af_packet.c:2959 [inline] packet_sendmsg+0x8234/0x9100 net/packet/af_packet.c:2984 sock_sendmsg_nosec net/socket.c:637 [inline] sock_sendmsg net/socket.c:657 [inline] __sys_sendto+0xc44/0xc70 net/socket.c:1952 __do_sys_sendto net/socket.c:1964 [inline] __se_sys_sendto+0x107/0x130 net/socket.c:1960 __x64_sys_sendto+0x6e/0x90 net/socket.c:1960 do_syscall_64+0xb6/0x160 arch/x86/entry/common.c:291 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x45a679 Code: ad b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00 RSP: 002b:00007f0a3c9e5c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 0000000000000006 RCX: 000000000045a679 RDX: 000000000000000e RSI: 0000000020000200 RDI: 0000000000000003 RBP: 000000000075bf20 R08: 00000000200000c0 R09: 0000000000000014 R10: 0000000000000000 R11: 0000000000000246 R12: 00007f0a3c9e66d4 R13: 00000000004c8ec1 R14: 00000000004dfe28 R15: 00000000ffffffff
Uninit was created at:
kmsan_save_stack_with_flags mm/kmsan/kmsan.c:149 [inline] kmsan_internal_poison_shadow+0x5c/0x110 mm/kmsan/kmsan.c:132 kmsan_slab_alloc+0x97/0x100 mm/kmsan/kmsan_hooks.c:86 slab_alloc_node mm/slub.c:2773 [inline] __kmalloc_node_track_caller+0xe27/0x11a0 mm/slub.c:4381 __kmalloc_reserve net/core/skbuff.c:141 [inline] __alloc_skb+0x306/0xa10 net/core/skbuff.c:209 alloc_skb include/linux/skbuff.h:1049 [inline] alloc_skb_with_frags+0x18c/0xa80 net/core/skbuff.c:5662 sock_alloc_send_pskb+0xafd/0x10a0 net/core/sock.c:2244 packet_alloc_skb net/packet/af_packet.c:2807 [inline] packet_snd net/packet/af_packet.c:2902 [inline] packet_sendmsg+0x63a6/0x9100 net/packet/af_packet.c:2984 sock_sendmsg_nosec net/socket.c:637 [inline] sock_sendmsg net/socket.c:657 [inline] __sys_sendto+0xc44/0xc70 net/socket.c:1952 __do_sys_sendto net/socket.c:1964 [inline] __se_sys_sendto+0x107/0x130 net/socket.c:1960 __x64_sys_sendto+0x6e/0x90 net/socket.c:1960 do_syscall_64+0xb6/0x160 arch/x86/entry/common.c:291 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- net/bridge/br_netfilter_hooks.c | 3 +++ 1 file changed, 3 insertions(+)
net/bridge/br_netfilter_hooks.c +3 -0
@@ -638,6 +638,9 @@ static unsigned int br_nf_forward_arp(vonf_bridge_pull_encap_header (skb); } +if (unlikely (!pskb_may_pull (skb,sizeof (struct arphdr )))) +return NF_DROP ; +if (arp_hdr (skb)->ar_pln !=4 ) {if (IS_VLAN_ARP (skb))nf_bridge_push_encap_header (skb);
Greg Kroah-Hartman
maintainerPATCH 134/137 net: icmp: fix data-race in cmp_global_allow()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit bbab7ef235031f6733b5429ae7877bfa22339712 upstream.
This code reads two global variables without protection of a lock. We need READ_ONCE()/WRITE_ONCE() pairs to avoid load/store-tearing and better document the intent.
KCSAN reported :
BUG: KCSAN: data-race in icmp_global_allow / icmp_global_allow
read to 0xffffffff861a8014 of 4 bytes by task 11201 on cpu 0:
icmp_global_allow+0x36/0x1b0 net/ipv4/icmp.c:254 icmpv6_global_allow net/ipv6/icmp.c:184 [inline] icmpv6_global_allow net/ipv6/icmp.c:179 [inline] icmp6_send+0x493/0x1140 net/ipv6/icmp.c:514 icmpv6_send+0x71/0xb0 net/ipv6/ip6_icmp.c:43 ip6_link_failure+0x43/0x180 net/ipv6/route.c:2640 dst_link_failure include/net/dst.h:419 [inline] vti_xmit net/ipv4/ip_vti.c:243 [inline] vti_tunnel_xmit+0x27f/0xa50 net/ipv4/ip_vti.c:279 __netdev_start_xmit include/linux/netdevice.h:4420 [inline] netdev_start_xmit include/linux/netdevice.h:4434 [inline] xmit_one net/core/dev.c:3280 [inline] dev_hard_start_xmit+0xef/0x430 net/core/dev.c:3296 __dev_queue_xmit+0x14c9/0x1b60 net/core/dev.c:3873 dev_queue_xmit+0x21/0x30 net/core/dev.c:3906 neigh_direct_output+0x1f/0x30 net/core/neighbour.c:1530 neigh_output include/net/neighbour.h:511 [inline] ip6_finish_output2+0x7a6/0xec0 net/ipv6/ip6_output.c:116 __ip6_finish_output net/ipv6/ip6_output.c:142 [inline] __ip6_finish_output+0x2d7/0x330 net/ipv6/ip6_output.c:127 ip6_finish_output+0x41/0x160 net/ipv6/ip6_output.c:152 NF_HOOK_COND include/linux/netfilter.h:294 [inline] ip6_output+0xf2/0x280 net/ipv6/ip6_output.c:175 dst_output include/net/dst.h:436 [inline] ip6_local_out+0x74/0x90 net/ipv6/output_core.c:179
write to 0xffffffff861a8014 of 4 bytes by task 11183 on cpu 1:
icmp_global_allow+0x174/0x1b0 net/ipv4/icmp.c:272 icmpv6_global_allow net/ipv6/icmp.c:184 [inline] icmpv6_global_allow net/ipv6/icmp.c:179 [inline] icmp6_send+0x493/0x1140 net/ipv6/icmp.c:514 icmpv6_send+0x71/0xb0 net/ipv6/ip6_icmp.c:43 ip6_link_failure+0x43/0x180 net/ipv6/route.c:2640 dst_link_failure include/net/dst.h:419 [inline] vti_xmit net/ipv4/ip_vti.c:243 [inline] vti_tunnel_xmit+0x27f/0xa50 net/ipv4/ip_vti.c:279 __netdev_start_xmit include/linux/netdevice.h:4420 [inline] netdev_start_xmit include/linux/netdevice.h:4434 [inline] xmit_one net/core/dev.c:3280 [inline] dev_hard_start_xmit+0xef/0x430 net/core/dev.c:3296 __dev_queue_xmit+0x14c9/0x1b60 net/core/dev.c:3873 dev_queue_xmit+0x21/0x30 net/core/dev.c:3906 neigh_direct_output+0x1f/0x30 net/core/neighbour.c:1530 neigh_output include/net/neighbour.h:511 [inline] ip6_finish_output2+0x7a6/0xec0 net/ipv6/ip6_output.c:116 __ip6_finish_output net/ipv6/ip6_output.c:142 [inline] __ip6_finish_output+0x2d7/0x330 net/ipv6/ip6_output.c:127 ip6_finish_output+0x41/0x160 net/ipv6/ip6_output.c:152 NF_HOOK_COND include/linux/netfilter.h:294 [inline] ip6_output+0xf2/0x280 net/ipv6/ip6_output.c:175
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 11183 Comm: syz-executor.2 Not tainted 5.4.0-rc3+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
--- net/ipv4/icmp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
net/ipv4/icmp.c +6 -5
@@ -256,10 +256,11 @@ bool icmp_global_allow(void)bool rc = false;/* Check if token bucket is empty and cannot be refilled -* without taking the spinlock. +* without taking the spinlock. The READ_ONCE() are paired +* with the following WRITE_ONCE() in this same function. */ -if (!icmp_global.credit) { - delta =min_t (u32, now - icmp_global.stamp,HZ ); +if (!READ_ONCE (icmp_global.credit)) { + delta =min_t (u32, now -READ_ONCE (icmp_global.stamp),HZ );if (delta <HZ /50 )return false; }
@@ -269,14 +270,14 @@ bool icmp_global_allow(void)if (delta >=HZ /50 ) { incr = sysctl_icmp_msgs_per_sec * delta /HZ ;if (incr) - icmp_global.stamp = now; +WRITE_ONCE (icmp_global.stamp, now); } credit =min_t (u32, icmp_global.credit + incr, sysctl_icmp_msgs_burst);if (credit) { credit--; rc = true; } - icmp_global.credit = credit; +WRITE_ONCE (icmp_global.credit, credit);spin_unlock (&icmp_global.lock);return rc; }
Greg Kroah-Hartman
maintainerPATCH 135/137 hrtimer: Annotate lockless access to timer->state
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 56144737e67329c9aaed15f942d46a6302e2e3d8 upstream.
syzbot reported various data-race caused by hrtimer_is_queued() reading timer->state. A READ_ONCE() is required there to silence the warning.
Also add the corresponding WRITE_ONCE() when timer->state is set.
In remove_hrtimer() the hrtimer_is_queued() helper is open coded to avoid loading timer->state twice.
KCSAN reported these cases:
BUG: KCSAN: data-race in __remove_hrtimer / tcp_pacing_check
write to 0xffff8880b2a7d388 of 1 bytes by interrupt on cpu 0:
__remove_hrtimer+0x52/0x130 kernel/time/hrtimer.c:991 __run_hrtimer kernel/time/hrtimer.c:1496 [inline] __hrtimer_run_queues+0x250/0x600 kernel/time/hrtimer.c:1576 hrtimer_run_softirq+0x10e/0x150 kernel/time/hrtimer.c:1593 __do_softirq+0x115/0x33f kernel/softirq.c:292 run_ksoftirqd+0x46/0x60 kernel/softirq.c:603 smpboot_thread_fn+0x37d/0x4a0 kernel/smpboot.c:165 kthread+0x1d4/0x200 drivers/block/aoe/aoecmd.c:1253 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:352
read to 0xffff8880b2a7d388 of 1 bytes by task 24652 on cpu 1:
tcp_pacing_check net/ipv4/tcp_output.c:2235 [inline] tcp_pacing_check+0xba/0x130 net/ipv4/tcp_output.c:2225 tcp_xmit_retransmit_queue+0x32c/0x5a0 net/ipv4/tcp_output.c:3044 tcp_xmit_recovery+0x7c/0x120 net/ipv4/tcp_input.c:3558 tcp_ack+0x17b6/0x3170 net/ipv4/tcp_input.c:3717 tcp_rcv_established+0x37e/0xf50 net/ipv4/tcp_input.c:5696 tcp_v4_do_rcv+0x381/0x4e0 net/ipv4/tcp_ipv4.c:1561 sk_backlog_rcv include/net/sock.h:945 [inline] __release_sock+0x135/0x1e0 net/core/sock.c:2435 release_sock+0x61/0x160 net/core/sock.c:2951 sk_stream_wait_memory+0x3d7/0x7c0 net/core/stream.c:145 tcp_sendmsg_locked+0xb47/0x1f30 net/ipv4/tcp.c:1393 tcp_sendmsg+0x39/0x60 net/ipv4/tcp.c:1434 inet_sendmsg+0x6d/0x90 net/ipv4/af_inet.c:807 sock_sendmsg_nosec net/socket.c:637 [inline] sock_sendmsg+0x9f/0xc0 net/socket.c:657 BUG: KCSAN: data-race in __remove_hrtimer / __tcp_ack_snd_check
write to 0xffff8880a3a65588 of 1 bytes by interrupt on cpu 0:
__remove_hrtimer+0x52/0x130 kernel/time/hrtimer.c:991 __run_hrtimer kernel/time/hrtimer.c:1496 [inline] __hrtimer_run_queues+0x250/0x600 kernel/time/hrtimer.c:1576 hrtimer_run_softirq+0x10e/0x150 kernel/time/hrtimer.c:1593 __do_softirq+0x115/0x33f kernel/softirq.c:292 invoke_softirq kernel/softirq.c:373 [inline] irq_exit+0xbb/0xe0 kernel/softirq.c:413 exiting_irq arch/x86/include/asm/apic.h:536 [inline] smp_apic_timer_interrupt+0xe6/0x280 arch/x86/kernel/apic/apic.c:1137 apic_timer_interrupt+0xf/0x20 arch/x86/entry/entry_64.S:830
read to 0xffff8880a3a65588 of 1 bytes by task 22891 on cpu 1:
__tcp_ack_snd_check+0x415/0x4f0 net/ipv4/tcp_input.c:5265 tcp_ack_snd_check net/ipv4/tcp_input.c:5287 [inline] tcp_rcv_established+0x750/0xf50 net/ipv4/tcp_input.c:5708 tcp_v4_do_rcv+0x381/0x4e0 net/ipv4/tcp_ipv4.c:1561 sk_backlog_rcv include/net/sock.h:945 [inline] __release_sock+0x135/0x1e0 net/core/sock.c:2435 release_sock+0x61/0x160 net/core/sock.c:2951 sk_stream_wait_memory+0x3d7/0x7c0 net/core/stream.c:145 tcp_sendmsg_locked+0xb47/0x1f30 net/ipv4/tcp.c:1393 tcp_sendmsg+0x39/0x60 net/ipv4/tcp.c:1434 inet_sendmsg+0x6d/0x90 net/ipv4/af_inet.c:807 sock_sendmsg_nosec net/socket.c:637 [inline] sock_sendmsg+0x9f/0xc0 net/socket.c:657 __sys_sendto+0x21f/0x320 net/socket.c:1952 __do_sys_sendto net/socket.c:1964 [inline] __se_sys_sendto net/socket.c:1960 [inline] __x64_sys_sendto+0x89/0xb0 net/socket.c:1960 do_syscall_64+0xcc/0x370 arch/x86/entry/common.c:290
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 24652 Comm: syz-executor.3 Not tainted 5.4.0-rc3+ #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
[ tglx: Added comments ]
--- include/linux/hrtimer.h | 14 ++++++++++---- kernel/time/hrtimer.c | 11 +++++++---- 2 files changed, 17 insertions(+), 8 deletions(-)
include/linux/hrtimer.h +10 -4
@@ -424,12 +424,18 @@ extern u64 hrtimer_get_next_event(void);extern bool hrtimer_active (const struct hrtimer *timer); -/* -* Helper function to check, whether the timer is on one of the queues +/** +* hrtimer_is_queued = check, whether the timer is on one of the queues +* @timer: Timer to check +* +* Returns: True if the timer is queued, false otherwise +* +* The function can be used lockless, but it gives only a current snapshot. */ -static inline int hrtimer_is_queued (struct hrtimer *timer) +static inline bool hrtimer_is_queued (struct hrtimer *timer) { -return timer->state &HRTIMER_STATE_ENQUEUED ; +/* The READ_ONCE pairs with the update functions of timer->state */ +return !!(READ_ONCE (timer->state) &HRTIMER_STATE_ENQUEUED ); }/*
kernel/time/hrtimer.c +7 -4
@@ -887,7 +887,8 @@ static int enqueue_hrtimer(struct hrtime base->cpu_base->active_bases |=1 << base->index; - timer->state =HRTIMER_STATE_ENQUEUED ; +/* Pairs with the lockless read in hrtimer_is_queued() */ +WRITE_ONCE (timer->state,HRTIMER_STATE_ENQUEUED );return timerqueue_add (&base->active, &timer->node); }
@@ -909,7 +910,8 @@ static void __remove_hrtimer(struct hrtistruct hrtimer_cpu_base *cpu_base = base->cpu_base;u8 state = timer->state; - timer->state = newstate; +/* Pairs with the lockless read in hrtimer_is_queued() */ +WRITE_ONCE (timer->state, newstate);if (!(state &HRTIMER_STATE_ENQUEUED ))return ;
@@ -936,8 +938,9 @@ static void __remove_hrtimer(struct hrtistatic inline int remove_hrtimer (struct hrtimer *timer,struct hrtimer_clock_base *base,bool restart) { -if (hrtimer_is_queued (timer)) { -u8 state = timer->state; +u8 state = timer->state; + +if (state &HRTIMER_STATE_ENQUEUED ) {int reprogram;/*
Greg Kroah-Hartman
maintainerPATCH 136/137 mmc: sdhci: Update the tuning failed messages to pr_debug level
In reply to Greg Kroah-HartmanFrom: Faiz Abbas <[email protected]>
[ Upstream commit 2c92dd20304f505b6ef43d206fff21bda8f1f0ae ]
Tuning support in DDR50 speed mode was added in SD Specifications Part1 Physical Layer Specification v3.01. Its not possible to distinguish between v3.00 and v3.01 from the SCR and that is why since commit 4324f6de6d2e ("mmc: core: enable CMD19 tuning for DDR50 mode") tuning failures are ignored in DDR50 speed mode.
Cards compatible with v3.00 don't respond to CMD19 in DDR50 and this error gets printed during enumeration and also if retune is triggered at any time during operation. Update the printk level to pr_debug so that these errors don't lead to false error reports.
--- drivers/mmc/host/sdhci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mmc/host/sdhci.c +1 -1
@@ -2033,7 +2033,7 @@ static int sdhci_execute_tuning(struct mspin_lock_irqsave (&host->lock, flags);if (!host->tuning_done) { -pr_info (DRIVER_NAME ": Timeout waiting for " +pr_debug (DRIVER_NAME ": Timeout waiting for " "Buffer Read Ready interrupt during tuning " "procedure, falling back to fixed sampling " "clock\n" );
Greg Kroah-Hartman
maintainerPATCH 137/137 tcp: do not send empty skb from tcp_write_xmit()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 1f85e6267caca44b30c54711652b0726fadbb131 ]
Backport of commit fdfc5c8594c2 ("tcp: remove empty skb from write queue in error cases") in linux-4.14 stable triggered various bugs. One of them has been fixed in commit ba2ddb43f270 ("tcp: Don't dequeue SYN/FIN-segments from write-queue"), but we still have crashes in some occasions.
Root-cause is that when tcp_sendmsg() has allocated a fresh skb and could not append a fragment before being blocked in sk_stream_wait_memory(), tcp_write_xmit() might be called and decide to send this fresh and empty skb.
Sending an empty packet is not only silly, it might have caused many issues we had in the past with tp->packets_out being out of sync.
--- net/ipv4/tcp_output.c | 8 ++++++++ 1 file changed, 8 insertions(+)
net/ipv4/tcp_output.c +8 -0
@@ -2148,6 +2148,14 @@ static bool tcp_write_xmit(struct sock *break ; } +/* Argh, we hit an empty skb(), presumably a thread +* is sleeping in sendmsg()/sk_stream_wait_memory(). +* We do not want to send a pure-ack packet and have +* a strange looking rtx queue with empty packet(s). +*/ +if (TCP_SKB_CB (skb)->end_seq ==TCP_SKB_CB (skb)->seq) +break ; +if (unlikely (tcp_transmit_skb (sk, skb,1 , gfp)))break ;
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +0000. Anything received after that time might be too late.
Build results:
total: 170 pass: 170 fail: 0 Qemu test results: total: 325 pass: 325 fail: 0
Guenter
Jon Hunter
maintainerQuoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +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.4.208-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
All tests are passing for Tegra ...
Test results for stable-v4.4:
6 builds: 6 pass, 0 fail
12 boots: 12 pass, 0 fail
19 tests: 19 pass, 0 failLinux version: 4.4.208-rc1-g8eb04883f217
Boards tested: tegra124-jetson-tk1, tegra20-ventana,
tegra30-cardhu-a04
Cheers
Jon
Signature · 1 line
nvpublic
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +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.4.208-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.208-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 4.4.208-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.4.y
git commit: 8eb04883f217f38b78d9fc0ef9044a5259b5e815
git describe: v4.4.207-138-g8eb04883f217
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.4-oe/build/v4.4.207-138-g8eb04883f217
No regressions (compared to build v4.4.207)
No fixes (compared to build v4.4.207)
Ran 19877 total tests in the following environments and test suites.
Environments
--------------
- i386
- juno-r2 - arm64
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* build
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* network-basic-tests
* perf
* prep-tmp-disk
* spectre-meltdown-checker-test
* kselftest
* kvm-unit-tests
* v4l2-compliance
* install-android-platform-tools-r2600
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
* ssuite
Summary
------------------------------------------------------------------------
kernel: 4.4.208-rc1
git repo: https://git.linaro.org/lkft/arm64-stable-rc.git
git branch: 4.4.208-rc1-hikey-20200101-645
git commit: 45aaddb4efb9c8a83ada6caeb9594f7fc5130ec3
git describe: 4.4.208-rc1-hikey-20200101-645
Test details: https://qa-reports.linaro.org/lkft/linaro-hikey-stable-rc-4.4-oe/build/4.4.208-rc1-hikey-20200101-645
No regressions (compared to build 4.4.208-rc1-hikey-20200101-644)
No fixes (compared to build 4.4.208-rc1-hikey-20200101-644)
Ran 1568 total tests in the following environments and test suites.
Environments
--------------
- hi6220-hikey - arm64
Test Suites
-----------
* build
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* perf
* spectre-meltdown-checker-test
* v4l2-compliance
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 17 lines · Naresh Kamboju
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.208 release. There are 137 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 Sat, 04 Jan 2020 22:02:41 +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.4.208-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 3 lines
thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Thanks for testing all of these and letting me know.
greg k-h